MariaDB
 sql >> Datenbank >  >> RDS >> MariaDB

So verschlüsseln Sie Ihre MySQL- und MariaDB-Backups

Wir kümmern uns normalerweise um Dinge, die uns wichtig sind, sei es ein teures Smartphone oder die Server des Unternehmens. Daten sind eines der wichtigsten Vermögenswerte der Organisation, und obwohl wir sie nicht sehen, müssen sie sorgfältig geschützt werden. Wir implementieren Data-at-Rest-Verschlüsselung, um Datenbankdateien oder ganze Volumes zu verschlüsseln, die unsere Daten enthalten. Wir implementieren die Verschlüsselung von Daten während der Übertragung mit SSL, um sicherzustellen, dass niemand Daten ausspionieren und sammeln kann, die über Netzwerke gesendet werden. Backups sind nicht anders. Unabhängig davon, ob es sich um eine vollständige oder inkrementelle Sicherung handelt, wird zumindest ein Teil Ihrer Daten gespeichert. Daher müssen auch Backups verschlüsselt werden. In diesem Blogbeitrag werden wir uns mit einigen Optionen befassen, die Sie möglicherweise haben, wenn es um die Verschlüsselung von Backups geht. Sehen wir uns zunächst an, wie Sie Ihre Backups verschlüsseln können und welche Anwendungsfälle diese Methoden bieten könnten.

Wie verschlüsseln Sie Ihr Backup?

Lokale Datei verschlüsseln

Zunächst einmal können Sie vorhandene Dateien einfach verschlüsseln. Stellen wir uns vor, Sie haben einen Backup-Prozess, der alle Ihre Backups auf einem Backup-Server speichert. Irgendwann haben Sie entschieden, dass es an der Zeit ist, einen Offsite-Backup-Speicher für die Notfallwiederherstellung zu implementieren. Sie können dafür S3 oder eine ähnliche Infrastruktur von anderen Cloud-Anbietern verwenden. Natürlich möchten Sie nirgendwo außerhalb Ihres vertrauenswürdigen Netzwerks unverschlüsselte Backups hochladen, daher ist es wichtig, dass Sie die Backup-Verschlüsselung auf die eine oder andere Weise implementieren. Eine sehr einfache Methode, die keine Änderungen an Ihren vorhandenen Sicherungsskripten erfordert, wäre die Erstellung eines Skripts, das eine Sicherungsdatei erstellt, verschlüsselt und in S3 hochlädt. Eine der Methoden, die Sie zum Verschlüsseln der Daten verwenden können, ist die Verwendung von openssl:

openssl enc -aes-256-cbc -salt -in backup_file.tar.gz -out backup_file.tar.gz.enc -k yoursecretpassword

Dadurch wird eine neue, verschlüsselte Datei „backup_file.tar.gz.enc“ im aktuellen Verzeichnis erstellt. Sie können es später jederzeit entschlüsseln, indem Sie Folgendes ausführen:

openssl aes-256-cbc -d -in backup_file.tar.gz.enc -out backup_file.tar.gz -k yoursecretpassword

Diese Methode ist sehr einfach, hat aber einige Nachteile. Der größte ist der Speicherplatzbedarf. Wenn Sie wie oben beschrieben verschlüsseln, müssen Sie sowohl die unverschlüsselte als auch die verschlüsselte Datei aufbewahren und benötigen im Ergebnis einen Festplattenspeicher, der doppelt so groß ist wie die Sicherungsdatei. Abhängig von Ihren Anforderungen kann dies natürlich etwas sein, das Sie möchten - das lokale Speichern von nicht verschlüsselten Dateien verbessert die Wiederherstellungsgeschwindigkeit - schließlich wird das Entschlüsseln der Daten auch einige Zeit in Anspruch nehmen.

Backup on the fly verschlüsseln

Um zu vermeiden, dass sowohl verschlüsselte als auch unverschlüsselte Daten gespeichert werden müssen, sollten Sie die Verschlüsselung in einer früheren Phase des Sicherungsprozesses implementieren. Wir können das durch Rohre tun. Pipes sind kurz gesagt eine Möglichkeit, die Daten von einem Befehl zum anderen zu senden. Dadurch ist es möglich, eine Kette von Befehlen zu erstellen, die Daten verarbeitet. Sie können die Daten generieren, dann komprimieren und verschlüsseln. Ein Beispiel für eine solche Kette könnte sein:

