Security+ Academy · Урок

Безопасное управление секретами и переменными окружения

Не храните секреты непосредственно в исходном коде: используйте менеджеры секретов (Vault, AWS Secrets Manager) и внедряйте переменные окружения во время выполнения.

Урок 2 из 413 шагов

«Безопасное управление секретами и переменными окружения» — бесплатный урок Security+ Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Security+ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Security+ Academy содержит 4 уроков всего.

Проблема секретов, зашитых в коде

Секреты, зашитые в коде — ключи API, пароли баз данных, закрытые ключи TLS и токены OAuth, встроенные непосредственно в исходный код, — являются одними из наиболее распространённых и предотвратимых уязвимостей безопасности. Секреты в исходном коде доступны в истории системы контроля версий (даже после удаления), видимы всем разработчикам с доступом к репозиторию и часто становятся общедоступными, когда репозитории случайно открывают. Инструменты вроде GitGuardian и truffleHog постоянно ищут утёкшие секреты на таких платформах, как GitHub.

# DANGEROUS: hardcoded secret in source code
# db_password = 'P@ssw0rd#2026'
# api_key = 'sk-live-abc123xyz789'
# aws_secret = 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY'

# These secrets are now:
# - In git history (even if later deleted)
# - Visible to all repo contributors
# - Potentially in CI/CD logs
# - Often leaked when repos go public accidentally

Переменные окружения: лучше, но недостаточно

Переменные окружения удаляют секреты из исходного кода, передавая их во время выполнения через операционную систему хоста или оркестратор контейнеров. application считывает os.environ['DB_PASSWORD'], а не заранее заданное значение. Это лучше, чем хранить секреты в коде, но у переменных окружения есть недостатки: они отображаются в списках процессов, наследуются дочерними процессами, часто попадают в дампы сбоев и отладочные журналы, а также требуют ручной Rotation. Они подходят для разработки, но сами по себе недостаточны для управления секретами в рабочей среде.

# Environment variable pattern:
# In .env file (NEVER commit to git):
# DB_PASSWORD=P@ssw0rd#2026
# API_KEY=sk-live-abc123xyz789

# In .gitignore:
# .env
# *.env
# .env.*

# In application code:
# db_password = os.environ.get('DB_PASSWORD')
# api_key = os.environ.get('API_KEY')

# Risk: env vars visible in 'ps aux' output,
# inherited by child processes, appear in /proc/<pid>/environ

Специализированные менеджеры секретов

Менеджеры секретов — специализированные системы для хранения, Rotation и аудита доступа к секретам. К ведущим решениям относятся HashiCorp Vault (с открытым исходным кодом и корпоративная версия), AWS Secrets Manager, Azure Key Vault и Google Cloud Secret Manager. application аутентифицируется в менеджере секретов во время выполнения, получает секрет и использует его — секреты никогда не хранятся на диске или в переменных окружения. Весь доступ записывается в журналы, что позволяет проверить, кто, к какому секрету и когда обращался.

# HashiCorp Vault secret retrieval (conceptual):
# Application authenticates to Vault using:
#   - AWS IAM role (in cloud environments)
#   - Kubernetes service account token
#   - AppRole credentials

# After authentication, retrieve secret:
# vault kv get -field=password secret/prod/database

# In application (Python SDK):
# client = hvac.Client(url='https://vault.company.com')
# client.auth.aws.iam_login(role='prod-app')
# secret = client.secrets.kv.read_secret('prod/database')
# db_password = secret['data']['password']

Автоматическая Rotation секретов

Ключевое преимущество менеджеров секретов перед переменными окружения — автоматическая Rotation. AWS Secrets Manager может автоматически менять пароли баз данных RDS по расписанию (например, каждые 30 дней), не требуя повторного развёртывания application. Менеджер секретов одновременно обновляет пароль в базе данных и сохранённый секрет. application, получающее секреты при каждом подключении, автоматически получает новые учётные данные. Это устраняет распространённую практику использования «постоянных» паролей служебных учётных записей, которые никогда не меняются.

# AWS Secrets Manager rotation configuration:
# Secret:         prod/app-database-credentials
# Rotation:       enabled
# Frequency:      every 30 days
# Lambda function: SecretsManager-MyRDSRotation

