Где хранить секреты? (ключи api, точены и пароли от баз данных)nodejs-67

Хранение секретов — критически важный аспект безопасности приложения. Вот профессиональные подходы, которые я рекомендую после многолетнего опыта:

1. Переменные окружения

Самый распространенный способ для разработки:

# .env файл
DB_PASSWORD=supersecret123
API_KEY=abcd1234efgh5678

Использование с dotenv пакетом:

require('dotenv').config();

const dbPassword = process.env.DB_PASSWORD;
const apiKey = process.env.API_KEY;

Плюсы:

  • Простота использования
  • Не попадает в систему контроля версий (если добавить в .gitignore)

Минусы:

  • Не подходит для production
  • Секреты остаются на диске

2. Secret Management Services

AWS Secrets Manager

const { SecretsManager } = require('aws-sdk');

async function getSecret() {
  const client = new SecretsManager();
  const secret = await client.getSecretValue({ SecretId: 'my/db/secret' }).promise();
  return JSON.parse(secret.SecretString);
}

HashiCorp Vault

const vault = require('node-vault')();

vault.read('secret/data/myapp').then((result) => {
  const secrets = result.data.data;
});

Плюсы:

  • Централизованное управление
  • Ротация секретов
  • Аудит доступа
  • Шифрование

3. Cloud Provider Key Management

  • AWS: Parameter Store (SSM)
  • Google Cloud: Secret Manager
  • Azure: Key Vault

Пример для AWS SSM:

const { SSM } = require('aws-sdk');

const ssm = new SSM();
const param = await ssm.getParameter({
  Name: '/prod/myapp/db_password',
  WithDecryption: true
}).promise();

const dbPassword = param.Parameter.Value;

4. Kubernetes Secrets

# secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: myapp-secrets
type: Opaque
data:
  db.password: BASE64_ENCODED_VALUE

Доступ в приложении через:

const dbPassword = Buffer.from(process.env.DB_PASSWORD, 'base64').toString('ascii');

5. Hardware Security Modules

Для максимальной безопасности (финансовые системы, PCI DSS):

  • AWS CloudHSM
  • Google Cloud HSM
  • Azure Dedicated HSM

Что НЕЛЬЗЯ делать

1. **Хранить в коде** (даже в закомментированных участках)
2. **Использовать конфигурационные файлы** (config.json, settings.js)
3. **Отправлять по email/мессенджерам**
4. **Хранить в браузере localStorage**
5. **Использовать простые системы шифрования** (например, base64 — это не шифрование)

Резюмируем

Для разных сценариев:

  • Разработка: .env файлы с dotenv
  • Production: Secret Management Services (AWS Secrets Manager, HashiCorp Vault)
  • Cloud Native: Интеграция с KMS провайдера
  • Критичные системы: HSM + IAM политики

Всегда соблюдайте принцип наименьших привилегий и регулярно ротируйте секреты. Для Node.js особенно важно никогда не логировать секретные значения и использовать process.env только на уровне инициализации приложения.