mysqldump --all-databases --single-transaction --triggers --routines | gzip | openssl  enc -aes-256-cbc -k mypass > backup.xb.enc

Sie können diese Methode auch mit xtrabackup oder mariabackup verwenden. Tatsächlich ist dies das Beispiel aus der MariaDB-Dokumentation:

mariabackup --user=root --backup --stream=xbstream  | openssl  enc -aes-256-cbc -k mypass > backup.xb.enc

Wenn Sie möchten, können Sie sogar versuchen, Daten als Teil des Prozesses hochzuladen:

mysqldump --all-databases --single-transaction --triggers --routines | gzip | openssl  enc -aes-256-cbc -k mysecretpassword | tee -a mysqldump.gz.enc | nc 10.0.0.102 9991

Als Ergebnis sehen Sie eine lokale Datei „mysqldump.gz.enc“ und eine Kopie der Daten wird an ein Programm weitergeleitet, das etwas dagegen unternimmt. Wir haben „nc“ verwendet, das Daten zu einem anderen Host gestreamt hat, auf dem Folgendes ausgeführt wurde:

nc -l 9991 > backup.gz.enc

In diesem Beispiel haben wir mysqldump und nc verwendet, aber Sie können xtrabackup oder mariabackup und ein Tool verwenden, das den Stream auf Amazon S3, Google Cloud Storage oder einen anderen Cloud-Anbieter hochlädt. Jedes Programm oder Skript, das Daten auf stdin akzeptiert, kann anstelle von „nc“ verwendet werden.

Eingebettete Verschlüsselung verwenden

In einigen Fällen bietet ein Backup-Tool eingebettete Unterstützung für die Verschlüsselung. Ein Beispiel hier ist xtrabackup, das die Datei intern verschlüsseln kann. Leider unterstützt mariabackup diese Funktion nicht, obwohl es ein Fork von xtrabackup ist.

Bevor wir es verwenden können, müssen wir einen Schlüssel erstellen, der zum Verschlüsseln der Daten verwendet wird. Dies kann durch Ausführen des folgenden Befehls erfolgen:

[email protected]:~# openssl rand -base64 24
HnliYiaRo7NUvc1dbtBMvt4rt1Fhunjb

Xtrabackup kann den Schlüssel im Nur-Text-Format akzeptieren (mit der Option --encrypt-key) oder ihn aus einer Datei lesen (mit der Option --encrypt-key-file). Letzteres ist sicherer, da die Übergabe von Passwörtern und Schlüsseln als Klartext an Befehle dazu führt, dass sie im Bash-Verlauf gespeichert werden. Sie können es auch deutlich an der Liste der laufenden Prozesse sehen, was ziemlich schlecht ist:

root      1130  0.0  0.6  65508  4988 ?        Ss   00:46   0:00 /usr/sbin/sshd -D
root     13826  0.0  0.8  93100  6648 ?        Ss   01:26   0:00  \_ sshd: [email protected]
root     25363  0.0  0.8  92796  6700 ?        Ss   08:54   0:00  \_ sshd: vagrant [priv]
vagrant  25393  0.0  0.6  93072  4936 ?        S    08:54   0:01  |   \_ sshd: [email protected]/1
vagrant  25394  0.0  0.4  21196  3488 pts/1    Ss   08:54   0:00  |       \_ -bash
root     25402  0.0  0.4  52700  3568 pts/1    S    08:54   0:00  |           \_ sudo su -
root     25403  0.0  0.4  52284  3264 pts/1    S    08:54   0:00  |               \_ su -
root     25404  0.0  0.4  21196  3536 pts/1    S    08:54   0:00  |                   \_ -su
root     26686  6.0  4.0 570008 30980 pts/1    Sl+  09:48   0:00  |                       \_ innobackupex --encrypt=AES256 --encrypt-key=TzIZ7g+WzLt0PXWf8WDPf/sjIt7UzCKw /backup/

Idealerweise verwenden Sie den in einer Datei gespeicherten Schlüssel, aber dann gibt es einen kleinen Haken, den Sie beachten müssen.

