背景介绍
相比于传统使用 AK/SK 在第三方应用中访问 AWS 资源的认证方式, IAM Roles Anywhere 使用证书认证的方式为应用生成临时的身份凭证, 可以有效避免 AK/SK 意外泄漏造成的安全隐患. AWS IAM Roles Anywhere 官方介绍
工作流程示意
主要涉及到的几个概念
- Private CA: 可以使用 Amazon Private CA 托管服务 (注: 这个是收费服务, 且价格不菲), 也可以在本地通过
OpenSSL
或者其他证书管理工具自行管理. - CA Cert:
CA 证书
. - Client Cert: 通过 Private CA 给第三方程序签发的
应用证书
- Trust Anchor: IAM Roles Anywhere 中的配置项, 用于建立 CA 和关联的 IAM Role 之间信任关系.
- IAM Role: 标准的 IAM 角色, 给第三方应用 Assume 用. 需要注意 Role 的 Trust relationship 需要信任
rolesanywhere.amazonaws.com
, 详细 Policy 见后面完整内容. - Profile: 在配置中定义第三方应用可以 Assume 的 IAM Role.
- Get Secrets: 从 IAM Roles Anywhere 获取临时凭证的过程, 结果将包含:
- AccessKeyId
- SecretAccessKey
- SessionToken
- Expiration
配置过程
下面我们将在 Linux 环境中使用 openssl
工具进行证书的相关签发操作.
创建 Certificate Authority (CA)
IAM Roles Anywhere 对 CA 证书的格式有严格的要求. 在开始具体命令之前, 需要首先检查确认当前系统 OpenSSL 配置文件 /etc/ssl/openssl.cnf
中 [v3_ca]
部分配置应当和下面一致 (关键是keyUsage
)
[ v3_ca ]
basicConstraints = critical, CA:TRUE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always, issuer:always
keyUsage = critical, cRLSign, digitalSignature, keyCertSign
否则后面签发出来的 CA 证书导入至 Trust Anchor 时会报错:
Incorrect basic constraints for CA certificate.
接下来开始正式的命令:
# 创建 CA 私钥
openssl genrsa -out MyCA.key 4096# 创建 CA certificate, 根据向导提示完成属性的填写
openssl req -new -x509 -days 3650 -key MyCA.key -out MyCA.pem -extensions v3_ca# 创建三方应用的私钥
openssl genrsa -out client.key 4096# 创建三方应用的证书申请配置 CSR 文件
openssl req -new -key client.key -out client.csr# 编辑 CSR 中和 version 3 extension 扩展相关的配置
cat > client.ext<<EOF
basicConstraints = CA:FALSE
authorityKeyIdentifier = keyid,issuer
keyUsage = nonRepudiation, digitalSignature, keyEncipherment, dataEncipherment
EOF# 创建三方应用的证书
openssl x509 -req -in client.csr -CA MyCA.pem -CAkey MyCA.key -CAcreateserial -out client.pem -days 3650 -sha256 -extfile client.ext
最终获得以下文件:
文件名 | 说明 |
---|---|
MyCA.key | CA 私钥 |
MyCA.pem | CA 证书 |
MyCA.srl | CA 证书的序列号 |
client.csr | 三方应用的证书申请 (Certificate Signing Request) |
client.ext | 三方应用证书 Version 3 的扩展配置 |
client.key | 三方应用证书的私钥 |
client.pem | 三方应用的证书 |
创建 Trust Anchor
访问 IAM 控制台 > Roles, 在页面底部找到 Roles Anywhere > Manage
Create a trust anchor
选择 External certificate bundle, 粘贴 MyCA.pem
中的内容
复制 Trust anchor 的 ARN, 后面写 Trust policy 会用到.
创建 Role
主要留意 Trust policy, Condition 中粘贴上面复制的 Trust anchor 的 ARN, 其他环节与创建普通 Role 一样, 不再赘述.
{"Version": "2012-10-17","Statement": [{"Effect": "Allow","Principal": {"Service": ["rolesanywhere.amazonaws.com"]},"Action": ["sts:AssumeRole","sts:TagSession","sts:SetSourceIdentity"],"Condition": {"ArnEquals": {"aws:SourceArn": ["arn:aws-cn:rolesanywhere:cn-northwest-1:000000000000:trust-anchor/7163eb88-0000-0000-0000-362346488bee"]}}}]
}
创建 Profile
起个名字, 选择上面创建好的 Role
复制 Profile 的 ARN, 后面测试会用到
测试
下载 aws_signing_helper 命令行工具用于测试 Roles Anywhere
# 注意在刚才创建证书的文件夹中执行测试
wget https://rolesanywhere.amazonaws.com/releases/1.4.0/X86_64/Linux/aws_signing_helperchmod +x aws_signing_helper# 注意替换 Trust anchor, Profile, Role 对应的 ARN
./aws_signing_helper credential-process \--certificate client.pem \--private-key client.key \--trust-anchor-arn arn:aws-cn:rolesanywhere:cn-northwest-1:000000000000:trust-anchor/7163eb88-0000-0000-0000-362346488bee \--profile-arn arn:aws-cn:rolesanywhere:cn-northwest-1:000000000000:profile/620512e9-0000-0000-0000-64949541db28 \--role-arn arn:aws-cn:iam::000000000000:role/Alian-roles-anywhere-role
确认输出结果中能够看到对应的以下信息表明成功:
- AccessKeyId
- SecretAccessKey
- SessionToken
- Expiration
写入环境变量通过 AWS CLI 测试 STS 身份结果:
export AWS_ACCESS_KEY_ID=AccessKeyId
export AWS_SECRET_ACCESS_KEY=SecretAccessKey
export AWS_SESSION_TOKEN=SessionToken
export AWS_DEFAULT_REGION=cn-northwest-1aws sts get-caller-identity