Отключить .htaccess и скрытые файлы в Nginx, но разрешить директорию .well-known.

Вопрос или проблема

У меня есть сервер 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-блоков в следующем порядке:

  1. location = – точное соответствие.
  2. location ^~ – приоритетный префикс-ловушка.
  3. location ~ или ~* – регулярные выражения.
  4. Обычные (строчные) 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;
}

Этот фрагмент конфигурации делает следующее:

  1. location ^~ /.well-known/acme-challenge/ — здесь используется префикс-ловушка (^~), чтобы обеспечение доступности данной директории не перебивалось последующими регулярными выражениями.
  2. allow all; — разрешает доступ к указанной директории.
  3. try_files $uri =404; — проверяет существование файла и возвращает ошибку 404, если файл/документ не найден.
  4. location ~ /\. — вторым блоком идет правило, блокирующее доступ ко всем файлам, имена которых начинаются с точки.
  5. deny all; — запрещает доступ к таким файлам.
  6. access_log off; и log_not_found off; — эти директивы отключают ведение журналов, чтобы предотвратить запись запрещенных попыток доступа.

Применение

Настройка Nginx — это всегда вопрос тщательной работы с различными location-блоками и понимания порядка их применения. Для успешной реализации приведённой выше конфигурации следуйте следующим шагам:

  1. Редактирование конфигурационных файлов: Ключевые настройки могут быть в основном файле конфигурации nginx.conf или в специфических для виртуальных хостов файлах в директории /etc/nginx/sites-available или непосредственно в /etc/nginx/nginx_vhost.conf, как упомянуто в вашем вопросе.

  2. Проверка конфигурации: Перед перезапуском Nginx используйте команду nginx -t, чтобы убедиться в отсутствии синтаксических ошибок в конфигурации.

  3. Перезапуск сервера Nginx: Примените изменения, перезапустив сервис Nginx с помощью команды systemctl reload nginx или service nginx reload.

  4. Тестирование доступа: Убедитесь, что доступ к другим скрытым файлам заблокирован, попытайтесь получить к ним доступ напрямую через браузер. Также проверьте, доступна ли директория .well-known, что важно для корректной работы Let’s Encrypt.

Заключение

Конфигурирование Nginx для обеспечения безопасности и функциональности требует внимания к деталям и понимания как взаимодействуют различные директивы. Описанная выше методика настройки позволяет эффективно блокировать доступ к нежелательным скрытым файлам, сохраняя при этом доступность необходимых директорий для правильного функционирования существующих решений, таких как Let’s Encrypt.

Оцените материал
Добавить комментарий

Капча загружается...