Como configurar a autenticação por senha com o Apache no Ubuntu 18.04

Introdução

Como um administrador Web, pode ser interessante restringir o acesso de visitantes a algumas partes de um site, seja temporária ou permanentemente. Embora os aplicativos Web possam fornecer seus próprios métodos de autenticação e autorização, você também pode confiar no próprio servidor Web para restringir o acesso, se eles forem inadequados ou estiverem indisponíveis.

Este tutorial traz um passo a passo sobre como proteger ativos com senha em um servidor Web do Apache que executa no Ubuntu 18.04, de modo a proporcionar mais segurança ao seu servidor.

Pré-requisitos

Para completar este tutorial, será necessário ter acesso a um servidor Ubuntu 18.04.

Além disso, você precisará da seguinte configuração antes de começar:

  • Um usuário sudo no seu servidor: você pode criar um usuário com privilégios sudo seguindo o Guia de configuração inicial de servidor no Ubuntu 18.04.

  • Um servidor Web Apache2: caso ainda não tenha configurado um, o tutorial Como instalar o servidor Web do Apache no Ubuntu 18.04 pode ajudá-lo.

  • Um site protegido com SSL: a forma como vai configurar isso dependerá de se você tem um nome de domínio para o seu site.

    • Caso tenha um nome de domínio, você pode proteger seu site com o Let’s Encrypt, que fornece certificados confiáveis e gratuitos. Siga o Guia do Let’s Encrypt para o Apache para configurar isto.
    • Se não tiver um domínio e somente estiver usando essa configuração para teste ou uso pessoal, você pode usar um certificado autoassinado. Tal certificado proporciona o mesmo tipo de criptografia, mas sem a validação de domínio. Para aplicar essa configuração, siga o Guia de certificados SSL autoassinados para o Apache.

Quando tudo isso estiver funcionando, faça login no seu servidor como o usuário sudo e continue abaixo.

Passo 1 — Instalando o pacote de utilitários do Apache

Vamos começar atualizando nosso servidor e instalando um pacote que precisaremos. Para completar este tutorial, usaremos um utilitário chamado htpasswd, que faz parte do pacote apache2-utils, para criar o arquivo e gerenciar os nomes de usuários e senhas necessários para acessar conteúdo restrito.

  • sudo apt-get update
  • sudo apt-get install apache2-utils

Com isso instalado, temos agora acesso ao comando htpasswd.

Passo 2 — Criando o arquivo de senha

O comando htpasswd nos permitirá criar um arquivo de senha que o Apache poderá usar para autenticar os usuários. Criaremos um arquivo oculto para esse fim, chamado .htpasswd, dentro do nosso diretório de configuração /etc/apache2.

A primeira vez que usarmos esse utilitário, precisaremos adicionar a opção -c para criar o arquivo passwdfile especificado. Assim, especificamos um nome de usuário (sammy, neste exemplo) – no final do comando – para criar uma nova entrada dentro do arquivo:

  • sudo htpasswd -c /etc/apache2/.htpasswd sammy

Você será solicitado a fornecer e confirmar uma senha para o usuário.

Deixe o argumento -c para quaisquer usuários adicionais que queira adicionar para que não substitua o arquivo:

  • sudo htpasswd /etc/apache2/.htpasswd another_user

Se visualizarmos o conteúdo do arquivo, podemos ver o nome de usuário e a senha criptografada de cada registro:

  • cat /etc/apache2/.htpasswd
Outputsammy:$apr1$.0CAabqX$rb8lueIORA/p8UzGPYtGs/ another_user:$apr1$fqH7UG8a$SrUxurp/Atfq6j7GL/VEC1  

Agora, temos nossos usuários e senhas em um formato que o Apache pode ler.

Passo 3 — Configurando a autenticação por senha do Apache

