🎯

[AWS] IAM Access Deniedエラー解決ガイド #3 - 条件付きアクセス制御

2025/01/15に公開

🌟 はじめに

おぐまです。
本記事は「IAM Access Deniedエラー解決ガイド」シリーズの第3回です。
今回は、条件付きアクセス制御に関連するAccess Deniedエラーの解決方法について解説します。

📚 条件付きアクセス制御の基本

Condition要素について

IAMポリシーのCondition要素を使用することで、きめ細かなアクセス制御が可能になります。

条件演算子の種類

  1. 文字列演算子
  • StringEquals
  • StringNotEquals
  • StringLike
  • StringNotLike
"Condition": {
    "StringEquals": {
        "aws:ResourceTag/Environment": "Production"
    },
    "StringLike": {
        "s3:prefix": ["projects/${aws:username}/*"]
    }
}
  1. 数値演算子
  • NumericEquals
  • NumericNotEquals
  • NumericLessThan
  • NumericGreaterThan
"Condition": {
    "NumericLessThan": {
        "s3:max-keys": "10"
    }
}
  1. 日付演算子
  • DateEquals
  • DateNotEquals
  • DateLessThan
  • DateGreaterThan
"Condition": {
    "DateGreaterThan": {
        "aws:CurrentTime": "2024-01-01T00:00:00Z"
    }
}
  1. ブール演算子
  • Bool
"Condition": {
    "Bool": {
        "aws:MultiFactorAuthPresent": "true"
    }
}

条件キーの種類

1. グローバル条件キー

全AWSサービスで使用可能な条件キー

  • aws:CurrentTime
  • aws:PrincipalTag
  • aws:SourceIp
  • aws:UserAgent
  • aws:username
"Condition": {
    "StringLike": {
        "aws:PrincipalTag/Department": "Engineering",
        "aws:username": "admin-*"
    }
}

2. サービス固有の条件キー

特定のサービスでのみ使用可能な条件キー

  • s3:prefix
  • ec2:ResourceTag
  • lambda:FunctionVersion
"Condition": {
    "StringEquals": {
        "s3:RequestObjectTag/classification": "confidential",
        "ec2:ResourceTag/Project": "WebApp"
    }
}

ポリシー変数の活用

ポリシー変数を使用することで、動的な値をポリシーに組み込むことができます:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": ["s3:ListBucket", "s3:GetObject"],
            "Resource": [
                "arn:aws:s3:::company-data/${aws:username}/*",
                "arn:aws:s3:::team-data/${aws:PrincipalTag/Team}/*"
            ]
        }
    ]
}

よく使用される変数:

  • ${aws:username}
  • ${aws:userid}
  • ${aws:PrincipalTag/TagKey}
  • ${aws:CurrentTime}

💡 5つの代表的なシナリオと解決方法

1. タグベースのアクセス制御(ABAC)

エラーメッセージ例

User is not authorized to perform: ec2:StartInstance on resource i-1234567890abcdef0 
due to resource tag conditions

解決手順

  1. タグポリシーの確認
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ec2:*",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/Environment": ["Production"],
                    "aws:ResourceTag/Owner": "${aws:username}"
                }
            }
        }
    ]
}
  1. リソースタグの確認
  2. IAMユーザーのタグ確認

2. IP制限によるアクセス制御

エラーメッセージ例

User is not authorized to perform: s3:GetObject due to IP address restriction

解決手順

  1. IPポリシーの確認
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Action": "*",
            "Resource": "*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": [
                        "203.0.113.0/24",
                        "2001:DB8::/32"
                    ]
                }
            }
        }
    ]
}
  1. クライアントIPの確認
  2. VPNやプロキシの確認

3. 時間帯制限

エラーメッセージ例

User is not authorized to perform action outside of allowed time window

解決手順

  1. 時間制限ポリシーの確認
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "*",
            "Resource": "*",
            "Condition": {
                "DateGreaterThan": {"aws:CurrentTime": "2024-01-01T09:00:00Z"},
                "DateLessThan": {"aws:CurrentTime": "2024-12-31T17:00:00Z"},
                "Bool": {"aws:MultiFactorAuthPresent": "true"}
            }
        }
    ]
}
  1. タイムゾーンの確認
  2. MFA認証状態の確認

4. VPCエンドポイントでの条件制御

エラーメッセージ例

User is not authorized to perform action through this VPC endpoint

解決手順

  1. エンドポイントポリシーの確認
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowSpecificVPCAccess",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::my-bucket/*"
            ],
            "Condition": {
                "StringEquals": {
                    "aws:SourceVpc": "${aws:PrincipalTag/VPC}",
                    "aws:SourceVpce": "vpce-1234567890abcdef0"
                }
            }
        }
    ]
}
  1. エンドポイントの設定確認
  2. ルートテーブルの確認

5. 複合条件による制御

エラーメッセージ例

Access denied due to multiple condition checks

解決手順

  1. 複合条件ポリシーの確認
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::${aws:PrincipalTag/Project}/*",
            "Condition": {
                "StringEquals": {
                    "aws:PrincipalTag/Department": "Engineering",
                    "s3:RequestObjectTag/Classification": "Internal"
                },
                "DateGreaterThan": {
                    "aws:CurrentTime": "${aws:PrincipalTag/ValidFrom}"
                },
                "Bool": {
                    "aws:MultiFactorAuthPresent": "true"
                }
            }
        }
    ]
}
  1. 各条件の評価結果確認
  2. ポリシー変数の値確認

📋 トラブルシューティングのベストプラクティス

  1. 条件評価の確認

    • Condition要素の構文
    • 値の一致確認
    • 複数条件の論理演算
  2. 環境要因の確認

    • ネットワーク設定
    • タイムゾーン設定
    • クライアント環境
  3. 監査とモニタリング

    • CloudTrailログの確認
    • メトリクスの監視
    • アラートの設定

🎉 まとめ

条件付きアクセス制御のAccess Deniedエラーの解決には、以下の点が重要です。

  1. 条件要素の正確な理解
  2. 条件演算子の適切な使用
  3. グローバル条件キーとサービス固有条件キーの使い分け
  4. ポリシー変数の効果的な活用
  5. 包括的なトラブルシューティングアプローチ

次回は、AWS IAMのトラブルシューティングツールについて詳しく解説する予定です!

参考リンク

GitHubで編集を提案
株式会社エーピーコミュニケーションズ

Discussion