Pular para conteúdo

auth-digest: Autenticação Digest para NGINX

Instalação

Você pode instalar este módulo em qualquer distribuição baseada em RHEL, incluindo, mas não se limitando a:

  • RedHat Enterprise Linux 7, 8, 9 e 10
  • CentOS 7, 8, 9
  • AlmaLinux 8, 9
  • Rocky Linux 8, 9
  • Amazon Linux 2 e Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-auth-digest
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-auth-digest

Ative o módulo adicionando o seguinte no topo de /etc/nginx/nginx.conf:

load_module modules/ngx_http_auth_digest_module.so;

Este documento descreve o nginx-module-auth-digest v1.0.0 lançado em 23 de março de 2018.


Mudanças em relação a outros forks

Correções de bugs 1, 2, 3

Mensagem de log adicionada para tentativas de login inválidas

Descrição

O módulo ngx_http_auth_digest complementa a Autenticação Básica embutida do Nginx módulo fornecendo suporte para RFC 2617 Autenticação Digest. O módulo está atualmente funcional, mas foi testado e revisado apenas por seu autor. E dado que este é um código de segurança, um único conjunto de olhos é quase certamente insuficiente para garantir que está 100% correto. Até que alguns relatórios de bugs sejam recebidos e alguns dos ‘desconhecidos desconhecidos’ no código sejam eliminados, considere este módulo como um ‘alpha’ e trate-o com a quantidade apropriada de ceticismo.

Uma lista de problemas conhecidos com o módulo pode ser encontrada no arquivo bugs.txt assim como no Issue Tracker. Por favor, considere contribuir com um patch se você tiver tempo e disposição. Qualquer ajuda para corrigir os bugs ou mudar a implementação para uma mais idiomática do nginx seria muito apreciada.

Exemplo

Você pode proteger por senha uma árvore de diretórios adicionando as seguintes linhas em uma seção server no seu arquivo de configuração do Nginx:

auth_digest_user_file /opt/httpd/conf/passwd.digest; # um arquivo criado com htdigest
location /private{
  auth_digest 'isto não é para você'; # define o realm para este bloco de localização
}

As outras diretivas controlam os padrões de duração para a sessão de autenticação. O seguinte é equivalente ao exemplo anterior, mas demonstra todas as diretivas:

auth_digest_user_file /opt/httpd/conf/passwd.digest;
auth_digest_shm_size 4m;   # o espaço de armazenamento alocado para rastrear sessões ativas

location /private {
  auth_digest 'isto não é para você';
  auth_digest_timeout 60s; # permite que os usuários esperem 1 minuto entre receber o
                           # desafio e clicar em enviar na caixa de diálogo do navegador
  auth_digest_expires 10s; # após um desafio/resposta bem-sucedido, permite que o cliente
                           # continue usando o mesmo nonce para solicitações adicionais
                           # por 10 segundos antes de gerar um novo desafio
  auth_digest_replays 20;  # também gera um novo desafio se o cliente usar o
                           # mesmo nonce mais de 20 vezes antes do limite de tempo de expiração
}

Adicionar autenticação digest a uma localização afetará quaisquer URIs que correspondam a esse bloco. Para desativar a autenticação para sub-ramificações específicas de uma URI, defina auth_digest como off:

location / {
  auth_digest 'isto não é para você';
  location /pub {
    auth_digest off; # esta sub-árvore será acessível sem autenticação
  }
}

Diretivas

auth_digest

Sintaxe
auth_digest [realm-name | off]

Padrão
off

Contexto
server, location

Descrição
Habilita ou desabilita a autenticação digest para um bloco de servidor ou localização. O nome do realm deve corresponder a um realm usado no arquivo de usuários. Qualquer usuário dentro desse realm poderá acessar arquivos após a autenticação.

Para desabilitar seletivamente a autenticação dentro de uma hierarquia de URI protegida, defina auth_digest como “off” dentro de um bloco de localização mais específico (veja o exemplo).

auth_digest_user_file

Sintaxe
auth_digest_user_file /caminho/para/arquivo/passwd

Padrão
unset

Contexto
server, location

Descrição
O arquivo de senhas deve estar no formato criado pelo comando apache htdigest (ou pelo script incluído htdigest.py). Cada linha do arquivo é uma lista separada por dois pontos composta por um nome de usuário, realm e hash md5 combinando nome, realm e senha. Por exemplo: joi:enfield:ef25e85b34208c246cfd09ab76b01db7

auth_digest_timeout

Sintaxe
auth_digest_timeout delay-time

Padrão
60s

Contexto
server, location

Descrição
Quando um cliente solicita pela primeira vez uma página protegida, o servidor retorna um código de status 401 junto com um desafio no cabeçalho www-authenticate.

Neste ponto, a maioria dos navegadores apresentará uma caixa de diálogo ao usuário pedindo que ele faça login. Esta diretiva define quanto tempo os desafios permanecerão válidos. Se o usuário esperar mais do que esse tempo antes de enviar seu nome e senha, o desafio será considerado ‘obsoleto’ e ele será solicitado a fazer login novamente.

auth_digest_expires

Sintaxe
auth_digest_expires lifetime-in-seconds

Padrão
10s

Contexto
server, location

Descrição
Uma vez que um desafio digest foi respondido com sucesso pelo cliente, solicitações subsequentes tentarão reutilizar o valor ‘nonce’ do desafio original. Para complicar ataques MitM, é melhor limitar o número de vezes que um nonce em cache será aceito. Esta diretiva define a duração desse período de reutilização após a primeira autenticação bem-sucedida.

auth_digest_replays

Sintaxe
auth_digest_replays number-of-uses

Padrão
20

Contexto
server, location

Descrição
A reutilização de nonce também deve ser limitada a um número fixo de solicitações. Note que aumentar esse valor causará um aumento proporcional no uso de memória e o shm_size pode precisar ser ajustado para acompanhar o tráfego intenso dentro dos blocos de localização protegidos por digest.

auth_digest_evasion_time

Sintaxe
auth_digest_evasion_time time-in-seconds

Padrão
300s

Contexto
server, location

Descrição
A quantidade de tempo que o servidor ignorará solicitações de autenticação de um endereço de cliente uma vez que o número de autenticações falhadas desse cliente atinja auth_digest_maxtries.

auth_digest_maxtries

Sintaxe
auth_digest_maxtries number-of-attempts

Padrão
5

Contexto
server, location

Descrição
O número de tentativas de autenticação falhadas de um endereço de cliente antes que o módulo entre em táticas evasivas. Para fins de evasão, apenas clientes de rede são rastreados, e apenas pelo endereço (sem incluir o número da porta). Uma autenticação bem-sucedida limpa os contadores.

auth_digest_shm_size

Sintaxe
auth_digest_shm_size size-in-bytes

Padrão
4096k

Contexto
server

Descrição
O módulo mantém um cache de tamanho fixo de sessões digest ativas para salvar o estado entre solicitações autenticadas. Uma vez que esse cache esteja cheio, nenhuma nova autenticação será possível até que as sessões ativas expirem.

Como resultado, escolher o tamanho adequado é um pouco complicado, pois depende dos valores definidos nas diretivas relacionadas à expiração. Cada desafio armazenado ocupa 48 + ceil(replays/8) bytes e viverá por até auth_digest_timeout + auth_digest_expires segundos. Ao usar as configurações padrão do módulo, isso se traduz em permitir cerca de 82k solicitações não repetidas a cada 70 segundos.

GitHub

Você pode encontrar dicas adicionais de configuração e documentação para este módulo no repositório do GitHub para nginx-module-auth-digest.