From fc2dcd4fca6186e98567c29d8467b72a42fd7fd4 Mon Sep 17 00:00:00 2001 From: Cayce Date: Wed, 28 Oct 2026 21:01:44 +0000 Subject: [PATCH] =?UTF-8?q?backup:=20backup-pull=20user=20=E2=80=94=20read?= =?UTF-8?q?-only=20rsync-only=20SSH=20access=20(Tanda=20B,=20point=202)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit System user backup-pull created on the VPS (no sudo, locked password). authorized_keys restricted with restrict + forced command rrsync -ro /var/backups/cayce. Verified with a since-deleted throwaway key: no shell, no arbitrary commands, no sftp/scp, no reads outside /var/backups/cayce, no writes; the positive rsync pull works. authorized_keys is left EMPTY — the operator adds their real key with the exact line documented in deploy/backup/backup-pull-setup.md. --- deploy/backup/backup-pull-setup.md | 43 ++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 deploy/backup/backup-pull-setup.md diff --git a/deploy/backup/backup-pull-setup.md b/deploy/backup/backup-pull-setup.md new file mode 100644 index 0000000..f725136 --- /dev/null +++ b/deploy/backup/backup-pull-setup.md @@ -0,0 +1,43 @@ +# 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.