Subdomínio do Apache com controle de permissão de acesso

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 validuser“. 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

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.