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

Django存储boto S3 collectstatic的最低凭据

夹谷阳夏
2023-03-14

我正在使用django-storestorages.backends.s3boto。S3BotoStorage遇到了一个奇怪的403错误。

我最初的IAM策略非常保守,只包括对象的get、put和delete。

--

然后我授予了除删除和创建bucket之外的所有权限

--

我终于给了完全权限,我想避免,我不再得到403错误。

我已经尝试根据此答案提供对桶根//*的访问权限

我的目标是只授予必要的权限。

共有3个答案

濮君植
2023-03-14

我假设这在最近几年发生了变化,但我只能使用以下权限收集静态数据:

{
    "Statement": [
        {
            "Action": [
                "s3:AbortMultipartUpload",
                "s3:GetObject",
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:DeleteObject",
                "s3:ListMultipartUploadParts"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::<bucket_name>/*"
            ]
        }
    ]
}

绊倒我的权限是PutObjectAcl。我也不确定是否需要多部分的东西,但我不想找出它对大文件或类似文件的必要性。

编辑:显然django-store在某些情况下会删除文件。我能够让它与:

{
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation",
                "s3:ListBucket",
                "s3:ListBucketMultipartUploads"
            ],
            "Resource": [
                "arn:aws:s3:::<bucket_name>"
            ]
        },
        {
            "Action": [
                "s3:AbortMultipartUpload",
                "s3:GetObject",
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:DeleteObject",
                "s3:DeleteObjectTagging",
                "s3:ListMultipartUploadParts"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::<bucket_name>/*"
            ]
        }
    ]
}

这里可能有几个额外的字段,但我无法重现删除操作以确认。

司业
2023-03-14

我也在尝试做同样的事情,我想我最终还是成功了(通过大量的谷歌搜索和其他StackOverflow答案)。这并不能保证是所需的最小权限集,但也不是全部。

这是用户Collect静态正在使用的IAM策略:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1399990928000",
      "Effect": "Allow",
      "Action": [
        "s3:ListAllMyBuckets"
      ],
      "Resource": [
        "arn:aws:s3:::*"
      ]
    }
  ]
}

这似乎很简单。

从这里开始,情况变得更加复杂。您需要更改的内容将标记在尖括号内。bucket策略应如下所示:

{
    "Version": "2008-10-17",
    "Id": "Permissions",
    "Statement": [
        {
            "Sid": "AllowAnybodyToGetBucketLocation",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:GetBucketLocation",
            "Resource": "arn:aws:s3:::<bucket_name>"
        },
        {
            "Sid": "AllowCollectstaticUserToListBucket",
            "Effect": "Allow",
            "Principal": {
                "AWS": "<collectstatic_user_arn_from_iam_user_summary>"
            },
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::<bucket_name>"
        },
        {
            "Sid": "AllowCollectstaticUserAccessToAllObjects",
            "Effect": "Allow",
            "Principal": {
                "AWS": "<collectstatic_user_arn_from_iam_user_summary>"
            },
            "Action": [
                "s3:DeleteObject",
                "s3:PutObjectAcl",
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::<bucket_name>/*"
        }
    ]
}

这至少为collectstatic的用户提供了所需的最低权限。

请注意,这假设您将所有对象直接转储到bucket的根目录中,而不是像static这样的目录中。我不完全确定如何做到这一点-我是否应该将资源指定为arn:aws:s3::

帮助我的来源:

  • http://blog.iambob.me/the-super-stupid-idiots-guide-to-getting-started-with-django-pipeline-and-s3/
  • 需要同时授予桶本身和子对象权限
  • 找出是S3上的权限问题还是django-store配置问题
  • 必须在IAM用户策略中执行
  • 一旦我设置了日志记录,这篇文章就帮我解码了日志
  • 显然,您可以指定权限全局,这允许我测试s3:Delete*s3:放置*s3:获取*分开。
缑兴贤
2023-03-14

这里是上传到特定bucket的bucket策略,在本例中是静态的。

{
    "Version": "2008-10-17",
    "Id": "StaticAndMediaPermissions",
    "Statement": [
        {
            "Sid": "AllowAnybodyToGetBucketLocation",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:GetBucketLocation",
            "Resource": "arn:aws:s3:::<bucket_name>"
        },
        {
            "Sid": "AllowCollectstaticUserToListStaticDirectory",
            "Effect": "Allow",
            "Principal": {
                "AWS": "<collectstatic_user_arn_from_iam_user_summary>"
            },
            "Action": [
                "s3:ListBucket",
                "s3:ListBucketMultipartUploads"
            ],
            "Resource": [
                "arn:aws:s3:::<bucket_name>",
                "arn:aws:s3:::<bucket_name>/static"
            ]
        },
        {
            "Sid": "AllowCollectstaticUserAccessToAllObjectsInStaticDirectory",
            "Effect": "Allow",
            "Principal": {
                "AWS": "<collectstatic_user_arn_from_iam_user_summary>"
            },
            "Action": [
                "s3:AbortMultipartUpload",
                "s3:DeleteObject",
                "s3:GetObject",
                "s3:PutObjectAcl",
                "s3:ListMultipartUploadParts",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::<bucket_name>/static/*"
        }
    ]
}

您仍然需要从我的其他答案中添加IAM用户策略。

确保在设置中将AWS\U位置变量设置为静态。py 。如果你没有那套,这就行不通了。

来源:*http://blogs.aws.amazon.com/security/post/Tx1P2T3LFXXCNB5/Writing-IAM-policies-Grant-access-to-user-specific-folders-in-an-Amazon-S3-bucke-走过如何设置目录特定的权限*https://stackoverflow.com/a/9649233/1999151-提示我使用AWS_LOCATION

或者,如果要为静态文件和媒体文件创建单独的目录,则需要按照以下说明操作:

https://stackoverflow.com/a/10626241/1999151

并从settings.py中删除AWS_LOCATION

您仍然需要从我的其他答案中添加IAM用户策略。

然后需要将AWS bucket策略调整为以下内容:

{
    "Version": "2008-10-17",
    "Id": "StaticAndMediaPermissions",
    "Statement": [
        {
            "Sid": "AllowAnybodyToGetBucketLocation",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:GetBucketLocation",
            "Resource": "arn:aws:s3:::<bucket_name>"
        },
        {
            "Sid": "AllowCollectstaticUserToListStaticAndMediaDirectories",
            "Effect": "Allow",
            "Principal": {
                "AWS": "<collectstatic_user_arn_from_iam_user_summary>"
            },
            "Action": [
                "s3:ListBucket",
                "s3:ListBucketMultipartUploads"
            ],
            "Resource": [
                "arn:aws:s3:::<bucket_name>",
                "arn:aws:s3:::<bucket_name>/media"
                "arn:aws:s3:::<bucket_name>/static"
            ]
        },
        {
            "Sid": "AllowCollectstaticUserAccessToAllObjectsInStaticAndMediaDirectories",
            "Effect": "Allow",
            "Principal": {
                "AWS": "<collectstatic_user_arn_from_iam_user_summary>"
            },
            "Action": [
                "s3:AbortMultipartUpload",
                "s3:DeleteObject",
                "s3:GetObject",
                "s3:PutObjectAcl",
                "s3:ListMultipartUploadParts",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::<bucket_name>/media/*",
                "arn:aws:s3:::<bucket_name>/static/*"
            ]
        }
    ]
}
 类似资料:
  • 如果你使用的是 SSH 方式连接远端,并且设置了一个没有口令的密钥,这样就可以在不输入用户名和密码的情况下安全地传输数据。 然而,这对 HTTP 协议来说是不可能的 —— 每一个连接都是需要用户名和密码的。 这在使用双重认证的情况下会更麻烦,因为你需要输入一个随机生成并且毫无规律的 token 作为密码。 幸运的是,Git 拥有一个凭证系统来处理这个事情。 下面有一些 Git 的选项: 默认所有都

  • 在带有npm 7.12.0版的Ubuntu上安装最新的web3 1.3.5版失败,出现了几个严重错误。修复的典型时间范围是什么? 下划线1.3.2-1.12.0 严重性:高 任意代码执行-https://npmjs.com/advisories/1674\没有可用的修复程序 节点\模块/下划线 。web3 bzz

  • 问题内容: 攻击 在凭证存储的情况下,一种可能的威胁模型是攻击者,它具有以下能力: 检查任何(用户)进程内存 读取本地(用户)文件 AFAIK,这种攻击的共识是无法阻止(因为必须将凭据存储在内存中,程序才能实际使用它们),但是有两种技术可以缓解这种攻击: 最小化敏感数据在内存中的存储时间 一旦不再需要数据,将覆盖内存 通过模糊措施来处理内存中的数据,继续移动数据以及其他安全性 特别是Python

  • 如果你使用的是 SSH 方式连接远端,并且设置了一个没有口令的密钥,这样就可以在不输入用户名和密码的情况下安全地传输数据。 然而,这对 HTTP 协议来说是不可能的 —— 每一个连接都是需要用户名和密码的。 这在使用双重认证的情况下会更麻烦,因为你需要输入一个随机生成并且毫无规律的 token 作为密码。 幸运的是,Git 拥有一个凭证系统来处理这个事情。 下面有一些 Git 的选项: 默认所有都

  • 我的用户名和密码存储在Git扩展内部的某个地方。过了一段时间,需要再给用户名和密码,我给错了很多次。 现在,如果我想拉一些东西等,我会收到。我不能给新的密码,它似乎是存储的,我不知道如何改变它。 是否可以删除旧凭据? 我有2.51.04版本。我已经卸载了它,重新安装,它没有帮助我。

  • 我有一个使用Firebase身份验证的node.js客户端。现在我想访问谷歌云存储,但是node.js的Firebase SDK不包括GCS。使用@google-云/存储工作,但只有匿名访问。如何将Firebase凭据应用到@google-Cloud/存储,以便在登录用户的上下文中访问GCS?