Совершенно секретно: 5 советов по управлению секретами в Apache Airflow

Автор Категория ,
Совершенно секретно: 5 советов по управлению секретами в Apache Airflow

В сферу ответственности дата-инженера входит не только проектирование быстрых и производительных конвейеров обработки данных, но обеспечение их надежности, в т.ч. с точки зрения информационной безопасности. Сегодня рассмотрим, как управлять чувствительной информацией (секретами) в Apache AirFlow, каких видов они бывают, где хранятся и что нужно сделать, чтобы не отображать их в UI и логе задач.

3 вида секретов в Apache Airflow

Секреты – это конфиденциальная информация, которая используется в пользовательских DAG-цепочках. Они бывают следующих видов [1]:

  • переменные (variables) – как общий способ хранения и извлечения произвольного контента или настроек в виде простого хранилища значений ключа в Airflow. Переменные среды – самый простой в использовании способ, но неудобный в обслуживании. Переменные среды не поддерживают встроенное шифрование и к ним невозможно получить доступ из GUI или CLI-интерфейсов Airflow. Безопаснее работать и этим видом секретов из Kubernetes. Продолжительность жизни переменных среды зависит от развертывания Airflow или его конфигураций.
  • подключения (connections) – информация, необходимая для подключения к внешним системам в формате URI в URL-кодировке.
  • конфигурации (configurations) – конфигурационные настройки AirFlow, которые могут храниться в бэкэнде системы.

При хранении секретов в базе метаданных AirFlow (Metastore DB), их обслуживание упрощается. В частности, они доступны из GUI- и CLI-интерфейсов, а также через API. При добавлении соединений кодирование URL и форматирование URI выполняется автоматически. Поддерживается шифрование ключом Fernet в БД, просто экспортируется и импортируется. В этом случае длительность жизни секрета определяется хранилищем Airflow Metastore. Впрочем, этот способ может быть не одобрен специалистами cybersecurity и не подойдет для production-сред. Поэтому стоит рассмотреть альтернативные способы [1]:

  • HashiCorp Vault – open-source утилита для безопасного и надежного хранения и распространения секретов, таких как ключи API, токены доступа и пароли [2];
  • GCP Secret Manager – система хранения ключей API, паролей, сертификатов и других конфиденциальных данных в Google Cloud [3];
  • AWS Secrets Manager – сервис управления конфиденциальными данными, который помогает защитить доступ к приложениям, сервисам и ИТ‑ресурсам [4];
  • Azure Key Vault – облачная служба для безопасного хранения секретов (ключи API, пароли, сертификаты или криптографические ключи) и доступа к ним.

Лучшие практики управления секретами в AirFow

С учетом, что развертывание Apache AirFlow в Google Cloud Platform (GCP) и других облачных средах сегодня становится весьма популярно, целесообразно использовать возможности именно этих SaaS/PaaS-решений для хранения конфиденциальной информацией и управления доступом к ней. В частности, интеграция GCP Workload Identity и AWS IAM (Identity and Access Management) предоставляет следующие преимущества совместного использования этих технологий [1]:

  • безопасность – не нужно прикасаться к учетным записям сервисов;
  • гибкость – учетные записи облачных служб привязаны к учетным записям служб Kubernetes;
  • простота эксплуатации – достаточно однажды настроить разрешения и сохранить их для долговременного использования.

Подключения и конфиденциальные переменные среды рекомендуется хранить в backend-альтеративах, таких как HashiCorp Vault, GCP Secret Manager, AWS Secrets Manager, Azure Key Vault. А Airflow Metastore DB стоит применять для тех секретов, к которым нужен доступ непосредственно из самого фреймворка [1]. Об автоматизации очистки хранилища Metastore читайте в нашей новой статье

Также имеет смысл маскировать конфиденциальные данные. Airflow по умолчанию маскирует пароли подключения, конфиденциальные переменные и ключи из дополнительного поля подключения (JSON), когда они появляются в журналах задач, в представлениях переменных и визуализированных полях GUI. За включение/отключение маскирования отвечает параметр конфигурации hide_sensitive_var_conn_fields. Автоматическое маскирование запускается подключением или доступом к переменной. Но при передаче чувствительных данных через XCom или любой другой подобный канал, оно не будет замаскировано в нисходящей задаче.

Когда маскирование включено, Airflow всегда будет маскировать поле пароля каждого соединения, к которому выполняется задача. Также фреймворк спрячет значение переменной или поле дополнительного JSON-объекта Connection, если имя содержит слова типа ‘password’, ‘secret’, ‘passwd’, ‘authorization’, ‘api_key’, ‘apikey’, ‘access_token’. Наконец, если требуется маскировать дополнительный секрет, который уже был замаскирован одним из вышеперечисленных методов, дата-инженер может сделать это в пользовательском DAG-файле или в функции выполнения оператора с помощью mask_secret() следующим образом [5]:

@task

def my_func():

    from airflow.utils.log.secrets_masker import mask_secret

    mask_secret(“custom_value”)

или через объявление функции в классе:

class MyOperator(BaseOperator):

    def execute(self, context):

        from airflow.utils.log.secrets_masker import mask_secret

        mask_secret(“custom_value”)

Узнайте больше полезных тонкостей современной дата-инженерии и практического применения Apache AirFlow для разработки сложных конвейеров аналитики больших данных с Hadoop и Spark на специализированных курсах в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:

Источники

  1. https://www.astronomer.io/blog/secrets-management-airflow-2
  2. https://www.vaultproject.io/
  3. https://cloud.google.com/secret-manager
  4. https://aws.amazon.com/ru/secrets-manager/faqs/
  5. https://airflow.apache.org/docs/apache-airflow/stable/security/secrets/index.html