如何从EC2实例中获取机密的值?

时间:2018-12-06 10:28:34

标签: amazon-web-services amazon-ec2 aws-cli aws-secrets-manager

我正在尝试配置我的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和密钥,而我的目标是让脚本自动获取机密。

我想念什么?

2 个答案:

答案 0 :(得分:3)

在已配置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

答案 1 :(得分:0)

刚刚发现我还必须配置元数据中指定的令牌。

aws configure仅询问KeyID和AccessKey。要配置令牌,我必须这样做:

$ aws configure set aws_session_token "FQoGZXI..."