Simplifying GPG key backup and restoration with Bash scripts



As a seasoned programmer, I've often encountered the need for secure and efficient management of GPG keys. Today, I'd like to share two bash scripts I've developed for exporting and importing GPG keys. These scripts are designed to simplify the process of backing up and restoring your GPG keys, making it accessible even to those with limited programming experience.

Šiame įraše pristatomi du bash skriptai, skirti GPG raktų eksportavimui/atsarginių kopijų kūrimui ir importavimui. Skriptai supaprastina GPG raktų valdymą, leisdami lengvai kurti atsargines kopijas ir atkurti raktus. Eksporto skriptas išsaugo viešus raktus, privačius raktus ir pasitikėjimo duomenų bazę, o importo skriptas atkuria šiuos duomenis iš naujausių atsarginių kopijų. Skriptai yra paprasti naudoti, bet turi ir trūkumų, tokių kaip fiksuota atsarginių kopijų vieta ir ribotos vartotojo sąveikos galimybės. Pateikiami pasiūlymai, kaip skriptus būtų galima patobulinti, įskaitant konfigūruojamą atsarginių kopijų vietą, suspaudimo galimybę ir selektyvų atsarginių kopijų kūrimą/atkūrimą.

What are these scripts for?

These scripts serve two main purposes:

  1. Exporting and Backing Up GPG Keys: This script allows you to create a backup of your public keys, private keys, and trust database.
  2. Importing GPG Keys: This script helps you restore your GPG keys from the previously created backup.

How do they work?

Export Script

The export script performs the following actions:

  1. Checks if the backup directory exists, creating it if necessary.
  2. Exports public keys, private keys, and the owner trust database.
  3. Saves these exports with the current date in the filename.



#!/bin/bash

# File name: gpg_export
# Author vaidotak
# Date: 2024-07-15
# Description:
# URL:

# GPG raktų eksporto ir atsarginės kopijos skriptas

# Nustatome konfigūracijos failo kelią
CONFIG_FILE="$(dirname "$0")/config.sh"

# Tikriname, ar konfigūracijos failas egzistuoja
if [ ! -f "$CONFIG_FILE" ]; then
    echo "Klaida: Konfigūracijos failas nerastas: $CONFIG_FILE"
    exit 1
fi

# Įkeliame konfigūraciją
source "$CONFIG_FILE"

# Tikriname, ar BACKUP_DIR yra nustatytas
if [ -z "$BACKUP_DIR" ]; then
    echo "Klaida: BACKUP_DIR nenustatytas config.sh faile."
    exit 1
fi

# Tikriname, ar atsarginės kopijos katalogas egzistuoja
if [ ! -d "$BACKUP_DIR" ]; then
    echo "Klaida: Atsarginės kopijos katalogas neegzistuoja."
    echo "Bandome sukurti katalogą..."
    mkdir -p "$BACKUP_DIR"
    if [ $? -ne 0 ]; then
        echo "Nepavyko sukurti katalogo. Patikrinkite teises ir kelią."
        exit 1
    fi
    echo "Katalogas sėkmingai sukurtas."
fi

# Gauname šiandienos datą
TODAY=$(date +%Y-%m-%d)

# Eksportuojame viešus raktus
gpg --export --armor > "$BACKUP_DIR/public_keys_$TODAY.asc"
if [ $? -ne 0 ]; then
    echo "Klaida eksportuojant viešus raktus."
    exit 1
fi
echo "Viešieji raktai sėkmingai eksportuoti."

# Eksportuojame privačius raktus
gpg --export-secret-keys --armor > "$BACKUP_DIR/private_keys_$TODAY.asc"
if [ $? -ne 0 ]; then
    echo "Klaida eksportuojant privačius raktus."
    exit 1
fi
echo "Privatūs raktai sėkmingai eksportuoti."

# Eksportuojame pasitikėjimo duomenų bazę
gpg --export-ownertrust > "$BACKUP_DIR/ownertrust_$TODAY.txt"
if [ $? -ne 0 ]; then
    echo "Klaida eksportuojant pasitikėjimo duomenų bazę."
    exit 1
fi
echo "Pasitikėjimo duomenų bazė sėkmingai eksportuota."

echo "GPG raktų eksportas ir atsarginė kopija sėkmingai atlikti."
echo "Failai išsaugoti kataloge: $BACKUP_DIR"


