説明
Lambda 関数のリソースベースポリシーは、他のアカウントやサービスによるその関数へのアクセスを管理します。lambda:* のような広い許可ではなく必要な操作を指定し、サービス主体を信頼するときは実際のイベントソースも制限してください。
この権限は、関数のコードが実行中に使う実行ロールとは別です。関数ポリシーの許可を、アカウント内の全 Lambda 関数に対する管理権限と解釈しないでください。
想定される影響
- 不要な関数アクセス権限が与えられたり、意図しないイベントソースから呼び出されたりする可能性があります。
- 不要な呼び出しは、コスト増加や関数が処理するデータ・業務の悪用につながるおそれがあります。
対処方法
- 通常の関数呼び出しでは、lambda:InvokeFunction など必要な操作だけを許可してください。
- principal を必要な主体に制限し、サービスに適した source_arn と source_account 条件を確認してください。S3 連携では実際のバケット ARN と所有アカウントを制限してください。
- 正規のイベント呼び出しは成功し、未承認のソースは拒否されることを確認してください。実行ロールの権限も別途最小限にしてください。
例
S3 と EventBridge の異なる連携の権限を示す抜粋です。参照先の関数は別途定義し、EventBridge ルールの ARN は実際の値に置き換えてください。イベントソースと関数のターゲット設定も別途必要です。
変更前
hcl
resource "aws_lambda_permission" "allow_all" {
statement_id = "AllowAllResources"
action = "lambda:*"
function_name = aws_lambda_function.my_lambda.function_name
principal = "s3.amazonaws.com"
}
ソースバケットを制限せず、S3 サービスに lambda:* を許可しています。必要な呼び出し操作と、バケット・所有アカウントに限定してください。
変更後
hcl
resource "aws_lambda_permission" "allow_cloudwatch" {
statement_id = "AllowExecutionFromCloudWatch"
action = "lambda:InvokeFunction"
function_name = aws_lambda_function.test_lambda.function_name
principal = "events.amazonaws.com"
source_arn = "arn:aws:events:eu-west-1:111122223333:rule/RunDaily"
}
指定した EventBridge ルールからの関数呼び出しだけを許可する代替例です。既存の S3 連携をそのまま置き換える例ではありません。