Neste passo, precisamos configurar o Apache para verificar esse arquivo antes de atender nosso conteúdo protegido. Podemos fazer isso de duas maneiras: diretamente no arquivo do host virtual de um site, ou colocando os arquivos .htaccess nos diretórios que precisam de restrição. Geralmente, é melhor usar o arquivo de host virtual. Porém, se você precisa permitir que os usuários não raiz gerenciem suas próprias restrições de acesso, verifique as restrições no controle de versão ao longo do site, ou caso já tenha um aplicativo Web que usa os arquivos .htaccess para outros fins, confira a segunda opção.

Escolha a opção que melhor atenda às suas necessidades.

Opção 1: configurando o controle de acesso dentro da definição de host Virtual (Preferencial)

A primeira opção é editar a configuração do Apache e adicionar a proteção por senha ao arquivo do host virtual. De maneira geral, isso irá proporcionar um desempenho melhor, pois evita o custo de ler arquivos de configuração distribuídos. Essa opção exige acesso à configuração – que nem sempre está disponível; porém, quando de fato tiver acesso, é recomendável.

Comece abrindo o arquivo de host virtual para o qual deseja adicionar uma restrição. No nosso exemplo, estaremos usando o arquivo default-ssl.conf, que contém o host virtual padrão instalado através do pacote Apache do Ubuntu. Abra o arquivo com um editor de texto de linha de comando, como o nano:

  • sudo nano /etc/apache2/sites-enabled/default-ssl.conf

Ali dentro, com os comentários removidos, o arquivo deverá ficar parecido com este:

/etc/apache2/sites-enabled/default-ssl.conf

<VirtualHost *:80>   ServerAdmin [email protected]   DocumentRoot /var/www/html   ErrorLog ${APACHE_LOG_DIR}/error.log   CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost> 

A autenticação é feita com base em cada diretório. Para configurar a autenticação, você precisará selecionar o diretório que deseja restringir com um bloco de <Directory ___>. No nosso exemplo, vamos restringir o diretório base inteiro, mas você pode modificar essa listagem para escolher um diretório específico dentro do espaço Web:

/etc/apache2/sites-enabled/default-ssl.conf

<VirtualHost *:80>   ServerAdmin [email protected]   DocumentRoot /var/www/html   ErrorLog ${APACHE_LOG_DIR}/error.log   CustomLog ${APACHE_LOG_DIR}/access.log combined    <Directory "/var/www/html">   </Directory> </VirtualHost> 

Dentro desse bloco de diretório, especifique que estamos configurando a autenticação Basic (básica). Para o AuthName, escolha um nome de realm que será exibido para o usuário quando for solicitado por credenciais. Use a diretiva AuthUserFile para apontar o Apache para o arquivo de senha que criamos. Por fim, estabeleça como requisito que somente um valid-user poderá acessar esse recurso. Isto significa dizer que, se o usuário puder confirmar sua identidade através de uma senha, ele terá permissão para entrar:

/etc/apache2/sites-enabled/default-ssl.conf

<VirtualHost *:80>   ServerAdmin [email protected]   DocumentRoot /var/www/html   ErrorLog ${APACHE_LOG_DIR}/error.log   CustomLog ${APACHE_LOG_DIR}/access.log combined    <Directory "/var/www/html">       AuthType Basic       AuthName "Restricted Content"       AuthUserFile /etc/apache2/.htpasswd       Require valid-user   </Directory> </VirtualHost> 

Salve e feche o arquivo quando você terminar. Se estiver usando o nano, você pode fazer isso pressionando CTRL+X seguido de Y e, depois, ENTER.

Antes de reiniciar o servidor Web, verifique a configuração com o seguinte comando:

  • sudo apache2ctl configtest

Se tudo estiver correto e você receber um Syntax OK como resultado, reinicie o servidor para implementar sua política de senha. Como o systemctl não mostra o resultado de todos os comandos de gerenciamento de serviços, usaremos o status para ter certeza de que o servidor está em funcionamento:

  • sudo systemctl restart apache2
  • sudo systemctl status apache2

Agora, o diretório que você especificou deve estar protegido por senha.