Import Script

The import script does the following:

  1. Checks for the existence of the backup directory.
  2. Finds the most recent backup files for each key type.
  3. Imports the keys and trust database from these files.

#!/bin/bash

# GPG raktų importo iš atsarginės kopijos skriptas

# Nustatome konfigūracijos failo kelią
CONFIG_FILE="$(dirname "$0")/config.sh"

# Tikriname, ar konfigūracijos failas egzistuoja
if [ ! -f "$CONFIG_FILE" ]; then
    echo "Klaida: Konfigūracijos failas nerastas: $CONFIG_FILE"
    exit 1
fi

# Įkeliame konfigūraciją
source "$CONFIG_FILE"

# Tikriname, ar BACKUP_DIR yra nustatytas
if [ -z "$BACKUP_DIR" ]; then
    echo "Klaida: BACKUP_DIR nenustatytas config.sh faile."
    exit 1
fi

if [ ! -d "$BACKUP_DIR" ]; then
    echo "Klaida: Atsarginės kopijos katalogas neegzistuoja."
    exit 1
fi

import_latest() {
    local pattern="$1"
    local latest_file=$(ls -t "$BACKUP_DIR"/$pattern 2>/dev/null | head -n1)
    if [ -z "$latest_file" ]; then
        echo "Nerasta failų, atitinkančių šabloną $pattern"
        return 1
    fi
    echo "Importuojama iš failo: $latest_file"
    gpg --import "$latest_file"
    return $?
}

import_latest_trust() {
    local pattern="$1"
    local latest_file=$(ls -t "$BACKUP_DIR"/$pattern 2>/dev/null | head -n1)
    if [ -z "$latest_file" ]; then
        echo "Nerasta failų, atitinkančių šabloną $pattern"
        return 1
    fi
    echo "Importuojama iš failo: $latest_file"
    gpg --import-ownertrust "$latest_file"
    return $?
}

if import_latest "public_keys_*.asc"; then
    echo "Viešieji raktai sėkmingai importuoti."
else
    echo "Klaida importuojant viešus raktus."
fi

if import_latest "private_keys_*.asc"; then
    echo "Privatūs raktai sėkmingai importuoti."
else
    echo "Klaida importuojant privačius raktus."
fi

if import_latest_trust "ownertrust_*.txt"; then
    echo "Pasitikėjimo duomenų bazė sėkmingai importuota."
else
    echo "Klaida importuojant pasitikėjimo duomenų bazę."
fi

echo "GPG raktų importas iš atsarginės kopijos baigtas."

How to use the scripts

  1. Save the scripts with a .sh extension (e.g., gpg_export_backup.sh and gpg_import.sh).
  2. Make them executable: chmod +x gpg_export_backup.sh gpg_import.sh
  3. Run the export script: ./gpg_export_backup.sh
  4. When needed, run the import script: ./gpg_import.sh

Advantages

  1. Automation: Simplifies the backup and restore process.
  2. Date-stamped backups: Allows for multiple backups over time.
  3. Latest file selection: Always imports the most recent backup.
  4. Error handling: Provides feedback on success or failure of operations.

Limitations

  1. Fixed backup location: The backup directory is hardcoded.
  2. No compression: Backups are not compressed, which might be an issue for large key sets.
  3. Limited user interaction: Doesn't allow for selecting specific keys or files.

Potential Improvements

  1. Configurable backup location: Allow users to specify the backup directory.
  2. Compression option: Add the ability to compress backups.
  3. Selective backup/restore: Let users choose specific keys to backup or restore.
  4. Scheduled backups: Implement automatic scheduled backups.
  5. Encryption: Add an option to encrypt the backup files for additional security.

Conclusion

These scripts provide a solid foundation for managing GPG key backups. While they're straightforward to use, they also offer room for customization and improvement. Whether you're a seasoned developer or new to programming, these tools can help streamline your GPG key management process.

Remember, when dealing with GPG keys, especially private keys, always ensure you're following best security practices. Keep your backups in a secure location and use strong passwords for your keys.

Komentarai

Populiarūs šio tinklaraščio įrašai

Configuring a NixOS firewall for everyday use

Setting up syncthing as a service on openSUSE and other Linux distributions

Automatinis didelio kiekio failų siuntimo per Telegram skriptas