Controle de acesso e restrição de diretórios no Apache: Require, Directory e proteção de áreas

Capítulo 13

Tempo estimado de leitura: 8 minutos

+ Exercício

O que é controle de acesso no Apache (visão prática)

Controle de acesso é o conjunto de regras que define quem pode acessar um recurso servido pelo Apache (um diretório, uma URL, um arquivo específico). No Apache moderno (2.4+), isso é feito principalmente com a diretiva Require, que decide se a requisição é permitida ou negada.

Você pode restringir acesso por:

  • Origem (IP/rede): permitir apenas IPs específicos ou sub-redes.
  • Autenticação: exigir usuário/senha (ex.: Basic Auth).
  • Alvo da regra: aplicar a regra a um <Directory> (caminho no disco), <Location> (caminho da URL) ou <Files> (nome/padrão de arquivo).

Require: a base das decisões de acesso

A diretiva Require é avaliada dentro de um contexto (por exemplo, <Directory> ou <Location>). Exemplos comuns:

  • Require all granted: permite tudo.
  • Require all denied: nega tudo.
  • Require ip 203.0.113.10: permite um IP.
  • Require ip 203.0.113.0/24: permite uma rede.
  • Require valid-user: permite qualquer usuário autenticado.
  • Require user alice bob: permite usuários específicos.

Quando você precisa combinar condições (por exemplo, “IP OU senha”), use blocos lógicos:

<RequireAny>  # OR (qualquer condição verdadeira libera)  Require ip 203.0.113.0/24  Require valid-user</RequireAny>
<RequireAll>  # AND (todas as condições devem ser verdadeiras)  Require ip 203.0.113.0/24  Require valid-user</RequireAll>

Para negar exceções, use Require not:

Continue em nosso aplicativo e ...
  • Ouça o áudio com a tela desligada
  • Ganhe Certificado após a conclusão
  • + de 5000 cursos para você explorar!
ou continue lendo abaixo...
Download App

Baixar o aplicativo

Require all grantedRequire not ip 198.51.100.23

Directory vs Location vs Files: onde aplicar a regra

<Directory> (caminho no sistema de arquivos)

Use quando a intenção é proteger um diretório real no disco (ex.: /var/www/site/admin). É a forma mais comum para proteger pastas físicas.

<Directory "/var/www/site/admin">  Require ip 203.0.113.0/24</Directory>

<Location> (caminho da URL)

Use quando a regra deve valer para uma URL, mesmo que o conteúdo não venha de um diretório físico (por exemplo, aplicações com roteamento, aliases, endpoints especiais). <Location> avalia a URL, não o caminho do disco.

<Location "/admin">  Require valid-user</Location>

Atenção: se você proteger apenas com <Directory>, mas a URL /admin for atendida por um mapeamento diferente (ex.: Alias), a regra pode não pegar. Nesses casos, <Location> costuma ser mais confiável para a URL.

<Files> e <FilesMatch> (nome/padrão de arquivo)

Use para proteger arquivos específicos (por nome) dentro de um contexto, ou globalmente (dependendo de onde você declara). É útil para bloquear arquivos sensíveis como .env, backups, chaves, dumps etc.

<Files ".env">  Require all denied</Files>
<FilesMatch "\.(bak|old|sql|zip|tar|gz)$">  Require all denied</FilesMatch>

Restrição por IP (passo a passo)

Objetivo: permitir acesso a uma área apenas para sua rede (ex.: escritório/VPN).

1) Escolha o alvo (Directory ou Location)

Se a área é uma pasta real dentro do site, prefira <Directory>. Se é uma rota de aplicação, prefira <Location>.

2) Escreva a regra com Require ip

<Directory "/var/www/site/admin">  Require ip 203.0.113.0/24</Directory>

Para múltiplos IPs/redes:

<Directory "/var/www/site/admin">  <RequireAny>    Require ip 203.0.113.10    Require ip 203.0.113.0/24    Require ip 192.0.2.0/24  </RequireAny></Directory>

3) Recarregue e teste

Após alterar a configuração, valide e recarregue (os comandos variam por distro, mas a ideia é: testar sintaxe e recarregar o serviço). Em seguida, teste de um IP permitido e de um IP não permitido.

Autenticação Basic (conceito + exemplo mínimo)

Basic Auth é um mecanismo simples em que o navegador envia usuário/senha (codificados em Base64) a cada requisição. Por isso, use sempre com HTTPS quando houver credenciais reais.

Componentes essenciais:

  • AuthType Basic: tipo de autenticação.
  • AuthName: texto exibido no prompt de login.
  • AuthUserFile: arquivo com usuários/senhas (hash).
  • Require: quem pode entrar (ex.: valid-user).

Exemplo mínimo de configuração

<Directory "/var/www/site/admin">  AuthType Basic  AuthName "Area restrita"  AuthUserFile "/etc/apache2/.htpasswd-admin"  Require valid-user</Directory>

Criando o arquivo de senhas (.htpasswd)

Use a ferramenta htpasswd para criar o arquivo e adicionar usuários.

  • Criar o arquivo e adicionar o primeiro usuário (ex.: admin):
htpasswd -c /etc/apache2/.htpasswd-admin admin
  • Adicionar outro usuário (sem -c):
htpasswd /etc/apache2/.htpasswd-admin alice

Boas práticas: mantenha o arquivo fora do DocumentRoot (ex.: em /etc/apache2/) para evitar qualquer chance de download acidental.

