Protegendo o acesso a algumas pastas ou diretórios no Apache

Post date: 11/10/2013 15:11:53

Em alguns momentos é interessante controlar o acesso de diretórios ou arquivos presentes em um servidor WEB. Por padrão, quando você coloca algo no diretório seu diretório compartilhado através do http, qualquer usuário pode ter acesso a esse arquivo, mediante a permissão do sistema de arquivo.

Por exemplo, ao acessar a pasta /share em um determinado servidor, obtem-se o seguinte resultado

Para acessar qualquer arquivo, o usuário www-data deve ter explicitamente a permissão de leitura, mas se o arquivo pertencer a um usuário qualquer, o mesmo pode ser acessível quando os usuários comuns (others) possuem permissão de leitura é suficiente para um arquivo poder ser lido. No sistema de arquivo que está armazenada a pasta share, os arquivos possuem as seguintes permissões:

$ ls -la total 456 drwxr-xr-x 2 www-data www-data 4096 Out 11 12:04 . drwxr-xr-x 8 root root 4096 Out 11 12:02 .. -rwxr-x--x 1 www-data www-data 454656 Out 11 12:04 putty.exe -rw-r----- 1 root root 70 Out 11 12:02 telefones.csv

apesar de ambos os arquivos não possuirem permissão de leitura para os usuários comuns, devido ao apache rodar sob o usuário www-data, o mesmo consegue acesso ao arquivo putty.exe, mas não dá acesso ao arquivo telefones.csv, pois o dono do arquivo é o root, resultando em um erro conforme mostrado a seguir.

Contudo, o apache tem a possibilidade de fazer o controle da acesso de diretórios mediante a login e senha, pois o protocolo oferece um código de resposta de comunicação 401 - Não Autorizado, ou seja, quem tem as credenciais para o diretório acessa e quem não tem, não acessa.

Neste tutorial serão mostradas duas formas de disponibilizar um controle de acesso através das configurações do APACHE

Ambiente de Teste

Este tutorial foi testado em um computador com as seguintes configurações

  • Ubuntu 12.04

  • Apache versão 2.2.22

Configurando o acesso através de controle de senha por arquivo

Para configurar um diretório com controle de acesso por arquivo você deve inserir em seu arquivo de configuração do apache a personalização do controle de acesso do diretório, para isto, basta você editar um dos sites-available do apache através de

$ vim /etc/apache2/sites-available/default

em qualquer parte do arquivo, para você colocar o controle de acesso a um determinado diretório, basta criar uma configuração de <Location nome> dentro do <Virtualhost>

Por exemplo, foi inserido a seguinte configuração

<Location /share> AuthType basic AuthUserFile /caminho/para/um/arquivo/que/contem/as/senhas/nome_do_arquivo AuthName "Acesso Privado, favor digitar seu login e senha para acessar os arquivos" Require valid-user </Location>

em que:

  • AuthType basic: é a forma de autenticação, no caso utilizamos uma autenticação simples, mas o apache permite as seguintes configurações de tipos de autenticação digest para configuração com usuário pertencente a um domínio com senha criado em um arquivo ou LDAP, com senha em um Active Directory (AD).

  • AuthUserFile : arquivo que será utilizado para controlar o acesso. O administrador pode escolher qualquer arquivo, basta criá-lo corretamente através do htpasswd. Deverá ser informado o diretório e o nome do arquivo que possui as senhas

  • AuthName : Forma de apresentação do sistema de controle de acesso, o administrador pode colocar qualquer mensagem, no idioma de preferência.

  • Require valid-user é para informar ao apache que só permitirá o acesso a usuários autenticados.

Para criar o arquivo de senha, você deve entrar na pasta escolhida e em seguida chamar o comando htpasswd, conforme mostrado a seguir.

# mkdir /etc/apache2/senhas # cd /etc/apache2/senhas # htpasswd -c nome_do_arquivo nome_do_usuario New password: Re-type new password: Adding password for user <nome_do_usuario>

Para inserir novos usuários, basta remover o parâmetro -c do htpasswd

# htpasswd nome_do_arquivo nome_do_usuario New password: Re-type new password: Adding password for user <nome_do_usuario>

Desta forma, agora basta só solicitar a recarga do apache2 para que ele coloque em execução as configurações de controle de acesso.

# a2enmod auth_basic # a2enmod authn_file # a2enmod authz_user # service apache2 restart

Com isto, o controle de acesso fica ativo e ao acessar a pasta share, será solicitado as credenciais do usuário.

ao acessar a página, é solicitado ao usuário a digitação de sua credencial

caso as credenciais digitadas não estejam no arquivo de texto, o navegador irá retornar o seguinte código de erro.

Parabéns, com isso qualquer arquivo com permissão de leitura para o usuário www-data poderá ser compartilhado em uma pasta em um servidor web apache2 mediante a senha gravada em um arquivo de texto. Perceba que nos testes foi feito a configuração do <Location> em um virtualhost atendendo a porta 433 (https), ou seja, além de uma autenticação por senha, você pode também transferir seus dados de forma criptografada.

Controle de Usuários em banco de dados (falta ainda testar ok?)

Além de um arquivo de texto, a autenticação básica permite também o controle de usuários através do SQL, por exemplo, um postgres.

Para isto, deve-se criar ao final do arquivo /etc/apache2/httpd.conf

DBDriver pgsql DBDParams "host=localhost dbname=mydb user=usuariodobanco password=secret" DBDMax 10

depois disto, basta criar o usuário banco de dados indicado, e o usuário com a senha informada para acessar o banco de dados criado através do comando:

# psql -u postgres CREATE USER usuariodobanco WITH PASSWORD 'secret'; CREATE DATABASE mydb; GRANT ALL PRIVILEGES ON DATABASE mydb to usuariodobanco; DATABASE mydb CREATE TABLE authn ( id integer PRIMARY KEY AUTOINCREMENT, username varchar(40) NOT NULL, password varchar(40) NOT NULL );

Com isto, basta inserir as informações de autenticação no Location

<Location /share> AuthType basic AuthName "Acesso Privado, favor digitar seu login e senha para acessar os arquivos" AuthBasicProvider dbd AuthDBDUserPWQuery \ "SELECT password FROM authn WHERE user = %s" Require valid-user </Location>

Feito isto, basta criar os usuários no banco utilizando um insert into

INSERT INTO authn (usuario,senha)

Desta forma, agora basta só solicitar a recarga do apache2 para que ele coloque em execução as configurações de controle de acesso.

# a2enmod auth_basic # a2enmod authn_dbm # a2enmod authz_user # service apache2 restart