たそらぼ

日頃思ったこととかメモとか。

AWSサービスが代理で行うリクエストは、aws:SourceIp キーを適用しないIAMポリシー設定

aws:ViaAWSService キーで、AWSサービスが代理で行うリクエストは、IP制限を適用しないIAMポリシー設定にする設定です。

aws:SourceIp キーの注意点

aws:SourceIp キーは特に企業などで、社内ネットワーク外から操作ができないような設定をするために、よく使われていると思います。
例えばこんな感じです。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PrincipalPutObjectIfIpAddress",
            "Effect": "Allow",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::my-service-bucket/*",
            "Condition": {
                "IpAddress": {"aws:SourceIp": "123.45.167.89"}
            }
        }
    ]
}

AWSサービスが代理で操作を行う際などに、意図しないエラーが発生することがありました。
dev.classmethod.jp

これは、AWS サービスがプリンシパルの代わりに呼び出しを行う場合、aws:SourceIpキーの制限をつけたポリシーによってアクセスを拒否されるためです。

AWS グローバル条件コンテキストキー - AWS Identity and Access Management

aws:SourceIp 条件キーをポリシーで使用して、プリンシパルが指定された IP 範囲内からのみリクエストを行うことを許可できます。ただし、AWS サービスがプリンシパルの代わりに呼び出しを行う場合、このポリシーはアクセスを拒否します。

今の公式ドキュメントでは記載がないですが、先にリンクを貼ったClassmethodさんの記事を見ると、AWSサービスのIPアドレスがリクエスト元と認識されてしまうことが具体的な原因のようなので、下の図のようなイメージを持つと良さそうです。

f:id:tasotasoso:20200418212852p:plain:w500
意図しないエラーの原因

aws:ViaAWSService キー

February 20, 2020に追加されたキーです。
aws:ViaAWSService キーと一緒に aws:SourceIp を使用することで、プリンシパルによって直接行われたリクエストにのみソース IP 制限が適用されるようにできます。
例えば、以下のようなポリシーをつけることで、IP制限を行いつつ、AWSサービスが代理でリクエストを送る際はIP制限を適用しないことができます。

From https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_condition-keys.html

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PrincipalPutObjectIfIpAddress",
            "Effect": "Allow",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::my-service-bucket/*",
            "Condition": {
                "Bool": {"aws:ViaAWSService": "false"},
                "IpAddress": {"aws:SourceIp": "123.45.167.89"}
            }
        },
        {
            "Sid": "ServicePutObject",
            "Effect": "Allow",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::my-service-bucket/*",
            "Condition": {
                "Bool": {"aws:ViaAWSService": "true"}
            }
        }
    ]
}


Amazon EC2AWS Glue、AWS Lake Formation、AWS OpsWorksでは未対応のようです。

参考文献

docs.aws.amazon.com