Home Comunidade Eventos YouTube Networks Desafios // produtos Academy News CTI | CVE Contato

02 - Gerenciamento de Repositório

video explicativo
Video explicativoEspaco reservado para o video desta anotação — adicione video: https://youtu.be/... no frontmatter da nota.

Gerenciamento de Repositório

No contexto de um Servidor Web, o Gerenciamento de Repositório (ou Document Root Management) refere-se à organização técnica, manutenção e segurança do local físico onde os arquivos do site ou aplicação residem. Não se trata apenas de armazenar arquivos, mas de estruturar como o software servidor (Apache, Nginx, IIS) interage com o sistema de arquivos para entregar conteúdo de forma eficiente, segura e auditável.

1. Estrutura Hierárquica do Repositório

O repositório deve separar conteúdo público de ficheiros de configuração, scripts sensíveis e dados de sistema. Estrutura típica de app moderno:

/var/www/exemplo/
├── public/                    # Único exposto ao servidor web
│   ├── index.php              # Entry point
│   ├── assets/{css,js,images,fonts}/
│   ├── robots.txt  favicon.ico  .htaccess
├── src/                       # Código (Controllers/Models/Views/config)
├── storage/{logs,cache,uploads}/  # Dados da aplicação
├── vendor/                    # Dependências (Composer, npm)
├── tests/   .env   .gitignore   composer.json

Diretrizes de Organização

  • Ponto de Entrada Único: apenas index.php (ou equivalente) na pasta pública.
  • Isolamento de Código Sensível: configurações e classes ficam fora do public/.
  • Separação por Tipo: imagens, CSS, JS e documentos em subpastas dedicadas.
  • Nomes consistentes: kebab-case para URLs, snake_case para arquivos de código.

2. Controle de Acesso e Segurança (Hardening)

O usuário do servidor web (ex: www-data, nginx) deve ter permissões de leitura, mas raramente de escrita no repositório, para evitar que um atacante, ao comprometer o processo web, altere o site.

Modelo de Permissões em Camadas

Diretório Dono Grupo Permissão Justificativa
/var/www/exemplo deploy www-data 750 Deploy controla, web lê
public/ deploy www-data 750 Web só lê
storage/uploads/ www-data www-data 770 Web escreve uploads
.env deploy www-data 640 Web lê secrets

ACLs (Access Control Lists)

Para casos mais complexos, usar ACLs em vez de apenas dono/grupo/outros:

# Permite leitura ao nginx e escrita ao deploy
setfacl -R -m u:nginx:rX,d:u:nginx:rX /var/www/exemplo
setfacl -R -m u:deploy:rwX,d:u:deploy:rwX /var/www/exemplo

3. Arquivos de Configuração Local

.htaccess (Apache)

Permite gerenciar o comportamento do repositório em tempo real, sem reiniciar o servidor:

# Bloquear arquivos sensíveis
<FilesMatch "(^\.|\.(bak|env|sql|log|md|sh)$)">
    Require all denied
</FilesMatch>

# Bloquear acesso ao diretório de código
RedirectMatch 403 /src/.*$
RedirectMatch 403 /vendor/.*$

# Forçar HTTPS
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Nginx (sem .htaccess)

Nginx não suporta .htaccess por design — toda configuração fica em /etc/nginx/, exigindo reload. Mais performático (não verifica arquivo em cada request) porém menos flexível para hospedagem compartilhada.

location ~ /\.(?!well-known).* { deny all; access_log off; log_not_found off; }
location ~* \.(env|sql|log|bak|sh|md)$ { deny all; return 404; }

4. Sincronização e Implementação (Deployment)

Método Como Funciona Vantagem Risco
Manual SCP/SFTP Cópia direta Simples Erro humano
Git pull Servidor clona repo Versionado Requer .gitignore para secrets
CI/CD Pipeline GitHub Actions, Jenkins Automatizado Complexidade inicial
Container Docker pull image Reprodutível Overhead de runtime
Atomic symlink Troca de symlink Zero downtime Requer versões paralelas

Atomic Deploys (Zero Downtime)

Nova versão carregada em pasta paralela e servidor web altera apenas um symlink para a nova pasta. Garante que o site nunca fique fora do ar durante a atualização.

