ACTIVO · PRODUCCIÓN

Keeper Device Approver

Aprobación automática de solicitudes de dispositivos SSO en Keeper Enterprise. Sin intervención manual, con historial completo y notificaciones instantáneas.

🐍Python 3 + Flask
🔑Keeper Commander CLI
🗄️SQLite historial
🪟WinSW servicio Windows
🛡️DPAPI credenciales

¿Qué hace?

Keeper Enterprise con SSO requiere aprobación de cada nuevo dispositivo desde el que un usuario inicia sesión. Este servicio automatiza ese proceso completamente.

Aprobación automática

Detecta solicitudes de dispositivos pendientes cada 30 segundos y las aprueba sin intervención.

📬

Notificaciones email

Email HTML detallado con usuario, dispositivo, IP y ubicación al instante de cada aprobación.

🌐

Panel web

Historial del último mes con filtros por usuario y período. Disponible en el puerto 5050.

🛡️

Credenciales protegidas

La master password se cifra con Windows DPAPI, vinculada a la máquina. No está en texto plano en ningún fichero.

🔄

Auto-recuperación

WinSW reinicia el servicio automáticamente si falla. El poller reintenta si keeper shell termina.

📋

Trazabilidad completa

Cada aprobación queda registrada con usuario, dispositivo, IP, tipo y marca de tiempo.

Cómo funciona

Proceso persistente que monitoriza la salida de Keeper Commander en tiempo real.

☁️
Keeper Cloud
API REST
Solicitudes de dispositivos pendientes
⚙️
Commander
keeper shell
enterprise-down + device-approve
🐍
Poller
Python · Popen
Lee stdout línea a línea
🗄️
SQLite
keeper_approver.db
approvals · runs · pending
🌐
Flask · Puerto 5050

Panel web con historial, filtros y detalle raw de cada aprobación

📧
SMTP · Email instantáneo

Notificación HTML al aprobar. Incluye usuario, dispositivo, IP y ubicación

📋
Logs · WinSW

Rotación automática: máx 10 MB × 3 ficheros por stdout/stderr

Puesta en marcha

Ver DEPLOY.md para instrucciones completas. Resumen del proceso:

1

Clonar y descargar WinSW

Clonar el repositorio y colocar WinSW-x64.exe renombrado como keeper-commander-service.exe en el directorio del proyecto.

2

Configurar config.json

Copiar config.example.jsonconfig.json con el usuario de la cuenta de servicio.

copy config.example.json config.json # Editar: user, server
3

Primer login interactivo

Necesario para registrar el dispositivo y desactivar el 2FA periódico.

$env:KEEPER_CONFIG_FILE = "config.json" $env:KEEPER_PASSWORD = "la_password" keeper shell # → a (master password) → código TOTP # → this-device 2fa_expiration forever → quit
4

Cifrar credenciales con DPAPI

El password se cifra vinculado a la máquina. No se guarda en texto plano.

python -c "from credentials import save_password; save_password('la_password')"
5

Instalar y arrancar el servicio

.\install_service.ps1 .\keeper-commander-service.exe start

Protección de credenciales

Las credenciales se protegen en varias capas sin comprometer la operación autónoma.

🛡️

Windows DPAPI

La master password se cifra con la API de protección de datos de Windows. credentials.dat solo es descifrable en la misma máquina.

🔒

ACL restringido

config.json tiene permisos solo para Administradores y SYSTEM. El install script elimina la herencia y restringe el acceso.

🚫

Gitignored

config.json y credentials.dat están en .gitignore. Ningún secreto llega al repositorio.

👤

Cuenta de servicio

En producción: cuenta dedicada con permisos mínimos (solo device approval), sin SSO, sin acceso al vault.

Ficheros del proyecto

keeper_commander/
├── run_service.py          # Punto de entrada: Flask + poller
├── poller.py               # keeper shell persistente, parseo de aprobaciones
├── database.py             # SQLite: approvals, runs, pending_approvals
├── notifier.py             # Email HTML al aprobar dispositivos
├── webapp.py               # Flask: panel web con historial y filtros
├── credentials.py          # Cifrado/descifrado DPAPI
├── templates/
│   └── index.html          # UI del panel web (dark theme)
├── settings.json           # Config: SMTP, puerto, intervalo
├── config.example.json     # Plantilla de config.json
├── config.json             # ⚠ gitignored — user, server, commands
├── credentials.dat         # ⚠ gitignored — password cifrado DPAPI
├── requirements.txt        # keepercommander, flask
├── keeper-commander-service.xml  # Descriptor WinSW
├── install_service.ps1     # Instalador Windows
├── install_service.sh      # Instalador Linux (systemd)
├── deploy.ps1              # git pull + pip + restart
├── README.md
└── DEPLOY.md