O Nginx desativa .htaccess e arquivos ocultos, mas permite o diretório .well conhecido

16

Eu tenho um servidor Nginx e desabilitei os arquivos ocultos no nginx_vhost.conf

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

Mas LetsEncrypt precisa de acesso ao .well-knowndiretório.

Como permito o .well-knowndiretório e nego os outros arquivos ocultos?

Janghou
fonte
Nota: O nginx não usa ou possui .htaccessarquivos. Possui arquivos de configuração, mas não são chamados .htaccessnem funcionam da mesma maneira.
Rob

Respostas:

17

As outras soluções não me ajudaram.

Minha solução é incluir um regex negativo para .well-known. Seu bloco de código deve ficar assim:

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

Ele bloqueará todos os arquivos de pontos, exceto os que começam com .well-known

PS: Eu também adicionaria return 404;ao bloco.

therealmarv
fonte
11
É location ~* /\.(?!well-known\/) {como visto em github.com/h5bp/server-configs-nginx/blob/master/h5bp/location/… idêntico a isso location ~ /\.(?!well-known).* { ?
Pro Backup
3
não, não é exatamente o mesmo. /\.(?!well-known\/)não é tão expressivo quanto meu regex (porque bloqueio todos os arquivos de ponto, exceto os conhecidos por definição). Talvez o melhor seja uma combinação como a location ~ /\.(?!well-known\/).*que desbloqueia apenas o diretório conhecido e também um teórico .well-known-blabla. Mas acho que não há perigo real em não bloquear um arquivo .well-conhecido-blabla teórico.
Therealmarv
por que desativar o htaccess desde que o Nginx não lida com isso?
Webwoman
3
Sim, você está certa @webwoman, mas às vezes há ambientes mistos. Qualquer arquivo de ponto não deve ser exibido na minha opinião (segurança ou exposição indesejada do histórico, como com .git), a menos que seja realmente necessário.
22419 therealmarv
16

O Nginx aplica locais com expressões regulares na ordem em que aparecem no arquivo de configuração.

Portanto, adicionar uma entrada como essa antes da sua localização atual ajudará você.

location ~ /\.well-known { 
    allow all;
}
Weirdei
fonte
Obrigado, é exatamente isso que eu precisava! Colocado isso antes de uma regra que nega acesso a todos os arquivos de ponto. A única coisa que mudei foi escapar do ponto, por exemplo location ~ /\.well-known {. De qualquer forma, essa deve ser a resposta aceita.
aexl
8

Forneci um tutorial completo sobre como usar o Let's Encrypt with NGINX no meu site.

As partes principais são:

  • O cliente oficial está ok e é muito ruim no Amazon Linux. Eu recomendo um cliente diferente, ACME .
  • Use este local para o método webroot, com meu cliente recomendado. Observe que os pedidos são atendidos por http, não https.

Você não precisa de ouvintes no seu bloco https, tudo é feito no https. Isso é apenas para provar que você controla o domínio, não está servindo a nada privado ou 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;
  }
}

Guia completo passo a passo vinculado acima.

Tim
fonte
3

Adicione isto (antes ou depois):

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

Você pode adicionar isso também na parte inferior, porque o ^~modificador correspondente tem precedência sobre expressões regulares. Veja os documentos .

Janghou
fonte
0

Se você tiver muitos arquivos de configuração e eles já contiverem uma negação em .htaccess como

location ~ /\.ht { deny all; }

Em vez de ignorar todos os arquivos de ponto , você pode simplesmente adicionar um segundo ignorar para .git com

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