sql >> データベース >  >> RDS >> MariaDB

MySQLとMariaDBのバックアップを暗号化する方法

    高価なスマートフォンであろうと会社のサーバーであろうと、私たちは通常、大切なものを世話します。データは組織の最も重要な資産の1つであり、私たちにはわかりませんが、慎重に保護する必要があります。保存データの暗号化を実装して、データを含むデータベースファイルまたはボリューム全体を暗号化します。 SSLを使用して転送中のデータ暗号化を実装し、ネットワークを介して送信されるデータをだれも盗聴して収集できないようにします。バックアップも例外ではありません。これが完全バックアップであるか増分バックアップであるかに関係なく、データの少なくとも一部が保存されます。そのため、バックアップも暗号化する必要があります。このブログ投稿では、バックアップの暗号化に関していくつかのオプションを検討します。ただし、最初に、バックアップを暗号化する方法と、それらの方法の使用例を見てみましょう。

    バックアップを暗号化する方法

    ローカルファイルを暗号化する

    まず、既存のファイルを簡単に暗号化できます。すべてのバックアップをバックアップサーバーに保存するバックアッププロセスがあると想像してみてください。ある時点で、ディザスタリカバリのためにオフサイトのバックアップストレージを実装する時期が来たと判断しました。そのために、他のクラウドプロバイダーのS3または同様のインフラストラクチャを使用できます。もちろん、暗号化されていないバックアップを信頼できるネットワークの外部にアップロードすることは望ましくないため、バックアップの暗号化を何らかの方法で実装することが重要です。既存のバックアップスクリプトに変更を加える必要がない非常に簡単な方法は、バックアップファイルを取得し、暗号化してS3にアップロードするスクリプトを作成することです。データの暗号化に使用できる方法の1つは、opensslを使用することです:

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

    これにより、現在のディレクトリに新しい暗号化ファイル「backup_file.tar.gz.enc」が作成されます。次を実行することで、後でいつでも復号化できます:

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

    この方法は非常に簡単ですが、いくつかの欠点があります。最大のものは、ディスク容量の要件です。上記のように暗号化する場合、暗号化されていないファイルと暗号化されたファイルの両方を保持する必要があり、その結果、バックアップファイルの2倍のサイズのディスクスペースが必要になります。もちろん、要件によっては、これが必要な場合もあります。暗号化されていないファイルをローカルに保持すると、リカバリ速度が向上します。結局、データの復号化にも時間がかかります。

    バックアップをオンザフライで暗号化

    暗号化されたデータと暗号化されていないデータの両方を保存する必要がないように、バックアッププロセスの初期段階で暗号化を実装することをお勧めします。私たちはパイプを通してそれを行うことができます。パイプは、要するに、あるコマンドから別のコマンドにデータを送信する方法です。これにより、データを処理する一連のコマンドを作成できます。データを生成し、それを圧縮して暗号化することができます。このようなチェーンの例は次のとおりです。

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

    この方法は、xtrabackupまたはmariabackupでも使用できます。実際、これはMariaDBドキュメントの例です:

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

    必要に応じて、プロセスの一部としてデータをアップロードすることもできます。

    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

    その結果、ローカルファイル「mysqldump.gz.enc」が表示され、データのコピーがプログラムにパイプされ、プログラムがそれに対して何かを実行します。 「nc」を使用しました。これは、以下が実行された別のホストにデータをストリーミングしました。

    nc -l 9991 > backup.gz.enc

    この例では、mysqldumpとncを使用しましたが、xtrabackupまたはmariabackupと、Amazon S3、Google Cloud Storage、またはその他のクラウドプロバイダーにストリームをアップロードするツールを使用できます。 「nc」の代わりに、stdin上のデータを受け入れる任意のプログラムまたはスクリプトを使用できます。

    埋め込み暗号化を使用する

    場合によっては、バックアップツールに暗号化のサポートが組み込まれています。ここでの例は、ファイルを内部で暗号化できるxtrabackupです。残念ながら、mariabackupは、xtrabackupのフォークですが、この機能をサポートしていません。

    使用する前に、データの暗号化に使用するキーを作成する必要があります。次のコマンドを実行することで実行できます:

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

    Xtrabackupは、プレーンテキスト形式のキーを受け入れるか(--encrypt-keyオプションを使用)、ファイルからキーを読み取ることができます(--encrypt-key-fileオプションを使用)。後者の方が安全です。パスワードとキーをプレーンテキストとしてコマンドに渡すと、それらがbash履歴に保存されるからです。実行中のプロセスのリストでもはっきりと確認できますが、これは非常に悪いことです:

    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/

    理想的には、ファイルに保存されているキーを使用しますが、注意しなければならない小さな落とし穴があります。

    [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.

    あなたは問題が何であるか疑問に思うかもしれません。 hexeditのような16進エディタでencrypt.keyファイルを開くと明らかになります:

    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.

    これで、「0A」を使用してエンコードされた最後の文字に気付くことができます。これは基本的に改行文字ですが、暗号化キーを評価する際に考慮されます。削除すると、最終的にバックアップを実行できます。

    [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

    その結果、暗号化されたファイルでいっぱいのバックアップディレクトリができあがります:

    [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には、暗号化パフォーマンスを調整するために使用できる他の変数がいくつかあります。

    • -encrypt-threadsにより、暗号化プロセスの並列化が可能になります
    • -encrypt-chunk-sizeは、暗号化プロセス用の作業バッファーを定義します。

    ファイルを復号化する必要がある場合は、-decryptオプションを指定してinnobackupexを使用できます。

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

    xtrabackupは暗号化されたファイルをクリーンアップしないため、次のワンライナーを使用してそれらを削除することをお勧めします。

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

    ClusterControlでのバックアップ暗号化

    ClusterControlを使用すると、暗号化されたバックアップをワンクリックで実行できます。すべてのバックアップ方法(mysqldump、xtrabackup、またはmariabackup)は暗号化をサポートしています。アドホックにバックアップを作成することも、バックアップのスケジュールを準備することもできます。

    この例では、完全なエクストラバックアップを選択し、それをコントローラーインスタンスに保存します。

    次のページで、暗号化を有効にしました。前述のように、ClusterControlは自動的に暗号化キーを作成します。これで、[バックアップの作成]ボタンをクリックするとプロセスが開始されます。

    新しいバックアップがバックアップリストに表示されます。暗号化されているとマークされています(鍵のアイコン)。

    このブログ投稿で、バックアップが適切に暗号化されていることを確認する方法についての洞察が得られることを願っています。


    1. MoodleMySQLデータベースの自動フェイルオーバーを設定する方法

    2. MySQLはORDERBYで行の位置を取得します

    3. MySQLにUTF-8を適切に処理させる方法

    4. PostgreSQLの日付から日数を引く