Nginx deshabilita .htaccess y archivos ocultos pero permite el directorio .well-known

16

Tengo un servidor Nginx y deshabilité los archivos ocultos en el nginx_vhost.conf

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

Pero LetsEncrypt necesita acceso al .well-knowndirectorio.

¿Cómo permito el .well-knowndirectorio y niego los otros archivos ocultos?

Janghou
fuente
Nota: nginx no usa ni tiene .htaccessarchivos. Tiene archivos de configuración, pero no se llaman .htaccessni funcionan igual.
Rob

Respuestas:

17

Las otras soluciones no me ayudaron.

Mi solución es incluir una expresión regular negativa para .well-known. Su bloque de código debería verse así entonces:

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

Bloqueará todos los archivos de puntos, excepto los que comienzan con .well-known

PD: También agregaría return 404;al bloque.

therealmarv
fuente
1
¿Es location ~* /\.(?!well-known\/) {como se ve en github.com/h5bp/server-configs-nginx/blob/master/h5bp/location/… idéntico a esto location ~ /\.(?!well-known).* { ?
Pro Backup
3
no, no es lo mismo exactamente. /\.(?!well-known\/)no es tan expresivo como mi expresión regular (porque bloqueo todos los archivos de puntos excepto los conocidos por definición). Quizás lo mejor sería una combinación como la location ~ /\.(?!well-known\/).*que desbloquea solo el directorio conocido en lugar de un teórico .well-known-blabla. Pero creo que no hay peligro real en no bloquear un archivo teórico .well-conocido-blabla.
therealmarv
¿Por qué deshabilitar htaccess ya que de todos modos Nginx no lo maneja?
Webwoman
3
Sí, tienes razón @webwoman, pero a veces hay entornos mixtos. En mi opinión, no se debe servir ningún archivo de puntos (seguridad o exposición no deseada del historial como con .git) a menos que sea realmente necesario.
therealmarv
16

Nginx aplica ubicaciones con expresiones regulares en el orden de su aparición en el archivo de configuración.

Por lo tanto, agregar una entrada como esta justo antes de su ubicación actual le ayudará.

location ~ /\.well-known { 
    allow all;
}
Weirdei
fuente
¡Gracias, esto es exactamente lo que necesitaba! Colocado esto antes de una regla que niega el acceso a todos los archivos de puntos. Lo único que cambié fue escapar del punto, por ejemplo location ~ /\.well-known {. De cualquier manera, esta debería ser la respuesta aceptada.
aexl
8

He proporcionado un tutorial completo paso a paso sobre cómo usar Let's Encrypt with NGINX en mi sitio web.

Las partes clave son:

  • El cliente oficial solo está bien, y es realmente pobre en Amazon Linux. Recomiendo un cliente diferente, ACME .
  • Use esta ubicación para el método webroot, con mi cliente recomendado. Tenga en cuenta que las solicitudes se sirven a través de http, no https.

No necesita oyentes en su bloque https en absoluto, todo se hace en https. Esto es solo para probar que controlas el dominio, no sirve nada privado o secreto.

# 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;
  }
}

Guía completa paso a paso vinculada anteriormente.

Tim
fuente
3

Agregue esto (antes o después):

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

Puede agregar esto también en la parte inferior, porque el ^~modificador de coincidencia tiene prioridad sobre las expresiones regulares. Ver los documentos .

Janghou
fuente
0

Si tiene muchos archivos de configuración y ya contienen una denegación en .htaccess como

location ~ /\.ht { deny all; }

luego, en lugar de ignorar todos los archivos de puntos , simplemente puede agregar un segundo ignorar para .git con

sed -i '/location ~ \/\\.ht { deny all; }/a \  location ~ \/\\.git { deny all; }' /etc/nginx/*
rubo77
fuente