説明
Lambda実行ロールに過剰な権限があると、コードの脆弱性や誤動作がより多くのAWSリソースに影響する可能性があります。ロールやポリシーの名前だけで判断せず、関連付けたポリシー、条件、ほかの制御を確認してください。ワイルドカードがあっても特定のサービスや操作群に限定される場合があるため、実際の許可範囲を確認する必要があります。
想定される影響
関数が侵害されると、実行ロールに許可されたデータの読み取り・変更・削除などを悪用される可能性があります。不要な権限は被害の範囲を広げます。
対処方法
- 関数が使うAPIとリソースを確認し、実行ロールを最小権限に限定してください。共有ロールに、ほかの関数の不要な権限を蓄積させないでください。
- 必要なログ・サービスアクセスを維持しながら不要な権限を削除し、正常な呼び出しと未承認アクセスの拒否をテストしてください。
例
固定の応答を返す最小限の関数と、その実行ロールを定義します。実際のコードには、互換性のあるランタイムと処理に必要な権限を選んでください。
変更前
yaml
Resources:
AppendItemToListFunction:
Type: AWS::Lambda::Function
Properties:
Handler: index.handler
Role: !GetAtt LambdaExecutionRole.Arn
Runtime: nodejs22.x
Code:
ZipFile: |
exports.handler = async () => ({ statusCode: 200, body: "ok" });
LambdaExecutionRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Service: lambda.amazonaws.com
Action: sts:AssumeRole
Policies:
- PolicyName: AdminPolicy
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Action: "*"
Resource: "*"
すべての操作とリソースを許可しており、固定の応答を返す関数に必要な範囲を大きく超えています。
変更後
yaml
Resources:
AppendItemToListFunction:
Type: AWS::Lambda::Function
Properties:
Handler: index.handler
Role: !GetAtt LambdaExecutionRole.Arn
Runtime: nodejs22.x
Code:
ZipFile: |
exports.handler = async () => ({ statusCode: 200, body: "ok" });
LambdaExecutionRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Service: lambda.amazonaws.com
Action: sts:AssumeRole
Policies:
- PolicyName: LimitedPolicy
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Action:
- logs:CreateLogGroup
- logs:CreateLogStream
- logs:PutLogEvents
Resource: "*"
このポリシーはログ関連の操作だけを許可します。対象も実際のロググループに限定できるか検討し、ほかのAWS APIを呼ぶ場合は必要な権限だけを追加してください。