次のバケット ポリシーを使用すると、期待どおりに PUT アクセスが制限されていることがわかります。ただし、この操作を許可するものがないにもかかわらず、作成されたオブジェクトで GET が許可されています。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowPut",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::<BUCKET>/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": [
"<IP ADDRESS>"
]
}
}
}
]
}
次のように、curl を使用して<BUCKET>ファイルを PUT することができます。<IP ADDRESS>
curl https://<BUCKET>.s3-<REGION>.amazonaws.com/ --upload-file test.txt
ファイルが正常にアップロードされ、S3 コンソールに表示されます。何らかの理由で、インターネット上のどこからでもファイルを取得できるようになりました。
curl https://<BUCKET>.s3-<REGION>.amazonaws.com/test.txt -XGET
これは、上記の方法を使用してアップロードされたファイルにのみ適用されます。S3 Web コンソールでファイルをアップロードするときに、curl を使用して GET できません (アクセスが拒否されました)。したがって、これはオブジェクト レベルの権限の問題だと思います。バケット ポリシーがこのアクセスを暗黙的に拒否しない理由はわかりませんが。
コンソールでオブジェクト レベルのアクセス許可を見ると、コンソールからアップロードされたファイル (方法 1) と、許可されたものからアップロードされたファイル (方法 2) の唯一の違いは、<IP ADDRESS>方法 2 のファイルには「所有者」がないことです。 、アクセス許可、またはメタデータ - メソッド 1 ファイルにはこれらすべてが含まれています。
さらに、バケットへのフルアクセス権を持つロールを引き受ける Lambda スクリプト (boto3 download_file()) を使用してオブジェクトを取得しようとすると、方法 2 でアップロードされたオブジェクトでは失敗します。方法 1 でアップロードされたオブジェクトでは成功します。