🔌

VPC Lambdaのセキュリティベストプラクティス

2024/06/14に公開

VPC Lambdaの仕組み

AWS Lambdaでは、Lambda関数がVPC内のリソースにアクセスできるよう設定することができます。この機能を有効にすると、Lambda関数の実行時にENIがVPC内に自動で作成されます。

VPC Lambdaのアーキテクチャ
[発表] Lambda 関数が VPC 環境で改善されます | Amazon Web Services ブログ より引用

そのため、この機能を使用するには、関数の実行ロールに以下のアクセスポリシーを追加するか、同等のAWS管理ポリシーAWSLambdaVPCAccessExecutionRoleを追加しなければならないとAWS公式ドキュメントに書かれています。

{
  "Effect" : "Allow",
  "Action" : [
    "ec2:CreateNetworkInterface",
    "ec2:DescribeNetworkInterfaces",
    "ec2:DescribeSubnets",
    "ec2:DeleteNetworkInterface",
    "ec2:AssignPrivateIpAddresses",
    "ec2:UnassignPrivateIpAddresses"
  ],
  "Resource" : "*"
}

https://docs.aws.amazon.com/lambda/latest/dg/configuration-vpc.html#configuration-vpc-permissions

問題点

上記のポリシーにはセキュリティ上の懸念があります。関数の実行ロールに上記のアクセスポリシーを追加するということは、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はセットされません。この挙動は以下のページに明記されています。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/permissions-source-function-arn.html

上記のポリシーではこの仕様を利用し、lambda:SourceFunctionArnがセットされていない場合のみENIの作成を許可しています。

参考

この記事は、以下の公式ドキュメントの節「Security best practices」の内容に沿っています。

https://docs.aws.amazon.com/lambda/latest/dg/configuration-vpc.html#configuration-vpc-best-practice

GitHubで編集を提案

Discussion