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:
- Ouça o áudio com a tela desligada
- Ganhe Certificado após a conclusão
- + de 5000 cursos para você explorar!
Baixar o aplicativo
Require all grantedRequire not ip 198.51.100.23Directory 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 aliceBoas 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 admin2) 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
| Sintoma | Causa provável | Ajuste |
|---|---|---|
| Mesmo com regra, a URL continua acessível | A regra foi aplicada em <Directory>, mas o conteúdo é servido por outro mapeamento/rota | Use <Location> para proteger a URL |
| 403 para todo mundo, inclusive IP permitido | IP/rede incorretos ou acesso vindo por proxy sem repassar IP real | Confirme 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 funciona | AuthUserFile errado, arquivo inacessível, ou usuário não existe | Confira caminho do arquivo, permissões e recrie usuário com htpasswd |
| Arquivo sensível ainda baixa | Regra <FilesMatch> não cobre o padrão real | Teste o nome exato e ajuste a regex; garanta que a regra está no contexto correto |