# Rotation process:
# 1. Lambda creates new DB password
# 2. Updates secret in Secrets Manager
# 3. Updates password on RDS instance
# 4. Tests new credentials work
# 5. Deprecates old credentials
# Application: always calls GetSecretValue at runtime -> gets fresh value

Защита с помощью .gitignore

Первой линией защиты от секретов, попавших в репозиторий, является правильно поддерживаемый файл .gitignore, исключающий все файлы, которые могут содержать секреты. Однако .gitignore предотвращает только будущие коммиты — секреты, уже добавленные в репозиторий, сохраняются в истории git. Если секреты случайно попали в репозиторий, их необходимо немедленно считать скомпрометированными: замените секрет, а затем при необходимости используйте такие инструменты, как git filter-repo, чтобы переписать историю (это требуется для соблюдения нормативных требований, но само по себе недостаточно, поскольку секрет уже мог быть извлечён).

# Recommended .gitignore entries for secret files:
# .env
# .env.*
# *.pem
# *.key
# *.p12
# *.pfx
# credentials.json
# service_account*.json
# secrets.yaml
# config/secrets.yml
# terraform.tfvars  (may contain cloud credentials)
# .aws/credentials

# Pre-commit hook to scan for secrets before commit:
# pre-commit install
# hook: detect-secrets / gitleaks / truffleHog

Секреты в инфраструктуре как коде

Файлы инфраструктуры как кода (IaC) — Terraform, CloudFormation и манифесты Kubernetes — часто содержат секреты: строки подключения к базам данных, ключи API в объявлениях переменных окружения и сертификаты TLS. Эти файлы часто добавляют в системы контроля версий, создавая риск раскрытия секретов. Среди решений — динамические секреты Vault (Vault создаёт краткоживущие учётные данные специально для каждого запуска Terraform), Secrets Kubernetes (хранятся в etcd и должны быть зашифрованы при хранении), а также external-secrets-operator, который во время выполнения синхронизирует данные из менеджера секретов с Kubernetes.

Принцип наименьших привилегий для секретов

Каждое приложение или служба должны получать доступ только к тем секретам, которые им непосредственно необходимы, — это принцип наименьших привилегий, применённый к секретам. Веб-приложению нужен пароль базы данных, но не закрытый ключ CA. Заданию для формирования отчётов нужны учётные данные базы данных только для чтения, а не доступ на запись. Менеджеры секретов обеспечивают это с помощью политик доступа, указывающих, какие идентификаторы (роли IAM, учётные записи служб, AppRoles) могут читать какие секреты; весь доступ записывается в журналы для аудита.

# Vault policy: web application can read DB password only
# policy name: web-app-policy
# path 'secret/prod/database' {
#   capabilities = ['read']
# }
# path 'secret/prod/tls-certs/*' {
#   capabilities = []  # DENY - app does not need TLS keys
# }

# This policy is assigned to the web app's AppRole.
# The reporting service gets a separate policy with
# only 'secret/prod/reporting-db-readonly' access.

Динамические секреты

Динамические секреты создаются по требованию для конкретного запрашивающего и автоматически истекают. Vault может создать временные учётные данные базы данных, действительные в течение 1 часа и связанные с конкретной службой, которая их запросила. После истечения срока действия база данных автоматически отзывает эти учётные данные. Благодаря этому не существует долгоживущих статических учётных данных, которые можно украсть: даже если атакующий перехватит динамические учётные данные, они быстро истекут, а в журналах аудита будет указано, какое удостоверение их запросило.

# Vault dynamic secrets: temporary DB credentials
# Application calls Vault to get a DB credential:
# vault read database/creds/web-app-role
#
# Vault response:
# username: v-web-app-x7k2m-1234567890  (unique, temporary)
# password: A1b2C3d4E5f6G7h8            (randomly generated)
# lease_duration: 1h                     (auto-expires)
#
# After 1 hour, Vault instructs DB to revoke this user.
# No static password ever exists for the attacker to steal.

Секреты в конвейерах CI/CD

Конвейерам CI/CD часто требуются секреты — учётные данные поставщика облачных услуг для развёртывания, токены реестра Docker и ключи подписи. Никогда не храните секреты в скриптах конвейера или файлах конфигурации. Вместо этого используйте встроенное хранилище секретов платформы конвейера (GitHub Actions Secrets, GitLab CI Variables, Jenkins Credentials Store) или получайте секреты из централизованного хранилища во время выполнения с помощью удостоверения машины. Помечайте переменные с секретами как замаскированные в журналах, чтобы предотвратить их случайное раскрытие в выводе сборки.

