1

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

  1. 使用访问令牌和秘密

    一种。在 sdk 属性文件中

    湾。作为环境变量

    C。在命令行系统属性中

    d。程序中直接硬编码

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

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

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

提前致谢。

4

2 回答 2

3

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

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

使用凭据

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

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

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

开始使用适用于 Java 2.x 的 AWS 开发工具包

Amazon S3 Java API 具有诸如pubObject之类的方法,可让您将对象放入 Amazon S3 存储桶中。

于 2021-09-19T15:32:01.253 回答
2
  1. 最好的方法是使用默认提供程序链,这意味着 [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,并让默认提供程序链利用它。

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

  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_KEY并且AWS_SESSION_TOKEN可以提供给应用程序。该应用程序将使用代入角色提供的权限与 AWS 服务进行通信。

  1. 是的,如果目标是访问 S3,还有另一种方法。我们可以使用预签名的网址
于 2021-09-19T13:25:27.837 回答