如何从 EC2 实例中获取密钥的值?
How can I get the value of a secret from within an EC2 instance?
我正在尝试配置我的 EC2 实例,以便脚本可以获取机密的值,例如在启动时。
我从 CentOS AMI 创建了一个 EC2 实例,并在 Secrets Manager 中创建了一个秘密。该机密使用来自 KMS 的密钥。
然后我定义了一个具有适当策略的 IAM 角色来解密秘密,并将该角色分配给 EC2 实例。
在实例中,我可以使用此命令在元数据中看到 AccessKeyId 和 SecretAccessKey(Decrypt-Secret 是角色的名称):
$ curl http://169.254.169.254/latest/meta-data/iam/security-credentials/Decrypt-Secrets/
{
"Code" : "Success",
"LastUpdated" : "2018-12-06T09:45:55Z",
"Type" : "AWS-HMAC",
"AccessKeyId" : "AAAAAAAAAAAAAA",
"SecretAccessKey" : "BBBBBBBBBBBBBBBBBBB",
"Token" : "...",
"Expiration" : "2018-12-06T16:11:24Z"
}
然后我配置aws cli:
$ aws configure
AWS Access Key ID [None]: AAAAAAAAAAAAAA
AWS Secret Access Key [None]: BBBBBBBBBBBBBBBBBBB
Default region name [us-east-1]: us-east-1
Default output format [None]:
并尝试获取秘密:
$ aws secretsmanager get-secret-value --secret-id arn:aws:secretsmanager:us-east-1:1234567890:secret:my-secret-aaaaa
An error occurred (UnrecognizedClientException) when calling the GetSecretValue operation: The security token included in the request is invalid.
我对错误的理解是我没有使用正确的 KeyID 和 AccessKey。但是我不明白为什么。
我还尝试创建一个使用相同策略的 IAM 用户,当我指定该用户的 KeyID 和 AccessKey 时,它起作用了,我可以获得秘密。但我必须手动指定 ID 和 Key,我的目标是让脚本自动获取密钥。
我错过了什么?
刚发现我还要配置元数据中指定的Token
aws configure
只要求 KeyID 和 AccessKey。要配置我必须做的令牌:
$ aws configure set aws_session_token "FQoGZXI..."
当您运行在已配置 IAM 角色的 EC2 实例上使用 aws CLI 时,您不需要设置访问密钥或任何其他信息(区域除外)。
CLI 已经知道如何自动从 EC2 元数据中获取凭据。此外,元数据中的凭据是临时的,将在 6 小时后过期,因此您不想将它们存储在您的配置中。
删除您存储在配置中的凭据,并使用正确的区域再次运行您的命令:
aws --region us-east-1 secretsmanager get-secret-value --secret-id arn:aws:secretsmanager:us-east-1:1234567890:secret:my-secret-aaaaa
我正在尝试配置我的 EC2 实例,以便脚本可以获取机密的值,例如在启动时。
我从 CentOS AMI 创建了一个 EC2 实例,并在 Secrets Manager 中创建了一个秘密。该机密使用来自 KMS 的密钥。
然后我定义了一个具有适当策略的 IAM 角色来解密秘密,并将该角色分配给 EC2 实例。
在实例中,我可以使用此命令在元数据中看到 AccessKeyId 和 SecretAccessKey(Decrypt-Secret 是角色的名称):
$ curl http://169.254.169.254/latest/meta-data/iam/security-credentials/Decrypt-Secrets/
{
"Code" : "Success",
"LastUpdated" : "2018-12-06T09:45:55Z",
"Type" : "AWS-HMAC",
"AccessKeyId" : "AAAAAAAAAAAAAA",
"SecretAccessKey" : "BBBBBBBBBBBBBBBBBBB",
"Token" : "...",
"Expiration" : "2018-12-06T16:11:24Z"
}
然后我配置aws cli:
$ aws configure
AWS Access Key ID [None]: AAAAAAAAAAAAAA
AWS Secret Access Key [None]: BBBBBBBBBBBBBBBBBBB
Default region name [us-east-1]: us-east-1
Default output format [None]:
并尝试获取秘密:
$ aws secretsmanager get-secret-value --secret-id arn:aws:secretsmanager:us-east-1:1234567890:secret:my-secret-aaaaa
An error occurred (UnrecognizedClientException) when calling the GetSecretValue operation: The security token included in the request is invalid.
我对错误的理解是我没有使用正确的 KeyID 和 AccessKey。但是我不明白为什么。
我还尝试创建一个使用相同策略的 IAM 用户,当我指定该用户的 KeyID 和 AccessKey 时,它起作用了,我可以获得秘密。但我必须手动指定 ID 和 Key,我的目标是让脚本自动获取密钥。
我错过了什么?
刚发现我还要配置元数据中指定的Token
aws configure
只要求 KeyID 和 AccessKey。要配置我必须做的令牌:
$ aws configure set aws_session_token "FQoGZXI..."
当您运行在已配置 IAM 角色的 EC2 实例上使用 aws CLI 时,您不需要设置访问密钥或任何其他信息(区域除外)。
CLI 已经知道如何自动从 EC2 元数据中获取凭据。此外,元数据中的凭据是临时的,将在 6 小时后过期,因此您不想将它们存储在您的配置中。
删除您存储在配置中的凭据,并使用正确的区域再次运行您的命令:
aws --region us-east-1 secretsmanager get-secret-value --secret-id arn:aws:secretsmanager:us-east-1:1234567890:secret:my-secret-aaaaa