web-dev-qa-db-ja.com

AWS Lambda:シークレットを外部APIに保存する方法は?

AWS Lambdaに基づいたモニタリングツールを構築しています。一連のメトリックを指定すると、LambdasはSMS using Twilio APIを送信できる必要があります。APIを使用できるように、TwilioはアカウントSIDと認証を提供しますトークン。

これらの秘密をどのように、どこに保存すればよいですか?

現在、 AWS KMS を使用することを考えていますが、他にも優れたソリューションがあるかもしれません。

53

これが私が思いついたものです。 AWS KMSを使用して、コードをAWS Lambdaにアップロードするファイルに秘密を暗号化します。それらを使用する必要があるときに、それを解読します。

従うべき手順は次のとおりです。

最初にKMSキーを作成します。ここでドキュメントを見つけることができます: http://docs.aws.Amazon.com/kms/latest/developerguide/create-keys.html

次に、秘密を暗号化し、結果をファイルに入れます。これは、CLIから次の方法で実現できます。

aws kms encrypt --key-id some_key_id --plaintext "This is the scret you want to encrypt" --query CiphertextBlob --output text | base64 -D > ./encrypted-secret

次に、このファイルをLambdaの一部としてアップロードする必要があります。次のように、Lambdaで秘密を解読して使用できます。

var fs = require('fs');
var AWS = require('aws-sdk');
var kms = new AWS.KMS({region:'eu-west-1'});

var secretPath = './encrypted-secret';
var encryptedSecret = fs.readFileSync(secretPath);

var params = {
  CiphertextBlob: encryptedSecret
};

kms.decrypt(params, function(err, data) {
  if (err) console.log(err, err.stack);
  else {
    var decryptedSecret = data['Plaintext'].toString();
    console.log(decryptedSecret);
  }
});

これがあなたのお役に立てば幸いです。

68

NodeJS 4.3のAWS Lambdaサポートの時点で、正しい答えは 環境変数 から 機密情報の保存 を使用することです。この機能はAWS KMSと統合されるため、デフォルトでは不十分な場合は、独自のマスターキーを使用してシークレットを暗号化できます。

10
Jamey

Kmsからapiキーを復号化することから始まるNodejs Lambda関数の設計図があります。 promiseインターフェイスを使用して簡単に復号化できます。また、kmsにアクセスするためにラムダ関数に付与する必要があるロール許可も提供します。青写真は、「algorithmia-blueprint」を検索して見つけることができます

3
bernays

まあ...それがKMSの目的です:) Lambda関数にプレーンテキストでトークンを保存したり、サードパーティのサービスに委任するよりも確かに安全です。

このルートを下る場合は、既存の使用例について this blog post をチェックして、起動と実行を高速化してください。特に、Lambda実行ロールポリシーに次を追加する必要があります。

_"kms:Decrypt",
"kms:DescribeKey",
"kms:GetKeyPolicy",
_

上記の例の残りのコードは少し複雑です。この場合、本当に必要なのはdescribeKey()だけです。

2
William Gaul