VPC Lambdaのセキュリティベストプラクティス
VPC Lambdaの仕組み
AWS Lambdaでは、Lambda関数がVPC内のリソースにアクセスできるよう設定することができます。この機能を有効にすると、Lambda関数の実行時にENIがVPC内に自動で作成されます。
[発表] Lambda 関数が VPC 環境で改善されます | Amazon Web Services ブログ より引用
そのため、この機能を使用するには、関数の実行ロールに以下のアクセスポリシーを追加するか、同等のAWS管理ポリシーAWSLambdaVPCAccessExecutionRole
を追加しなければならないとAWS公式ドキュメントに書かれています。
{
"Effect" : "Allow",
"Action" : [
"ec2:CreateNetworkInterface",
"ec2:DescribeNetworkInterfaces",
"ec2:DescribeSubnets",
"ec2:DeleteNetworkInterface",
"ec2:AssignPrivateIpAddresses",
"ec2:UnassignPrivateIpAddresses"
],
"Resource" : "*"
}
問題点
上記のポリシーにはセキュリティ上の懸念があります。関数の実行ロールに上記のアクセスポリシーを追加するということは、Lambda関数が上記の操作を自由に行えるということです。
すなわち、Lambda関数のコードからENIの作成や削除、プライベートIPの付け替えが自由にできるようになってしまいます。これは最小権限の原則の観点から望ましくないでしょう。
解決策
以下のポリシーを設定すると、LambdaサービスにのみENIの作成を許可し、Lambda関数のコードにはそのような操作を許可しない、というアクセス許可が実現できます。
{
"Effect" : "Allow",
"Action" : [
"ec2:CreateNetworkInterface",
"ec2:DescribeNetworkInterfaces",
"ec2:DescribeSubnets",
"ec2:DeleteNetworkInterface",
"ec2:AssignPrivateIpAddresses",
"ec2:UnassignPrivateIpAddresses"
],
"Resource" : "*",
"Condition": {
"Null": {
"lambda:SourceFunctionArn": "true"
}
}
}
このポリシーではIAM条件キーlambda:SourceFunctionArn
を使用しています。
Lambda関数の実行環境からAWS APIにリクエストを送信すると、関数のARNがlambda:SourceFunctionArn
としてコンテキストに挿入されます。一方でLambdaサービスがENIの作成を行う際にはlambda:SourceFunctionArn
はセットされません。この挙動は以下のページに明記されています。
上記のポリシーではこの仕様を利用し、lambda:SourceFunctionArn
がセットされていない場合のみENIの作成を許可しています。
参考
この記事は、以下の公式ドキュメントの節「Security best practices」の内容に沿っています。
Discussion