Как я могу получить значение секрета из экземпляра EC2?

Я пытаюсь настроить свой экземпляр EC2, чтобы сценарий мог получать значение секрета, например, во время загрузки.

Я создал экземпляр EC2 из CentOS AMI и секрет в диспетчере секретов. Секрет использует ключ от 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 этого пользователя, он работает, я могу получить секрет. Но мне нужно указать идентификатор и ключ вручную, и моя цель - сценарий, который автоматически получит секрет.

Что мне не хватает?


person Marc    schedule 06.12.2018    source источник


Ответы (2)


Когда вы запускаете aws CLI на экземпляре EC2 с уже настроенной ролью IAM, вам не нужно устанавливать ключ доступа или любую другую информацию (кроме региона).

Интерфейс командной строки уже знает, как автоматически получать учетные данные из метаданных EC2. Более того, учетные данные в метаданных являются временными и истекают через 6 часов, поэтому вы не хотите хранить их в своей конфигурации.

Удалите кредиты, которые вы сохранили в своей конфигурации, и снова запустите команду с правильным регионом:

aws --region us-east-1 secretsmanager get-secret-value --secret-id arn:aws:secretsmanager:us-east-1:1234567890:secret:my-secret-aaaaa
person JoeB    schedule 06.12.2018

Только что обнаружил, что мне также нужно настроить токен, указанный в метаданных.

aws configure запрашивает только KeyID и AccessKey. Для настройки токена мне пришлось сделать:

$ aws configure set aws_session_token "FQoGZXI..."
person Marc    schedule 06.12.2018
comment
Если вы указали роль экземпляра, вам также не нужно настраивать интерфейс командной строки. Он будет искать роль экземпляра. - person kdgregory; 06.12.2018