【问题标题】:Access Amazon S3 from a Java program从 Java 程序访问 Amazon S3
【发布时间】:2021-09-19 12:52:35
【问题描述】:

我有一个 Java 程序,它需要访问 Amazon S3 才能将一些文件放在那里。请注意,这个 Java 程序正在我的桌面上运行(而不是在 EC2 中)。使用凭证访问 Amazon S3 的最佳安全方式是什么?以下是我知道的方式。

  1. 使用访问令牌和密码

    一个。在 sdk 属性文件中

    b.作为环境变量

    c。在命令行系统属性中

    d。程序中直接硬编码

出于安全原因,我当然更喜欢选项 b 和 c。

  1. 这里是否有基于角色的权限?我的理解是这是不可能的,因为我的 Java 程序在 AWS 不知道的外部机器上运行。

  2. 还有其他可能的访问方式吗?

提前致谢。

【问题讨论】:

    标签: amazon-web-services amazon-s3 amazon-iam cloud-security


    【解决方案1】:

    使用 AWS SDK for Java V2 时,请参阅 AWS SDK for Java 开发者指南 V2。本开发者指南包含大量可以回答此类问题的信息。

    要了解凭据的工作原理,请参阅此主题:

    Using credentials

    Github 中的所有 AWS 示例都假定凭证是从凭证文件加载的。如文档中所述,凭据文件位于

    • Windows - C:\Users.aws\credentials
    • Linux、macOS、Unix - ~/.aws/credentials

    请参阅本主题,该主题将向您展示如何使用 Amazon S3 API 启动和运行 - 包括设置您的凭证。

    Get started with the AWS SDK for Java 2.x

    Amazon S3 Java API 具有 pubObject 等方法,可让您将对象放入 Amazon S3 存储桶中。

    【讨论】:

      【解决方案2】:
      1. 最好的方法是使用default provider chain,这意味着[DefaultCredentialsProvider] (https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/DefaultCredentialsProvider.html) 类将根据特定层次结构决定从何处获取凭据:
      1. Java System Properties - aws.accessKeyId and aws.secretAccessKey
      2. Environment Variables - AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY
      3. Web Identity Token credentials from system properties or environment variables
      4. Credential profiles file at the default location (~/.aws/credentials) shared by all AWS SDKs and the AWS CLI
      5. Credentials delivered through the Amazon EC2 container service if AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" environment variable is set and security manager has permission to access the variable,
      6. Instance profile credentials delivered through the Amazon EC2 metadata service
      

      对于本地开发,推荐的方法是使用aws configure 命令set up your credentials,并让默认提供程序链利用它。

      虽然在某些情况下环境变量可能是一个合理的选择(默认链将能够使用它们),但请永远不要在代码中硬编码任何凭据!

      1. 是的。我们可以使用 AWS CLI 担任角色:
      aws sts assume-role --role-arn "arn:aws:iam::123456789012:role/example-role" --role-session-name AWSCLI-Session
      

      这将提供一个临时的AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_SESSION_TOKEN,可以提供给应用程序。应用程序将使用代入角色提供的权限与 AWS 服务进行通信。

      1. 是的,如果目标是访问 S3,还有另一种方法。我们可以使用presigned urls

      【讨论】:

      • 谢谢欧文。想知道如果我使用角色(选项 2),AWS 如何识别我的应用程序?我的 Java 应用程序是一个外部应用程序..那么它如何获得 ARN?
      • @SRaj 当您担任角色时,将获得不同的 AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY 和 AWS_SESSION_TOKEN。这与假定的角色相关联,因此 AWS 知道具有该角色的特定实体想要访问特定服务。您从要担任的角色中获得的 ARN,您只需创建一个可以在之后担任的新角色即可获得。
      • 好的,但要获得该角色,我的应用程序必须首先使用 IAM 凭证或联合 SSO 进行身份验证。是这样吗?请让我知道,一旦我清楚,我会接受答案
      • @SRaj 是的,确实,您的应用程序必须首先以某种方式对其自身进行身份验证。
      猜你喜欢
      • 1970-01-01
      • 2018-09-13
      • 2014-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-18
      相关资源
      最近更新 更多