Nota: Este artigo foi publicado originalmente em 2013. Alguns passos, comandos ou versões de software podem ter mudado. Consulte a documentação atual do Apache Web Server para obter as informações mais recentes.

Neste guia passo a passo, você aprenderá a proteger um site usando Apache.

Como: Proteger um site usando Apache

Se eu tivesse que adivinhar, provavelmente diria que a maioria das pessoas que usam Apache o faz para publicar sites que são publicamente acessíveis e/ou possuem segurança integrada (como o WordPress, que gerencia o acesso à aplicação e aos dados por conta própria). Então, agora que eu queria publicar um site que exige um nome de usuário/senha ou algum tipo de restrição para que apenas eu pudesse ver seus dados (pense em um console de gerenciamento), eu não fazia ideia de por onde começar.

O Apache oferece ambas as modalidades que podem ser usadas independentemente ou em combinação: Autenticação e Autorização.

Autenticação significa que o usuário precisa fornecer credenciais para acessar e sua sessão é autenticada (identificada) durante toda a sua permanência.

Autorização significa que o cliente está autorizado a acessar a página. O usuário individual não é necessariamente identificado. Por exemplo, se a autorização é baseada no host de origem (endereço IP), então não há necessidade de autenticação (Módulo Apache mod_authz_host.)

