😇
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
参考
Discussion