Недавно на работе я столкнулся с необходимостью безопасно хранить и извлекать значение переменной среды с помощью AWS.

Секрет среды должен шифроваться при хранении и передаче и расшифровываться приложением только во время выполнения.

В этой записи блога мы рассмотрим, как использовать Node.js с AWS Secrets Manager и AWS KMS для безопасного хранения и извлечения переменных среды. Мы также будем использовать Terraform для настройки необходимых ресурсов AWS.

Менеджер секретов AWS

AWS Secrets Manager — это сервис, который позволяет хранить и извлекать секреты, такие как учетные данные базы данных, ключи API и другую конфиденциальную информацию. Secrets Manager шифрует и хранит секреты с помощью AWS KMS и позволяет вам контролировать доступ к секретам с помощью политик IAM. Secrets Manager также обеспечивает автоматическую ротацию секретов для повышения безопасности.

АМС КМС

AWS KMS — это сервис, который позволяет создавать ключи шифрования для ваших ресурсов AWS и управлять ими. KMS можно использовать для шифрования данных в состоянии покоя и при передаче, а также для шифрования переменных среды, хранящихся в AWS Secrets Manager.

Node.js с AWS Secrets Manager и AWS KMS

Чтобы использовать AWS Secrets Manager и AWS KMS с Node.js, нам необходимо установить AWS SDK для Node.js:

npm install aws-sdk

Затем мы можем использовать следующий код, чтобы получить секрет из AWS Secrets Manager и расшифровать его с помощью AWS KMS:

const AWS = require('aws-sdk');
const secretsManager = new AWS.SecretsManager();
const kms = new AWS.KMS();

async function getSecret(secretName) {
  const params = {
    SecretId: secretName
  };
  const response = await secretsManager.getSecretValue(params).promise();
  const ciphertext = response.SecretBinary;
  const decrypted = await kms.decrypt({ CiphertextBlob: ciphertext }).promise();
  return decrypted.Plaintext.toString('utf-8');
}

// Usage
const MY_ENV_VAR = await getSecret('my-app/dev/my-secret');
console.log(MY_ENV_VAR);

В этом примере мы используем метод getSecretValue объекта secretsManager для получения секрета с именем my-app/dev/my-secret из AWS Secrets Manager. Свойство SecretBinary объекта ответа содержит зашифрованное значение секрета. Затем мы используем метод decrypt объекта kms для расшифровки значения зашифрованного текста. Свойство Plaintext объекта ответа содержит расшифрованное значение открытого текста секрета.

Терраформ

Чтобы настроить инфраструктуру с помощью Terraform, мы можем использовать следующий код:

resource "aws_kms_key" "my_kms_key" {
  description = "Encryption key for my secrets"
}

resource "aws_secretsmanager_secret" "my_secret" {
  name = "my-app/dev/my-secret"
  kms_key_id = aws_kms_key.my_kms_key.id
}

resource "aws_secretsmanager_secret_version" "my_secret_version" {
  secret_id     = aws_secretsmanager_secret.my_secret.id
  secret_binary = base64encode("my-secret-value")
}

В этом примере мы создаем ключ шифрования, используя ресурс aws_kms_key. Мы также создаем секрет с именем my-app/dev/my-secret, используя ресурс aws_secretsmanager_secret и указываем свойство kms_key_id для использования созданного ранее ключа шифрования. Мы также создаем секретную версию, используя ресурс aws_secretsmanager_secret_version со значением зашифрованного текста в кодировке base64 my-secret-value. Обратите внимание, что значение зашифрованного текста должно быть заменено фактическим значением зашифрованного текста.

IAM-разрешения

Это была бы не статья об AWS без упоминания роли IAM в этом сценарии использования. Чтобы код nodejs успешно работал и выполнял вызовы API к Secrets Manager и службам KMS, вам потребуется роль IAM со следующими разрешениями:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "SecretsManagerPermissions",
      "Effect": "Allow",
      "Action": [
        "secretsmanager:GetSecretValue",
        "secretsmanager:DescribeSecret",
        "secretsmanager:ListSecrets"
      ],
      "Resource": "arn:aws:secretsmanager:<region>:<account-id>:secret:<secret-name>"
    },
    {
      "Sid": "KMSPermissions",
      "Effect": "Allow",
      "Action": [
        "kms:Decrypt"
      ],
      "Resource": "arn:aws:kms:<region>:<account-id>:key/<key-id>"
    }
  ]
}

Заключение

В этом блоге мы рассмотрели, как использовать Node.js с AWS Secrets Manager и AWS KMS для безопасного хранения и извлечения переменных среды. Мы также использовали Terraform для настройки необходимых ресурсов AWS. Используя AWS Secrets Manager и AWS KMS, мы можем гарантировать, что наши секреты зашифрованы и защищены, и мы можем контролировать доступ к ним с помощью политик IAM. Этот подход также позволяет нам автоматически чередовать наши секреты для повышения безопасности.

Использовать AWS Secrets Manager и AWS KMS с Node.js просто и понятно. Мы можем использовать AWS SDK для Node.js, чтобы получать секреты из Secrets Manager и расшифровывать их с помощью KMS. С Terraform мы можем легко создавать необходимые ресурсы AWS для хранения наших секретов.

Я надеюсь, что эта запись в блоге помогла понять, как использовать AWS Secrets Manager и AWS KMS с Node.js для безопасного хранения и извлечения переменных среды. Если у вас есть какие-либо вопросы или отзывы, пожалуйста, оставьте комментарий ниже. Спасибо за чтение!