Nginx wyłącza .htaccess i ukryte pliki, ale zezwala na dobrze znany katalog

16

Mam serwer Nginx i wyłączyłem ukryte pliki w nginx_vhost.conf

## Disable .htaccess and other hidden files
    location ~ /\. {
        deny all;
        access_log off;
        log_not_found off;
    }

Ale LetsEncrypt potrzebuje dostępu do .well-knownkatalogu.

Jak zezwolić na .well-knownkatalog i odrzucić inne ukryte pliki?

Janghou
źródło
Uwaga: nginx nie używa ani nie ma .htaccessplików. Ma pliki konfiguracyjne, ale nie są wywoływane .htaccessani nie działają tak samo.
Rob

Odpowiedzi:

17

Inne rozwiązania mi nie pomogły.

Moje rozwiązanie polega na uwzględnieniu negatywnego wyrażenia regularnego dla .well-known. Twój blok kodu powinien wyglądać następująco:

## Disable .htaccess and other hidden files
location ~ /\.(?!well-known).* {
    deny all;
    access_log off;
    log_not_found off;
}

Zablokuje każdy plik kropkowy oprócz tych zaczynających się od .well-known

PS: Chciałbym również dodać return 404;do bloku.

therealmarv
źródło
1
Czy location ~* /\.(?!well-known\/) {widziany na github.com/h5bp/server-configs-nginx/blob/master/h5bp/location/… jest identyczny z tym location ~ /\.(?!well-known).* { ?
Pro Backup
3
nie, to nie jest dokładnie to samo. /\.(?!well-known\/)nie jest tak wyrazisty jak moje wyrażenie regularne (ponieważ blokuję wszystkie pliki kropek oprócz dobrze znanych z definicji). Być może najlepsza byłaby kombinacja, location ~ /\.(?!well-known\/).*która odblokowuje tylko dobrze znany katalog zamiast teoretycznej .well-known-blabla. Ale myślę, że nie ma realnego niebezpieczeństwa, jeśli nie zablokujesz teoretycznego pliku .well-known-blabla.
therealmarv
po co wyłączać htaccess, skoro Nginx i tak go nie obsługuje?
Webwoman
3
Tak, masz rację @webwoman, ale czasami istnieją mieszane środowiska. Moim zdaniem żaden plik kropkowy nie powinien być udostępniany (bezpieczeństwo lub niechciane ujawnianie historii, jak w przypadku .git), chyba że jest to naprawdę potrzebne.
therealmarv
16

Nginx stosuje lokalizacje z wyrażeniami regularnymi w kolejności ich pojawienia się w pliku konfiguracyjnym.

Dlatego dodanie takiego wpisu tuż przed bieżącą lokalizacją pomoże.

location ~ /\.well-known { 
    allow all;
}
Weirdei
źródło
Dziękuję, właśnie tego potrzebowałem! Umieściłem to przed regułą odmawiającą dostępu do wszystkich plików dot. Jedyne, co zmieniłem, to ucieczka od kropki, np location ~ /\.well-known {. Tak czy inaczej, powinna to być zaakceptowana odpowiedź.
aexl
8

Udostępniłem pełny samouczek krok po kroku na temat korzystania z Let's Encrypt with NGINX na mojej stronie internetowej.

Kluczowe części to:

  • Oficjalny klient jest w porządku i jest bardzo słaby w Amazon Linux. Polecam innego klienta, ACME .
  • Użyj tej lokalizacji dla metody webroot z moim poleconym klientem. Pamiętaj, że żądania są obsługiwane przez http, a nie https.

W ogóle nie potrzebujesz słuchaczy w swoim bloku https, wszystko odbywa się na https. To tylko po to, aby udowodnić, że kontrolujesz domenę, nie służy ona żadnemu prywatnemu ani tajnemu.

# Answer let's encrypt requests, but forward everything else to https
server {
  listen       80;
  server_name  example.com www.example.com
  access_log  /var/log/nginx/access.log main;

  # Let's Encrypt certificates with Acmetool
  location /.well-known/acme-challenge/ {
    alias /var/www/.well-known/acme-challenge/;
  }

  location / {
    return       301 https://www.example.com$request_uri;
  }
}

Pełny przewodnik krok po kroku połączony powyżej.

Tim
źródło
3

Dodaj to (przed lub po):

location ^~ /.well-known/ {
        log_not_found off;
     }

Możesz to dodać również na dole, ponieważ ^~modyfikator dopasowania ma pierwszeństwo przed wyrażeniami regularnymi. Zobacz dokumenty .

Janghou
źródło
0

Jeśli masz wiele plików konfiguracyjnych, które już zawierają odmowę w .htaccess jak

location ~ /\.ht { deny all; }

następnie zamiast ignorować wszystkie pliki kropek , możesz po prostu dodać drugie ignorowanie dla .git za pomocą

sed -i '/location ~ \/\\.ht { deny all; }/a \  location ~ \/\\.git { deny all; }' /etc/nginx/*
rubo77
źródło