Совет по безопасности: Защитите свой файл .env

Источник: «Security Tip: Protect Your .env File»
[Совет #62] Поисковые системы любят просматривать все ваши файлы, поэтому будьте внимательны к тому, что вы оставляете на видном месте.

Сегодня утром я наткнулся на интересный твит от @AshboDev в Twitter:

Твит о доступных .env файлах
Сегодня вечером я обнаружил несколько сайтов #Laravel с открытым .env, дающим мне полный доступ к БД, к которой подключён их сайт. Удивительно, как много их там, это недостаток образования или просто самодовольство людей? @AshboDev

Это вызвало ряд интересных вопросов и рекомендаций, о которых мы расскажем в ближайшее время, а также вот этот ответ/цитата от @akshitarora0907, наглядно демонстрирующий суть проблемы:

Цитата твита, показывающая снимок экрана с открытым .env файлом
Цитата твита, показывающая снимок экрана с открытым .env файлом.

Это совершенно очевидная проблема на некоторых сайтах, которую можно легко использовать с помощью техники Google Dorking, позволяющей легко находить открытые .env файлы.

Я только что провёл быструю проверку, которая выявила 20 с лишним сайтов на первой странице результатов — именно то, что я и ожидал найти. Это только те сайты, о которых Google знает — их может быть значительно больше, и их можно найти вручную или со временем, когда Google их обнаружит.

Многие из них содержат ключи шифрования для APP, учётные данные баз данных, ключи API и т.д., многие из них могут быть использованы для дальнейшей эксплуатации приложения или связанных с ним учётных записей. Например, поиск ключей Stripe позволит получить доступ к платёжным системам…

Как это происходит

По замыслу разработчиков, Laravel хранит все файлы, кроме самых необходимых, вне каталога public/, и вы должны настроить свои приложения таким образом, чтобы только каталог public/ был доступен в Интернете. Это означает, что такие файлы, как .env, вообще недоступны, и вы полностью защищены от этой проблемы.

Однако некоторые среды не поддерживают размещение файлов за пределами web root (например, виртуальный хостинг), или если вы управляете собственным сервером и не знаете о назначении каталога public/. В таких случаях файлы за пределами каталога public/ становятся доступными в Интернете, и конфиденциальная информация, например, файл .env, может быть раскрыта.

Проблемой является не только .env, но и любой другой файл в вашей директории — например, auth.json, или файлы кэша, конфигурационные файлы и т.д… вариантов множество.

Как это предотвратить

  1. Установите приложение так, чтобы public/ был единственным каталогом, доступным для просмотра через Интернет.

    Это очень важно, поэтому всегда сначала попробуйте это сделать! Если вы используете такой сервис, как Laravel Forge, это будет сделано автоматически.

  2. Добавьте в Nginx/Apache специальные правила, блокирующие доступ к конфиденциальным файлам.

    Laravel Forge делает это в качестве дополнительного уровня защиты, полностью блокируя все файлы .*. Это также блокирует доступ к файлам .git, что является ещё одной серьёзной угрозой безопасности.

    location ~ /\.(?!well-known).* {
    deny all;
    }
  3. Установите переменные окружения в среде сервера или используйте решение XYZ для безопасного хранения конфигураций.

    Я включил их в список, поскольку они являются приемлемыми решениями. Пункт #3 использовать только в том случае, если вы действительно хотите возиться с этими опциями, управляя большим приложением на нескольких серверах. Это добавляет множество сложностей, с которыми не стоит связываться при работе с простым приложением, и я бы лично рекомендовал просто ограничиться файлом .env и установить Laravel должным образом.

    (Если вы хотите, чтобы я остановился на этом подробнее, или вы не согласны, пожалуйста, пишите в комментариях, и я с удовольствием продолжу обсуждение).

На этом мы закончим, так как это совет по безопасности, а не углублённый анализ, но главный вывод — устанавливайте и настраивайте свои приложения Laravel так, чтобы конфиденциальные файлы не были доступны через Интернет.

Если вам неудобно настраивать сайт безопасно и правильно управлять веб-конфигурацией, то я настоятельно рекомендую воспользоваться сервисом Laravel Forge, который сделает все это за вас

Дополнительные материалы

Предыдущая Статья

Новое в Symfony 6.4: Интеграции Mailer, Translation, Notifier, Webhook и RemoteEvent

Следующая Статья

Возврат массивов и объектов из метода reduce()