Note: TL;DR: With append-only repositories, one should specifically use the
--keep-within option of the
forget command when removing snapshots.
To prevent a compromised backup client from deleting its backups (for example
due to a ransomware infection), a repository service/backend can serve the
repository in a so-called append-only mode. This means that the repository is
served in such a way that it can only be written to and read from, while delete
and overwrite operations are denied. rustic’s
rest-server features an
append-only mode, but few other standard backends do. To support append-only
with such backends, one can use
rclone as a complement in between the backup
client and the backend service.
To remove snapshots and recover the corresponding disk space, the
prune commands require full read, write and delete access to the repository.
If an attacker has this, the protection offered by append-only mode is naturally
void. The usual and recommended setup with append-only repositories is therefore
to use a separate and well-secured client whenever full access to the repository
is needed, e.g. for administrative tasks such as running
other maintenance commands.
However, even with append-only mode active and a separate, well-secured client
used for administrative tasks, an attacker who is able to add garbage snapshots
to the repository could bring the snapshot list into a state where all the
legitimate snapshots risk being deleted by an unsuspecting administrator that
forget command with certain
--keep-* options, leaving only the
attacker’s useless snapshots.
For example, if the
forget policy is to keep three weekly snapshots, and the
attacker adds an empty snapshot for each of the last three weeks, all with a
timestamp (see the
--time option) slightly more recent than
the existing snapshots (but still within the target week), then the next time
the repository administrator (or a scheduled job) runs the
forget command with
this policy, the legitimate snapshots will be removed (since the policy will
keep only the most recent snapshot within each week). Even without running
prune, recovering data would be messy and some metadata lost.
To avoid this,
forget policies applied to append-only repositories should use
--keep-within option, as this will keep not only the attacker’s snapshots
but also the legitimate ones. Assuming the system time is correctly set when
forget runs, this will allow the administrator to notice problems with the
backup or the compromised host (e.g. by seeing more snapshots than usual or
snapshots with suspicious timestamps). This is, of course, limited to the
specified duration: if
forget --keep-within 7d is run 8 days after the last
good snapshot, then the attacker can still use that opportunity to remove all