# GitHub Actions: using secrets in pipeline
# secrets.yml in GitHub Settings -> Secrets (encrypted storage)
# Secret: AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY

# In .github/workflows/deploy.yml:
# env:
#   AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
#   AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}

# Best practice: use OIDC federation instead
# GitHub -> AWS trust relationship via OIDC token
# -> No static AWS keys needed at all

Аудит доступа к секретам

Менеджеры секретов предоставляют подробные журналы аудита каждого события доступа к секрету: какое удостоверение обратилось к какому секрету, с какого IP-адреса, в какое время и был ли доступ разрешён или отклонён. Эти журналы критически важны для соблюдения нормативных требований (SOC 2, PCI-DSS) и реагирования на инциденты. Если есть подозрение, что учётные данные скомпрометированы, журналы аудита показывают, какие системы и когда обращались к ним, что позволяет быстро выявить потенциально затронутые системы и принять решение об их изоляции.

Хуки перед коммитом для предотвращения утечек секретов

Хуки перед коммитом — это скрипты, которые автоматически запускаются перед завершением каждого коммита git и позволяют обнаружить секреты до их попадания в историю системы контроля версий. Такие инструменты, как detect-secrets (Yelp), GitLeaks и git-secrets (AWS), интегрируются как хуки перед коммитом и сканируют подготовленные файлы на наличие шаблонов ключей API, строк подключения, закрытых ключей и токенов JWT. Если обнаружен секрет, коммит отклоняется, а разработчику предлагается удалить учётные данные. Среда pre-commit упрощает добавление конфигураций хуков и обмен ими между командами.

# Installing detect-secrets as pre-commit hook:
# 1. Install: pip install detect-secrets
# 2. Create baseline: detect-secrets scan > .secrets.baseline
# 3. Add to .pre-commit-config.yaml:
#    repos:
#      - repo: https://github.com/Yelp/detect-secrets
#        rev: v1.4.0
#        hooks:
#          - id: detect-secrets
#            args: ['--baseline', '.secrets.baseline']
# 4. Install hooks: pre-commit install

# Now every commit attempt is scanned:
# git commit -m 'add config'
# -> detect-secrets runs
# -> if AWS key pattern found: COMMIT BLOCKED
# -> developer must remove secret and use secrets manager

Быстрая проверка

Проверьте своё понимание концепций CompTIA Security+ (SY0-701) из этого урока.

Итоги урока

В этом уроке Вы узнали, что жёстко заданные секреты в исходном коде необходимо устранять и заменять менеджерами секретов, такими как Vault или AWS Secrets Manager; автоматическая ротация устраняет долгоживущие учётные данные, которыми атакующие могли бы воспользоваться даже после первоначальной компрометации; а динамические секреты и политики доступа с наименьшими привилегиями уменьшают ценность любого отдельно взятого раскрытого секрета. Далее мы рассмотрим безопасность зависимостей и анализ состава программного обеспечения.

Можно начать бесплатно

Изучай Security+ Academy с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
30
Уроки
120

Часто задаваемые вопросы

Урок «Безопасное управление секретами и переменными окружения» бесплатный?

Да — полный текст урока «Безопасное управление секретами и переменными окружения» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Security+ Academy, подпишись на CoddyKit PRO. Курс Security+ Academy содержит 4 уроков всего.

Чему я научусь в уроке «Безопасное управление секретами и переменными окружения»?

Не храните секреты непосредственно в исходном коде: используйте менеджеры секретов (Vault, AWS Secrets Manager) и внедряйте переменные окружения во время выполнения. Ты практикуешь Security+ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Security+ Academy?

Предыдущий опыт не требуется. Security+ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Безопасное управление секретами и переменными окружения»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Security+ Academy?

Да. Каждый урок Security+ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Проверка входных данных и кодирование выходных данных
  2. Безопасное управление секретами и переменными окружения
  3. Безопасность зависимостей и анализ состава программного обеспечения
  4. DevSecOps: перенос безопасности в начало конвейеров
← Назад к Security+ Academy