Как передать ключ, значение, сгенерированное лямбда-функцией, в KMS

#amazon-web-services #aws-lambda #terraform #amazon-kms #aws-parameter-store

Вопрос:

У меня есть следующий код машинописи, который генерирует ключ, который мне нужно сохранить в KMS

 import {LocalCryptUtils} from 'crypt-util';

const fs = require('fs');

const cryptUtils = new LocalCryptUtils();
cryptUtils.createMasterPrivateKey();

var file = fs.createWriteStream('../../config/derived.txt')
file.write('{n');
file.write(` "public_key_derived" : "${cryptUtils.derivePublicKey(0, 0)}", n`)
file.write(` "public_address_derived" : "${cryptUtils.deriveAddress(0, 0)}" n`)
file.end('}n');

console.log(`{ "masterKey" : "${cryptUtils.exportMasterPrivateKey()}" }`);
 

Все ресурсы, которые я нашел в Интернете, объясняют, как включать переменные KMS или хранилища параметров в лямбда-функцию. Но мое требование состоит в обратном. Мне нужно использовать лямбда-функцию для генерации ключа и хранения в KMS, а также еще одну функцию меньшего размера для генерации ключа и хранения в хранилище параметров. В результате используйте это в ECS Fargate.

Я был бы признателен за ваше руководство в этом вопросе.

пс. Я использую Terraform в качестве инструмента IaC.

Комментарии:

1. Я не уверен, что полностью понимаю, чего вы пытаетесь достичь. KMS может создавать ключи, управляемые клиентами, позвонив по docs.aws.amazon.com/kms/latest/APIReference/API_CreateKey.html API, но это генерирует ключ и не дает вам доступа к нему. Затем вы вызываете API KMS для шифрования или дешифрования данных с помощью этого ключа. Не могли бы вы объяснить, чего вы пытаетесь достичь как целостной вещи, а не как шаги, которые, по вашему мнению, вам нужно сделать, чтобы достичь этого, пожалуйста?

2. @ydaetskcoR Я удалил свой предыдущий комментарий, так как понял, что он снова не предоставил достаточной информации. Итак, здесь я даю ему еще один шанс; Мы используем этот код для генерации ключа the key и хранения его вручную в хранилище параметров, а затем шифруем его с помощью KMS. Затем предоставил правильные разрешения для использования ECS the key Fargate везде, где требуется приложение. Я обеспокоен этой частью генерации этого ключа и думаю, что лучше избавиться от него, но я не вижу функции генерации в параметре хранилища или Менеджере секретов. Всегда ли такие ключи генерируются за пределами infra и хранятся вручную в AWS?

3. Вероятно, все еще недостаточно контекста, чтобы понять, почему вы делаете это очень специфично, но, возможно, я смогу объяснить, что мы делаем, когда нам нужно сгенерировать какую-то секретную строку или ключ для использования службой. Мы используем random_password ресурс, чтобы заставить Terraform генерировать что-то на лету и хранить это в файле состояния (который защищен отдельно), а затем использовать aws_ssm_parameter ресурс для хранения в SSM.

4. Для служб ECS вы можете использовать secrets в определении задачи ECS ссылку на параметр SSM по его ARN, а затем мы разрешаем роли выполнения задачи разрешения IAM получить его и расшифровать (мы шифруем с помощью ключа CMK KMS, чтобы запретить пользователям, использующим только чтение, читать секреты). Затем служба просто считывает его из переменной среды во время выполнения.

5. @ydaetskcoR вы действительно объяснили, что именно я искал. Поэтому я думаю, что нам просто нужно преобразовать то, что у нас есть в параметрах этого кода, чтобы создать пароль для random_password ресурса terraform. Насколько я проверил документацию, в этом ресурсе есть много параметров, которые вы можете настроить для создания пароля. Но этот сгенерированный пароль является своего рода одноразовым поколением или, возможно, меняется очень редко. Мы должны как-то предотвратить его восстановление, когда происходит обновление ресурсов и сценариев терраформирования, у вас есть представление об этом?