Täglich Shaarli

Alle Links eines Tag auf einer Seite.

December 3, 2023

Verschlüsseltes Backup auf Onlinespeicher von Bitrix24.de

Neulich gab es als Promo 50 Gigabyte kostenlosen Onlinespeicher bei Bitrix24.de. Eine sehr gute Gelegenheit die wichtigsten Daten aus dem Home-Server ins Internet zu kippen. Leider funktioniert das Mounten per Webdav wegen veralteter Cipher, die von Bitrix24 Verwendung finden und bei davfs2 schon entfernt wurden, nicht. Ein einfacher Upload mit curl geht aber auch so.

tar -czvf - -C path/to/important/files . | openssl aes-256-cbc -salt -k 'enc_passwd123!' -pbkdf2 | curl -T - -u [email protected]:bitrix_password https://b24-w0e67a.bitrix24.de/company/personal/user/1/disk/path/backup.tar.enc

Wir packen also alles aus dem lokalen Verzeichnis path/to/important/files zusammen, verschlüsseln es mir einem ordentlichen Passwort und laden die Datei bei Bitrix24.de hoch.

Die Backup-Datei kann man testweise wieder herunterladen und mit der folgenden Zeile entschlüsseln und z.B. nach /tmp/restore entpacken.

cat backup.tar.enc | openssl aes-256-cbc -d -salt -k 'enc_passwd123!' | tar -xzvf - -C /tmp/restore

Wenn man das ganze automatisieren will, will man vielleicht die alte, hochgeladene Datei vor dem nächsten Upload löschen.

 curl -X DELETE -u [email protected]:bitrix_password https://b24-w0e67a.bitrix24.de/company/personal/user/1/disk/path/backup.tar.enc

Die Datei wandert bei Bitrix24.de leider nur in den Papierkorb und nimmt auch weiterhin Platz ein, bis sie entweder automatisch nach 30 Tagen gelöscht oder der Papierkorb von Hand geleert wird.

Um das ganze zu automatisieren und außerdem einen Mechanismus zum Chunken zu haben, habe ich aus dem ganzen ein Python-Script zusammengebastelt, das regelmäßig per Cron ausgeführt wird. Wichtig war mir hierbei, daß keine Daten auf die SSD zwischengespeichert werden, um diese zu schonen und außerdem den RAM-Verbrauch nicht explodieren zu lassen. Es wird also alles per Pipe durchgereicht, so dass die Chunksize maßgeblich für den RAM-Verbrauch ist.

import os
import subprocess
import sys

def create_backup(directory):
    # Archiv erstellen und verschlüsseln
    tar_process = subprocess.Popen(["tar", "-zcf", "-", directory], stdout=subprocess.PIPE)
    encrypt_process = subprocess.Popen(["openssl", "aes-256-cbc", "-salt", "-k", "enc_passwd123!", "-pbkdf2"], stdin=tar_process.stdout, stdout=subprocess.PIPE)    

    # Chunk-Größe festlegen 100MB (in bytes)
    chunk_size = 100 * 1024 * 1024

    # Verzeichnisname des Backup-Verzeichnisses extrahieren
    backup_directory, backup_dirname = os.path.split(os.path.normpath(directory))    
    print( f"backup_dirname={backup_dirname}" )

    # Chunks erstellen und hochladen
    chunk_number = 1
    while True:
        chunk = encrypt_process.stdout.read(chunk_size)
        if not chunk:
            break

        # Chunk hochladen
        upload_chunk(chunk, chunk_number, backup_dirname)

        chunk_number += 1

    # Aufräumen
    encrypt_process.stdout.close()
    encrypt_process.wait()

def upload_chunk(chunk, chunk_number, backup_dirname):
    filename = f"backup_{backup_dirname}_{str(chunk_number).zfill(3)}"

    delete_command = f"curl -X DELETE -u [email protected]:passwd123! 'https://b24-w0e67a.bitrix24.de/company/personal/user/1/disk/path/{filename}'"
    subprocess.run(delete_command, shell=True)    

    upload_command = f"curl -i -X PUT -u [email protected]:passwd123! --data-binary @- 'https://b24-w0e67a.bitrix24.de/company/personal/user/1/disk/path/{filename}'"    
    subprocess.run(upload_command, input=chunk, shell=True)    

# Kommandozeilenparameter überprüfen
if len(sys.argv) < 2:
    print("Verzeichnis als Parameter angeben.")
    sys.exit(1)

# Verzeichnis aus Kommandozeilenparameter extrahieren
directory = sys.argv[1]

# Beispielaufruf des Skripts
create_backup(directory)

Aufgerufen werden kann das Script einfach mit python3 <scriptname> path/to/important/files.