[email protected]:~# openssl rand -base64 24 > encrypt.key
[email protected]:~# innobackupex --encrypt=AES256 --encrypt-key-file=/root/encrypt.key /backup/
.
.
.
xtrabackup: using O_DIRECT
InnoDB: Number of pools: 1
encryption: unable to set libgcrypt cipher key - User defined source 1 : Invalid key length
encrypt: failed to create worker threads.
Error: failed to initialize datasink.

Sie fragen sich vielleicht, was das Problem ist. Es wird klar, wann wir die Datei encrypt.key in einem Hexadezimal-Editor wie hexedit öffnen:

00000000   6D 6B 2B 4B  66 69 55 4E  5A 49 48 77  39 42 36 72  68 70 39 79  6A 56 44 72  47 61 79 45  6F 75 6D 70  0A                                     mk+KfiUNZIHw9B6rhp9yjVDrGayEoump.

Sie können jetzt das letzte Zeichen sehen, das mit „0A“ codiert wurde. Dies ist im Grunde das Zeilenvorschubzeichen, wird jedoch bei der Auswertung des Verschlüsselungsschlüssels berücksichtigt. Sobald wir es entfernt haben, können wir endlich die Sicherung ausführen.

[email protected]:~# innobackupex --encrypt=AES256 --encrypt-key-file=/root/encrypt.key /backup/
xtrabackup: recognized server arguments: --datadir=/var/lib/mysql --innodb_buffer_pool_size=185M --innodb_flush_log_at_trx_commit=2 --innodb_file_per_table=1 --innodb_data_file_path=ibdata1:100M:autoextend --innodb_read_io_threads=4 --innodb_write_io_threads=4 --innodb_doublewrite=1 --innodb_log_file_size=64M --innodb_log_buffer_size=16M --innodb_log_files_in_group=2 --innodb_flush_method=O_DIRECT --server-id=1
xtrabackup: recognized client arguments: --datadir=/var/lib/mysql --innodb_buffer_pool_size=185M --innodb_flush_log_at_trx_commit=2 --innodb_file_per_table=1 --innodb_data_file_path=ibdata1:100M:autoextend --innodb_read_io_threads=4 --innodb_write_io_threads=4 --innodb_doublewrite=1 --innodb_log_file_size=64M --innodb_log_buffer_size=16M --innodb_log_files_in_group=2 --innodb_flush_method=O_DIRECT --server-id=1 --databases-exclude=lost+found --ssl-mode=DISABLED
encryption: using gcrypt 1.6.5
181116 10:11:25 innobackupex: Starting the backup operation

IMPORTANT: Please check that the backup run completes successfully.
           At the end of a successful backup run innobackupex
           prints "completed OK!".

181116 10:11:25  version_check Connecting to MySQL server with DSN 'dbi:mysql:;mysql_read_default_group=xtrabackup;mysql_socket=/var/lib/mysql/mysql.sock' as 'backupuser'  (using password: YES).
181116 10:11:25  version_check Connected to MySQL server
181116 10:11:25  version_check Executing a version check against the server...
181116 10:11:25  version_check Done.
181116 10:11:25 Connecting to MySQL server host: localhost, user: backupuser, password: set, port: not set, socket: /var/lib/mysql/mysql.sock
Using server version 5.7.23-23-57
innobackupex version 2.4.12 based on MySQL server 5.7.19 Linux (x86_64) (revision id: 170eb8c)
xtrabackup: uses posix_fadvise().
xtrabackup: cd to /var/lib/mysql
xtrabackup: open files limit requested 0, set to 1024
xtrabackup: using the following InnoDB configuration:
xtrabackup:   innodb_data_home_dir = .
xtrabackup:   innodb_data_file_path = ibdata1:100M:autoextend
xtrabackup:   innodb_log_group_home_dir = ./
xtrabackup:   innodb_log_files_in_group = 2
xtrabackup:   innodb_log_file_size = 67108864
xtrabackup: using O_DIRECT
InnoDB: Number of pools: 1
181116 10:11:25 >> log scanned up to (2597648)
xtrabackup: Generating a list of tablespaces
InnoDB: Allocated tablespace ID 19 for mysql/server_cost, old maximum was 0
181116 10:11:25 [01] Encrypting ./ibdata1 to /backup/2018-11-16_10-11-25/ibdata1.xbcrypt
181116 10:11:26 >> log scanned up to (2597648)
181116 10:11:27 >> log scanned up to (2597648)
181116 10:11:28 [01]        ...done
181116 10:11:28 [01] Encrypting ./mysql/server_cost.ibd to /backup/2018-11-16_10-11-25/mysql/server_cost.ibd.xbcrypt
181116 10:11:28 [01]        ...done
181116 10:11:28 [01] Encrypting ./mysql/help_category.ibd to /backup/2018-11-16_10-11-25/mysql/help_category.ibd.xbcrypt
181116 10:11:28 [01]        ...done
181116 10:11:28 [01] Encrypting ./mysql/slave_master_info.ibd to /backup/2018-11-16_10-11-25/mysql/slave_master_info.ibd.xbcrypt
181116 10:11:28 [01]        ...done

