Вопрос или проблема
У меня есть сервер Nginx, и я отключил скрытые файлы в nginx_vhost.conf
## Отключить .htaccess и другие скрытые файлы
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
Но LetsEncrypt нуждается в доступе к директории .well-known
.
Как разрешить доступ к директории .well-known
и запретить другие скрытые файлы?
Другие решения мне не помогли.
Моё решение — включить отрицательную регулярное выражение для .well-known
. Ваш блок кода должен выглядеть так:
## Отключить .htaccess и другие скрытые файлы
location ~ /\.(?!well-known).* {
deny all;
access_log off;
log_not_found off;
}
Это заблокирует все файлы с точкой, кроме тех, которые начинаются с .well-known
P.S.: Я также добавил бы return 404;
в блок.
Nginx применяет директивы с регулярными выражениями в порядке их появления в конфигурационном файле.
Поэтому добавление такой записи прямо перед вашим текущим местоположением поможет вам.
location ~ /\.well-known {
allow all;
}
Я предоставил полный пошаговый учебник о использовании Let’s Encrypt с NGINX на своем веб-сайте.
Ключевые моменты:
- Официальный клиент приемлемый, но очень слабый на Amazon Linux. Я рекомендую другой клиент, ACME.
- Используйте это местоположение для метода webroot с моим рекомендуемым клиентом. Учтите, что запросы обслуживаются по http, а не https.
Вам не нужны слушатели в вашем блоке https, всё делается на https. Это только для доказательства того, что вы контролируете домен, здесь не обслуживается что-либо приватное или секретное.
# Ответьте на запросы let’s encrypt, но пересылайте все остальное на https
server {
listen 80;
server_name example.com www.example.com
access_log /var/log/nginx/access.log main;
# Let's Encrypt сертификаты с помощью Acmetool
location /.well-known/acme-challenge/ {
alias /var/www/.well-known/acme-challenge/;
}
location / {
return 301 https://www.example.com$request_uri;
}
}
Полное пошаговое руководство по ссылке выше.
Добавьте это (до или после):
location ^~ /.well-known/ {
log_not_found off;
}
Вы также можете добавить это внизу, потому что модификатор ^~
имеет приоритет над регулярными выражениями.
Смотрите документацию.
Если у вас много конфигурационных файлов, и они уже содержат запрет на .htaccess, как в
location ~ /\.ht { deny all; }
тогда вместо игнорирования всех файлов с точкой вы можете просто добавить второе игнорирование для .git, использовать
sed -i '/location ~ \/\\.ht { deny all; }/a \ location ~ \/\\.git { deny all; }' /etc/nginx/*
Фактически, это сработало для меня:
location ~ ^/?\.well-known/acme-challenge/ {
try_files $uri =404;
}
location ~ /\. {
deny all;
}
И порядок имеет огромное значение, поэтому блок “location ~ /\.
” должен быть последним, или наоборот “location ~ ^/?\.well-known/acme-challenge/
” должен быть первым!
Этот вариант из страницы документации Nginx, добавляя “^
” перед “~
” (например, “location ^~ ^/?\.well-known/acme-challenge/
“) не сработал для меня, независимо от порядка 🙁
Если хотите, вы можете также добавить эти опции из вопроса автора:
access_log off;
log_not_found off;
.
Ответ или решение
Вопрос, связанный с настройкой сервера Nginx для блокировки доступа к скрытым файлам, таких как .htaccess, но предоставляющий доступ к директории .well-known, достаточно актуален в контексте использования Let’s Encrypt для получения SSL-сертификатов. Давайте рассмотрим, как можно корректно сконфигурировать Nginx в такой ситуации.
Теоретическая часть
Nginx использует блоки конфигурации, называемые location, для маршрутизации запросов к определённым ресурсам на сервере. Эти блоки могут определяться различными способами, включая использование регулярных выражений. Default-поведение Nginx заключается в применении location-блоков в следующем порядке:
- location = – точное соответствие.
- location ^~ – приоритетный префикс-ловушка.
- location ~ или ~* – регулярные выражения.
- Обычные (строчные) location.
Скрытые файлы, такие как .htaccess, часто используются в Apache для управления настройками сервером, чего Nginx не поддерживает. Nginx не обрабатывает файлы .htaccess, и их использование в этом контексте избыточно и даже потенциально небезопасно. Поэтому имеет смысл заблокировать доступ к таким файлам.
Однако, определённым директорам, например, .well-known/acme-challenge, необходимо предоставить доступ, поскольку они используются Let’s Encrypt для проверки владения доменом.
Пример конфигурации
Прежде чем перейти к практическому применению, приведем пример конфигурации, который позволит заблокировать доступ к большинству скрытых файлов, но оставит доступной директорию .well-known:
# Позволяем доступ к .well-known/acme-challenge
location ^~ /.well-known/acme-challenge/ {
allow all;
try_files $uri =404;
}
# Блокируем доступ к другим скрытым файлам
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
Этот фрагмент конфигурации делает следующее:
location ^~ /.well-known/acme-challenge/
— здесь используется префикс-ловушка (^~
), чтобы обеспечение доступности данной директории не перебивалось последующими регулярными выражениями.allow all;
— разрешает доступ к указанной директории.try_files $uri =404;
— проверяет существование файла и возвращает ошибку 404, если файл/документ не найден.location ~ /\.
— вторым блоком идет правило, блокирующее доступ ко всем файлам, имена которых начинаются с точки.deny all;
— запрещает доступ к таким файлам.access_log off;
иlog_not_found off;
— эти директивы отключают ведение журналов, чтобы предотвратить запись запрещенных попыток доступа.
Применение
Настройка Nginx — это всегда вопрос тщательной работы с различными location-блоками и понимания порядка их применения. Для успешной реализации приведённой выше конфигурации следуйте следующим шагам:
-
Редактирование конфигурационных файлов: Ключевые настройки могут быть в основном файле конфигурации
nginx.conf
или в специфических для виртуальных хостов файлах в директории/etc/nginx/sites-available
или непосредственно в/etc/nginx/nginx_vhost.conf
, как упомянуто в вашем вопросе. -
Проверка конфигурации: Перед перезапуском Nginx используйте команду
nginx -t
, чтобы убедиться в отсутствии синтаксических ошибок в конфигурации. -
Перезапуск сервера Nginx: Примените изменения, перезапустив сервис Nginx с помощью команды
systemctl reload nginx
илиservice nginx reload
. -
Тестирование доступа: Убедитесь, что доступ к другим скрытым файлам заблокирован, попытайтесь получить к ним доступ напрямую через браузер. Также проверьте, доступна ли директория .well-known, что важно для корректной работы Let’s Encrypt.
Заключение
Конфигурирование Nginx для обеспечения безопасности и функциональности требует внимания к деталям и понимания как взаимодействуют различные директивы. Описанная выше методика настройки позволяет эффективно блокировать доступ к нежелательным скрытым файлам, сохраняя при этом доступность необходимых директорий для правильного функционирования существующих решений, таких как Let’s Encrypt.