過剰な権限を持つ実行ロールを使用する AWS Lambda 関数

Lambda の実行ロールに過剰な権限がないか確認し、関数に必要な操作とリソースにアクセスを限定します。

説明

Lambda の実行ロールは、関数のコードがほかの AWS サービスにアクセスするための権限を持ちます。iam:* のような広範な権限や、別のロールの使用または認証情報の作成に関わる sts:AssumeRole、iam:CreateLoginProfile などの権限を不要に付与すると、関数が侵害された際の被害が広がるおそれがあります。

実際に行える操作は、関連付けられたポリシー、リソースの範囲、条件、アクセス許可の境界、その他の制限によって変わります。強い権限が必要な関数では、業務上の必要性を確認し、許可する対象と条件を十分に限定してください。

想定される影響

  • 関数が侵害されると、実行ロールに許可された、セキュリティへの影響が大きい IAM 操作が悪用される可能性があります。
  • 実効権限やほかのポリシーによっては、追加の認証情報の作成や別のロールの使用により影響が広がるおそれがあります。
  • 過剰な権限を持つロールを複数の関数で共有すると、事故の影響範囲が広がり、権限管理も複雑になります。

対処方法

  • 関数が実際に使用する操作とリソースを確認し、不要な権限を削除してください。
  • 関数の用途に合った実行ロールを使用し、対応している操作ではリソースや条件を具体的に指定してください。
  • インラインポリシー、管理ポリシー、アクセス許可の境界、その他の制限を合わせて確認し、必要な機能が引き続き動作することをテストしてください。

例

以下はポリシーの違いを示す Terraform の抜粋です。Lambda 関数、実行ロールの定義、および関数とロールを関連付ける設定は省略しています。

変更前

hcl
resource "aws_iam_role_policy" "lambda_privileged_policy" {
  name = "lambda-privileged-policy"
  role = aws_iam_role.lambda_execution_role.id

  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Action = [
          "ec2:Describe*",
          "iam:*"
        ]
        Effect   = "Allow"
        Resource = "*"
      }
    ]
  })
}

変更後

hcl
resource "aws_iam_role_policy" "lambda_scoped_policy" {
  name = "lambda-scoped-policy"
  role = aws_iam_role.lambda_execution_role.id

  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Action = [
          "ec2:Describe*",
          "s3:GetObject"
        ]
        Effect   = "Allow"
        Resource = "*"
      }
    ]
  })
}

説明:

  • 変更前: すべてのリソースに対して iam:* を許可しています。この広いアクセス範囲が実行ロールに必要か確認する必要があります。
  • 変更後: iam:* は削除していますが、Resource = "*" と広い読み取り権限が残っています。最小権限の設定が完了したわけではありません。特に s3:GetObject は、必要なバケット内のオブジェクト ARN に対象を絞ってください。

参考資料