Als Ergebnis erhalten wir ein Backup-Verzeichnis voller verschlüsselter Dateien:

[email protected]:~# ls -alh /backup/2018-11-16_10-11-25/
total 101M
drwxr-x---  5 root root 4.0K Nov 16 10:11 .
drwxr-xr-x 16 root root 4.0K Nov 16 10:11 ..
-rw-r-----  1 root root  580 Nov 16 10:11 backup-my.cnf.xbcrypt
-rw-r-----  1 root root  515 Nov 16 10:11 ib_buffer_pool.xbcrypt
-rw-r-----  1 root root 101M Nov 16 10:11 ibdata1.xbcrypt
drwxr-x---  2 root root 4.0K Nov 16 10:11 mysql
drwxr-x---  2 root root  12K Nov 16 10:11 performance_schema
drwxr-x---  2 root root  12K Nov 16 10:11 sys
-rw-r-----  1 root root  113 Nov 16 10:11 xtrabackup_checkpoints
-rw-r-----  1 root root  525 Nov 16 10:11 xtrabackup_info.xbcrypt
-rw-r-----  1 root root 2.7K Nov 16 10:11 xtrabackup_logfile.xbcrypt

Xtrabackup hat einige andere Variablen, die verwendet werden können, um die Verschlüsselungsleistung zu optimieren:

  • --encrypt-threads ermöglicht die Parallelisierung des Verschlüsselungsprozesses
  • --encrypt-chunk-size definiert einen Arbeitspuffer für den Verschlüsselungsprozess.

Sollten Sie die Dateien entschlüsseln müssen, können Sie dafür innobackupex mit der Option --decrypt verwenden:

[email protected]:~# innobackupex --decrypt=AES256 --encrypt-key-file=/root/encrypt.key /backup/2018-11-16_10-11-25/

Da xtrabackup verschlüsselte Dateien nicht säubert, möchten Sie sie vielleicht mit dem folgenden Einzeiler entfernen:

for i in `find /backup/2018-11-16_10-11-25/ -iname "*\.xbcrypt"`; do rm $i ; done

Backup-Verschlüsselung in ClusterControl

Mit ClusterControl sind verschlüsselte Backups nur einen Klick entfernt. Alle Backup-Methoden (mysqldump, xtrabackup oder mariabackup) unterstützen die Verschlüsselung. Sie können ein Backup ad hoc erstellen oder einen Zeitplan für Ihre Backups erstellen.

In unserem Beispiel haben wir ein vollständiges xtrabackup ausgewählt, wir werden es auf der Controller-Instanz speichern.

Auf der nächsten Seite haben wir die Verschlüsselung aktiviert. Wie bereits erwähnt, erstellt ClusterControl automatisch einen Verschlüsselungsschlüssel für uns. Das ist es, wenn Sie auf die Schaltfläche „Backup erstellen“ klicken, wird ein Prozess gestartet.

Das neue Backup ist in der Backup-Liste sichtbar. Es ist als verschlüsselt gekennzeichnet (das Schlosssymbol).

Wir hoffen, dass Ihnen dieser Blogbeitrag einige Einblicke gibt, wie Sie sicherstellen können, dass Ihre Sicherungen ordnungsgemäß verschlüsselt sind.