モチベーション
AWS Lambdaでチャットワークにつぶやく際に使うAPI keyを暗号化したいです。
作戦
AWS Key Management Service(以下KMS)を使います。
KMS上に保存したマスターキーでAPI keyを暗号化します。
暗号化したAPI keyはソースコードに埋め込むことが出来ます。
これをNode.jsで復号します。
手順
マスターキーの登録
IAM操作可能なユーザーでマスターキーを登録します。
IAM管理画面の暗号化キーから設定します。
暗号化キーの作成の前に、リージョンの選択してください。
暗号化キーはリージョンごと管理されています。
暗号化キーには識別子として、エイリアスを指定できます。
ここではチャットワークのAPI_KEYなのでchatbotとします。
暗号化キーには管理できるユーザと利用できるユーザを別々に指定することができます。
Lambdaで使う場合はLambdaの実行ユーザーは、キーユーザーとして登録するのが良いでしょう。
awsコマンドの設定
設定していなければ、awsコマンドの認証情報を設定します。
~ aws configure
AWS Access Key ID [****************DBSA]: YOUR_AWS_ACCESS_KEY_ID
AWS Secret Access Key [****************X5Ex]: YOUR_SECRET_ACCESS_KEY
Default region name [ap-northeast-1]:
Default output format [text]: json
AWS Access Key IDとAWS Secret Access KeyはIAM操作可能なユーザーで作成します。
Getting Set Up with the AWS Command Line Interface - AWS Command Line Interface
秘密情報(文字列)の暗号化
awsコマンドで文字列hello_worldを暗号化します。
マスターキーを登録した際のエイリアスを--key-id alias/chatbotのように指定します。
aws kms encrypt --key-id alias/chatbot --region ap-northeast-1 --plaintext hello_world
{
"KeyId": "arn:aws:kms:ap-northeast-1:275624216953:key/c069b141-823a-4756-b973-dce51241b4b2",
"CiphertextBlob": "AQECAHjf+WkQYtH+9sxLq9RViQWd+oHbIcUOdX1uNHBK2hEXhAAAAGkwZwYJKoZIhvcNAQcGoFowWAIBADBTBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDMI9ixmjyICcSa4+egIBEIAmojl8e63GFxuAUf7ZjzGQl0/R5Noe3E88GwIwYS++KnP5aE0NGHc="
}
CiphertextBlobの値が暗号化後の文字列です。
秘密情報の復号
ソースコード
CiphertextBlobの値をBASE64でデコードして、AWS.KMSのdecrypt関数に渡します。
const AWS = require('aws-sdk')
const CiphertextBlob = 'AQECAHjf+WkQYtH+9sxLq9RViQWd+oHbIcUOdX1uNHBK2hEXhAAAAGkwZwYJKoZIhvcNAQcGoFowWAIBADBTBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDMI9ixmjyICcSa4+egIBEIAmojl8e63GFxuAUf7ZjzGQl0/R5Noe3E88GwIwYS++KnP5aE0NGHc='
new AWS.KMS({
region: 'ap-northeast-1'
})
.decrypt({
CiphertextBlob: new Buffer(CiphertextBlob, 'base64')
}, (err, data) => console.log(data.Plaintext.toString()))
実行
node .
結果
hello_world
補足
今はLambdaで環境変数が使えます。
API keyの保存には、環境変数を使う方がよいかもしれません。
【アップデート】AWS Lambdaで環境変数を使えるようになりました!!! | Developers.IO