説明
Lambda の environment.variables に AWS 認証情報を保存すると、デプロイ設定や Terraform の状態にシークレットが残ります。関数が環境変数をログに出力する場合や、設定へのアクセス権限を広く付与している場合にも漏えいする可能性があります。アクセスキー ID だけでは API 呼び出しを認証できませんが、対応するシークレットアクセスキーも漏えいすると、付与された権限が悪用されるおそれがあります。
関数から AWS リソースにアクセスする際は、実行ロールの一時的な認証情報を使用してください。このロールは、関数のデプロイに使う主体の権限とは別です。
想定される影響
- 有効な認証情報が別の環境で再利用され、許可された AWS 操作に悪用される可能性があります。
- コードやデプロイ設定に複製されたシークレットは、交換や利用先の把握が難しくなります。
- 漏えいしたキーを失効すると、そのキーに依存する関数が停止する可能性があります。
対処方法
- 環境変数からアクセスキー ID とシークレットアクセスキーを取り除き、実行ロールには必要な権限だけを付与してください。
- 外部サービスのシークレットは Secrets Manager または Systems Manager Parameter Store の
SecureStringで管理し、関数の取得権限を制限してください。 - 漏えいした認証情報の利用先を移行してから失効し、関連する操作を調査してください。ソース、状態、ログに残る複製にも対処してください。
例
以下は部分的な例です。lambda_runtime にはデプロイパッケージとハンドラーに適したサポート対象のランタイムを指定し、参照先の実行ロールを別途設定してください。
変更前
hcl
resource "aws_lambda_function" "lambda_function" {
filename = "lambda_function_payload.zip"
function_name = "lambda_function_name"
role = aws_iam_role.iam_for_lambda.arn
handler = "exports.test"
runtime = var.lambda_runtime
environment {
variables = {
foo = "AKIAIOSFODNN7EXAMAAA"
}
}
}
foo にはアクセスキー ID を連想させる例示用の文字列が入っています。この値が有効な認証情報であることを示すものではありませんが、実際の長期認証情報をこの方法で渡さないでください。
変更後
hcl
resource "aws_lambda_function" "lambda_function" {
filename = "lambda_function_payload.zip"
function_name = "lambda_function_name"
role = aws_iam_role.iam_for_lambda.arn
handler = "exports.test"
runtime = var.lambda_runtime
environment {
variables = {
foo = "test"
}
}
}
foo を通常の文字列に変更しています。実行ロールの権限設定や、すでに漏えいしたキーの失効は行われないため、別途対応してください。