使用 AWS CLI 安全管理凭证的最佳实践

了解保护您的 AWS CLI 凭证的权威最佳实践。本指南涵盖凭证加载顺序、配置文件的正确使用、环境变量,以及至关重要的如何利用 IAM 角色和 AWS SSO 来消除存储长期静态访问密钥的风险。实施这些策略,可在您的 AWS 自动化和管理工作流中实现强大的安全性。

使用 AWS CLI 安全管理凭证的最佳实践

AWS CLI 凭证可以创建、删除和暴露真实的云资源,因此泄露访问密钥并非小错误。最安全的设置是为人类提供通过 IAM Identity Center 获得的短期凭证,并为工作负载提供通过角色获得的临时凭证。

这些使用 AWS CLI 安全管理凭证的最佳实践解释了 CLI 在哪里查找凭证、何时使用配置文件,以及如何避免在脚本中使用长期静态密钥。

了解 AWS CLI 凭证加载顺序

AWS CLI 通过提供程序链解析凭证。确切的链可能因 CLI 版本和配置而异,但您最常排查的实际顺序是:

  1. 环境变量: AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY 以及可选的 AWS_SESSION_TOKEN
  2. Assume-role 和 Web 身份配置: 告诉 CLI 调用 AWS STS 获取临时凭证的配置文件。
  3. IAM Identity Center 凭证:aws configure ssoaws configure sso-session 创建的配置文件。
  4. 共享凭证文件: 通常是 ~/.aws/credentials
  5. 共享配置文件: 通常是 ~/.aws/config,包括 credential_process 条目。
  6. 容器凭证: ECS 任务角色和兼容的容器凭证端点。
  7. EC2 实例配置文件凭证: 来自实例元数据服务 (IMDS) 的临时凭证。

AWS CLI 在正常命令中不使用 --access-key-id--secret-access-key 命令行标志。如果您在脚本中看到这些,可能是将 AWS CLI 行为与另一个工具或 SDK 混淆了。

1. 保护配置文件中的凭证 (~/.aws/credentials)

共享凭证文件,通常是 ~/.aws/credentials,使用方便,但应作为无法使用 IAM Identity Center 或角色时的备选方案。如果必须在此存储静态密钥,请保护该文件并保持权限狭窄。

文件保护和权限

限制对此文件的读取访问至关重要。在 Linux/macOS 系统上,设置权限以便只有所有者可以读取或写入文件:

chmod 600 ~/.aws/credentials

使用配置文件进行隔离

使用不同的配置文件允许您为不同环境(例如开发、预发布、生产)或不同账户分离凭证。这可以防止意外的跨环境操作。

示例 ~/.aws/credentials

[default]
aws_access_key_id = AKIAEXAMPLE000000000
aws_secret_access_key = exampleSecretAccessKeyDoNotUse

[production-user]
aws_access_key_id = AKIAEXAMPLE111111111
aws_secret_access_key = anotherExampleSecretDoNotUse

使用命名配置文件时,您必须使用 --profile 标志指定它:

aws s3 ls --profile production-user

2. 利用环境变量

环境变量为当前进程及其子进程提供凭证,而无需编辑 AWS 配置文件。它们对于临时会话和 CI 作业很有用,但仍可能通过进程环境、调试日志或粗心的 shell 历史记录泄露。

在您的 shell 会话中设置以下变量:

export AWS_ACCESS_KEY_ID="AKIAIOSFODNN7EXAMPLE"
export AWS_SECRET_ACCESS_KEY="wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
export AWS_SESSION_TOKEN="temporary-session-token-if-using-sts"
export AWS_DEFAULT_REGION="us-east-1"

关于优先级的注意事项: 通过环境变量设置的凭证始终覆盖~/.aws/credentials 文件中找到的凭证,因为它们在凭证加载链中位于更高级别。

安全警告: 导出环境变量时要小心,尤其是在共享终端或可能被记录的脚本中。使用后立即取消设置它们:

unset AWS_ACCESS_KEY_ID
unset AWS_SECRET_ACCESS_KEY
unset AWS_SESSION_TOKEN

3. 优先为 AWS 工作负载使用 IAM 角色

对于在 AWS 基础设施上运行的工作负载,例如 EC2、Lambda、ECS 和 EKS,避免使用静态凭证。使用 IAM 角色,以便 AWS 自动颁发临时凭证。

在 EC2 上,实例配置文件通过 IMDS 公开临时凭证。在 ECS 上,任务角色通过容器凭证端点公开凭证。在 EKS 上,服务账户的 IAM 角色使用 Web 身份令牌。AWS CLI 和 SDK 知道如何使用这些提供程序,而无需在磁盘上存储长期密钥。

工作原理:

  1. EC2 实例启动时,通过实例配置文件关联一个 IAM 角色。
  2. 在该实例上运行的 CLI 查询实例元数据服务 (IMDS) 以获取临时凭证。
  3. CLI 使用这些临时凭证进行所有后续 API 调用。

这完全消除了与长期访问密钥相关的风险。

4. 为人类访问使用 IAM Identity Center

对于从笔记本电脑使用 AWS CLI 的工程师,IAM Identity Center 通常比 IAM 用户访问密钥更安全。您通过浏览器登录,选择一个账户和角色,CLI 使用缓存的短期凭证。

使用以下命令进行配置:

aws configure sso

然后在会话过期时登录:

aws sso login --profile <profile-name>

IAM Identity Center 以前称为 AWS SSO,因此您可能仍然在 CLI 命令和配置键中看到 sso

5. 使用 credential_process 进行外部代理

您可以配置 CLI 调用外部工具,例如保险库代理或企业凭证代理,以动态获取凭证。这在 ~/.aws/config 中指定:

示例 ~/.aws/config

[profile my-vault-profile]
region = us-west-2
credential_process = /usr/local/bin/my-vault-cli get-aws-creds --profile my-vault-profile

在与 HashiCorp Vault 等机密管理工具集成时,此方法至关重要。

最佳实践总结和检查清单

为了最大限度地提高 AWS CLI 操作的安全性,请遵守以下核心原则:

  • 最小权限原则: 确保所有 IAM 用户和角色仅拥有严格必要的权限来执行其工作。
  • 优先使用角色而非密钥: 在 AWS 基础设施内操作时,始终使用 IAM 角色(实例配置文件)。
  • 使用 IAM Identity Center: 对于人类交互式使用,使用 IAM Identity Center 管理对多个账户的访问。
  • 切勿硬编码密钥: 避免将访问密钥直接放入脚本、源代码或命令历史记录中。
  • 保护凭证文件: 限制 ~/.aws/credentials 的文件系统权限 (chmod 600)。
  • 定期轮换密钥: 如果必须使用静态密钥,请强制执行严格的轮换计划。

您的默认设置应该是临时凭证:为人员使用 IAM Identity Center,为工作负载使用 IAM 角色,为代理的企业访问使用 credential_process。仅在别无选择时使用静态访问密钥,然后严格限定其范围、定期轮换,并在依赖关系消失后立即删除它们。