Чтение секрета с помощью CloudFormation

Я пытаюсь создать стек AWS в CloudFormation с секретом в JSON.

Я не хочу, чтобы значение секрета отображалось в параметрах, и я не хочу, чтобы мой экземпляр (fargate или ec2) имел доступ к диспетчеру секретов. Я хочу, чтобы CloudFormation извлекал значение из диспетчера секретов и вставлял его в шаблон во время выполнения.

Вот что я сделал:

  1. Создать секрет

  2. Создайте шаблон с помощью конструктора

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

  4. Убедитесь, что корзина содержит тег с секретом

Это мой шаблон:

{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Description": "create a single S3 bucket",
    "Resources": {
        "SampleBucket": {
            "Type": "AWS::S3::Bucket",
            "Properties": {
                "BucketName": "asantostestbucket",
                "Tags" : [
                    {
                        "Key" : "keyname",
                        "Value" : "{{resolve:secretsmanager:dev/learning:SecretString:hello}}"
                    }
            ]
            }
        }
    }
}

Что дает мне ошибку One or more tags are not valid.

Как я могу указать CloudFormation, что я хочу, чтобы он прочитал секрет, а не пытался прочитать тег как текст? Другими словами, замените "{{resolve: secretsmanager: dev / learning: SecretString: hello}}" значением вместо того, чтобы читать его как текст.


person Alexandre Santos    schedule 18.06.2019    source источник
comment
Почему вы не хотите, чтобы экземпляр имел доступ к диспетчеру секретов? Это наиболее безопасный метод с аудитом. Единственный другой метод - передать значение из CloudFormation в экземпляр через пользовательские данные, но секрет будет виден в пользовательских данных. Метод ведра - это безопасность посредством неизвестности, что не является реальной безопасностью. Кроме того, экземпляру потребуется разрешение на получение метаданных S3, что ничем не отличается от предоставления ему разрешения на доступ к диспетчеру секретов.   -  person John Rotenstein    schedule 19.06.2019
comment
@JohnRotenstein, я в курсе всего, что вы упомянули. Это не производственный код, это проверка концепции. Мы хотим знать, возможно ли это.   -  person Alexandre Santos    schedule 19.06.2019


Ответы (2)


Чтобы воспроизвести эту ситуацию, я сделал следующее:

  • In the Secrets Manager, created a new secret
    • "Other type of secrets"
    • Ключ: hello
    • Значение: surprise
    • Секретное имя: dev/learning
  • Протестировал секрет с помощью AWS CLI

Вот результат:

aws secretsmanager get-secret-value --secret-id dev/learning
{
    "ARN": "arn:aws:secretsmanager:ap-southeast-2:123456789012:secret:dev/learning-kCxSK3",
    "Name": "dev/learning",
    "VersionId": "...",
    "SecretString": "{\"hello\":\"surprise\"}",
    "VersionStages": [
        "AWSCURRENT"
    ],
    "CreatedDate": 1560925072.106
}
  • Запущен шаблон CloudFormation, который вы предоставили выше (но с другим именем сегмента)

Результат: я получил сообщение One or more tags are not valid

Итак, я получил тот же результат, что и вы.

Затем я попытался создать ресурс другого типа, используя секрет:

{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Resources": {
        "SecurityGroup": {
            "Type": "AWS::EC2::SecurityGroup",
            "Properties": {
                "GroupDescription": "{{resolve:secretsmanager:dev/learning:SecretString:hello}}"
            }
        }
    }
}

Это сработало успешно:

aws ec2 describe-security-groups --group-id sg-03cfd71f4539a4b7e
{
    "SecurityGroups": [
        {
            "Description": "surprise",
            ...

Итак, похоже, что {{resolve}} ведет себя правильно, но тегу S3 это почему-то не нравится.

Итог: это возможно, но не рекомендуется.

person John Rotenstein    schedule 19.06.2019
comment
Я подозреваю, что для раскрытия секретов можно использовать только некоторые ресурсы. - person Alexandre Santos; 19.06.2019
comment
Я считаю, что команда Cloud Formation не позволяет динамическим ссылкам на секреты расширяться в местах, где они будут общедоступными. Сюда входят такие вещи, как метаданные EC2 (которые отображаются в консоли как данные в кодировке base64) и теги. - person JoeB; 21.06.2019

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

person krunal shimpi    schedule 01.07.2019