Sincronización de Claves SSH
NoxPanel sincroniza automáticamente las claves SSH del usuario hacia los shell users de hosting, permitiendo acceso SSH sin contraseña tanto a VMs como a hosting compartido desde una única sección del panel.
Visión General
Cuando un usuario añade o elimina una clave SSH en la sección Claves SSH del panel,
NoxPanel despliega automáticamente esa clave en todos los shell users de hosting
asociados al usuario, escribiendo el fichero authorized_keys en el contenedor
hosting-core via SSH.
Note
Las claves SSH sirven tanto para VPS (Proxmox) como para hosting compartido. El panel muestra un banner informativo indicando esta doble funcionalidad.
Arquitectura
Módulo Principal
Ubicación: hosting/ssh_key_sync.py
Funciones principales:
build_authorized_keys_content(user) → strRecopila todas las claves SSH activas del usuario (modelo
SSHKeyenaccounts/models.py) y genera el contenido del ficheroauthorized_keys.get_shell_users_for_user(user) → QuerySetEncuentra todos los shell users activos del usuario siguiendo la cadena:
User → TenantUser → Tenant → HostingShellUser.sync_ssh_keys_for_shell_user(shell_user, content) → boolEscribe el fichero
authorized_keysen hosting-core via_ssh_exec():Obtiene UID/GID del usuario Linux con
id -u/id -gCrea el directorio
.sshconmkdir -pEscribe el contenido con
printfAplica permisos:
chmod 700 .ssh,chmod 600 authorized_keysAplica ownership:
chown uid:gid
sync_ssh_keys_for_user(user) → dictFunción principal: sincroniza todas las claves de un usuario a todos sus shell users. Devuelve
{'synced': N, 'errors': [...]}.
Triggers de Sincronización
La sincronización se dispara automáticamente en estos puntos:
Evento |
Fichero |
Detalle |
|---|---|---|
Añadir clave SSH (web) |
|
Después de |
Eliminar clave SSH (web) |
|
Después de |
Añadir clave SSH (API) |
|
|
Eliminar clave SSH (API) |
|
|
Crear shell user (API) |
|
|
Configuración SSH en hosting-core
El Match Group shellusers en /etc/ssh/sshd_config debe incluir:
Match Group shellusers
AuthorizedKeysFile /var/www/chroot/%u/home/%u/.ssh/authorized_keys
ChrootDirectory /var/www/chroot/%u
AllowTcpForwarding no
X11Forwarding no
PermitTunnel no
AllowAgentForwarding no
Esta configuración se genera automáticamente en hosting-core/entrypoint.sh
durante el arranque del contenedor (función configure_shell_sandbox).
Conexión SSH
Los usuarios se conectan via:
ssh {username}@{dominio} -p 2222
El puerto 2222 del host se mapea al puerto 22 del contenedor hosting-core.
Diagrama de Flujo
┌──────────────────┐
│ Usuario añade │
│ clave SSH │
│ (panel/API) │
└────────┬─────────┘
│
▼
┌──────────────────┐
│ SSHKey.create() │
│ (accounts) │
└────────┬─────────┘
│
▼
┌──────────────────┐
│ sync_ssh_keys_ │
│ for_user() │
└────────┬─────────┘
│
▼
┌──────────────────┐ SSH (paramiko) ┌──────────────────┐
│ build_authorized │ ──────────────────────> │ hosting-core │
│ _keys_content() │ │ authorized_keys │
└──────────────────┘ └──────────────────┘
Troubleshooting
El SSH sigue pidiendo contraseña:
Verificar que la clave está en el path correcto:
docker exec noxpanel-hosting-core-1 cat /var/www/chroot/{user}/home/{user}/.ssh/authorized_keys
Verificar permisos (deben ser 700 el dir, 600 el archivo):
docker exec noxpanel-hosting-core-1 ls -la /var/www/chroot/{user}/home/{user}/.ssh/
Verificar
AuthorizedKeysFileen sshd_config:docker exec noxpanel-hosting-core-1 grep AuthorizedKeysFile /etc/ssh/sshd_config
Verificar que el usuario pertenece al grupo
shellusers:docker exec noxpanel-hosting-core-1 groups {username}
La sincronización falla silenciosamente:
La sincronización usa try/except con pass para no bloquear la operación
principal. Revisar logs de Django:
docker logs noxpanel-web-1 2>&1 | grep ssh_key_sync