Opção 2: configurando o controle de acesso com arquivos .htaccess

O Apache pode usar arquivos .htaccess para permitir que certos itens de configuração sejam definidos dentro de um diretório de conteúdo. Como o Apache precisa reler esses arquivos a cada pedido que envolva o diretório – o que pode ter impacto negativo no desempenho, a Opção 1 é preferencia. Porém, se você já estiver usando o arquivo .htaccess ou precisar permitir que usuários não raiz gerenciem restrições, os arquivos .htaccess fazem sentido.

Para habilitar a proteção por senha usando arquivos .htaccess, abra o arquivo de configuração principal do Apache com um editor de texto de linha de comando, como o nano:

  • sudo nano /etc/apache2/apache2.conf

Encontre o bloco <Directory> para o diretório /var/www que contém o diretório base. Ative o processamento do .htaccess, modificando a diretiva AllowOverride dentro desse bloco, de None para All:

/etc/apache2/apache2.conf

. . .  <Directory /var/www/>   Options Indexes FollowSymLinks   AllowOverride All   Require all granted </Directory>  . . . 

Salve e feche o arquivo quando você terminar. Se estiver usando o nano, você pode fazer isso pressionando CTRL+X seguido de Y e, depois, ENTER.

Em seguida, precisamos adicionar um arquivo .htaccess ao diretório que queremos restringir. Em nossa demonstração, vamos restringir o diretório base inteiro (o site inteiro), que fica em /var/www/html, mas você pode colocar esse arquivo em qualquer diretório onde queira restringir o acesso:

  • sudo nano /var/www/html/.htaccess

Dentro desse arquivo, especifique que queremos configurar a autenticação Basic. Para o AuthName, escolha um nome de realm que será exibido para o usuário quando for solicitado por credenciais. Use a diretiva AuthUserFile para apontar o Apache para o arquivo de senha que criamos. Por fim, vamos exigir um valid-user para acessar esse recurso, o que significa que alguém que consiga confirmar sua identidade com uma senha terá permissão para entrar:

/var/www/html/.htaccess

AuthType Basic AuthName "Restricted Content" AuthUserFile /etc/apache2/.htpasswd Require valid-user 

Salve e feche o arquivo. Reinicie o servidor Web para proteger com senha todo o conteúdo dentro ou abaixo do diretório com o arquivo .htaccess e use o systemctl status para verificar o sucesso da reinicialização:

  • sudo systemctl restart apache2
  • sudo systemctl status apache2

O diretório que você especificou deve estar agora protegido por senha.

Passo 4 — Confirmando a autenticação por senha

Para confirmar se seu conteúdo está protegido, tente acessar seu conteúdo restrito em um navegador Web. Você deve receber um prompt de usuário e senha que se parece com este:

Prompt de senha do Apache2

Se digitar as credenciais corretas, você poderá acessar o conteúdo. Se digitar as credenciais erradas ou clicar em “Cancel” (cancelar), você verá a página de erro “Unauthorized” (não autorizado):

Erro não autorizado do Apache2

Conclusão

Parabéns! Se você acompanhou o tutorial até este ponto, você já pode configuar a autenticação básica para o seu site.

Há muito mais que pode ser feito com a configuração do Apache e .htaccess. Para aprender mais sobre a flexibilidade e a eficácia que estão disponíveis na configuração do Apache, teste um desses tutoriais:

  • Para conseguir uma compreensão melhor do arquivo de configuração principal, leia a seção Familiarizando-se com Arquivos e Diretórios Importantes do Apache, em nosso Guia de instalação do Apache.

  • Aprenda mais sobre os arquivos de host virtual em Como configurar Apache Virtual Hosts no Ubuntu 16.04

  • Aprenda sobre como reescrever URLs, personalizar páginas de erro como a “Unauthorized” acima, ou incluir elementos comuns em todas as suas páginas com Server Side Includes em nosso guia Como usar o arquivo .htaccess.