Cloud Boxi

restic по HTTPS: почему я ушёл с SFTP на rest-server

С SFTP у домашнего сервера были права удалять собственные бэкапы. Значит, эти права были бы и у шифровальщика. Режим добавления в rest-server закрыл эту дыру.

Сначала копия уходила на VPS по SFTP. Это удобно: нужен только SSH. Но у такого подхода есть слабое место. Ключ лежит на домашнем сервере, и им можно не только записывать, но и удалять. Если кто-то получит доступ к коробке, он дотянется и до внешней копии.

Режим только добавления

rest-server это маленький HTTP-сервер для репозиториев restic. Главное в нём флаг --append-only: клиент может добавлять снимки, но не может удалять или перезаписывать уже сохранённые данные.

Заодно копия стала обычным HTTPS на стандартном порту. С SFTP на некоторых сетях передача обрывалась на длинных заливках, а HTTPS через домашний роутер и провайдера идёт ровно. Первая заливка на 1,3 ТБ прошла без единого перезапуска.

Настройка на VPS

sudo useradd -r -d /srv/restic -s /usr/sbin/nologin restic
sudo install -d -o restic -g restic -m 700 /srv/restic
sudo htpasswd -B -c /srv/restic/.htpasswd box
sudo chown restic: /srv/restic/.htpasswd

Пароль здесь защищает доступ к серверу. Сами данные зашифрованы паролем restic, который на VPS не попадает.

Запуск со всеми нужными флагами:

rest-server --path /srv/restic \
    --append-only --private-repos \
    --tls --tls-cert /etc/rest-server/fullchain.pem \
    --tls-key /etc/rest-server/key.pem

С --private-repos пользователь видит только репозитории внутри папки со своим именем. У меня это просто дополнительная страховка.

Настройка на клиенте

Адрес с паролем хранится в отдельном файле, чтобы он не попадал в список процессов:

sudo sh -c 'umask 077; echo "rest:https://box:ПАРОЛЬ@backup.example.org/box/main" > /etc/restic/remote-url'
restic --repository-file /etc/restic/remote-url snapshots

Кто теперь чистит старые снимки

При режиме добавления клиент не может выполнить forget, и репозиторий будет только расти. Чистить его должен сам VPS, напрямую с диска:

export RESTIC_PASSWORD_FILE=/root/restic-password
restic -r /srv/restic/box/main forget \
    --keep-daily 7 --keep-weekly 5 --keep-monthly 12 --prune

Да, для этого пароль restic всё же попадает на VPS. Если не хочется держать его там, чистку можно запускать вручную раз в несколько месяцев, подключаясь по SSH и вводя пароль. Я так и делаю. На всякий случай снимки за год занимают немного, а объём диска есть с запасом.

Как это проверить

Попробуйте удалить снимок с клиента. Команда должна завершиться ошибкой:

restic --repository-file /etc/restic/remote-url forget latest
# ошибка: сервер отвечает 403, удаление запрещено

Если снимок удалился, значит флаг не применился. Лучше узнать об этом сейчас, чем после взлома.