Se você gerencia um servidor Apache contendo alguns subdomínios ou mesmo alguns diretórios que devem ser acessados exclusivamente por pessoas autorizadas então você deve realizar uma autenticação de usuários para permitir este controle.
O procedimento para autenticação consiste em editar o arquivo de configuração do seu subdomínio e incluir as diretivas corretas de acordo com o seu interesse e as duas formas mais simples de se fazer isso são usando um simples arquivo no formato login:senha para ser gerenciado pelo comando htpasswd; ou ou uma base de autenticação como uma árvore OpenLDAP ou Microsoft Active Directory.
O básico
A configuração abaixo corresponde a um domínio virtual básico disponível na web via Apache 2:
<VirtualHost *>
#Configuracao basica do subdominio newsletter
#
ServerAdmin webmaster@meudominio
DocumentRoot /home/newsletter/public_html/
ServerName newsletter.meudominio
ServerAlias *.newsletter.meudominio
ErrorLog /var/log/apache2/newsletter-error.log
CustomLog /var/log/apache2/newsletter-access.log combined
#
#O charset padrao e UTF8 mantenha esta linha comentada sempre que possivel.
AddDefaultCharset ISO8859-1
#
#Configuracao do diretorio
<Directory /home/newsletter/public_html/>
DirectoryIndex index.htm index.html index.php
</Directory>
#
#Proibe a leitura de arquivos ".inc"
<Files ~ "\.inc$">
Order allow,deny
Deny from all
</Files>
</VirtualHost>
Atente apenas para configuração do diretório que pus em destaque. Até ai qualquer pessoa pode acessar este diretório e ler as páginas de forma irrestrita. Para evitarmos isso temos alguns truques:
Truque 1: Restringir por faixa de endereço IP
Observe novamente a sessão directory do meu subdomínio no Apache, desta vez com restrição.
#
#Configuracao do diretorio
<Directory /home/newsletter/public_html/>
DirectoryIndex index.htm index.html index.php
Order deny,allow
Deny from all
Allow from 192.168.1.0/24
</Directory>
#
As três linhas em negrito dizem ao Apache que: primeiro ele deve considerar a regra para negação de acesso e depois a de autorização (Order…); em seguida é dito que todos os acesso serão negados exceto que sejam explicitamente autorizados (Deny from all); e por fim é dito que somente máquinas na minha faixa de rede são autorizadas (Allow from 192.168.1.0/24) e que poderia ser apenas um endereço IP (192.168.1.6), uma faixa de rede, um domínio etc. A sessão correspondente ao módulo de validação de hosts no Apache[1] revela todas as possibilidades.
Truque 2: Autenticação
Autenticação de usuários para acesso a determinado diretório depende de uma relação usuário/senha armazenada em algum lugar acessível pelo apache. Uma vez que o usuário tente acessar uma página com esta restrição uma janela de autenticação será exibida pelo navegador do usuário onde ele deverá fornecer seu login e senha. Caso a autenticação seja aceita o usuário poderá ver as páginas, do contrário uma mensagem de negação será exibida.
Autenticação com arquivo de senhas
A forma mais básica, porém mais trabalhosa é criar em algum local do seu servidor um arquivo de senhas. Para criar e fazer a manutenção deste arquivo você usará o comando htpasswd, pela linha de comandos do seu sistema operacional.
Vejamos novamente a sessão diretory do meu subdomínio com a restrição de autenticação:
#
#Configuracao do diretorio
<Directory /home/newsletter/public_html/>
DirectoryIndex index.htm index.html index.php
AuthName "Acesso restrito. Digite o login e a senha."
AuthType Basic
AuthUserFile /etc/adminsnewsletter
require valid-user
</Directory>
#
Veja as quatro linhas adicionadas na configuração básica do meu diretório. Primeiro temos uma mensagem que será exibida para o usuário na janela de autenticação (Authname…) e o tipo de autenticação (AuthType…). Em seguida é dito ao apache qual é o arquivo contendo os logins e senhas dos usuários autorizados (AuthUserFile) e finalmente é dito que qualquer usuário válido é suficiente para autenticação.
Autorizando apenas um usuário
Neste último ponto podemos fazer uma consideração legal. Vamos supor que você tenha uma tabela de usuários gigantesca contendo todos os logins permitidos a acessar seus diretórios. Existe um diretório especifico que apenas o usuário luis pode acessar. Para isso a configuração daquele diretório especifico terá a diretiva “Require user luis”, ao invés de “Require valid–user“. Desta forma o nosso diretório ficaria com a seguinte configuração:
#
#Configuracao do diretorio
<Directory /home/newsletter/public_html/>
DirectoryIndex index.htm index.html index.php
AuthName "Acesso restrito. Digite o login e a senha."
AuthType Basic
AuthUserFile /etc/adminsnewsletter
require user luis
</Directory>
#
Feito isto basta criar o arquivo de login/senha conforme é explicado mais a diante e racarregar as configurações do Apache com o comando “invoke-rc.d apache2 reload” (Nos sistemas Debian-like).
Autorizando vários usuários
Caso seja necessário permitir a dois ou três usuários simplesmente adicione o login de todos eles separados por espaço nesta mesma linha desta forma:
require user luis carla ricardo
Ou de forma mais inteligente defina grupos de usuários. Então bastará você incluir ou remover os usuários dos grupos desejados. Para isso sua configuração ficaria assim:
# #Configuracao do diretorio <Directory /home/newsletter/public_html/> DirectoryIndex index.htm index.html index.php AuthName "Acesso restrito. Digite o login e a senha." AuthType Basic AuthUserFile /etc/adminsnewsletter AuthGroupFile /etc/groupsnewsletter require group webmaster </Directory> #
Desta maneira o usuário será solicitado a informar o login e senha, mas ainda que ele acerte só estará autorizado a acessar o conteúdo deste diretório caso pertença ao grupo “webmaster”.
Agora basta criar o arquivo de login/senha e o arquivo de grupos, conforme é explicado mais a diante e racarregar as configurações do Apache com o comando “invoke-rc.d apache2 reload” (Nos sistemas Debian-like).
Criando usuários para autenticar o Apache
No exemplo a seguir estou criando três usuários que estarão autorizados a entrar no meu diretório:
# htpassdw -c /etc/admisnewsletter joao
# htpassdw /etc/admisnewsletter pedro
# htpassdw /etc/admisnewsletter maria
Observe que o parâmetro “-c” é usado somente da primeira vez para criar o arquivo. Depois você nunca mais o usará, ou apagará todo o arquivo.
Criando grupos de usuários para autorização de acesso no Apache
Diferentemente do arquivo de usuários/senhas, o arquivo de grupo deve ser editado com um editor de textos de sua preferência. Tal como o vi, vim, nano, pico, emacs, notepad etc. Abra o seu editor preferido, edite o arquivo e salve-o no local especificado na diretiva AuthGroupFile. Veja o exemplo abaixo de um arquivo com dois grupos e os três usuários criados.
webmaster: joao maria
usuario: pedro
Não deixe de ler o [3] para mais dicas sobre métodos de autenticação, autorização e controle de acesso.
Autenticando usuários em uma árvore OpenLDAP
Depois que eu descobri que posso centralizar todas (ou quase todas ) as minhas bases de autenticação em um lugar só não quero outa opção. Com o OpenLDAP é possível manter todos os logins e senhas em um só lugar de forma o que facilita muito a gerência de contas.
Da mesma forma como fizemos com os usuários do apache a partir de um arquivo, podemos fazer com os usuários do LDAP. Lembrando de ante-mão que NDS, AD, Netscape Diretor, OpenLDAP entre outros são uma base no padrão LDAP sendo assim, este procedimento é quase genérico permitindo que você possa usá-lo qualquer um destes sistemas para validar seus usuários.
# #Configuracao do diretorio <Directory /home/newsletter/public_html/> DirectoryIndex index.htm index.html index.php AuthType Basic AuthName "Acesso restrito." AuthBasicProvider ldap AuthzLDAPAuthoritative off AuthLDAPURL ldap://ldap.meudominio:389/ou=Usuarios,dc=dominio,dc=com,dc=br?uid require valid-user </Directory> #
As diretivas AuthType, AuthName e Require já foram comentadas. As demais são especificas para este tipo de autenticação, como a AuthBasicProvider que é uma “gambirra” no “AuthType Basic” para que ele use outro método de autenticação que não o baseado em arquivos. Neste caso nós definimos para usar o LDAP, consulte a página sobre autenticação básica do Apache [4] para mais informações.
AuthzLDAPAuthoritative define que nenhum outro módulo deve tentar validar o usuário caso o primeiro falhe. Em geral isto deve ficar como off.
AuthLDAPURL é a URL de acesso ao seu servidor LDAP. Esteja atento ao DN completo do ramo onde seus usuários estão a árvore LDAP. Neste meu exemplo todos os meus usuários estão no Ou=Usuários,dc=dominio,dc=com,dc=br. Observe também o “uid” no final daquela URL este é o atributo que contém o login dos seus usuários. Quase sempre será isso, mas pode haver configurações em que colocaram o atributo “cn” como login. Confira a sua árvore para definir corretamente.
Como os nossos usuários estão em uma árvore LDAP já populada não será precisa adicionar usuários em lugar algum. Basta dar um “reload” nas configurações do apache e pronto.
Conclusão
A que apresentei foi apenas uma gota no oceano de possibilidades. A partir destas técnicas básicas já é possível pensar am outras, ou juntá-las aproveitando as idéias dadas e também o conteúdo da documentação do Apache que possui alguns exemplos úteis. Fica a cargo da imaginação de cada um definir suas políticas de controle de acesso ao seu website e assim evitar que bisbilhoteiros vejam o que não devem.
Referências
[1] Apache.org. Apache HTTP Server Version 2.2: Apache Module mod_authz_host. Disponível em: <http://httpd.apache.org/docs/2.2/pt-br/mod/mod_authz_host.html>
[2] Apache.org. Apache HTTP Server Version 2.2: Apache Module mod_authz_ldap. Disponível em: <http://httpd.apache.org/docs/2.2/pt-br/mod/mod_authnz_ldap.html>
[3] Apache.org. Apache HTTP Server Version 2.2: Authentication, Authorization and Access Control . http://httpd.apache.org/docs/2.2/pt-br/howto/auth.html
[4] Apache.org. Apache HTTP Server Version 2.2: Apache Module mod_auth_basic. http://httpd.apache.org/docs/2.2/pt-br/mod/mod_auth_basic.html
AuthUserFile /etc/adminsnewsletter