Руководства по безопасности

Основы безопасности: чем на самом деле опасны .env и API-ключи

Что такое .env, что происходит при утечке API-ключа и четыре простые привычки для инди-разработчиков: не выставлять, не коммитить, менять при утечке, проверять.

Опубликовано 2026-06-07 Обновлено 2026-10-06 7 мин чтения
На этой странице

«Постоянно слышу, что безопасность важна, но с чего вообще начать?» Это самый первый шаг для инди-разработчиков. Не чтобы напугать — только то, на что можно действовать сегодня, по порядку.

Почему начинать с секретов (.env и API-ключей)

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

Защитите свои секреты — и предотвратите большинство частых инцидентов. Поэтому начинаем здесь.

Что такое .env (за 30 секунд)

.env — это файл, собирающий секретные значения вашего приложения: пароль базы данных, внешние API-ключи, ключ, шифрующий сессии. Поскольку секреты лежат вместе в одном файле, утечка раскрывает их все разом — поэтому это файл, который надо охранять первым (→ Глоссарий: Что такое .env).

Где могут храниться секреты (.env, переменные окружения, менеджеры секретов)

.env — не единственное место для секретов. Выбирайте по масштабу и назначению.

ГдеДля чего лучшеНа что обратить внимание
Файл .envЛокальная разработка, один небольшой серверДержите его вне Git и вне публичных директорий
Настройки переменных окружения хостинга (вводятся в панели)ПродакшенОграничьте доступ к панели; не допускайте значений в логах сборки
Секреты CI (автоматические тесты и деплой)Автоматизация вроде GitHub ActionsВнешние инструменты, запускаемые в CI, видят значения; передавайте ключи только с нужными правами
Менеджер секретовНесколько человек или несколько серверовДержите доступ на чтение минимальным и регулярно меняйте ключи

Для секретов CI полезен пример инцидента Codecov 2021 года. Внешний инструмент, запускаемый в CI, был подменён, и секреты из переменных окружения CI были похищены (→ инцидент Codecov).

Какие ключи можно публиковать, а какие нельзя

Некоторые API-ключи предназначены для использования внутри браузеров или мобильных приложений, другие — только для серверов. Исходите из того, что всё отправленное в браузер может прочитать любой.

ПримерМожно публиковать?Почему
Публикуемый ключ Stripe (начинается с pk_)ДаВ документации сказано, что его можно включать во фронтенд-код; он не может выполнять чувствительные операции, например создавать платежи
Секретный ключ Stripe (sk_) или ограниченный ключ (rk_)НетОни позволяют выполнять серверные операции; документация рекомендует ограниченные ключи с суженными правами
Переменная окружения Next.js с NEXT_PUBLIC_ПубликуетсяЕё значение встраивается в JavaScript для браузера при сборке
Переменная окружения Next.js без NEXT_PUBLIC_Не публикуется (только сервер)Сюда кладите секретные значения

Если сомневаетесь, проверьте в официальной документации сервиса, можно ли использовать ключ на стороне клиента. Если там об этом не сказано, считайте ключ непубликуемым.

Что означает утечка API-ключа

API-ключ — это «строка, по которой сервис считает вызывающего вами». В чужих руках ущерб распространяется так.

① API-ключ утекает (публичная директория, коммит git или через уязвимость)
↓ с задержкой (дни+)
② Кто-то посторонний использует внешний сервис «от вашего имени»
↓
③ Мошеннические счета / чтение-запись данных / выдача себя за вас
Сначала тихо. Используется с задержкой — а потом однажды всплывает счёт или взлом.

Украденные ключи часто перепродают и используют с задержкой — «сначала ничего не происходит, потом внезапный счёт» — классический паттерн. Поэтому «после того как заметите» уже поздно; суть в том, чтобы изначально не допустить утечки.

Что делать, если ключ мог утечь

Удаление ключа из кода его не останавливает. По отчёту GitGuardian 2025 года, 70% секретов, утёкших в публичные репозитории в 2022 году, на момент отчёта всё ещё действовали. Действуйте в таком порядке.

  1. Отзовите или смените ключ в панели выдавшего сервиса. Если сервис даёт льготный период, завершите действие утёкшего ключа «сейчас»
  2. Установите новый ключ в продакшене и убедитесь, что приложение работает
  3. Проверьте историю использования и счета у выдавшего сервиса на действия, которые совершали не вы
  4. Удаление из файлов и истории Git может подождать до отзыва (одно удаление не остановит того, у кого уже есть копия)

Подробнее — в статье 540 000 учётных данных, опубликованных на GitHub, всё ещё действуют. GitHub по умолчанию включает «push protection», которая не даёт личному аккаунту отправить секреты в публичный репозиторий, но ловит она не все виды секретов.

