😇

S3バケットにアクセスするオンプレサーバにIAMユーザーを払い出したくないんじゃ

に公開

概要

タイトル通りです。試行錯誤した結果を御覧ください。

仮説

S3のVPCエンドポイント(インターフェイス型)を使用するとプライベートIPアドレスでS3にアクセスが出来る。
オンプレとAWSがDirectGateway等でローカル接続されていれば、IAMユーザーを払い出さなくてもS3にアクセス出来るんじゃないか?

無理だった

AWS CLIやSDKを使うのにIAM認証情報が必要だからIAMユーザーは必要だったわ。

じゃあIAMユーザーにIAMポリシーを付けずに済む方法はないか?

万が一アクセスキーとシークレットキーが漏洩した場合に備えてIAMユーザ自体には何も権限付けておきたくない。

実際にやってみた。
(検証はCloudShellをVPC上に立てて行った)

0. VPCエンドポイント(インターフェイス型)を設置する。

これは前提

1. S3バケットポリシーでIAMユーザを許可する

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::BUCKET_NAME",
                "arn:aws:s3:::BUCKET_NAME/*"
            ]
        }
    ]
}

これでVPCエンドポイント経由でアクセスする。

aws s3 ls s3://BUCKET_NAME/ --region us-east-1 --endpoint-url https://bucket.vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com

これはできた。

2. S3アクセスポイントでIAMユーザを許可する

これもできた。

aws s3api list-objects-v2 --bucket arn:aws:s3:us-east-1:123456789012:accesspoint/accesspointexamplename --region us-east-1 --endpoint-url https://accesspoint.vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com

ネットワークオリジンをVPCに設定しておけば実質VPCエンドポイント経由を強制することが出来る。
つまり万が一キーが漏洩しても外からS3バケットに接続することは不可能となる。これでいいかも。

ちなみにVPC外のCloudShellで試した結果

$ aws s3 cp s3://S3_ACCESSPOINT_ALIAS/test.txt ./

fatal error: An error occurred (403) when calling the HeadObject operation: Forbidden

参考

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/privatelink-interface-endpoints.html#creating-vpc-endpoint-policy

Discussion