Proteção do Serviço Web YOLO X Layout: Nginx como Proxy Reverso com Autenticação Básica na Porta 7860

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.

Tags: nginx Basic Authentication Reverse Proxy Security Hardening YOLO X Layout

Publicado em 7-1 19:39