Este guia demonstra como fortalecer a segurança de um serviço de análise de documentos baseado no YOLO X Layout, expondo uma interface Gradio que, por padrão, roda sem proteção na porta 7860. A solução emprega um Nginx como proxy reverso para encapsular o serviço e implementa uma camada de autenticação básica, transformando um endpoint aberto em um recurso controlado.
Compreendendo o Risco da Implantação Padrão
Iniciar o aplicativo Gradio diretamente cria several superfícies de ataque:
- Acesso Não Autenticado: Qualquer usuário com o IP do servidor pode interagir com a ferramenta.
- Exposição de Porta: A porta 7860 fica diretamente acessível, vulnerável a varreduras.
- Ausência de Logs: Não há registro centralizado de tentaitvas de acesso.
- Sem Limitação de Taxa: O serviço fica exposto a abusos ou ataques de força bruta.
A abordagem ideal para muitos projetos é um sistema de controle de acesso leve, que forneça autenticação, oculte a porta interna e permita monitoramento, sem a complexidade de soluções como OAuth ou LDAP.
Preparando o Ambiente e Instalando o Nginx
Primeiro, confirme que o serviço YOLO X Layout está em execução e respondendo na porta local.
# Verificar processos relacionados
ps aux | grep python
# Conferir se a porta 7860 está em uso
ss -tlnp | grep 7860
# Testar a resposta local
curl -I http://127.0.0.1:7860
Em seguida, instale o servidor web Nginx e a ferramenta para geração de senhas.
# Atualizar repositórios e instalar o Nginx
sudo apt-get update && sudo apt-get install -y nginx
# Habilitar e iniciar o serviço do Nginx
sudo systemctl enable --now nginx
# Instalar utilitários para autenticação básica
sudo apt-get install -y apache2-utils
Configurando a Autenticação por Usuário e Senha
Crie um arquivo seguro para armazenar as credenciais dos usuários.
# Criar diretório para o arquivo de credenciais
sudo mkdir -p /etc/nginx/.htpasswd
# Gerar a primeira entrada de usuário (substitua 'operador' pelo nome desejado)
sudo htpasswd -c /etc/nginx/.htpasswd/analise_docs operador
# Ajustar permissões para segurança
sudo chown root:www-data /etc/nginx/.htpasswd/analise_docs
sudo chmod 640 /etc/nginx/.htpasswd/analise_docs
Para adicionar usuários adicionais, omita a flag -c:
sudo htpasswd /etc/nginx/.htpasswd/analise_docs outro_usuario
Definindo o Proxy Reverso no Nginx
Crie um arquivo de configuração dedicado no diretório sites-available.
sudo nano /etc/nginx/sites-available/yolo-proxy
Insira a seguinte configuração, adaptando as linhas comentadas conforme necessário:
server {
listen 80;
# server_name meu-servico.meudominio.com;
# Registro de logs para esta aplicação específica
access_log /var/log/nginx/yolo_access.log;
error_log /var/log/nginx/yolo_error.log;
# Ativação da autenticação básica
auth_basic "Acesso Restrito - Ferramenta de Análise";
auth_basic_user_file /etc/nginx/.htpasswd/analise_docs;
location / {
# Encaminhamento todas as requisições para o serviço local
proxy_pass http://localhost:7860;
proxy_buffering off;
# Cabeçalhos para preservar informações do cliente original
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Suporte a WebSocket, necessário para o Gradio
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# Ajustes de timeout para operações longas
proxy_connect_timeout 120s;
proxy_send_timeout 120s;
proxy_read_timeout 120s;
}
# Cabeçalhos de segurança adicionais
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
}
Ative o site e reinicie o Nginx para aplicar as mudanças.
# Criar link simbólico para ativar a configuração
sudo ln -s /etc/nginx/sites-available/yolo-proxy /etc/nginx/sites-enabled/
# Testar a sintaxe da configuração
sudo nginx -t
# Recarregar o serviço do Nginx
sudo systemctl reload nginx
Validando o Acesso Protegido
Agora, o acesso ao serviço deve ser feito através da porta 80 (HTTP) ou 443 (HTTPS), e não mais pela 7860.
- Teste no Navegador: Acesse
http://SEU_IP. Um prompt de login deve aparecer. - Teste via Linha de Comando (API): Modifique suas requisições para incluir a autenticação.
import requests
from requests.auth import HTTPBasicAuth
# Endpoint agora aponta para o proxy na porta padrão
api_url = "http://SEU_IP/api/predict"
credenciais = HTTPBasicAuth('operador', 'senha_segura')
with open('documento.pdf', 'rb') as arquivo:
dados_arquivo = {'file': arquivo}
resposta = requests.post(api_url, files=dados_arquivo, auth=credenciais)
if resposta.status_code == 200:
print("Análise concluída:", resposta.json())
else:
print("Falha na autenticação ou na requisição.")
Para garentir que a porta 7860 não está mais exposta externamente, bloqueie-a com um firewall.
# Configurar regras básicas do firewall UFW
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https
sudo ufw enable
Fortalecimentos Adicionais
1. Habilitar Criptografia com SSL/TLS (HTTPS)
Para proteger as credenciais em trânsito, configure um certificado SSL. Com um domínio apontando para seu servidor, use o Certbot:
# Instalar o Certbot para o Nginx
sudo apt-get install -y certbot python3-certbot-nginx
# Obter e instalar o certificado (substitua pelo seu domínio)
sudo certbot --nginx -d seu-dominio.com
Para testes sem um domínio público, gere um certificado autoassinado:
# Criar diretório para certificados
sudo mkdir -p /etc/nginx/ssl
# Gerar chave e certificado autoassinado (válido por 365 dias)
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/nginx/ssl/yolo.key \
-out /etc/nginx/ssl/yolo.crt \
-subj "/CN=localhost"
Adapte a configuração do Nginx para usar as portas 443 e os caminhos dos certificados, adicinoando um bloco de redirecionamento da porta 80 para 443.
2. Limitação de Taxa de Requisições
Para mitigar tentativas de força bruta, adicione uma diretiva de limitação de taxa.
No bloco http do arquivo /etc/nginx/nginx.conf, defina uma zona de limitação:
http {
limit_req_zone $binary_remote_addr zone=reqs_por_ip:10m rate=10r/m;
# ... outras configurações globais
}
Na configuração do servidor do seu proxy, aplique a limitação:
location / {
limit_req zone=reqs_por_ip burst=5 nodelay;
# ... restante das diretivas do proxy
}
3. Restrição por Endereço IP
Em ambientes corporativos, o acesso pode ser restrito a redes internas específicas.
location / {
allow 192.168.1.0/24; # Rede corporativa
allow 203.0.113.50; # IP de um escritório externo
deny all;
# ... restante das diretivas do proxy
}
Monitoramento e Solução de Problemas
Monitore os logs para verificar acessos legítimos e tentativas maliciosas.
# Acompanhar o log de acesso em tempo real
sudo tail -f /var/log/nginx/yolo_access.log
# Filtrar apenas as requisições que falharam na autenticação
sudo grep " 401 " /var/log/nginx/yolo_access.log
Se a interface do Gradio apresentar problemas de carregamento após a configuração do proxy, verifique se os cabeçalhos Upgrade e Connection estão corretamente configurados para suportar WebSocket, como no exemplo de configuração fornecido.