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.json → config.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