説明
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 に対象を絞ってください。