Неразрешенная динамическая ссылка SecureString для хранилища параметров в шаблоне CloudFormation

Согласно AWS, при развертывании инфраструктуры, требующей секретов, то есть паролей и т.п., с CloudFormation, одно из популярных решений состоит в использовании SecureStrings хранилища параметров из SSM.

Однако, несмотря на существующую документацию CFN с пошаговыми инструкциями по использовать динамические ссылки в шаблонах CFN, я не могу использовать фактическое значение SecureStrings.

Предполагая следующее представление JSON существующей SecureString, хранящейся в хранилище параметров SSM:

{
  "MyRedshiftMasterUserPassword": {
    "value": "Abcd2019",
    "type": "SecureString"
  }
}

и шаблон YAML CFN, который использует его, как указано в документации:

Resources
  Redshift:
    Type: 'AWS::Redshift::Cluster'
    Properties:
      NodeType: dc2.large
      NumberOfNodes: !Ref RedshiftNodes
      ClusterType: multi-node
      AutomatedSnapshotRetentionPeriod: !Ref AutomatedSnapshotRetentionPeriod
      DBName: datawarehouse_v1
      MasterUsername: !Ref RedshiftMasterUsername
      MasterUserPassword: '{{resolve:ssm-secure:MyRedshiftMasterUserPassword:1}}'

Вышеупомянутое решение не работает, поэтому либо я неправильно определяю шаблон, либо поддержка этой функции не реализована должным образом, что кажется мне странным, учитывая, что он исходит от AWS.

В частности, я столкнулся со следующими ошибками, которые все заканчиваются стеком UPDATE_FAILED:

  1. Всякий раз, когда имя параметра, на которое указывает ссылка, является достаточно длинным, CloudFormation жалуется:

Параметр MasterUserPassword не является допустимым паролем, поскольку его длина превышает 64 символа. (Сервис: AmazonRedshift; Код состояния: 400; Код ошибки: InvalidParameterValue; Идентификатор запроса: 7be9bd43-2927-11e9-aa88-29bbdcae859e)

  1. Кроме того, даже если специально упомянуто, что косые черты могут использоваться в ссылках на шаблоны, например /infrastructure/datawarehouse/redshift/MyRedshiftMasterUserPassword выдается следующая ошибка:

Параметр MasterUserPassword не является допустимым паролем. Можно использовать только печатаемые символы ASCII, за исключением '/', '@', '"', '', '\', '' '. (Сервис: AmazonRedshift; Код состояния: 400; Код ошибки: InvalidParameterValue)

таким образом, как результат, на который ссылается SecureString, похоже, несовместимо с иерархией SSM ParameterStore (параметры с косой чертой).

  1. Более того, при удалении любого ранее сообщенного недопустимого символа из имени параметра он жалуется на следующее:

Параметр MasterUserPassword должен содержать как минимум 1 заглавную букву. (Сервис: AmazonRedshift; Код состояния: 400; Код ошибки: InvalidParameterValue; Идентификатор запроса: 90a263bd-2929-11e9-80c0-ffcecf297c44)


В конце концов, хотя использование базового короткого Parameter name без косой черты в шаблоне позволяет стеку завершить операцию Update, динамическая ссылка по-прежнему не возникает, поскольку фактическое используемое значение меняется out должно быть предоставлено Имя параметра, а не значение, на которое он ссылается, например, MyRedshiftMasterUserPassword вместо Abcd2019.

Я знаю, что можно также использовать AWS Secrets Manager, но он платный.


person blamblam    schedule 05.02.2019    source источник
comment
Как вы убедились, что фактическое значение оказалось именем параметра, а не значением? Кроме того, указанные вами ошибки относятся не к имени параметра, а к значению, и «Abcd2019» кажется правильным. Я успешно использовал securestring точно так же, как вы представили, так что это кажется правильным. Вы пытаетесь получить его с помощью какого-нибудь SDK, такого как boto3?   -  person Biplob Biswas    schedule 07.02.2019
comment
Я проверил последнее используемое значение, пытаясь подключиться к кластеру Redshift, поскольку он аутентифицируется только по имени, а не по значению в качестве пароля. Фактически SecureString «Abcd2019» является допустимым паролем, но, поскольку в конечном итоге он использует имя, а не значение, он не соответствует ограничениям, что приводит к ошибкам.   -  person blamblam    schedule 07.02.2019
comment
Можете ли вы проверить значения этих двух команд aws: aws ssm get-parameter --name MyRedshiftMasterUserPassword и aws ssm get-parameter --name MyRedshiftMasterUserPassword --with-decryption? Потому что в остальном мне это нравится.   -  person Biplob Biswas    schedule 07.02.2019
comment
Просто проверил возвращаемые значения при выполнении команд awscli, и результат успешно разрешен.   -  person blamblam    schedule 12.02.2019


Ответы (1)


Открыт запрос в службу поддержки AWS с запросом руководства по этому странному поведению CloudFormation.

По словам службы поддержки, на самом деле это действительно известная ошибка для службы CloudFormation, для исправления которой нет расчетного времени. Разрешение параметра SSM Parameter Store SecureString при использовании в качестве динамической ссылки в частном случае свойства RedshiftMasterUserPassword, несмотря на ссылку в документации, не разрешается должным образом, и вместо этого используется имя параметра.

В качестве альтернативы они предлагают 2 обходных пути, пока проблема будет устранена:

  1. Получите MasterUserPassword для Redshift из входного параметра со свойством NoEcho, установленным в значение true. Свойство NoEcho позволяет маскировать значение пароля, и вам не нужно хранить пароль в файле шаблона. Однако каждый раз, когда вы обновляете стек, вам необходимо вводить пароль в качестве входного параметра. Для справки будет полезен приведенный ниже фрагмент кода.

Второй вариант, который более универсален:

  1. Определите настраиваемый ресурс с поддержкой Lambda в вашем файле шаблона, который запрашивает службу SSM и возвращает пароль в CloudFormation. В этом сценарии вам необходимо написать собственный код для лямбда-функции, которая использует AWS вызов API GetParameter, чтобы получить значение параметра SSM Secure String и вернуть расшифрованное значение в CloudFormation.

Другие поддерживаемые свойства для динамической ссылки работают нормально.

person blamblam    schedule 12.02.2019