#!/bin/bash
set -euo pipefail
RELEASE_DIR="/var/www/releases/$(date +%Y%m%d_%H%M%S)"
APP_DIR="/var/www/exemplo/current"
git clone --depth=1 https://github.com/org/app.git "$RELEASE_DIR"
(cd "$RELEASE_DIR" && composer install --no-dev --optimize-autoloader && php artisan config:cache)
ln -sfn "$RELEASE_DIR" "$APP_DIR.tmp" && mv -T "$APP_DIR.tmp" "$APP_DIR"
systemctl reload php8.3-fpm nginx
ls -dt /var/www/releases/*/ | tail -n +6 | xargs rm -rf  # manter últimos 5

Rollback Imediato

ln -sfn /var/www/releases/20240110_120000 /var/www/exemplo/current && systemctl reload nginx

5. Conteúdo Dinâmico vs Estático

Repositórios Estáticos

Ficheiros entregues como estão no disco. Foco em: Cache HTTP (Cache-Control: max-age=31536000, immutable para assets com hash), Compressão (Gzip RFC 1952 ou Brotli RFC 7932, ~15-20% melhor que Gzip), e Pre-compressão (gerar .gz e .br no build, servindo-os diretamente).

brotli on;  brotli_comp_level 6;
brotli_types text/css application/javascript application/json image/svg+xml;
gzip on;  gzip_types text/plain text/css application/javascript;
gzip_min_length 1000;

Repositórios de Uploads

Pastas onde usuários fazem upload. Exigem: desativar execução de scripts (PHP/Python/Perl) para evitar web shell, validação de MIME type no servidor (não confiar só na extensão), renomear arquivos para nomes aleatórios (evitar path guessing), e limitar tamanho (client_max_body_size no Nginx, upload_max_filesize no PHP).

location /uploads/ {
    location ~ \.php$ { deny all; }
    add_header X-Content-Type-Options nosniff;
}

6. Versionamento e Secrets

Git como Backend

git clone --depth=1 https://github.com/org/site.git    # clone read-only
git remote set-url origin --push=disabled

.gitignore Crítico

.env  .env.local  config/secrets.yml  storage/logs/*.log
storage/uploads/private/*  node_modules/  vendor/  *.sql  *.bak

Secrets Management

  • Nunca commitar .env em repositório. Usar Vault (HashiCorp), AWS Secrets Manager, Azure Key Vault.
  • Para projetos pequenos: .env no servidor apenas, com chmod 600.

7. Limpeza e Manutenção

Um gerenciamento eficaz inclui a remoção periódica de: arquivos temporários (*.tmp, *.swp), backups antigos (index.php.bak, db.sql.2023) que podem expor código-fonte, logs volumosos que podem encher o disco e parar o servidor, versões antigas de releases (manter últimas 3-5), e cache obsoleto (regenerar após deploy).

Script de Limpeza (cron semanal)

find /var/www -name "*.bak" -mtime +30 -delete
find /var/www -name "*.log" -size +100M -mtime +30 -delete
find /var/www/releases -maxdepth 1 -type d -mtime +90 -exec rm -rf {} \;
df -h | awk 'NR>1 && int($5) > 80 {print "DISCO CHEIO:", $0}'

8. Monitoramento e Auditoria

du -sh /var/www/exemplo/                              # tamanho (planejar capacidade)
find /var/www -type f -mtime -1 -ls                  # modificados hoje (suspeitos)
find /var/www -perm /o+w -type f -ls                 # permissões inseguras
find /var/www -name "*.php" -size -2k -mtime -7       # web shell suspeito
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head  # top URLs
inotifywait -m -r /var/www/exemplo/storage/uploads -e create -e modify        # novos uploads

9. Backup e Recuperação (Estratégia 3-2-1)

  • 3 cópias dos dados; 2 mídias diferentes (disco + fita, ou local + cloud); 1 cópia offsite (AWS S3, Glacier).
Tipo O que Inclui Frequência Retenção
Completo Todos os arquivos Semanal 12 semanas
Incremental Mudanças desde último Diário 30 dias
Snapshot LVM Imagem do FS Horário 24 horas
Off-site Replicação remota Tempo real Indefinido

10. Conclusão

O Gerenciamento de Repositório combina organização estrutural (árvore de diretórios), segurança (permissões, ACLs, .htaccess, bloqueio de execução em uploads), automação (CI/CD, deploys atômicos, rollback), performance (compressão, cache) e governança (versionamento, secrets, backup, monitoramento). Um repositório mal gerenciado é a causa número um de incidentes de segurança em aplicações web — desde defacement até vazamento de dados via .env exposto. Aplicar as melhores práticas descritas é fundamental para garantir a resiliência, segurança e auditabilidade de qualquer servidor web em produção.