Как управлять секретами и конфиденциальными данными в приложениях без сервера
Введение: Уникальные требования безопасности безсерверных систем
Бессерверные вычисления изменили способ создания и развертывания приложений. Абстрагируя серверы, масштабируя и патчивая, платформы, такие как AWS Lambda, Azure Functions и Google Cloud Functions, позволяют разработчикам сосредоточиться исключительно на бизнес-логике. Однако этот сдвиг парадигмы также вводит новые проблемы безопасности, особенно вокруг управления секретами и конфиденциальными данными. В традиционном серверном приложении секреты часто находятся в выделенном хранилище на файловой системе или внутри защищенной базы данных. В бессерверном хранилище функции эфемерны, а не имеют состояния и часто используются - нет постоянной файловой системы или долгоживущего процесса для обеспечения безопасности секретов. Ключи API жесткого кодирования, учетные данные базы данных или ключи шифрования в коде являются неприемлемым риском, поскольку код часто хранится в контроле версий и может быть проверен любым, у кого есть доступ.
В этой статье содержится всеобъемлющее руководство по обработке секретов в безсерверных средах. Мы рассмотрим основные проблемы, погрузимся в передовой опыт, пройдемся по конкретным шаблонам реализации с использованием крупных облачных провайдеров и обсудим, как обеспечить безопасность всего жизненного цикла конфиденциальных данных - от разработки до производства.
Понимание проблем тайного управления в безсерверном режиме
Безсерверные архитектуры по своей сути не имеют состояния. Когда функция вызывается, она запускается в контейнере, который срывается после выполнения (или повторно используется в течение короткого времени). Эта эфемерная природа означает, что вы не можете полагаться на длительные процессы или файловые системы для хранения секретов. Общие подводные камни включают:
- Обнаружение в коде и журналах: Разработчики могут непреднамеренно передавать секреты для управления источником или регистрировать их во время отладки.Как только секрет находится в потоке журналов, он может быть извлечен любым, у кого есть доступ к журналу — и журналы часто сохраняются на неопределенный срок.
- Ограничения переменных среды: В то время как переменные среды удобны, они часто устанавливаются во время развертывания и хранятся в простом тексте в конфигурации функции. Если злоумышленник получает доступ к конфигурации функции считывания (например, через скомпрометированный конвейер CI/CD), он получает секрет. Кроме того, переменные среды видны в консоли поставщика облачных услуг, поэтому внутренние команды могут иметь ненужное воздействие.
- Холодные запуски и кэширование: Получение секретов на каждом вызове может ввести задержку и стоимость. Разработчики иногда кэшируют секреты в памяти, но эфемерный контейнер может быть повторно использован для нескольких вызовов - что приводит к устаревшим или просроченным секретам, если ротация является частой.
- Аудиторская способность и вращение: Без централизованного хранилища трудно узнать, кто получил доступ к секрету, когда, или вращать секреты без обновления каждой функции.
Эти проблемы усугубляются распределенной, событийно-ориентированной природой безсерверных приложений. Одной функции может потребоваться вызов базы данных, внешнего API и очереди - каждая из которых требует отдельных учетных данных. Управление всеми этими безопасно через десятки или сотни функций требует систематического подхода.
Лучшие практики для управления секретами и конфиденциальными данными
Основой любой безсерверной стратегии безопасности является принцип наименьших привилегий: каждая функция должна иметь доступ только к секретам, в которых она абсолютно нуждается, и на максимально короткий срок.
1.Использовать специальные секретные услуги управления
Каждый крупный поставщик облачных услуг предлагает специально созданный сервис для хранения и доступа к секретам:
- AWS Secrets Manager — управляет секретами с помощью автоматической ротации и мелкозернистых политик доступа.
- Azure Key Vault — хранит секреты, ключи и сертификаты и интегрируется с функциями Azure через управляемые идентификаторы.
- Google Cloud Secret Manager (FLT:0) — предлагает версию, элементы управления IAM и интеграцию с облачными функциями и облачным запуском.
Эти службы шифруют секреты в состоянии покоя и в пути, предоставляют журналы аудита каждого доступа и позволяют вращать секреты без перераспределения функций. Никогда не храните секреты в простых текстовых конфигурационных файлах или встроенном коде.
2.Переменные значения окружающей среды - но с осторожностью
Переменные среды остаются распространенным способом впрыска конфигурации в бессерверные функции. Однако они никогда не должны хранить секреты напрямую. Вместо этого используйте переменные среды для хранения ссылок на секреты (например, ARN секрета в диспетчере секретов AWS или имя секрета в хранилище ключей Azure). Затем функция извлекает фактический секрет во время выполнения с использованием соответствующего SDK. Таким образом, даже если злоумышленник читает переменные среды, он получает только указатель, а не сам секрет.
3. шифровать все в состоянии покоя и транзита
Секреты должны быть зашифрованы везде, где они находятся: внутри секретной службы управления, при кэшировании в памяти (с использованием методов, таких как шифрование с твердой памятью), и при передаче по сети. Все основные секретные службы управления обеспечивают шифрование в покое с использованием шифрования конвертов с ключами, управляемыми клиентами (CMK), где это возможно. Для транзита всегда используйте TLS 1.2 или выше между вашей функцией и секретным магазином.
4. Внедрение строгого контроля доступа и принципа наименьшей привилегии
Используйте ролевой контроль доступа (RBAC) или атрибутивный контроль доступа (ABAC), чтобы ограничить, какие функции могут считывать, какие секреты. В AWS прикрепляйте политики IAM к роли исполнения функции, которые предоставляют только для конкретных секретных ARN. Аналогично, в Azure, используйте управляемые идентификаторы и назначайте гранулированные политики доступа к ключу. Избегайте разрешений wildcard, которые позволяют функции считывать любой секрет в учетной записи.
Кроме того, ограничить доступ к самой секретной службе управления. Только администраторы должны иметь возможность создавать, изменять или удалять секреты. Операторы и разработчики должны ограничиваться чтением секретов, необходимых для их работы, а журналы аудита должны периодически пересматриваться.
5. Регулярно вращайте секреты
Автоматическое вращение секретов имеет решающее значение для ограничения радиуса взрыва компромисса. AWS Secrets Manager может вращать секреты по расписанию (например, каждые 30 дней), вызывая функцию Lambda, которая обновляет секрет в целевой службе (например, в базе данных). Azure Key Vault интегрируется с другими службами Azure для вращения, хотя для этого требуется автоматизация для целей, не относящихся к Azure. Google Cloud Secret Manager поддерживает версификацию, делая ручное вращение простым, но автоматическое вращение требует работы облачной функции или облачного планировщика.
Даже при автоматическом вращении вы должны убедиться, что старые секретные версии не хранятся бесконечно.Внедрить политику хранения, которая очищает старые версии после безопасного окна (например, через 30 дней после вращения), чтобы предотвратить использование злоумышленником старой, скомпрометированной тайны.
6. использовать динамические и временные учетные данные, где это возможно
Для служб, которые его поддерживают, предпочитают временные учетные данные долгосрочным секретам. Например, функции AWS Lambda могут принимать роли IAM, которые выдают временные учетные данные (через STS) для доступа к S3, DynamoDB или другим службам AWS. Это устраняет необходимость в любых жестко закодированных учетных данных. Аналогично, функции Azure могут использовать управляемые идентификаторы для аутентификации к службам Azure без сохранения каких-либо секретов. Функции Google Cloud могут использовать учетные записи служб с короткими токенами.
7.Аудит и мониторинг секретного доступа
Включите вход в систему вашей службы управления секретными данными и отправьте эти журналы на центральную платформу управления информацией и событиями безопасности (SIEM). Мониторинг необычных шаблонов доступа, таких как функция считывания секретов чаще, чем ожидалось, или доступ с неизвестных IP-адресов. Настройте оповещения об ошибках, таких как «отказ в доступе» в секретный магазин, что может указывать на неправильно настроенную функцию или попытку грубой силы.
Управление секретами: реальные модели мира
Знание методов — это одно, а правильное их применение — другое. Ниже приведены шаблоны реализации для трех основных поставщиков облачных услуг, а также кросс-платформенные соображения.
AWS Lambda с менеджером секретов AWS
Чтобы интегрировать AWS Secrets Manager с функцией Lambda, выполните следующие действия:
- Создать секрет — Храните пароль базы данных, ключ API или другую чувствительную строку в секретном диспетчере.Включить автоматическое вращение, если целевая служба поддерживает его.
- Предоставьте доступ к роли исполнения Lambda — Добавьте политику, которая позволяет на конкретном секрете ARN.
- Восстановите секрет во время выполнения — В вашем функциональном коде (Node.js, Python и т.д.) импортируйте AWS SDK и звоните . Кэшируйте секрет в глобальной переменной, чтобы уменьшить задержку и стоимость при повторных вызовах. Например (упрощенный код):
const AWS = require('aws-sdk');
const secretsManager = new AWS.SecretsManager();
let cachedSecret;
exports.handler = async () => {
if (!cachedSecret) {
const data = await secretsManager.getSecretValue({ SecretId: 'arn:aws:secretsmanager:us-east-1:123456789012:secret:MyDbPassword-abc123' }).promise();
cachedSecret = data.SecretString;
}
// use cachedSecret securely, never log it
};
Обратите внимание, что секрет извлекается только один раз за холодный старт. При последующих теплых вызовах кэшируемое значение повторно используется. Если вы часто вращаете секреты, подумайте о том, чтобы установить короткий тайм-to-Live (TTL) на кэше или проверить версию секрета перед повторным использованием.
Azure Key Vault с Azure Key Vault
Azure предлагает более плавную интеграцию через ссылки на Key Vault в конфигурации приложения или в настройках функции. Вместо вызова SDK вручную вы можете установить переменную среды для этого специального синтаксиса:
@Microsoft.KeyVault(SecretUri=https://myvault.vault.azure.net/secrets/DbPassword/)
Когда функция запускается, Azure автоматически разрешает ссылку и вводит секретное значение в качестве переменной среды. Этот подход значительно упрощает код и удерживает секреты из любого файла конфигурации. Однако вы все равно должны предоставить назначенной системой управляемой идентичности функции роль .
Для функций, которые должны динамически извлекать несколько секретов, используйте SDK и , чтобы получать секреты по имени. Всегда используйте для аутентификации, которая будет использовать управляемую личность в производстве и ваши локальные учетные данные во время разработки.
Google Cloud работает с секретным менеджером
Функции Google Cloud могут получать доступ к секретам через переменные среды, которые ссылаются на секретную версию. В команде развертывания можно указать переменную среды, такую как , значение которой установлено на . Функция автоматически разрешает секретное значение во время выполнения. Альтернативно, используйте клиентскую библиотеку Secret Manager для извлечения секретов по требованию.
Уникальная особенность Google Cloud Secret Manager заключается в том, что вы можете предоставить доступ на секретном уровне с помощью IAM-связей, а также использовать ключи шифрования, управляемые клиентами (CMEK), для дополнительной защиты.
За облаками: секреты в CI/CD и разработке
Секреты должны управляться не только в производстве, но и во время разработки и непрерывной интеграции / непрерывного развертывания (CI / CD) трубопроводов. Разработчикам часто необходимо тестировать бессерверные функции локально с реальными конечными точками обслуживания. Самая безопасная практика заключается в использовании личных секретов или временных учетных данных, которые охватываются их идентичностью и имеют ограниченные разрешения.
- Локальная разработка: Используйте такие инструменты, как (для AWS), с или для впрыска учетных данных через переменные среды. Никогда не секреты жесткого кода в локальных конфигурационных файлах, которые могут быть совершены.
- CI/CD трубопроводы: Храните секреты как секреты трубопровода (например, секреты действий GitHub, переменные GitLab CI/CD) и впрыскивайте их во время сборки или развертывания. Избегайте печати секретов в журналах; используйте маскированные переменные, где это возможно. Для многоступенчатых развертываний рассмотрите возможность использования выделенной секретной службы управления, которую трубопровод вызывает через свою собственную идентичность, а не передавать секреты через переменные среды.
- Инфраструктура как код (IaC): Если вы используете Terraform, AWS CloudFormation или Azure Bicep для развертывания бессерверных функций, никогда не секреты жесткого кода в шаблонах IaC. Вместо этого используйте безопасный бэкэнд удаленного состояния и ссылочные секреты из секретного магазина облачного провайдера. Многие инструменты IaC имеют выделенные ресурсы для безопасного чтения секретов (например, источник данных в Terraform).
Соблюдение и стандартизация
Многие нормативные рамки (GDPR, SOC 2, PCI-DSS) требуют строгого контроля за доступом к конфиденциальным данным.Правильное управление секретностью помогает удовлетворить эти требования, предоставляя:
- Аудиторские маршруты: Секретные службы управления регистрируют каждое прочтение, запись и удаление, давая вам полную историю доступа.
- Наименее привилегированное правоприменение: Политики IAM гарантируют, что только авторизованные функции и пользователи могут получить доступ к секретам.
- Шифрование: Секреты шифруются в состоянии покоя и в пути, удовлетворяя требованиям защиты данных.
Принять общекорпоративную политику для секретного наименования, интервалов вращения и циклов обзора. Используйте такие инструменты, как OWASP Секретный щит управления обманом OWASP Секреты управления щитом обмана ] и NIST SP 800-57 NIST SP 800-57) в качестве авторитетных ссылок для управления ключами.
Вывод: создание безопасной архитектуры без сервера
Управление секретами в приложениях без серверов — это не одноразовая задача, а постоянная дисциплина. Эфемерный и распределенный характер бессерверных требует, чтобы вы никогда не доверяли коду или конфигурации хранить секреты. Вместо этого полагайтесь на выделенные секретные службы управления, обеспечивайте доступ с наименьшими привилегиями, автоматически вращайте учетные данные и отслеживайте каждый доступ.
Следуя лучшим практикам, изложенным в этой статье, - используя AWS Secrets Manager, Azure Key Vault или Google Cloud Secret Manager; используя переменные среды только в качестве указателей; кэшируя разумно; и интегрируя безопасную обработку секретов в CI / CD - вы можете создавать приложения без серверов, которые являются мощными и безопасными. Помните, что секреты являются ключами к вашему цифровому царству. Относитесь к ним с уважением, которого они заслуживают.
Для более глубоких погружений обратитесь к официальной документации: