S3バケットポリシーにIPアドレス制限を加えると AWS Backup の S3 バケットのバックアップに失敗する事象の対処法

S3 バケットポリシーでアクセス制限を加えた場合は、AWS Backup で用いるサービスロールからのアクセスに対する明示的な拒否を除外する必要があります。
2022.08.16

困っていた内容

awsbackup-test-001 のバケットを AWS Backup でバックアップを取っています。

セキュリティ対策として、S3バケットポリシーに下記の通り、IP アドレス制限を加えました。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "SourceIPRestriction001",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::awsbackup-test-001",
                "arn:aws:s3:::awsbackup-test-001/*"
            ],
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": [
                        "192.0.2.0/24",
                        "203.0.113.0/24"
                    ]
                }
            }
        }
    ]
}

この設定を行ったことで、AWS Backup の S3 バケットのバックアップに失敗するようになりました。

どのように対処すれば良いですか?

どう対応すればいいの?

AWS Backup などサービスからアクションを実行する場合は、サービスロールを使用します。

そのため、S3 バケットポリシーに、当該のロールからのアクションについて明示的な拒否から除外する必要があります。

下記のように変更してください。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "SourceIPRestriction001",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::awsbackup-test-001",
                "arn:aws:s3:::awsbackup-test-001/*"
            ],
            "Condition": {
                "StringNotLike": {
                    "aws:userId": "AROASAMPLESAMPLESAMPL:*"
                },
                "NotIpAddress": {
                    "aws:SourceIp": [
                        "192.0.2.0/24",
                        "203.0.113.0/24"
                    ]
                }
            }
        }
    ]
}

なお、AWS Backup でデフォルトで使用しているサービスロール: AWSBackupDefaultServiceRole の RoleId を取得するためには AWS CLI コマンドの get-role を用います。

$ aws iam get-role --role-name AWSBackupDefaultServiceRole
{
    "Role": {
        "Path": "/service-role/",
        "RoleName": "AWSBackupDefaultServiceRole",
        "RoleId": "AROASAMPLESAMPLESAMPL",
        "Arn": "arn:aws:iam::<account-id>:role/service-role/AWSBackupDefaultServiceRole",
        "CreateDate": "2022-08-15T07:46:37+00:00",
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Effect": "Allow",
                    "Principal": {
                        "Service": "backup.amazonaws.com"
                    },
                    "Action": "sts:AssumeRole"
                }
            ]
        },
        "Description": "Provides AWS Backup permission to create backups and perform restores on your behalf across AWS services",
        "MaxSessionDuration": 3600,
        "RoleLastUsed": {}
    }
}

やってみた

事前に デフォルトサービスロール: AWSBackupDefaultServiceRole にマネージドポリシー: AWSBackupServiceRolePolicyForS3BackupAWSBackupServiceRolePolicyForS3Restore をアタッチしておきます。

IP 制限がされている S3 バケットに対して、AWS Backup のオンデマンドバックアップを実行してみます。

「Access Denied」というエラーメッセージが発生し、失敗しました。

バケットポリシーで AWSBackupDefaultServiceRole の RoleId を Condition 句を用いて明示的な拒否対象から除外した後、再度実行します。

無事、成功しました。

参考資料

How to Restrict Amazon S3 Bucket Access to a Specific IAM Role | AWS Security Blog

[アップデート] AWS BackupのAmazon S3サポートがGAになりました | DevelopersIO