IP 制限をかけているバケットに対して AWS Backup で復元ポイントを作成する方法について

2022.08.12

困っていた内容

S3 のバケットポリシーで IP 制限をかけると、AWS Backup のジョブが失敗する。 どのようなポリシーにすればいいでしょうか。

どう対応すればいいの?

この場合、"aws:ViaAWSService": "false" を使えばいいように見えますが、AWS Backup からのアクセスはサービスロールからのアクセスになるようです。
そのため以下ドキュメントの通り、値は "false" を返し、これでは避けることができません。

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

サービスが IAM プリンシパルの認証情報を使用し、プリンシパルに代わってリクエストを実行すると、リクエストコンテキストキーは true を返します。
サービスがサービスロールまたはサービスリンクロールを使用してプリンシパルに代わって呼び出しを行う場合、コンテキストキーは false を返します。
リクエストコンテキストキーは、プリンシパルが直接呼び出しを行ったときも false を返します。

この場合、AWSBackup に使用するサービスロールである「AWSBackupDefaultServiceRole」以外のアクセスを制限することで、
特定 IP アドレス以外からのアクセス制限をかけつつ AWSBackup を利用することができます。

実際に適用するバケットポリシーの例は以下の様な形になります。

{  
    "Version": "2012-10-17",  
    "Statement": [  
        {  
            "Effect": "Deny",  
            "Principal": "*",  
            "Action": "s3:*",  
            "Resource": [  
                "arn:aws:s3:::バケット名",  
                "arn:aws:s3:::バケット名/*"  
            ],  
            "Condition": {  
                "StringNotLike": {  
                    "aws:userid": "IAM ロール ID:*"  
                },  
                "NotIpAddress": {  
                    "aws:SourceIp": [  
                        "xxx.xxx.xxx.xxx/32",  
                        "xxx.xxx.xxx.xxx/32",  
                        "xxx.xxx.xxx.xxx/32"  
                    ]  
                }  
            }  
        }  
    ]  
}

この際は対象のロールを IAM ロール ID で指定しますが、こちらはマネジメントコンソールから確認することができません。
そのため、AWSCLI のコマンド等で確認してください。

例) $ aws iam get-role --role-name <ロール名>

参考資料

[AWS] S3バケットポリシーで、特定のIAMロールだけがバケットにアクセス出来るようにする。