如何在不影响Amazon Athena使用的情况下阻止S3文件下载?
问题原因
你的IAM策略直接拒绝了所有s3:GetObject操作,而Athena执行查询时必须读取S3存储桶内的数据,必然会调用s3:GetObject,因此被策略拦截触发权限错误。EMR Notebooks能正常读取是因为它使用的是EMR集群的服务角色权限,不受当前用户IAM策略限制,符合你的预期。
解决方案:基于请求来源的条件化Deny策略
通过添加aws:CalledVia条件键,仅拒绝用户直接发起的s3:GetObject请求,允许Athena服务发起的请求,这样既阻止用户下载文件,又不影响Athena查询。
修改后的IAM策略如下:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::bucket-name/*", "Condition": { "StringNotEquals": { "aws:CalledVia": "athena.amazonaws.com" } } } ] }
关键说明
aws:CalledVia条件键用于识别请求的发起来源:- 当用户通过控制台、AWS CLI、SDK直接调用
s3:GetObject时,aws:CalledVia不包含athena.amazonaws.com,会触发Deny,阻止下载。 - 当Athena代表用户发起
s3:GetObject请求时,aws:CalledVia会标记为athena.amazonaws.com,因此不会被Deny,查询可正常执行。
- 当用户通过控制台、AWS CLI、SDK直接调用
- 如果需要保留其他服务(如EMR)的访问权限,可将对应服务域名添加到数组中,示例:
按你的描述当前EMR不受原策略影响,可根据实际测试结果决定是否添加。"StringNotEquals": { "aws:CalledVia": ["athena.amazonaws.com", "elasticmapreduce.amazonaws.com"] }
验证步骤
- 将修改后的策略应用给目标用户。
- 尝试直接通过AWS控制台下载S3文件,应提示权限不足。
- 运行Athena查询,确认能正常返回结果。
- 在EMR Notebooks中测试读取文件,确保访问正常。
内容的提问来源于stack exchange,提问作者Luiz
相关产品推荐
相关产品推荐

