AWS Key Management System を使って暗号/復号化

AWS Lambda のコードで、認証情報などのハードコーディングして Git なんかにコミットできないデータを扱いたい場合。Lambda だとファイルシステムを持たないので、コードとは別のファイルで保持することはできない。そんな場合に使えるのが、AWS の Key Management System (KMS) だ。

使い方としてはざっと以下の通り。

  • ある Lambda 関数の実行 IAM ロールを sample-role とする。
  • KMS でエイリアス名に sample-key と指定した新規キーを作成する。
  • キーの管理者として IAM ユーザーの otsuka(自分) を割り当てる。
  • キーのユーザーとして IAM ロールの sample-role を割り当てる。

AWS CLI で次のように aws kms コマンドを使って、暗号化文字列の CiphertextBlob を作成する。

$ aws kms encrypt --key-id alias/sample-key --plaintext "秘密の認証情報"

{
    "KeyId": "arn:aws:kms:ap-northeast-1:999999999999:key/0cf7c1c2-02be-465e-bfc1-9fed069ec46b", 
    "CiphertextBlob": "CiCMn4lT71Fa1WaTa50abVHpH2/0cCAAWq1H7fp7L3ymihKwAQEBAgB4jJ+JU+9RWtVmk2uNGm1R6R9v9HAgAFqtR+n6ei9spooAAACHMIGEBgkqhkiG9w0BBwagdzB1AgEAMHAGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMziMazEjmHKMrnTliAgEQgEMiuztAO5FXObkU95Uu7hNvjf/rhe1Ra6vMQ/RkhznmE7ALtQabyoMwsjbydkHuCIun5fpVfFka31TQRBwXeJHt/Wk0"
}

そして Lambda の Python コードにはこの CiphertextBlob の値を埋め込み、次のように復号化して元の秘密の認証情報を取得する。

from base64 import b64decode
import boto3 as boto3

kms = boto3.client('kms')
decrypted_secret_text = kms.decrypt(CiphertextBlob=b64decode("暗号化された CiphertextBlob の値"))['Plaintext']

コードには暗号化された文字列が入っているので、コミットしてもいいんじゃないかな。

Last updated on July 26, 2016