Secure configuration

Управление переменными окружения

Cypress позволяет работать с чувствительными данными через переменные окружения, избегая их прямого хранения в коде. Основные способы управления переменными:

  • Файл cypress.env.json. Позволяет хранить ключи и пароли отдельно от тестов. Структура файла:
{
  "API_KEY": "ваш_секретный_ключ",
  "USER_EMAIL": "user@example.com"
}
  • Переменные окружения системы. Можно передавать значения при запуске командой:
CYPRESS_API_KEY=секретный_ключ npx cypress run
  • Команда cypress.config.js с разделом env:
import { defineConfig } from 'cypress'

export default defineConfig({
  env: {
    API_KEY: process.env.API_KEY
  }
})

Использование в тестах:

cy.get('@apiKey').then(() => {
  const apiKey = Cypress.env('API_KEY')
})

Важно: переменные окружения в cypress.env.json не должны попадать в систему контроля версий.


Ограничение доступа к тестовым данным

Для тестирования с конфиденциальной информацией применяются изолированные тестовые учетные записи. Практики безопасности включают:

  • Использование тестовых пользователей, не имеющих реального доступа к продукту.
  • Хранение данных только в зашифрованном виде или через API, возвращающее токены.
  • Разделение данных для разных сред (dev, staging, prod), чтобы минимизировать риск утечки.

Настройка безопасных заголовков и куки

Cypress позволяет управлять заголовками HTTP и куками, что важно для тестирования приложений с авторизацией:

cy.request({
  method: 'POST',
  url: '/login',
  headers: {
    'Authorization': `Bearer ${Cypress.env('API_KEY')}`
  },
  body: {
    email: Cypress.env('USER_EMAIL'),
    password: Cypress.env('USER_PASSWORD')
  }
})

Для куки:

cy.setCookie('session_id', 'секретное_значение')
cy.getCookie('session_id').should('exist')

Рекомендация: очищать куки и локальное хранилище после каждого теста через хуки afterEach, чтобы предотвратить утечку состояния между тестами.


Защита от выполнения тестов на продакшн-среде

Cypress может запускаться на любой среде, включая production, что опасно. Для защиты:

  • Использовать проверку URL перед выполнением теста:
beforeEach(() => {
  if (Cypress.config('baseUrl').includes('production')) {
    throw new Error('Тесты не могут запускаться на продакшн-среде')
  }
})
  • Настроить переменные окружения, которые ограничивают доступ только к тестовым серверам.

Шифрование и хранение секретов

При работе с API-ключами и токенами лучше использовать шифрование:

  • Хранить ключи в зашифрованном виде и расшифровывать только во время выполнения теста.
  • Использовать сторонние менеджеры секретов, например, HashiCorp Vault или AWS Secrets Manager, и подгружать значения через переменные окружения.

Логирование и аудит

Для безопасного тестирования важно вести аудит:

  • Не логировать секретные данные (console.log(Cypress.env('API_KEY')) запрещено).
  • Логи должны содержать только информацию о статусе теста и ошибки, без чувствительных данных.
  • Хранить логи в защищенном месте и ограничивать доступ.

Ограничение сетевых запросов

Cypress позволяет перехватывать и ограничивать HTTP-запросы:

cy.intercept('POST', '/api/private', { statusCode: 403 }).as('blockedRequest')

Это предотвращает случайную отправку конфиденциальных данных в небезопасные среды.


Настройка CI/CD с безопасностью

При запуске тестов в CI/CD системах:

  • Передавать секреты через защищённые переменные CI/CD.
  • Никогда не сохранять секреты в репозитории.
  • Использовать отдельные сервисные аккаунты для выполнения тестов, ограниченные по правам.

Использование HTTPS и безопасных соединений

Для интеграционных тестов необходимо всегда использовать безопасные протоколы:

  • baseUrl приложения должен быть по https.
  • Все API-запросы должны проходить через HTTPS, чтобы предотвратить утечку токенов через сеть.
  • При тестировании локальной среды можно использовать самоподписанные сертификаты и настроить Cypress для игнорирования предупреждений:
chromeWebSecurity: false

Итоговые практики безопасности

  1. Хранение секретов вне репозитория.
  2. Ограничение доступа к тестовым данным и средам.
  3. Очистка состояния (куки, локальное хранилище) между тестами.
  4. Логирование без раскрытия конфиденциальной информации.
  5. Перехват и контроль сетевых запросов.
  6. Настройка безопасного CI/CD с защищёнными переменными.
  7. Использование HTTPS и безопасных протоколов везде, где это возможно.

Эти меры обеспечивают целостность тестов и защиту конфиденциальной информации при автоматизации с Cypress.