从 Java 程序访问 Amazon S3
Access Amazon S3 from a Java program
我有一个 Java 程序需要访问 Amazon S3 以将一些文件放在那里。请注意,这个 Java 程序在我的桌面上是 运行(不在 EC2 中)。使用凭据访问 Amazon S3 的最佳安全方式是什么?以下是我知道的方式。
使用访问令牌和秘密
一个。在 sdk 属性文件中
b。作为环境变量
c。在命令行系统属性中
d。在程序中直接硬编码
出于安全原因,我当然更喜欢选项 b 和 c。
这里是否有基于角色的权限?我的理解是这是不可能的,因为我的 Java 程序是 运行 在 AWS 不知道的外部机器中。
还有其他访问方法吗?
提前致谢。
- 最好的方法是使用 default provider chain, which means that the [DefaultCredentialsProvider] (https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/DefaultCredentialsProvider.html) class 将根据特定层次结构决定从何处获取凭据:
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
对于本地开发,推荐的方法是 set up your credentials 使用 aws configure
命令并让默认提供程序链利用它。
尽管在某些情况下环境变量可能是一个合理的选择(并且默认链将能够使用它们),但请永远不要在您的代码中硬编码任何凭据!
- 是的。我们可以使用 AWS CLI 担任角色:
aws sts assume-role --role-arn "arn:aws:iam::123456789012:role/example-role" --role-session-name AWSCLI-Session
这将提供可以提供给应用程序的临时 AWS_ACCESS_KEY_ID
、AWS_SECRET_ACCESS_KEY
和 AWS_SESSION_TOKEN
。该应用程序将使用代入角色提供的权限与 AWS 服务进行通信。
- 是的,如果目标是访问 S3,还有另一种方法。我们可以使用 presigned urls.
使用适用于 Java V2 的 AWS SDK 时,请参阅适用于 Java 的 AWS SDK
开发者指南 V2。本开发者指南包含大量信息,可以回答此类问题。
要了解凭据的工作原理,请参阅此主题:
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 存储桶中。
我有一个 Java 程序需要访问 Amazon S3 以将一些文件放在那里。请注意,这个 Java 程序在我的桌面上是 运行(不在 EC2 中)。使用凭据访问 Amazon S3 的最佳安全方式是什么?以下是我知道的方式。
使用访问令牌和秘密
一个。在 sdk 属性文件中
b。作为环境变量
c。在命令行系统属性中
d。在程序中直接硬编码
出于安全原因,我当然更喜欢选项 b 和 c。
这里是否有基于角色的权限?我的理解是这是不可能的,因为我的 Java 程序是 运行 在 AWS 不知道的外部机器中。
还有其他访问方法吗?
提前致谢。
- 最好的方法是使用 default provider chain, which means that the [DefaultCredentialsProvider] (https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/DefaultCredentialsProvider.html) class 将根据特定层次结构决定从何处获取凭据:
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
对于本地开发,推荐的方法是 set up your credentials 使用 aws configure
命令并让默认提供程序链利用它。
尽管在某些情况下环境变量可能是一个合理的选择(并且默认链将能够使用它们),但请永远不要在您的代码中硬编码任何凭据!
- 是的。我们可以使用 AWS CLI 担任角色:
aws sts assume-role --role-arn "arn:aws:iam::123456789012:role/example-role" --role-session-name AWSCLI-Session
这将提供可以提供给应用程序的临时 AWS_ACCESS_KEY_ID
、AWS_SECRET_ACCESS_KEY
和 AWS_SESSION_TOKEN
。该应用程序将使用代入角色提供的权限与 AWS 服务进行通信。
- 是的,如果目标是访问 S3,还有另一种方法。我们可以使用 presigned urls.
使用适用于 Java V2 的 AWS SDK 时,请参阅适用于 Java 的 AWS SDK 开发者指南 V2。本开发者指南包含大量信息,可以回答此类问题。
要了解凭据的工作原理,请参阅此主题:
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 存储桶中。