# backup-pull — usuario de solo lectura para el pull desde la Mac La VPS genera los backups cifrados en `/var/backups/cayce/YYYY-MM-DD/`. La Mac los descarga por rsync con una clave SSH **restringida**. La VPS nunca tiene credenciales para escribir ni borrar nada fuera de sí misma. ## Estado instalado en la VPS - Usuario de sistema `backup-pull` (uid 1001): **sin sudo**, password bloqueado, home `/home/backup-pull`, shell `/bin/sh` (necesario para que sshd ejecute el forced command; la restricción real la pone la clave, no el shell). - `/home/backup-pull/.ssh/authorized_keys` (600, backup-pull:backup-pull) — **vacío** hasta que el operador añada su clave pública. - `/var/backups/cayce` → `root:backup-pull`, `750`; artefactos `640`. ## Formato de la línea authorized_keys (una sola línea) restrict,command="/usr/bin/rrsync -ro /var/backups/cayce" ssh-ed25519 AAAA... comentario `restrict` = no-pty, no-port-forwarding, no-agent-forwarding, no-X11-forwarding (y sin sftp). `rrsync -ro` = solo rsync de LECTURA, confinado a `/var/backups/cayce`. Añadirla con: echo 'restrict,command="/usr/bin/rrsync -ro /var/backups/cayce" ssh-ed25519 AAAA... cayce-mac-pull' \ | sudo tee -a /home/backup-pull/.ssh/authorized_keys ## Pull desde la Mac rsync -av --partial backup-pull@15.235.3.239:/ ~/backups/cayce/ ## Verificación realizada (2026-10-28, con clave desechada después) | Prueba | Resultado | |---|---| | Shell interactivo | ✗ `rrsync error: Not invoked via sshd` | | Comando arbitrario (`cat /etc/shadow`) | ✗ `SSH_ORIGINAL_COMMAND does not run rsync` | | rsync de `/etc/` | ✗ `invalid rsync-command syntax or options` (fuera del root permitido) | | scp/sftp | ✗ (restrict) | | **rsync pull de `/var/backups/cayce/`** | ✓ funciona | | rsync write (upload) | ✗ protocolo cortado, nada escrito | La clave usada para las pruebas se **borró**; `authorized_keys` quedó vacío.