Abaixo estão as informações relevantes para configurar o Apache de forma simples (obtidas de: http://httpd.apache.org/docs/2.2/howto/auth.html)


Existem três tipos de módulos envolvidos no processo de autenticação e autorização. Você geralmente precisará escolher pelo menos um módulo de cada grupo.

  • Tipo de autenticação (veja a diretiva (<http://httpd.apache.org/docs/2.2/mod/core.html#authtype>))
    • (<http://httpd.apache.org/docs/2.2/mod/mod_auth_basic.html>)
    • (<http://httpd.apache.org/docs/2.2/mod/mod_auth_digest.html>)
  • Provedor de autenticação (veja as diretivas (<http://httpd.apache.org/docs/2.2/mod/mod_auth_basic.html#authbasicprovider>) e (<http://httpd.apache.org/docs/2.2/mod/mod_auth_digest.html#authdigestprovider>))
    • (<http://httpd.apache.org/docs/2.2/mod/mod_authn_anon.html>)
    • (<http://httpd.apache.org/docs/2.2/mod/mod_authn_dbd.html>)
    • (<http://httpd.apache.org/docs/2.2/mod/mod_authn_dbm.html>)
    • (<http://httpd.apache.org/docs/2.2/mod/mod_authn_file.html>)
    • (<http://httpd.apache.org/docs/2.2/mod/mod_authnz_ldap.html>)
  • Autorização (veja a diretiva (<http://httpd.apache.org/docs/2.2/mod/core.html#require>))
    • (<http://httpd.apache.org/docs/2.2/mod/mod_authnz_ldap.html>)
    • (<http://httpd.apache.org/docs/2.2/mod/mod_authz_dbm.html>)
    • (<http://httpd.apache.org/docs/2.2/mod/mod_authz_groupfile.html>)
    • (<http://httpd.apache.org/docs/2.2/mod/mod_authz_host.html>)
    • (<http://httpd.apache.org/docs/2.2/mod/mod_authz_owner.html>)
    • (<http://httpd.apache.org/docs/2.2/mod/mod_authz_user.html>)

O módulo (<http://httpd.apache.org/docs/2.2/mod/mod_authnz_ldap.html>) é tanto um provedor de autenticação quanto de autorização. O módulo (<http://httpd.apache.org/docs/2.2/mod/mod_authn_alias.html>) não é um provedor de autenticação em si, mas permite que outros provedores de autenticação sejam configurados de maneira flexível. O módulo (<http://httpd.apache.org/docs/2.2/mod/mod_authz_host.html>) fornece autorização e controle de acesso baseado em nome de host, endereço IP ou características da requisição, mas não faz parte do sistema de provedor de autenticação.


Primeiro, você precisa criar um arquivo de senhas. Exatamente como você faz isso depende do provedor de autenticação que você escolheu. Mais sobre isso adiante. Para começar, usaremos um arquivo de senhas em texto. Este arquivo deve ser colocado em algum lugar não acessível pela web. Isso é para que as pessoas não possam baixar o arquivo de senhas. Por exemplo, se seus documentos são servidos a partir de /usr/local/apache/htdocs, você pode querer colocar o(s) arquivo(s) de senhas em /usr/local/apache/passwd. Para criar o arquivo, use o utilitário (<http://httpd.apache.org/docs/2.2/programs/htpasswd.html>) que veio com o Apache. Este estará localizado no diretório bin de onde você instalou o Apache. Se você instalou o Apache a partir de um pacote de terceiros, ele pode estar no seu caminho de execução. Para criar o arquivo, digite:

htpasswd -c /usr/local/apache/passwd/passwords rbowen

O (<http://httpd.apache.org/docs/2.2/programs/htpasswd.html>) pedirá a senha e depois pedirá que você a digite novamente para confirmar:

# htpasswd -c /usr/local/apache/passwd/passwords rbowen New password: mypassword Re-type new password: mypassword Adding password for user rbowen

Se o (<http://httpd.apache.org/docs/2.2/programs/htpasswd.html>) não está no seu caminho, obviamente você terá que digitar o caminho completo do arquivo para executá-lo. Com uma instalação padrão, ele está localizado em /usr/local/apache2/bin/htpasswd. Em seguida, você precisará configurar o servidor para solicitar uma senha e informar ao servidor quais usuários têm acesso permitido. Você pode fazer isso editando o arquivo httpd.conf ou usando um arquivo .htaccess. Por exemplo, se você deseja proteger o diretório /usr/local/apache/htdocs/secret, pode usar as seguintes diretivas, colocadas no arquivo /usr/local/apache/htdocs/secret/.htaccess, ou colocadas no httpd.conf dentro de uma seção <Directory /usr/local/apache/apache/htdocs/secret>.

AuthType Basic AuthName "Restricted Files" # (Following line optional) AuthBasicProvider file AuthUserFile /usr/local/apache/passwd/passwords Require user rbowen

Vamos examinar cada uma dessas diretivas individualmente. A diretiva (<http://httpd.apache.org/docs/2.2/mod/core.html#authtype>) seleciona o método usado para autenticar o usuário. O método mais comum é Basic, e este é o método implementado pelo (<http://httpd.apache.org/docs/2.2/mod/mod_auth_basic.html>). É importante estar ciente, no entanto, de que a autenticação Basic envia a senha do cliente para o servidor sem criptografia. Este método, portanto, não deve ser usado para dados altamente sensíveis, a menos que acompanhado pelo (<http://httpd.apache.org/docs/2.2/mod/mod_ssl.html>). O Apache suporta outro método de autenticação: AuthType Digest. Este método é implementado pelo (<http://httpd.apache.org/docs/2.2/mod/mod_auth_digest.html>) e é muito mais seguro. A maioria dos navegadores recentes suporta a autenticação Digest. A diretiva (<http://httpd.apache.org/docs/2.2/mod/core.html#authname>) define o Realm a ser usado na autenticação. O realm tem duas funções principais. Primeiro, o cliente frequentemente apresenta essa informação ao usuário como parte da caixa de diálogo de senha. Segundo, ela é usada pelo cliente para determinar qual senha enviar para uma determinada área autenticada. Então, por exemplo, uma vez que um cliente tenha se autenticado na área "Restricted Files", ele automaticamente tentará a mesma senha para qualquer área no mesmo servidor marcada com o Realm "Restricted Files". Portanto, você pode evitar que um usuário seja solicitado mais de uma vez pela senha, permitindo que múltiplas áreas restritas compartilhem o mesmo realm. É claro que, por razões de segurança, o cliente sempre precisará pedir a senha novamente quando o nome do host do servidor mudar. A diretiva (<http://httpd.apache.org/docs/2.2/mod/mod_auth_basic.html#authbasicprovider>) é, neste caso, opcional, já que file é o valor padrão para esta diretiva. Você precisará usar esta diretiva se estiver escolhendo uma fonte diferente para autenticação, como (<http://httpd.apache.org/docs/2.2/mod/mod_authn_dbm.html>) ou (<http://httpd.apache.org/docs/2.2/mod/mod_authn_dbd.html>). A diretiva (<http://httpd.apache.org/docs/2.2/mod/mod_authn_file.html#authuserfile>) define o caminho para o arquivo de senhas que acabamos de criar com o (<http://httpd.apache.org/docs/2.2/programs/htpasswd.html>). Se você tem um grande número de usuários, pode ser bastante lento pesquisar um arquivo de texto simples para autenticar o usuário em cada requisição. O Apache também tem a capacidade de armazenar informações de usuários em arquivos de banco de dados rápidos. O módulo (<http://httpd.apache.org/docs/2.2/mod/mod_authn_dbm.html>) fornece a diretiva (<http://httpd.apache.org/docs/2.2/mod/mod_authn_dbm.html#authdbmuserfile>). Esses arquivos podem ser criados e manipulados com o programa (<http://httpd.apache.org/docs/2.2/programs/dbmmanage.html>). Muitos outros tipos de opções de autenticação estão disponíveis em módulos de terceiros no (http://modules.apache.org/). Finalmente, a diretiva (<http://httpd.apache.org/docs/2.2/mod/core.html#require>) fornece a parte de autorização do processo, definindo o usuário que tem permissão para acessar esta região do servidor. Na próxima seção, discutimos várias maneiras de usar a diretiva (<http://httpd.apache.org/docs/2.2/mod/core.html#require>).


A diretiva (<http://httpd.apache.org/docs/2.2/mod/core.html#satisfy>) pode ser usada para especificar que vários critérios podem ser considerados ao tentar decidir se um determinado usuário terá acesso. Satisfy pode receber como argumento uma de duas opções - all ou any. Por padrão, assume-se que o valor é all. Isso significa que se vários critérios forem especificados, todos devem ser atendidos para que alguém tenha acesso. No entanto, se definido como any, vários critérios podem ser especificados, mas se o usuário satisfizer qualquer um deles, terá acesso concedido. Um exemplo disso é usar o controle de acesso para garantir que, embora um recurso seja protegido por senha de fora da sua rede, todos os hosts dentro da rede recebam acesso não autenticado ao recurso. Isso seria realizado usando a diretiva Satisfy, como mostrado abaixo.

<Directory /usr/local/apache/htdocs/sekrit> AuthType Basic AuthName intranet AuthUserFile /www/passwd/users AuthGroupFile /www/passwd/groups Require group customers Order allow,deny Allow from internal.com Satisfy any </Directory>


As diretivas acima permitem que apenas uma pessoa (especificamente alguém com o nome de usuário rbowen) entre no diretório. Na maioria dos casos, você vai querer permitir mais de uma pessoa. É aqui que o (<http://httpd.apache.org/docs/2.2/mod/mod_authz_groupfile.html#authgroupfile>) entra. Se você quer permitir mais de uma pessoa, precisará criar um arquivo de grupo que associa nomes de grupos a uma lista de usuários nesse grupo. O formato deste arquivo é bastante simples, e você pode criá-lo com seu editor favorito. O conteúdo do arquivo será assim:

GroupName: rbowen dpitts sungo rshersey

É simplesmente uma lista dos membros do grupo em uma linha longa separados por espaços. Para adicionar um usuário ao seu arquivo de senhas já existente, digite:

htpasswd /usr/local/apache/passwd/passwords dpitts

Você obterá a mesma resposta de antes, mas ela será adicionada ao arquivo existente, em vez de criar um novo arquivo. (É o -c que faz criar um novo arquivo de senhas). Agora, você precisa modificar seu arquivo .htaccess ou bloco (<http://httpd.apache.org/docs/2.2/mod/core.html#directory>) para ficar assim:

AuthType Basic AuthName "By Invitation Only" # Optional line: AuthBasicProvider file AuthUserFile /usr/local/apache/passwd/passwords AuthGroupFile /usr/local/apache/passwd/groups Require group GroupName

Agora, qualquer pessoa listada no grupo GroupName, e que tenha uma entrada no arquivo de senhas, terá acesso, se digitar a senha correta. Há outra maneira de permitir múltiplos usuários que é menos específica. Em vez de criar um arquivo de grupo, você pode simplesmente usar a seguinte diretiva:

Require valid-user

Usar isso em vez da linha Require user rbowen permitirá o acesso de qualquer pessoa que esteja listada no arquivo de senhas e que digite corretamente sua senha.


Como armazenar senhas em arquivos de texto simples tem os problemas mencionados acima, você pode desejar armazenar suas senhas em outro lugar, como em um banco de dados. (<http://httpd.apache.org/docs/2.2/mod/mod_authn_dbm.html>) e (<http://httpd.apache.org/docs/2.2/mod/mod_authn_dbd.html>) são dois módulos que tornam isso possível. Em vez de selecionar “(http://httpd.apache.org/docs/2.2/mod/mod_auth_basic.html#authbasicprovider) file, você pode escolher dbm ou dbd como seu formato de armazenamento. Para selecionar um arquivo dbd em vez de um arquivo de texto, por exemplo:

<Directory /www/docs/private> AuthName "Private" AuthType Basic AuthBasicProvider dbm AuthDBMUserFile /www/passwords/passwd.dbm Require valid-user </Directory>

Outras opções estão disponíveis. Consulte a documentação do (<http://httpd.apache.org/docs/2.2/mod/mod_authn_dbm.html>) para mais detalhes.

(http://img.zemanta.com/zemified_e.png?x-id=e42f8804-6c89-45f2-a6df-f24978a5af3c)](http://www.zemanta.com/?px “Enhanced by Zemanta”)

Resumo

Você aprendeu com sucesso a proteger um site usando Apache. Se encontrar algum problema, verifique novamente os pré-requisitos e certifique-se de que seu ambiente Apache Web Server está configurado corretamente.

Artigos Relacionados