アップロード ポリシーとフォーム フィールドを使用して、アップロードごとにサーバー側の暗号化を有効にするなど、ブラウザから S3 にファイルを直接アップロードするための直接ブラウザ アップロード フォームを使用していますfor x-amz-server-side-encryption
。
問題は、アップロードされたファイルにサーバー側の暗号化を適用する S3 側のバケット ポリシーにあります。バケット ポリシーが設定されていないため、サーバー側の暗号化が有効になっているため、ファイルは完全にアップロードされます。バケット ポリシーを追加すると、HTTP 403 (AccessDenied) エラーでアップロードが拒否されます。
私が使用している完全なバケット ポリシーは次のとおりです (Amazon のドキュメントから引用)。
{
"Version": "2008-10-17",
"Id": "PutObjPolicy",
"Statement": [
{
"Sid": "DenyUnEncryptedObjectUploads",
"Effect": "Deny",
"Principal": {
"AWS": "*"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::MY-BUCKET-NAME/*",
"Condition": {
"StringNotEquals": {
"s3:x-amz-server-side-encryption": "AES256"
}
}
}
]
}
署名され、アップロード フォームで使用されるポリシー (エンコードされておらず、フォーマットされていない) の例を次に示します。
{
"expiration": "2013-04-14T14:29:56.000Z",
"conditions": [
{
"bucket": "MY-BUCKET-NAME"
},
{
"acl": "private"
},
{
"x-amz-server-side-encryption": "AES256"
},
[
"starts-with", "$key", "uploads/"
],
{
"success_action_status": "201"
}
]
}
簡潔にするためにアップロード フォームの詳細は省略しますが、対応する非表示のフォーム フィールドをx-amz-server-side-encryption
. 繰り返しますが、これはバケット ポリシーがなくても機能するため、これのクライアント側の側面は良好な状態にあると思います。この時点で、特定のクラスの PUT を具体的に許可する必要があると思いますが、何を追加すればよいかわかりません。
何か案は?