Как зашифровать переменные окружения для Lambda через CLI? - PullRequest
0 голосов
/ 25 октября 2018

enter image description here

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

То, что я пытаюсь сделать, это точно то же самое, но при условии, что вы развертываетеэта функция Lamba не в консоли GUI, а через шаблон CloudFormation, который развертывается в CLI .

Вот как я указываю соответствующие параметры в шаблоне CloudFormation:

"EnvironmentVariable" : {
      "Type" : "String",
      "Default" : "test",
      "Description" : "Environment Variable"
    },
    "KmsKeyArn" : {
      "Type" : "String",
      "Description" : "KMS Key ARN if environment variables are encrypted"
    },

Вот как я ссылаюсь на эти параметры в ресурсе Lambda, в разделе «Ресурсы» шаблона:

"Environment" : {
   "Variables" : {
     "SomeVariable": {
       "Ref" : "EnvironmentVariable"
     }  
   }
 },
 "KmsKeyArn" : { "Ref" : "KmsKeyArn" },

А вот как я развертываю этот шаблон в CLI(со всеми моими ARN и другими значениями, измененными для защиты конфиденциальности, но сохраняя их структуру):

aws cloudformation deploy --template-file lambda-template.json --stack-name "CLI-lambda-stack "--parameter-overrides S3BucketName =" theBucket "S3FileLocation =" lambda_function.zip "S3ObjectVersion =" ZuB0eueEgh2yh5q00.DiykLNudujdsc5 "DeadLetterArn =" arn: aws: sns: us-west-2: 526598937246: CloudFormationTests "EnvironmentVariable =" testing "KmsKeyArn =" arn: aws: kms: us-west-2: 227866537246: ключ / b24e7c79-a14d-4a3e-b848-165115c210HandlerFunctionName = "lambda_function.lambda_handler" MemorySize = "128" Role = "arn: aws: iam :: 507845137246: роль / тест-сервер-default-us-east-1-lambdaRole" FuncName = "myCLILambda"

После запуска этого в CLI я не получаю ошибок, но когда я открываю функцию Lambda в консоли для проверки результатов, я вижу что-то вроде этого:

enter image description here

Куда я иду?Спасибо за любые идеи.

Ответы [ 2 ]

0 голосов
/ 26 октября 2018
  1. Создайте ключ KMS, если у вас его еще нет (AWS> IAM> Ключи шифрования> Создать новый ключ> Дать псевдоним).Получите KeyId.
  2. Шифруйте ваши переменные через KMS.Пример:

$ aws kms encrypt --key-id $KEY_ID --plaintext secretpassword --output text --query CiphertextBlob

1009 * AQICAHjZ + JlI8KKmiVc ++ NhnBcO0xX3LFAaCfsjH8Yjig3Yr2AFPIyKCp3XVOEDlbiTMWiejAAAAbDBqBgkqhkiG9w0BBwagXTBbAgEAMFYGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMhai9vkA2KdU5gd + qAgEQgCnWW4F3fb7pTwmA2ppskJhUl0dJGEXIE5oDCr3ZsH7TlN5X381juPg0LA == 1011 * Держите его в шаблоне CF, как это 1013 *

3.Декрипт внутри вашей лямбда-функции

kms = boto3.client('kms')
response = kms.decrypt(CiphertextBlob=os.environ['SECRET_DATA'].decode('base64'))
secret_data = response['Plaintext']
secret_data

Или попробуйте этот вариант: https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-paramstore-about.html#sysman-paramstore-securestring

0 голосов
/ 26 октября 2018

Подводя итог нашим комментариям:

Существует 2 типа шифрования: в пути и в состоянии покоя .При настройке свойства KmsKeyArn в CloudFormation вы устанавливаете конфигурацию «в состоянии покоя» в AWS Lambda, которая заставляет AWS шифровать информацию на своих серверах перед сохранением.Вы никогда этого не увидите, равно как и зашифрованное значение.

Шифрование «в пути» - это то, что вы видите на консоли.Как говорится, в графическом интерфейсе есть помощников для шифрования вашего текста.Это сделает текст зашифрованным даже для вас, и они изменят его на *****.Чтобы использовать эту переменную в вашей функции, вам нужно написать код, который расшифрует значение.Например, Как использовать зашифрованные переменные среды в AWS Lambda? .

Чтобы получить те же результаты в графическом интерфейсе пользователя с помощью CLI, необходимо вручную зашифровать переменные перед вызов команды aws cloudformation deploy.

...