暗号化は、データを可能な限り安全に保つための最も重要なセキュリティ機能の1つです。処理するデータによっては、必ずしも必須ではありませんが、少なくとも組織のセキュリティの向上と見なす必要があります。実際には、データの盗難や不正アクセスを回避することをお勧めします。
このブログでは、2つの基本的なタイプの暗号化と、MariaDBサーバーでの暗号化の構成方法について説明します。
データ暗号化には、保存時と転送中の2つの基本的なタイプがあります。それらの意味を見てみましょう。
システムに保存されているデータは、保存データと呼ばれます。このデータの暗号化は、アルゴリズムを使用してテキストまたはコードを読み取り不能に変換することで構成されます。暗号化されたデータをデコードするには、暗号化キーが必要です。
データベース全体の暗号化は、パフォーマンスに深刻な影響を与える可能性があるため、注意して行う必要があります。したがって、個々のフィールドまたはテーブルのみを暗号化することをお勧めします。
保存データを暗号化することで、ハードドライブの物理的な盗難や不正なファイルストレージアクセスからデータを保護します。この暗号化は、特にファイルシステムに財務データまたは健康データが保存されている場合は、データセキュリティ規制にも準拠しています。
トランザクション間で転送または移動されるデータは、データ転送中と呼ばれます。 Webページの閲覧中にサーバーとクライアント間を移動するデータは、この種のデータの良い例です。
常に移動しているため、データが宛先に到達する前にデータの盗難や改ざんを防ぐために、適切な暗号化で保護する必要があります。
転送中のデータを保護する理想的な状況は、データを移動する前に暗号化し、最終的な宛先に到達したときにのみ復号化することです。
MariaDB保存データの暗号化
テーブルとテーブルスペースの暗号化は10.1バージョンからMariaDBに追加され、XtraDB、InnoDB、Ariaストレージエンジン、およびバイナリログの暗号化をサポートしています。
ドキュメントによると、暗号化を使用すると約3〜5%のオーバーヘッドが発生するため、本番環境での問題を回避するために、暗号化にストレスを与えてどのように応答するかを確認するためのテスト環境を用意することが重要です。
MariaDBデータベースの既存の「city」テーブルを確認しましょう:
$ strings city.ibd |head
infimum
supremum
infimum
supremum
3ABW
3KHM
infimum
supremum
Kabul AFGKabol
Qandahar AFGQandahar
ご覧のとおり、たとえば、strings Linuxコマンドを使用すると、問題なくそこからデータを読み取ることができます。それでは、暗号化する方法を見てみましょう。
openssl randコマンドを使用して暗号化キーを生成します:
$ mkdir -p /etc/mysql/encryption
$ for i in {1..4}; do openssl rand -hex 32 >> /etc/mysql/encryption/keyfile; done;
<encryption_key_id1>;<hex-encoded_encryption_key1>
<encryption_key_id2>;<hex-encoded_encryption_key2>
次のようにsedlinuxコマンドを使用して編集できます:
$ for i in {1..4}; do sed -i -e "$i s/^/$i;/" keyfile; done
したがって、ファイルは次のようになります。
$ cat /etc/mysql/encryption/keyfile
1;f237fe72e16206c0b0f6f43c3b3f4accc242564d77f5fe17bb621de388c193af
2;0c0819a10fb366a5ea657a71759ee6a950ae8f25a5ba7400a91f59b63683edc5
3;ac9ea3a839596dbf52492d9ab6b180bf11a35f44995b2ed752c370d920a10169
4;72afc936e16a8df05cf994c7902e588de0d11ca7301f9715d00930aa7d5ff8ab
ここで、前に見たのと同様のopensslコマンドを使用してランダムパスワードを生成します。
$ openssl rand -hex 128 > /etc/mysql/encryption/keyfile.key
次の手順に進む前に、キーファイルの暗号化に関する次の詳細を知っておくことが重要です。
- MariaDBが現在キーファイルを暗号化するためにサポートしている唯一のアルゴリズムは、Advanced Encryption Standard(AES)のCipher Block Chaining(CBC)モードです。
- 暗号化キーのサイズは、128ビット、192ビット、または256ビットにすることができます。
- 暗号化キーは、暗号化パスワードのSHA-1ハッシュから作成されます。
ここで、openssl encコマンドを使用してキーファイルを暗号化するには、次のコマンドを実行します。
$ openssl enc -aes-256-cbc -md sha1 -pass file:/etc/mysql/encryption/keyfile.key -in /etc/mysql/encryption/keyfile -out /etc/mysql/encryption/keyfile.enc
最後に、my.cnf構成ファイル(RedHatベースのOSでは/etc/またはDebianベースのOSでは/etc/ mysql /にあります)に次のパラメーターを追加する必要があります。
[mysqld]
…
#################### DATABASE ENCRYPTION ####################
plugin_load_add = file_key_management
file_key_management_filename = /etc/mysql/encryption/keyfile.enc
file_key_management_filekey = FILE:/etc/mysql/encryption/keyfile.key
file_key_management_encryption_algorithm = aes_cbc
encrypt_binlog = 1
innodb_encrypt_tables = ON
innodb_encrypt_log = ON
innodb_encryption_threads = 4
innodb_encryption_rotate_key_age = 0
…
そして、MariaDBサービスを再起動して変更を加えます:
$ systemctl restart mariadb
この時点で、すべてが暗号化機能を使用する準備ができています。前に示したのと同じテーブル「city」を暗号化してみましょう。このためには、ALTER TABLEステートメントを使用してENCRYPTEDパラメーターをYESに設定する必要があります:
MariaDB [world]> ALTER TABLE city ENCRYPTED=YES;
Query OK, 0 rows affected (0.483 sec)
Records: 0 Duplicates: 0 Warnings: 0
これで、ファイルシステムから直接テーブルにアクセスしようとすると、次のように表示されます。
$ strings city.ibd |head
PU%O
!ybN)b
9,{9WB4
T3uG:
?oiN
,35sz
8g)Q
o(o
q_A1
k=-w
ご覧のとおり、テーブルは読み取れません。 MySQLコマンドにENCRYPTION_KEY_ID=
my.cnf構成ファイルでinnodb_encrypt_tablesパラメーターをONに設定すると、新しいテーブルはデフォルトで暗号化されます。
MariaDB転送中データの暗号化
MariaDBを使用すると、以前はSecure Socket LayerまたはSSLと呼ばれていたトランスポート層セキュリティプロトコル(TLS)を使用して、サーバーとクライアント間の転送中のデータを暗号化できます。
まず、MariaDBサーバーがTLSサポートでコンパイルされていることを確認する必要があります。これを確認するには、次のSHOWGLOBALVARIABLESステートメントを実行します。
MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE 'version_ssl_library';
+---------------------+----------------------------+
| Variable_name | Value |
+---------------------+----------------------------+
| version_ssl_library | OpenSSL 1.1.1 11 Sep 2018 |
+---------------------+----------------------------+
1 row in set (0.001 sec)
そして、SHOW VARIABLESステートメントを使用して、現在使用されていないかどうかを確認します。
MariaDB [(none)]> SHOW VARIABLES LIKE '%ssl%';
+---------------------+----------------------------+
| Variable_name | Value |
+---------------------+----------------------------+
| have_openssl | YES |
| have_ssl | DISABLED |
| ssl_ca | |
| ssl_capath | |
| ssl_cert | |
| ssl_cipher | |
| ssl_crl | |
| ssl_crlpath | |
| ssl_key | |
| version_ssl_library | OpenSSL 1.1.1 11 Sep 2018 |
+---------------------+----------------------------+
10 rows in set (0.001 sec)
status MariaDBコマンドを使用してSSLステータスを確認することもできます:
MariaDB [(none)]> status
--------------
mysql Ver 15.1 Distrib 10.4.13-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2
Connection id: 22
Current database:
Current user: [email protected]
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server: MariaDB
Server version: 10.4.13-MariaDB-1:10.4.13+maria~bionic-log mariadb.org binary distribution
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: latin1
Db characterset: latin1
Client characterset: utf8
Conn. characterset: utf8
UNIX socket: /var/lib/mysql/mysql.sock
Uptime: 4 hours 28 min 25 sec
Threads: 11 Questions: 111668 Slow queries: 0 Opens: 92 Flush tables: 1 Open tables: 85 Queries per second avg: 6.933
--------------
MariaDBで転送中データの暗号化を構成する方法
$ mkdir -p /etc/mysql/certs
次に、接続を暗号化するように構成されるCA証明書を生成しましょう:
$ openssl genrsa 2048 > ca-key.pem
$ openssl req -new -x509 -nodes -days 365000 -key ca-key.pem -out ca-cert.pem
この最後のコマンドでは、次の情報を入力するように求められます。
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:
次に、サーバー証明書を生成する必要があります:
$ openssl req -newkey rsa:2048 -nodes -keyout server-key.pem -out server-req.pem
このコマンドでは、以前と同じ情報に加えて、オプションの証明書パスワードを入力するように求められます。
$ openssl rsa -in server-key.pem -out server-key.pem
$ openssl x509 -req -in server-req.pem -days 365000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem
最後に、クライアント証明書を生成する必要があります:
$ openssl req -newkey rsa:2048 -nodes -keyout client-key.pem -out client-req.pem
これにより、情報とオプションの証明書パスワードを入力するよう求められます。
$ openssl rsa -in client-key.pem -out client-key.pem
$ openssl x509 -req -in client-req.pem -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem
証明書ごとに異なる共通名を使用していることを確認してください。使用していないと、機能せず、次のようなメッセージが表示されます。
ERROR 2026 (HY000): SSL connection error: self signed certificate
現時点では、次のようになります。
$ ls /etc/mysql/certs/
ca-cert.pem ca-key.pem client-cert.pem client-key.pem client-req.pem server-cert.pem server-key.pem server-req.pem
そして、次のコマンドを使用して証明書を検証できます:
$ openssl verify -CAfile ca-cert.pem server-cert.pem client-cert.pem
server-cert.pem: OK
client-cert.pem: OK
では、my.cnf構成ファイル(RedHatベースのOSでは/ etc /、DebianベースのOSでは/ etc / mysql /にあります)で構成しましょう:
[mysqld]
ssl_ca=/etc/mysql/certs/ca-cert.pem
ssl_cert=/etc/mysql/certs/server-cert.pem
ssl_key=/etc/mysql/certs/server-key.pem
[client-mariadb]
ssl_ca =/etc/mysql/certs/ca-cert.pem
ssl_cert=/etc/mysql/certs/client-cert.pem
ssl_key=/etc/mysql/certs/client-key.pem
対応するセクション(mysqldおよびclient-mariadb)の下に追加していることを確認してください。
証明書の所有者を変更し、データベースサービスを再起動します:
$ chown mysql.mysql /etc/mysql/certs/
$ systemctl restart mariadb
この後、SHOW VARIABLESの出力を見ると、次のようになっているはずです。
MariaDB [(none)]> SHOW VARIABLES LIKE '%ssl%';
+---------------------+----------------------------------+
| Variable_name | Value |
+---------------------+----------------------------------+
| have_openssl | YES |
| have_ssl | YES |
| ssl_ca | /etc/mysql/certs/ca-cert.pem |
| ssl_capath | |
| ssl_cert | /etc/mysql/certs/server-cert.pem |
| ssl_cipher | |
| ssl_crl | |
| ssl_crlpath | |
| ssl_key | /etc/mysql/certs/server-key.pem |
| version_ssl_library | OpenSSL 1.1.1 11 Sep 2018 |
+---------------------+----------------------------------+
10 rows in set (0.001 sec)
それでは、それを使用するためのREQUIRESSSLパラメーターを持つユーザーを作成しましょう:
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 's9s'@'%' IDENTIFIED BY 'root123' REQUIRE SSL;
Query OK, 0 rows affected (0.005 sec)
このユーザーを使用してデータベースにアクセスし、statusコマンドを確認すると、SSLが使用中であることがわかります。
MariaDB [(none)]> status
--------------
mysql Ver 15.1 Distrib 10.4.13-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2
Connection id: 15
Current database:
Current user: [email protected]
SSL: Cipher in use is TLS_AES_256_GCM_SHA384
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server: MariaDB
Server version: 10.4.13-MariaDB-1:10.4.13+maria~bionic-log mariadb.org binary distribution
Protocol version: 10
Connection: 127.0.0.1 via TCP/IP
Server characterset: latin1
Db characterset: latin1
Client characterset: utf8
Conn. characterset: utf8
TCP port: 3306
Uptime: 16 sec
Threads: 11 Questions: 136 Slow queries: 0 Opens: 17 Flush tables: 1 Open tables: 11 Queries per second avg: 8.500
--------------
ClusterControlでSSL暗号化を有効にする方法
MariaDBデータベースでSSLを有効にする別の方法、さらに簡単な方法は、ClusterControlを使用することです。 ClusterControlがインストールされており、それを使用してMariaDBデータベースを管理していることを前提としているため、ClusterControl->MariaDBクラスターの選択->セキュリティ->SSL暗号化->有効に移動します。
これで、MariaDBデータベースでSSL暗号化が有効になります手作業なしで。
MariaDBでの保存時の暗号化の制限
MariaDBの保存時の暗号化に関連して、考慮すべきいくつかの制限があります。
- メタデータ(.frmファイルなど)とクライアントに送信されるデータは暗号化されません。
- 特に
- データを復号化する方法を知っているのは、MariaDBサーバーだけです。
- mysqlbinlogは、-read-from-remote-serverが使用されている場合にのみ暗号化されたバイナリログを読み取ることができます。
- Percona XtraBackupは、暗号化されたInnoDBを使用するインスタンスをバックアップできません。ただし、Mariabackupは暗号化されたインスタンスをバックアップできます。
- ディスクベースのGaleragcacheは、コミュニティバージョンのMariaDB Serverでは暗号化されていませんが、このファイルはMariaDB EnterpriseServer10.4で暗号化されています。
- Auditプラグインは暗号化された出力を作成できません。それをsyslogに送信し、代わりにそこで保護を構成します。
- Ariaログは暗号化されていません。これは、一時的でないAriaテーブルにのみ影響します。
- MariaDBエラーログは暗号化されていません。エラーログには、クラッシュ、アサーションの失敗、デバッグを支援するためにInnoDB / XtraDBがモニター出力をログに書き込む場合など、クエリテキストとデータが含まれる場合があります。必要に応じてsyslogに送信することもできます。
転送中のデータを保護することは、保存中のデータを保護することと同じくらい重要です。組織で必須ではない場合でも、データを回避するのに役立つため、適用を検討する必要があります。盗難または不正アクセス。
MariaDBには、前述の手順に従って実装する非常に簡単な方法がありますが、ClusterControlを使用するとさらに簡単になります。