Restoring from backup

In this section, we'll detail how to restore a bastion's main data from a backup.

This can be useful in two main cases:

  • When an account with high privileges has deleted or altered by mistake a great amount of accounts or groups, up to a point where it's operationally easier to just restore the settings, accounts, groups and keys from the latest available backup

  • When you are not in an HA setup and your only instance is down and can't be brought back up in a timely manner.

Note that if you are in a HA setup and you need to add a new node (regardless of the fact that you're replacing a failed node or not), you don't need to restore from backup: you can simply follow the HA setup procedure so that your new node is synced with your main node.

Prerequisites

First, you obviously must have a backup at hand, which should be the case if you followed the Configuring keys, accounts & groups remote backup section when you first installed the instance you want to restore.

If the backup is encrypted with GPG (it should be), you must have access to the corresponding GPG private key and its passphrase.

You must ensure that the new server you're setting up has the same OS release than the one the backup file comes from, as we'll overwrite the new server's accounts and groups files with the backed up versions. This could cause adverse effects if the distro or release differ, although the restore script won't stop you from doing so (it'll even help you adjust the discrepancies if needed, but again, this is strongly discouraged).

Steps

Installation

On the new server you want to deploy the backup to, you must first follow the standard Basic Installation procedure, up to and including the Check that the code works on your machine step.

Once done, you may proceed to the next steps below.

GPG key and backup archive import

On the server you've just installed, you'll need to import the private GPG key that was used to encrypt the backup, and you'll also need to fetch the backup archive itself. It's a good practice to NOT decrypt the backup archive prior to transferring it to the new server. This way, you're sure that the credentials and keys contained in the backup have not been compromised.

To import the GPG key, just run:

gpg --import

And paste the private GPG key corresponding to the backup so that it gets imported into root's keyring.

Alternatively, you can put the private GPG key in a temporary file, and import it this way:

gpg --import < /tmp/backupkey.asc

You may now import the backup archive, which usually has a name matching the backup-YYYY-MM-DD.tar.gz.gpg format. You can use scp, sftp or any other method to get this file onto the server, at any location you see fit. We'll use /root as location for the rest of this documentation, as this is guaranteed to only be readable by root, hence not compromising the keys and credentials.

Decrypt and extract accounts and groups

Now, you can decrypt the backup archive:

gpg -d /root/backup-YYYY-MM-DD.tar.gz.gpg > /root/backup-decrypted.tar.gz
gpg: encrypted with 4096-bit RSA key, ID F50BFFC49143C821, created 2021-03-27
   "Bastion Administrators <bastions.admins@example.org>"

You'll have to input the GPG private key passphrase when asked to.

Then, check whether the archive seems okay:

tar tvzf /root/backup-decrypted.tar.gz

You should see a long list of files, most under the /home hierarchy.

We now need to extract the backed up /etc/passwd and /etc/group files, to ensure the new instance we're setting up has its UIDs/GIDs synced with the system we're restoring:

tar xvzf /root/backup-decrypted.tar.gz -C /root --strip-components=1 etc/passwd etc/group
etc/group
etc/passwd

We now have the two original accounts and groups lists in /root, and we can proceed to check whether the UIDs and GIDs are in sync.

Ensuring the UIDs/GIDs are in sync

This procedure is the same than when setting up a slave instance bastion, please follow the corresponding step there and come back to this documentation when it's done.

Note

The referenced step above asks you to reboot at the end, please ensure you've done it before continuing with the rest of the procedure below.

Restoring

Now that we know the UIDs/GIDs are synced, we can proceed with the full restore:

tar -C / --preserve-permissions --preserve-order --overwrite --acls --numeric-owner -xzvf /root/backup-decrypted.tar.gz

Note

If you're getting errors such as 'Warning: Cannot acl_from_text: Invalid argument', please ensure that your filesystem supports ACLs and is mounted with ACL support, otherwise tar can't restore ACLs from the backup.

Back to production

As the configuration of the SSH daemon has also been restored, you might want to restart it so that it picks up the new configuration:

service ssh restart

Once this is done, all the accounts that were present in the backup should be working. After ensuring this is the case, you may put the server put back in production.