当前位置: 首页 > 知识库问答 >
问题:

上传文档时拒绝访问,如何设置权限配置文件和bucket策略?

韩鸿
2023-03-14

我需要一点指导如何设置我的S3桶策略和/或IAM权限配置文件。我们的Rails应用程序将文件上传到桶中,并在上传后显示文档的链接。基本上,我想启用阻止所有公共访问,因为它是安全的,但从内Rails应用程序文档应该能够上传和打开时,点击一个链接。因此,我创建了一个具有以下权限配置文件的IAM用户:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::<bucket-name>",
                "arn:aws:s3:::<bucket-name>"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::<bucket-name>/*",
                "arn:aws:s3:::<bucket-name>/*"
            ]
        }
    ]
}

然后我添加了一个桶策略,如下所示:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<iam-user>"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::<bucket-name>/*"
        }
    ]
}

对于“Action”:“s3:*”,我想我是说:这个用户可以在这个bucket上做任何事情吗?这适用于打开文档,但在上载文档时,访问被拒绝。那么,我需要做什么改变才能使上传文档再次正常工作呢?

共有2个答案

张璞
2023-03-14

您可以为您的文件创建S3预签名url。这将使您页面的访问者能够下载它们,而无需显式公开。预先签名的网址是临时的,因此您需要一个重新生成过期网址的机制。

其他流行的选择是通过CloudFront公开文件。这样,您的存储桶不仅可以保持完全私有,而且还可以获得全局CDN的好处,它可以更快地为您的文件提供服务器。

景鸿才
2023-03-14

如果您希望授予应用程序访问(上传/下载)Amazon S3存储桶的权限,则应在应用程序正在使用的IAM用户或IAM角色的IAM策略中授予权限。没有必要还创建一个桶策略。

这将允许应用程序上传和下载内容。

当应用程序希望允许用户访问私有对象时,它应该生成Amazon S3预签名网址,这是一个有时间限制的网址,提供对私有对象的临时访问。URL可以作为链接插入到超文本标记语言中,甚至可以插入到标记中(例如

预签名的URL也可用于将对象上载到bucket。通过这种方式,应用程序可以控制谁可以上传对象以及将其放置在何处。请参阅:使用预先指定的URL上载对象-Amazon简单存储服务

 类似资料:
  • 问题内容: 因此,我只是试图创建一个通过gmail进行导航并自动执行某些任务的代码。我设法成功自动登录到GMail,但是尝试登录页面源时登录后仍然遇到此错误代码。 错误代码 Java代码 注意:我使用的是最新版的Firefox和最新版的Selenium PS:关于类似问题,我经历了11个以上的不同问题,没有人提供明确的解决方案,答案也非常模糊。 问题答案: 伙计们,我很久以前就找到了解决此问题的方

  • 请让我知道如何解决这个问题。

  • 我的应用程序的目标SdkVersion=29 我拍了一张照片,它保存在路径: src=/storage/simulated/0/DCIM/Camera/IMG_20201120_091943。jpg 然后我想使用FileInputStream/FileOutputStream将此图像复制到内部存储。虽然,我的应用程序有WRITE/READ存储权限,但当我编码 我收到了一个FileNotFoundE

  • 用户在轻推上传文件时,考虑到对文件的传播有着不同的考量,因此在发送文件时也可以对文件的转发和下载权限进行设置。转发权限可选择:可转发、仅在企业内转发、不可转;下载权限可设置:可下载和不可下载。 例如,当文件为企业内的重要文件,仅希望企业内员工可见,不希望外传时,则可以设置文件为仅在企业内转发,不可下载;设置后,则该文件只能在企业内分享,文件可以支持在线预览,不可下载,并且将加上阅读者的名字和手机号

  • 这似乎很奇怪,因为该命令试图在Program Files中更改文件,而不是在C:\users\username中更改它应该在的位置。此外,当我为一个.gitconfig文件检查C:\users\username时,我找不到一个。有人知道这是怎么回事吗?

  • 问题内容: 我正在使用拥有者设置为的Apache Web服务器。我永远都不知道文件权限的最佳做法是什么,例如,当我创建新的Laravel 5项目时。 Laravel 5要求文件夹可写。我发现了很多不同的方法可以使其正常工作,而我通常以递归方式使其成为chmod。我知道这不是最好的主意。 官方文件说: Laravel可能需要配置一些权限:Web服务器中的文件夹, 并且需要Web服务器进行写访问。 这