AWS Vault
AWS Vault 是一个在开发环境中安全存储和访问 AWS 凭证的工具。
AWS Vault 将 IAM 凭证存储在操作系统的安全密钥库中,然后使用这些凭证生成临时凭证,以供您的 shell 和应用程序使用。它旨在与 AWS CLI 工具配合使用,并且能够识别您在 ~/.aws/config
中的配置文件和配置。
查看公告博客文章了解更多详情。
安装
您可以通过以下方式安装 AWS Vault:
- 下载最新版本
- 在 macOS 上使用 Homebrew Cask:
brew install --cask aws-vault
- 在 macOS 上使用 MacPorts:
port install aws-vault
- 在 Windows 上使用 Chocolatey:
choco install aws-vault
- 在 Windows 上使用 Scoop:
scoop install aws-vault
- 在 Linux 上使用 Homebrew on Linux:
brew install aws-vault
- 在 Arch Linux 上:
pacman -S aws-vault
- 在 Gentoo Linux 上:
emerge --ask app-admin/aws-vault
(先启用 Guru) - 在 FreeBSD 上:
pkg install aws-vault
- 在 OpenSUSE 上:启用 devel:languages:go 仓库,然后
zypper install aws-vault
- 使用 Nix:
nix-env -i aws-vault
- 使用 asdf-vm:
asdf plugin-add aws-vault https://github.com/karancode/asdf-aws-vault.git && asdf install aws-vault <version>
文档
配置、使用、技巧和窍门可在 USAGE.md 文件中找到。
保险库后端
支持的保险库后端包括:
- macOS 钥匙串
- Windows 凭据管理器
- Secret Service(Gnome Keyring、KWallet)
- KWallet
- Pass
- 加密文件
使用 --backend
标志或 AWS_VAULT_BACKEND
环境变量进行指定。
快速入门
# 为 "jonsmith" 配置文件存储 AWS 凭证
$ aws-vault add jonsmith
输入访问密钥 ID:ABDCDEFDASDASF
输入密钥:%%%
# 执行命令(使用临时凭证)
$ aws-vault exec jonsmith -- aws s3 ls
bucket_1
bucket_2
# 打开浏览器窗口并登录 AWS 控制台
$ aws-vault login jonsmith
# 列出凭证
$ aws-vault list
配置文件 凭证 会话
======= =========== ========
jonsmith jonsmith -
# 使用临时凭证启动子 shell
$ aws-vault exec jonsmith
正在启动子 shell /bin/zsh,使用 `exit` 退出子 shell
$ aws s3 ls
bucket_1
bucket_2
工作原理
aws-vault
使用 Amazon 的 STS 服务通过 GetSessionToken
或 AssumeRole
API 调用生成临时凭证。这些凭证在短时间内过期,从而降低了凭证泄露的风险。
AWS Vault 然后通过以下两种方式之一将临时凭证暴露给子进程
- 环境变量会写入子进程。请注意以下示例中AWS凭证是如何被写出的:
$ aws-vault exec jonsmith -- env | grep AWS
AWS_VAULT=jonsmith
AWS_DEFAULT_REGION=us-east-1
AWS_REGION=us-east-1
AWS_ACCESS_KEY_ID=%%%
AWS_SECRET_ACCESS_KEY=%%%
AWS_SESSION_TOKEN=%%%
AWS_CREDENTIAL_EXPIRATION=2020-04-16T11:16:27Z
- 本地元数据服务器会被启动。这种方法的优点是,任何使用Amazon SDK的程序都会自动刷新凭证,因此会话时间可以尽可能短。
$ aws-vault exec --server jonsmith -- env | grep AWS
AWS_VAULT=jonsmith
AWS_DEFAULT_REGION=us-east-1
AWS_REGION=us-east-1
AWS_CONTAINER_CREDENTIALS_FULL_URI=%%%
AWS_CONTAINER_AUTHORIZATION_TOKEN=%%%
默认使用环境变量,但你可以在exec
命令上使用--server
标志来选择使用本地实例元数据服务器。
角色和MFA
最佳实践是创建角色来委派权限。出于安全考虑,你还应该要求用户提供由多因素认证(MFA)设备生成的一次性密钥。
首先,你需要在IAM中创建用户和角色,并设置MFA设备。然后你可以设置IAM角色以强制执行MFA。
以下是使用角色和MFA的配置示例:
[default]
region = us-east-1
[profile jonsmith]
mfa_serial = arn:aws:iam::111111111111:mfa/jonsmith
[profile foo-readonly]
source_profile = jonsmith
role_arn = arn:aws:iam::22222222222:role/ReadOnly
[profile foo-admin]
source_profile = jonsmith
role_arn = arn:aws:iam::22222222222:role/Administrator
mfa_serial = arn:aws:iam::111111111111:mfa/jonsmith
[profile bar-role1]
source_profile = jonsmith
role_arn = arn:aws:iam::333333333333:role/Role1
mfa_serial = arn:aws:iam::111111111111:mfa/jonsmith
[profile bar-role2]
source_profile = bar-role1
role_arn = arn:aws:iam::333333333333:role/Role2
mfa_serial = arn:aws:iam::111111111111:mfa/jonsmith
以下是你可以从aws-vault预期的结果:
命令 | 凭证 | 缓存 | MFA |
---|---|---|---|
aws-vault exec jonsmith --no-session | 长期凭证 | 否 | 否 |
aws-vault exec jonsmith | 会话令牌 | 会话令牌 | 是 |
aws-vault exec foo-readonly | 角色 | 否 | 否 |
aws-vault exec foo-admin | 会话令牌 + 角色 | 会话令牌 | 是 |
aws-vault exec foo-admin --duration=2h | 角色 | 角色 | 是 |
aws-vault exec bar-role2 | 会话令牌 + 角色 + 角色 | 会话令牌 | 是 |
aws-vault exec bar-role2 --no-session | 角色 + 角色 | 角色 | 是 |
开发
macOS发布版本已经过代码签名,以避免在Keychain中出现额外提示。你可以通过以下方式验证:
$ codesign --verify --verbose $(which aws-vault)
如果你正在开发或自行编译aws-vault二进制文件,你可以通过访问Keychain Access > Certificate Assistant > Create Certificate -> Certificate Type: Code Signing来生成自签名证书。然后你可以用以下命令签名你的二进制文件:
$ go build .
$ codesign --sign <上面创建的证书名称> ./aws-vault
参考和灵感
- https://github.com/pda/aws-keychain
- https://docs.aws.amazon.com/IAM/latest/UserGuide/MFAProtectedAPI.html
- https://docs.aws.amazon.com/IAM/latest/UserGuide/IAMBestPractices.html#create-iam-users
- https://github.com/makethunder/awsudo
- https://github.com/AdRoll/hologram
- https://github.com/realestate-com-au/credulous
- https://github.com/dump247/aws-mock-metadata
- https://boto.readthedocs.org/en/latest/boto_config_tut.html