Бессерверная структура - какие разрешения мне нужны для использования хранилища параметров AWS SSM?

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

В качестве фона бессерверная структура [позволяет загружать значения открытого текста и SecureString из хранилища параметров AWS SSM]. 1

Какие разрешения необходимы для доступа и загрузки этих значений хранилища параметров SSM при выполнении бессерверного развертывания?


person sudo soul    schedule 21.05.2019    source источник


Ответы (2)


Как правило, для доступа к значениям хранилища параметров AWS SSM и их расшифровки требуются следующие 3 разрешения:

  1. ssm:DescribeParameters
  2. ssm:GetParameters
  3. kms:Decrypt

-

Вот реальный пример, который разрешает доступ только к параметрам SSM, относящимся к моим лямбда-функциям (отличающимся общим соглашением / шаблоном именования) - он работает при следующих обстоятельствах:

  1. Значения SecureString зашифрованы с помощью ключа шифрования AWS SSM по умолчанию.
  2. Все параметры используют следующее соглашение об именах

    a. /${app-name-or-app-namespace}/serverless/${lambda-function-name/then/whatever/else/you/want

    б.${lambda-function-name} должен начинаться с sls-

Допустим, у меня есть приложение myCoolApp и лямбда-функция sls-myCoolLambdaFunction. Возможно, я хочу сохранить значения конфигурации базы данных, такие как имя пользователя и пароль.

Я бы создал два параметра SSM:

  1. /myCoolApp/serverless/sls-myCoolLambdaFunction/dev/database/username (открытый текст)

  2. /myCoolApp/serverless/sls-myCoolLambdaFunction/dev/database/password (SecureString)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:DescribeParameters"
            ],
            "Resource": [
                "arn:aws:ssm:${region-or-wildcard}:${aws-account-id-or-wildcard}:*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ssm:GetParameter"
            ],
            "Resource": [
                "arn:aws:ssm:${region-or-wildcard}:${aws-account-id-or-wildcard}:parameter/myCoolApp/serverless/sls-*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt"
            ],
            "Resource": [
                "arn:aws:kms:*:${aws-account-id}:key/alias/aws/ssm"
            ]
        }
    ]
}

Затем в моем файле serverless.yml я мог бы ссылаться на эти два значения SSM как на переменные среды уровня функции, например

environment:
      DATABASE_USERNAME: ${ssm:/myCoolApp/serverless/sls-myCoolLambdaFunction/dev/database/username}
      DATABASE_PASSWORD: ${ssm:/myCoolApp/serverless/sls-myCoolLambdaFunction/dev/database/password~true}

Или, что еще лучше, если я хочу быть супер-динамичным для ситуаций, когда у меня разные значения конфигурации в зависимости от этапа, я могу установить переменные среды следующим образом

environment:
      DATABASE_USERNAME: ${ssm:/myCoolApp/serverless/sls-myCoolLambdaFunction/${self:provider.stage}/database/username}
      DATABASE_PASSWORD: ${ssm:/myCoolApp/serverless/sls-myCoolLambdaFunction/${self:provider.stage}/database/password~true}

В этом примере выше, если бы у меня было два этапа - dev & prod, возможно, я бы создал следующие параметры SSM:

  1. /myCoolApp/serverless/sls-myCoolLambdaFunction/dev/database/username (открытый текст)

  2. /myCoolApp/serverless/sls-myCoolLambdaFunction/dev/database/password (SecureString)

  3. /myCoolApp/serverless/sls-myCoolLambdaFunction/prod/database/username (открытый текст)

  4. /myCoolApp/serverless/sls-myCoolLambdaFunction/prod/database/password (SecureString)

person sudo soul    schedule 21.05.2019
comment
Хороший пример, который вы здесь привели. Тем не менее, иметь в serverless.yml часть пользователя / пароля - нехорошо. Потому что, в конце концов, когда он загружен в S3, облачная информация будет запускать его, и лямбда будет иметь пользователя / пароль в своей среде. - person Edmond; 21.06.2020
comment
@Edmond - это старый вопрос конфигурации во время сборки и во время выполнения. Я согласен с вами, хотя более безопасным способом будет получение лямбда-кодом секретов из SSM (или любого другого хранилища данных) во время выполнения, используя для этого свою роль iam. - person sudo soul; 29.06.2020

Я предлагаю использовать AWS SDK для получения параметров SSM в коде вместо сохранения в файле среды (например, .env). Так безопаснее. Вам необходимо назначить разрешение для используемой роли с помощью action = ssm: GetParameter и указать ресурс для параметра в хранилище параметров SSM. Я использую бессерверный фреймворк для развертывания. Ниже показано, что у меня есть в serverless.yml, предполагая имена параметров с шаблоном "{stage} -myproject- *" (например, dev-myproject-username, qa-myproject-password):

custom:
  myStage: ${opt:stage}
provider:
  name: aws
  runtime: nodejs10.x
  stage: ${self:custom.myStage}
  region: us-east-1
  myAccountId: <aws account id>
  iamRoleStatements:
    - Effect: Allow
      Action:
        - ssm:GetParameter
      Resource: "arn:aws:ssm:${self:provider.region}:${self:provider.myAccountId}:parameter/${self:provider.stage}-myproject-*"

два полезных ресурса перечислены ниже: где сохранить учетные данные? IAM doc для беспроводной инфраструктуры

person Raymond    schedule 21.10.2019
comment
Как iamRoleStatements применяется к поставщику по сравнению с отдельными ресурсами / лямбда-функциями? Где они в конечном итоге привязываются к лямбдам? - person Charlie Schliesser; 16.10.2020