创建限制公共访问、仅允许Cognito用户上传的S3桶政策
解决方案:给你的S3桶配置符合需求的权限策略
首先得确认你的S3桶公共访问阻止设置已经完全拉满——就是那四个选项全开启:阻止新的公共ACL、阻止公共ACL、阻止公共桶策略、限制公共桶策略,这是兜底的基础,确保没有任何漏网的公共访问途径。
回头看你现在的桶策略,有几个地方不符合你的需求:
- 把未授权用户的角色
Cognito_katebUnauth_Role也加进去了,这等于允许没注册的人也能碰桶,得去掉 - 还包含了
transcribe-role-k5easa7b这个转录服务角色,如果你的需求里不需要这个角色访问桶,直接删掉就行 - 给了
s3:*全权限,太宽泛了,咱们只需要上传相关的操作就够
下面是改好的策略,精准控制只有Cognito授权用户能上传,同时彻底封死公共访问:
{ "Version": "2012-10-17", "Id": "RestrictToCognitoAuthUsers", "Statement": [ { "Sid": "AllowCognitoAuthUsersUpload", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::358110801253:role/Cognito_katebAuth_Role" }, "Action": [ "s3:PutObject", "s3:PutObjectAcl" // 要是你的应用不需要设置对象ACL,直接删掉这行就行 ], "Resource": "arn:aws:s3:::va-raw-audio-to-transcribe/*" }, { "Sid": "DenyPublicAccess", "Effect": "Deny", "Principal": "*", "Action": "s3:*", "Resource": [ "arn:aws:s3:::va-raw-audio-to-transcribe", "arn:aws:s3:::va-raw-audio-to-transcribe/*" ], "Condition": { "Bool": { "aws:SecureTransport": "false" // 可选:强制所有请求用HTTPS,更安全 } } } ] }
为啥这么改?给你掰扯清楚:
- AllowCognitoAuthUsersUpload 这一段:只给Cognito授权用户的角色开了上传对象的权限(
s3:PutObject),而且权限范围只限定在桶里的文件(/*),桶本身的权限没给,避免不必要的风险。 - DenyPublicAccess 这一段:直接拒绝所有人的所有S3操作,但因为针对
Cognito_katebAuth_Role的Allow规则优先级会覆盖这个Deny,所以授权用户还是能正常上传。加的aws:SecureTransport条件是额外的安全层,确保所有请求都是加密的HTTPS。
额外提醒:
- 要是你还需要那个转录角色访问桶(比如要读取音频文件做转录),就在Allow语句的Principal里加上
arn:aws:iam::358110801253:role/service-role/transcribe-role-k5easa7b,然后把Action改成需要的,比如s3:GetObject。 - 别忘了检查你的Cognito身份池配置,确保授权用户能拿到
Cognito_katebAuth_Role的临时凭证,应用代码里也得用这些凭证来访问S3才行。
内容的提问来源于stack exchange,提问作者Meng Ge
相关产品推荐
相关产品推荐