Laboratório: proteger /admin com IP e/ou senha

Neste laboratório você vai proteger uma pasta /admin de duas formas: (A) apenas por IP e (B) por IP OU senha. Você também verá como a escolha entre <Directory> e <Location> muda o comportamento.

Pré-condição do laboratório

Considere que o site está em /var/www/site e que existe a pasta /var/www/site/admin com um index.html simples para teste.

A) Proteger /admin apenas por IP (Directory)

1) Adicione no VirtualHost (ou no arquivo de configuração do site) um bloco <Directory>:

<Directory "/var/www/site/admin">  Require ip 203.0.113.0/24</Directory>

2) Recarregue o Apache e teste:

  • De um IP fora da rede permitida: deve retornar 403 Forbidden.
  • De um IP dentro da rede: deve abrir normalmente.

B) Proteger /admin por IP OU senha (RequireAny + Basic Auth)

Objetivo: quem estiver na rede confiável entra sem senha; fora dela, precisa autenticar.

1) Crie o arquivo de usuários:

htpasswd -c /etc/apache2/.htpasswd-admin admin

2) Use <RequireAny> para combinar as condições:

<Directory "/var/www/site/admin">  AuthType Basic  AuthName "Admin"  AuthUserFile "/etc/apache2/.htpasswd-admin"  <RequireAny>    Require ip 203.0.113.0/24    Require valid-user  </RequireAny></Directory>

3) Teste:

  • Dentro da rede: acesso direto.
  • Fora da rede: navegador deve pedir usuário/senha; após autenticar, acesso liberado.

C) Comparando com <Location> (quando /admin é uma URL, não uma pasta)

Se sua aplicação responde /admin sem necessariamente mapear para /var/www/site/admin (por exemplo, roteamento interno), você pode proteger pela URL:

<Location "/admin">  AuthType Basic  AuthName "Admin"  AuthUserFile "/etc/apache2/.htpasswd-admin"  Require valid-user</Location>

Teste comparativo: se você renomear/mover a pasta física, a regra em <Directory> pode deixar de fazer sentido; já <Location> continua valendo para a URL /admin.

Como evitar acesso a arquivos sensíveis (.env, backups, configs)

Um erro comum é deixar arquivos que não deveriam ser públicos dentro do DocumentRoot (ou em subpastas). Mesmo que “não haja link”, o usuário pode tentar adivinhar o nome e baixar. A mitigação é bloquear explicitamente padrões perigosos.

Bloquear .env e variações

<FilesMatch "^\.env">  Require all denied</FilesMatch>

Bloquear backups e arquivos temporários comuns

<FilesMatch "\.(bak|old|orig|swp|tmp)$">  Require all denied</FilesMatch>
<FilesMatch "\.(sql|sqlite|dump)$">  Require all denied</FilesMatch>
<FilesMatch "\.(zip|tar|gz|tgz|7z)$">  Require all denied</FilesMatch>

Bloquear arquivos de configuração expostos por engano

Adapte a lista ao seu projeto (ex.: config.php, settings.php, *.ini, *.yml). Exemplo:

<FilesMatch "\.(ini|yml|yaml|conf|config)$">  Require all denied</FilesMatch>

Bloquear diretórios “ocultos” (ex.: .git)

Se um repositório ou metadados forem parar no DocumentRoot, isso é crítico. Bloqueie qualquer caminho que comece com ponto:

<DirectoryMatch "/\.">  Require all denied</DirectoryMatch>

Isso ajuda a impedir acesso a /.git, /.svn, /.idea e similares.

Erros comuns e checagem rápida

SintomaCausa provávelAjuste
Mesmo com regra, a URL continua acessívelA regra foi aplicada em <Directory>, mas o conteúdo é servido por outro mapeamento/rotaUse <Location> para proteger a URL
403 para todo mundo, inclusive IP permitidoIP/rede incorretos ou acesso vindo por proxy sem repassar IP realConfirme o IP de origem visto pelo Apache (logs) e revise a rede; em cenários com proxy, avalie configuração de IP real (com cuidado)
Prompt de senha aparece, mas login nunca funcionaAuthUserFile errado, arquivo inacessível, ou usuário não existeConfira caminho do arquivo, permissões e recrie usuário com htpasswd
Arquivo sensível ainda baixaRegra <FilesMatch> não cobre o padrão realTeste o nome exato e ajuste a regex; garanta que a regra está no contexto correto

Agora responda o exercício sobre o conteúdo:

Você quer proteger a URL /admin mesmo quando ela pode ser atendida por roteamento interno ou Alias, sem depender do caminho físico no disco. Qual abordagem é mais adequada para garantir que a regra se aplique à URL?

Você acertou! Parabéns, agora siga para a próxima página

Você errou! Tente novamente.

<Location> aplica regras com base na URL, não no caminho físico. Isso é mais confiável quando /admin pode ser servido por roteamento ou mapeamentos como Alias, onde um <Directory> pode não capturar o acesso.

Próximo capitúlo

Hardening básico no Apache: headers de segurança e exposição mínima

Arrow Right Icon
Capa do Ebook gratuito Apache para Iniciantes: Configuração Essencial, Virtual Hosts e Segurança Básica
81%

Apache para Iniciantes: Configuração Essencial, Virtual Hosts e Segurança Básica

Novo curso

16 páginas

Baixe o app para ganhar Certificação grátis e ouvir os cursos em background, mesmo com a tela desligada.