markosbenitez fa72ced5a6 security: hardening contra 7 vectores de ataque identificados
Análisis ofensivo → defensas implementadas:

1. /health/history sin auth (CRÍTICO)
   - Requiere Bearer token (HEALTH_AUTH_TOKEN en .env)
   - chat_ids enmascarados como hash SHA256[:8] opaco ("usr_a3b4c5d6")
   - Accesos denegados loggeados con IP + User-Agent

2. /health revela inteligencia operacional (MEDIO)
   - Sin auth: solo {"status", "timestamp"} — sin conteo de tenants ni timing
   - Con auth: respuesta completa con métricas internas
   - Misma URL, auth desbloquea detalle

3. Variables sensibles en proceso env (CRÍTICO)
   - Después de cargar Settings(), se limpian FERNET_KEY, TELEGRAM_BOT_TOKEN,
     PJ_USUARIO_ENC, PJ_PASSWORD_ENC, WEBHOOK_SECRET, HEALTH_AUTH_TOKEN, INVITE_CODE
   - Protege contra /proc/<pid>/environ y herencia por subprocesos

4. Race condition TOCTOU en invite codes (MEDIO)
   - SELECT+UPDATE reemplazado por UPDATE WHERE usado=0
   - rowcount=0 → False; imposible que dos requests simultáneos consuman el mismo código

5. Timing oracle en invite codes (BAJO-MEDIO)
   - Delay mínimo de 800ms en _paso_codigo() independientemente del resultado
   - secrets.compare_digest() para comparación del código del .env

6. Information disclosure en respuestas a no-registrados (BAJO)
   - _rechazar_no_registrado: "Para usar este bot escribí /start." (sin revelar comandos)
   - handle_texto_libre: silencio total para usuarios sin registro (no confirmar que el bot existe)

7. Nginx rate limiting (DEPLOY.md)
   - limit_req_zone pedrito_webhook: 30r/s, burst=50
   - limit_req_zone pedrito_health: 10r/m, burst=5
   - Headers de seguridad: X-Content-Type-Options, X-Frame-Options

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-26 08:06:36 -03:00

Pedrito Hechakuaa

Monitor de notificaciones del Poder Judicial de Paraguay vía Telegram.

Te avisa cuando aparecen notificaciones nuevas en tu cuenta del sistema del PJ.

Setup en 5 pasos

1. Prerequisitos

  • Python 3.12+
  • Una cuenta en Telegram
  • Un bot de Telegram creado con @BotFather
  • Tu chat_id de Telegram (obtenerlo con @userinfobot)
  • Credenciales del sistema del PJ (apps.csj.gov.py)

2. Instalar

# Entrar a la carpeta del proyecto
cd pedrito-hechakuaa

# Instalar dependencias (recomendado: uv)
pip install uv
uv sync

3. Configurar

# Copiar el template
cp .env.example .env

# Generar una clave de cifrado (guardarla en un lugar seguro también)
uv run python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"
# Copiar el resultado en FERNET_KEY= dentro de .env

# Editar .env y completar:
# - FERNET_KEY (la que generaste arriba)
# - TELEGRAM_BOT_TOKEN (de @BotFather)
# - TELEGRAM_CHAT_ID (de @userinfobot)

4. Cifrar las credenciales del PJ

uv run python scripts/cifrar_credenciales.py

Te va a pedir la cédula y contraseña del PJ, las cifra con Fernet, y actualiza PJ_USUARIO_ENC y PJ_PASSWORD_ENC en tu .env. Nunca escribe las credenciales en plano.

5. Arrancar

uv run python main.py

El bot va a:

  1. Conectarse al PJ y revisar tus notificaciones actuales
  2. Mandarte un mensaje en Telegram con el estado inicial
  3. Revisar cada hora en horario hábil (lunes-viernes, 7-18h)
  4. Avisarte en Telegram cuando aparezca algo nuevo

Comandos de Telegram

Comando Función
/start Ver estado del bot
/notif Revisar notificaciones ahora (no esperar la próxima hora)
/estado Ver último chequeo y estadísticas
/ayuda Lista de comandos

Correr como servicio (opcional)

Si querés que corra en background en tu Mac o en un servidor:

Con screen (más simple):

screen -S pedrito
python main.py
# Ctrl+A, D para detach
# screen -r pedrito para volver

Con systemd en Linux:

# /etc/systemd/system/pedrito.service
[Unit]
Description=Pedrito Hechakuaa - monitor judicial
After=network.target

[Service]
Type=simple
WorkingDirectory=/ruta/al/pedrito-hechakuaa
ExecStart=/usr/bin/python3 main.py
Restart=on-failure
RestartSec=30

[Install]
WantedBy=multi-user.target
sudo systemctl enable pedrito
sudo systemctl start pedrito

Seguridad

  • Las credenciales del PJ se cifran con Fernet (AES-128-CBC con HMAC)
  • .env nunca se commitea (está en .gitignore)
  • El bot solo responde al TELEGRAM_CHAT_ID que configuraste
  • El bot es read-only: nunca acusa notificaciones ni tiene efectos procesales

Migración a v1

Cuando estés listo para la arquitectura completa (multi-tenant, LLM conversacional, web de onboarding), ver el directorio ../pedrito-hechakuaa/ con el diseño completo.

La v0 está pensada para migrar incrementalmente: cada módulo tiene el mismo contrato que su equivalente en v1.

Description
Asistente conversacional para acceso a expedientes del poder judicial
Readme 265 KiB
Languages
Python 95.9%
HTML 3.8%
Dockerfile 0.3%