我只想在 Amazon Simple Storage Service (Amazon S3) 存储桶中存储某些文件类型。我想限制上传,以便我的存储桶只接受这些文件类型。
解决方法
您可以使用结合了允许和拒绝语句的存储桶策略,将文件上传限制为特定文件类型。这种方法通过对对象键进行模式匹配来强制执行文件扩展名要求。
**注意:**此方法根据对象键中的文件扩展名进行筛选,而不是基于实际文件内容或多用途互联网邮件扩展 (MIME) 类型。如果用户重命名文件,则可以绕过此限制。对于基于内容的验证,请考虑在应用程序层进行额外检查。
在存储桶策略中使用以下两种类型的语句:
-
Allow(允许)语句仅允许对与批准文件类型相匹配的对象执行 s3:PutObject 操作。
-
Deny(拒绝)语句拒绝对与批准文件类型不匹配的对象执行 s3:PutObject 操作。
**注意:**显式拒绝语句可防止上传未经授权的文件类型,即使是拥有广泛 S3 权限(例如管理访问权限)的用户也无法绕过。
例如,以下存储桶策略仅允许针对文件扩展名为 .jpg、.png 或 .gif 的对象对 exampleuser 执行 PutObject 操作:
{
"Version": "2012-10-17",
"Id": "Policy1464968545158",
"Statement": [
{
"Sid": "Stmt1464968483619",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111111111111:user/exampleuser"
},
"Action": "s3:PutObject",
"Resource": [
"arn:aws:s3:::DOC-EXAMPLE-BUCKET/*.jpg",
"arn:aws:s3:::DOC-EXAMPLE-BUCKET/*.png",
"arn:aws:s3:::DOC-EXAMPLE-BUCKET/*.gif"
]
},
{
"Sid": "Stmt1464968483619",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:PutObject",
"NotResource": [
"arn:aws:s3:::DOC-EXAMPLE-BUCKET/*.jpg",
"arn:aws:s3:::DOC-EXAMPLE-BUCKET/*.png",
"arn:aws:s3:::DOC-EXAMPLE-BUCKET/*.gif"
]
}
]
}
**注意:**将 DOC-EXAMPLE-BUCKET 替换为您的存储桶的名称。
对于第一个 Principal(主体)值,请列出您要向其授予上传权限的用户的 Amazon 资源名称 (ARN)。
**注意:**当您在存储桶策略中指定资源时,存储桶策略评估区分大小写。拒绝 NotResource arn:aws:s3:::DOC-EXAMPLE-BUCKET/*.jpg 的 s3:PutObject 操作的存储桶策略允许您上传 my_image.jpg。但是,如果您尝试上传 my_image.JPG,则 Amazon S3 会返回 Access Denied 错误。为了支持这两种大小写情况,请在策略中同时包含 *.jpg 和 *.JPG 扩展名。
此示例存储桶策略包括显式拒绝语句。如果用户不满足条件,那么即使是设置存储桶策略的用户也可能会失去对存储桶的访问权限。因此,在保存存储桶策略之前,请仔细阅读。如果您意外锁定了存储桶,请参阅不小心拒绝所有人访问 Amazon S3 存储桶后如何重新获得访问权限?
要根据文件类型以外的标准来保护 Amazon S3 存储桶,请使用适用于 S3 的 Amazon GuardDuty 恶意软件防护或 Amazon Macie。Amazon GuardDuty 恶意软件防护的扫描引擎会检查所有上传的文件是否存在恶意软件。Amazon Macie 会报告有关您上传到 S3 的支持的文件格式的敏感数据的调查发现。它使用内置标准或您的自定义数据标识符。