【问题标题】:Specify AWS credentials in a Docker image在 Docker 映像中指定 AWS 凭证
【发布时间】:2020-02-21 08:31:17
【问题描述】:

我在 Flask Python 应用程序中使用 Amazon S3,但是,我不想硬编码我的访问密钥,因为 Amazon 在公开密钥方面存在问题。有没有办法让密钥进入应用程序而不暴露它们。我看到了一个关于使用环境变量的建议和另一个关于 IAM 用户角色的建议,但文档没有帮助。

编辑:我忘了提到我正在 Docker 上部署这个应用程序并希望允许它,这样如果另一个用户从 docker 拉取图像,我的访问密钥就不会被泄露。我没有使用 AWS EC2

【问题讨论】:

  • 您通常通过环境变量指定这些凭据。如果您使用的是 AWS 开发工具包,如果您在 AWS 基础设施上运行它,它还可以自动从分配给实例或容器的 IAM 角色中获取凭证。要为您获得最佳答案,您需要告诉我们更多关于您将如何运行您的应用程序。
  • 我将使用 docker build 创建应用程序的 docker 映像,以与我团队的其他成员共享,以便他们可以在各个区域使用该应用程序。应用程序从 S3 存储桶下载文件并将文件上传到其中。
  • 这能回答你的问题吗? stackoverflow.com/questions/36354423/…
  • 不使用 EC2,我的 Flask 应用程序只使用 S3 作为文件存储选项。我只需要应用程序中的密钥不仅适用于我的本地系统,而且适用于任何其他用户,而不会损害密钥

标签: python amazon-web-services docker flask amazon-s3


【解决方案1】:

以下可能会有所帮助:

  • IAM 角色(如果您的应用程序已经在 AWS 中运行,实例角色可以帮助您获取临时令牌以访问 S3 等资源。AWS CLI 或官方 SDK 已经构建了这些功能,您无需实施任何自定义代码。对于要这样做,您将角色“X”分配给 EC2 实例,然后角色“X”需要有一个策略映射,您可以在其中定义权限)

示例策略可能类似于:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowAccessToObjects",
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:GetObject",
                "s3:GetObjectAcl",
                "s3:GetObjectVersion",
                "s3:GetObjectVersionAcl",
                "s3:ListMultipartUploadParts"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::<Bucket_Name>/*"
            ],
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": [
                        "w.x.y.z/32"
                    ]
                }
            }
        },
        {
            "Sid": "AllowAccessToBucket",
            "Action": [
                "s3:PutObject",
                "s3:ListBucket",
                "s3:GetBucketVersioning",
                "s3:ListBucketVersions"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::<Bucket_Name>"
            ],
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": [
                        "a.b.c.d/32"
                    ]
                }
            }
        }
    ]
}

通常最好的方法是永远不要有任何静态配置的凭据。如果根本不可能实现类似的东西,那么:

  • 其他选项可以将机密存储在 Vault 等外部机密存储中,当容器启动时,可以在引导应用程序之前获取并注入机密。然后这些可以作为 ENV 使用

【讨论】:

    【解决方案2】:

    Python AWS 开发工具包会在 several possible locations 中查找凭证。这里最相关的是environment variables

    Boto3 将检查这些环境变量的凭据:

    AWS_ACCESS_KEY_ID
    您的 AWS 账户的访问密钥。

    AWS_SECRET_ACCESS_KEY
    您的 AWS 账户的密钥。

    您应该为要向其分发 docker 映像的每个用户或团队创建具有适当权限的单独 IAM 用户,他们可以set those environment variables via docker when running your image

    【讨论】:

      猜你喜欢
      • 2021-08-03
      • 1970-01-01
      • 1970-01-01
      • 2022-08-09
      • 2019-06-09
      • 2019-10-28
      • 2020-10-30
      • 1970-01-01
      • 2021-03-08
      相关资源
      最近更新 更多