Четыре привычки, чтобы начать сегодня

Ничего сложного. Всего четыре.

1

Не выставляйте наружу

Никогда не помещайте .env или тело приложения в директорию, видимую из веба (веб-корень). Выставляйте только public/. Конкретные шаги для шаред-хостинга: это руководство.

2

Не коммитьте

Добавьте .env* в .gitignore (разрешив !.env.example); делитесь только обезличенным примером. Раз закоммитив, его можно восстановить из истории, так что держите его вне с самого начала.

3

Меняйте всё при утечке

Не только один ключ — меняйте каждый секрет, который мог утечь. По порядку: внешние API / OAuth → ключи шифрования → почта → БД. Действуйте так, будто их видели.

4

Самопроверка

Время от времени убеждайтесь, что /.env нельзя открыть снаружи (ниже).

Самопроверка (только против доменов, которыми вы владеете)

# 200 с телом означает, что выставлено наружу. 403/404 пока нормально.
curl -sI https://your-domain/.env | head -1
curl -sI https://your-domain/.git/config | head -1

Проверка этого при каждом деплое рано ловит ошибки размещения.

Кроме того, что видно снаружи, проверьте также Git и результат сборки (запускайте в своём репозитории).

# Коммитился ли когда-нибудь .env? (любой вывод означает, что да, в какой-то момент)
git log --all --oneline -- .env
# env-подобные файлы, которые Git отслеживает сейчас (всё, кроме .env.example, стоит проверить)
git ls-files | grep -i "env"

Чтобы убедиться, что ключ не попадает в браузер, поищите первые несколько символов ключа в папке результата сборки (для Next.js — .next/static). Перед публикацией можно также вставить код в сканер утечки секретов (ничего никуда не отправляется).

Частые ошибки против правильного первого шага

Частое

  • «Работает же», и .env кладут прямо под public
  • «Потом удалю», и .env один раз коммитят
  • Меняют только тот ключ, по которому видели злоупотребление

Правильный первый шаг

  • Тело приложения вне веб-корня, выставлять только public/
  • Исключить .env через .gitignore с самого начала
  • При утечке сменить каждый секрет в окружении

Следующие шаги

Дальше следующие темы — «рискованные значения по умолчанию в вашем стеке» и «система, чтобы не отставать от опубликованных CVE». Не спешите, по одной за раз.

Источники

Читать дальше

FAQ

QС чего начать в безопасности?
A

С того, чтобы не допускать утечки своих секретов (.env и API-ключей). Большинство реальных инцидентов начинаются там. Не выставляйте их наружу, не коммитьте в git, при утечке меняйте всё, и время от времени самопроверяйтесь — это предотвращает большую часть.

QЧто конкретно происходит при утечке API-ключа?
A

Кто-то может действовать от вашего имени по отношению к внешнему сервису. Частые исходы — мошеннические счета (тяжёлое использование списывается на вас) и чтение/запись ваших данных. Украденные ключи часто перепродают и используют с задержкой.

QМожно ли класть .env в git?
A

Нет. Добавьте .env* в .gitignore и делитесь только обезличенным .env.example. Раз закоммитив, его можно восстановить из истории git даже после того, как вы позже удалите.

QЧто такое файл .env?
A

Текстовый файл, который хранит настройки приложения, особенно секретные значения вроде паролей и API-ключей, отдельно от кода. Каждая строка имеет вид ИМЯ=значение. Многие фреймворки, включая Laravel, Next.js и Django, читают его при запуске. Поскольку секреты лежат вместе, он должен оставаться вне Git и вне публичных директорий.

QЧем .env отличается от переменных окружения?
A

Переменные окружения — это сам механизм: значения, которые ОС или среда выполнения передаёт программе. Файл .env — это контейнер, который хранит эти значения в файле, чтобы приложение или библиотека загрузили их как переменные окружения при запуске. В продакшене многие обходятся без файла .env и передают переменные окружения из панели хостинга или менеджера секретов.

QМожно ли класть API-ключ во фронтенд-код (в браузер)?
A

Только если в документации прямо сказано, что ключ можно публиковать. JavaScript, который вы отправляете в браузер, может прочитать любой. Например, в документации Stripe сказано, что публикуемые ключи (начинаются с pk_) можно включать во фронтенд-код, а секретные ключи (sk_) и ограниченные ключи (rk_) раскрывать нельзя. В Next.js переменные окружения с префиксом NEXT_PUBLIC_ встраиваются в код для браузера, поэтому никогда не давайте секрету такой префикс.