Совет по безопасности: Защитите свой файл .env
Сегодня утром я наткнулся на интересный твит от @AshboDev в Twitter:
Это вызвало ряд интересных вопросов и рекомендаций, о которых мы расскажем в ближайшее время, а также вот этот ответ/цитата от @akshitarora0907, наглядно демонстрирующий суть проблемы:
Это совершенно очевидная проблема на некоторых сайтах, которую можно легко использовать с помощью техники Google Dorking, позволяющей легко находить открытые .env файлы.
Я только что провёл быструю проверку, которая выявила 20 с лишним сайтов на первой странице результатов — именно то, что я и ожидал найти. Это только те сайты, о которых Google знает — их может быть значительно больше, и их можно найти вручную или со временем, когда Google их обнаружит.
Многие из них содержат ключи шифрования для APP
, учётные данные баз данных, ключи API и т.д., многие из них могут быть использованы для дальнейшей эксплуатации приложения или связанных с ним учётных записей. Например, поиск ключей Stripe позволит получить доступ к платёжным системам…
Как это происходит
По замыслу разработчиков, Laravel хранит все файлы, кроме самых необходимых, вне каталога public/
, и вы должны настроить свои приложения таким образом, чтобы только каталог public/
был доступен в Интернете. Это означает, что такие файлы, как .env
, вообще недоступны, и вы полностью защищены от этой проблемы.
Однако некоторые среды не поддерживают размещение файлов за пределами web root (например, виртуальный хостинг), или если вы управляете собственным сервером и не знаете о назначении каталога public/
. В таких случаях файлы за пределами каталога public/
становятся доступными в Интернете, и конфиденциальная информация, например, файл .env
, может быть раскрыта.
Проблемой является не только .env
, но и любой другой файл в вашей директории — например, auth.json
, или файлы кэша, конфигурационные файлы и т.д… вариантов множество.
Как это предотвратить
Установите приложение так, чтобы
public/
был единственным каталогом, доступным для просмотра через Интернет.Это очень важно, поэтому всегда сначала попробуйте это сделать! Если вы используете такой сервис, как Laravel Forge, это будет сделано автоматически.
Добавьте в Nginx/Apache специальные правила, блокирующие доступ к конфиденциальным файлам.
Laravel Forge делает это в качестве дополнительного уровня защиты, полностью блокируя все файлы
.*
. Это также блокирует доступ к файлам.git
, что является ещё одной серьёзной угрозой безопасности.location ~ /\.(?!well-known).* {
deny all;
}Установите переменные окружения в среде сервера или используйте решение XYZ для безопасного хранения конфигураций.
Я включил их в список, поскольку они являются приемлемыми решениями. Пункт #3 использовать только в том случае, если вы действительно хотите возиться с этими опциями, управляя большим приложением на нескольких серверах. Это добавляет множество сложностей, с которыми не стоит связываться при работе с простым приложением, и я бы лично рекомендовал просто ограничиться файлом
.env
и установить Laravel должным образом.(Если вы хотите, чтобы я остановился на этом подробнее, или вы не согласны, пожалуйста, пишите в комментариях, и я с удовольствием продолжу обсуждение).
На этом мы закончим, так как это совет по безопасности, а не углублённый анализ, но главный вывод — устанавливайте и настраивайте свои приложения Laravel так, чтобы конфиденциальные файлы не были доступны через Интернет.
Если вам неудобно настраивать сайт безопасно и правильно управлять веб-конфигурацией, то я настоятельно рекомендую воспользоваться сервисом Laravel Forge, который сделает все это за вас