2.4. MariaDB サーバーでの TLS 暗号化の設定
デフォルトでは、MariaDB は暗号化されていない接続を使用します。安全な接続のために、MariaDB サーバーで TLS サポートを有効にし、暗号化された接続を確立するようにクライアントを設定します。
2.4.1. MariaDB サーバーに CA 証明書、サーバー証明書、および秘密鍵を配置する
MariaDB サーバーで TLS 暗号化を有効にする前に、認証局 (CA) 証明書、サーバー証明書、および秘密鍵を MariaDB サーバーに保存します。
前提条件
Privacy Enhanced Mail(PEM) 形式の以下のファイルがサーバーにコピーされています。
-
サーバーの秘密鍵:
server.example.com.key.pem
-
サーバー証明書:
server.example.com.crt.pem
-
認証局 (CA) 証明書:
ca.crt.pem
秘密鍵および証明書署名要求 (CSR) の作成や、CA からの証明書要求に関する詳細は、CA のドキュメントを参照してください。
-
サーバーの秘密鍵:
手順
CA およびサーバー証明書を
/etc/pki/tls/certs/
ディレクトリーに保存します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow mv <path>/server.example.com.crt.pem /etc/pki/tls/certs/ mv <path>/ca.crt.pem /etc/pki/tls/certs/
# mv <path>/server.example.com.crt.pem /etc/pki/tls/certs/ # mv <path>/ca.crt.pem /etc/pki/tls/certs/
MariaDB サーバーがファイルを読み込めるように、CA およびサーバー証明書にパーミッションを設定します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow chmod 644 /etc/pki/tls/certs/server.example.com.crt.pem /etc/pki/tls/certs/ca.crt.pem
# chmod 644 /etc/pki/tls/certs/server.example.com.crt.pem /etc/pki/tls/certs/ca.crt.pem
証明書は、セキュアな接続が確立される前は通信の一部であるため、任意のクライアントは認証なしで証明書を取得できます。そのため、CA およびサーバーの証明書ファイルに厳密なパーミッションを設定する必要はありません。
サーバーの秘密鍵を
/etc/pki/tls/private/
ディレクトリーに保存します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow mv <path>/server.example.com.key.pem /etc/pki/tls/private/
# mv <path>/server.example.com.key.pem /etc/pki/tls/private/
サーバーの秘密鍵にセキュアなパーミッションを設定します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow chmod 640 /etc/pki/tls/private/server.example.com.key.pem chgrp mysql /etc/pki/tls/private/server.example.com.key.pem
# chmod 640 /etc/pki/tls/private/server.example.com.key.pem # chgrp mysql /etc/pki/tls/private/server.example.com.key.pem
承認されていないユーザーが秘密鍵にアクセスできる場合は、MariaDB サーバーへの接続は安全ではなくなります。
SELinux コンテキストを復元します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow restorecon -Rv /etc/pki/tls/
# restorecon -Rv /etc/pki/tls/
2.4.2. MariaDB サーバーでの TLS の設定
セキュリティーを向上させるには、MariaDB サーバーで TLS サポートを有効にします。その結果、クライアントは TLS 暗号化を使用してサーバーでデータを送信できます。
前提条件
- MariaDB サーバーをインストールしている。
-
mariadb
サービスが実行している。 Privacy Enhanced Mail(PEM) 形式の以下のファイルがサーバー上にあり、
mysql
ユーザーが読み取りできます。-
サーバーの秘密鍵:
/etc/pki/tls/private/server.example.com.key.pem
-
サーバー証明書:
/etc/pki/tls/certs/server.example.com.crt.pem
-
認証局 (CA) 証明書
/etc/pki/tls/certs/ca.crt.pem
-
サーバーの秘密鍵:
- サーバー証明書のサブジェクト識別名 (DN) またはサブジェクトの別名 (SAN) フィールドは、サーバーのホスト名と一致します。
- サーバーが RHEL 9.2 以降を実行し、FIPS モードが有効になっている場合、クライアントが Extended Master Secret (EMS) 拡張機能をサポートしているか、TLS 1.3 を使用している必要があります。EMS を使用しない TLS 1.2 接続は失敗します。詳細は、Red Hat ナレッジベースソリューション TLS extension "Extended Master Secret" enforced on RHEL 9.2 and later を参照してください。
手順
/etc/my.cnf.d/mariadb-server-tls.cnf
ファイルを作成します。以下の内容を追加して、秘密鍵、サーバー、および CA 証明書へのパスを設定します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow [mariadb] ssl_key = /etc/pki/tls/private/server.example.com.key.pem ssl_cert = /etc/pki/tls/certs/server.example.com.crt.pem ssl_ca = /etc/pki/tls/certs/ca.crt.pem
[mariadb] ssl_key = /etc/pki/tls/private/server.example.com.key.pem ssl_cert = /etc/pki/tls/certs/server.example.com.crt.pem ssl_ca = /etc/pki/tls/certs/ca.crt.pem
証明書失効リスト (CRL) がある場合は、それを使用するように MariaDB サーバーを設定します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ssl_crl = /etc/pki/tls/certs/example.crl.pem
ssl_crl = /etc/pki/tls/certs/example.crl.pem
オプション: 暗号化なしの接続試行を拒否します。この機能を有効にするには、以下を追加します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow require_secure_transport = on
require_secure_transport = on
オプション: サーバーがサポートする必要がある TLS バージョンを設定します。たとえば、TLS 1.2 および TLS 1.3 をサポートするには、以下を追加します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow tls_version = TLSv1.2,TLSv1.3
tls_version = TLSv1.2,TLSv1.3
デフォルトでは、サーバーは TLS 1.1、TLS 1.2、および TLS 1.3 をサポートします。
mariadb
サービスを再起動します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow systemctl restart mariadb.service
# systemctl restart mariadb.service
検証
トラブルシューティングを簡素化するには、ローカルクライアントが TLS 暗号化を使用するように設定する前に、MariaDB サーバーで以下の手順を実行します。
MariaDB で TLS 暗号化が有効になっていることを確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow mysql -u root -p -e "SHOW GLOBAL VARIABLES LIKE 'have_ssl';"
# mysql -u root -p -e "SHOW GLOBAL VARIABLES LIKE 'have_ssl';" +---------------+-----------------+ | Variable_name | Value | +---------------+-----------------+ | have_ssl | YES | +---------------+-----------------+
have_ssl
変数がyes
に設定されている場合、TLS 暗号化が有効になります。MariaDB サービスが特定の TLS バージョンのみをサポートするように設定している場合は、
tls_version
変数を表示します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow mysql -u root -p -e "SHOW GLOBAL VARIABLES LIKE 'tls_version';"
# mysql -u root -p -e "SHOW GLOBAL VARIABLES LIKE 'tls_version';" +---------------+-----------------+ | Variable_name | Value | +---------------+-----------------+ | tls_version | TLSv1.2,TLSv1.3 | +---------------+-----------------+
2.4.3. 特定のユーザーアカウントに TLS で暗号化された接続を要求する
機密データにアクセスできるユーザーは、ネットワーク上で暗号化されていないデータ送信を回避するために、常に TLS で暗号化された接続を使用する必要があります。
すべての接続にセキュアなトランスポートが必要なサーバーで設定できない場合は (require_secure_transport = on
)、TLS 暗号化を必要とするように個別のユーザーアカウントを設定します。
前提条件
- MariaDB サーバーで TLS サポートが有効になっている。
- セキュアなトランスポートを必要とするように設定するユーザーが存在する。
手順
管理ユーザーとして MariaDB サーバーに接続します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow mysql -u root -p -h server.example.com
# mysql -u root -p -h server.example.com
管理ユーザーがリモートでサーバーにアクセスする権限を持たない場合は、MariaDB サーバーでコマンドを実行し、
localhost
に接続します。REQUIRE SSL
句を使用して、ユーザーが TLS 暗号化接続を使用して接続する必要があるよう強制します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow MariaDB [(none)]> ALTER USER 'example'@'%' REQUIRE SSL;
MariaDB [(none)]> ALTER USER 'example'@'%' REQUIRE SSL;
検証
TLS 暗号化を使用して、
example
ユーザーとしてサーバーに接続します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow mysql -u example -p -h server.example.com --ssl
# mysql -u example -p -h server.example.com --ssl ... MariaDB [(none)]>
エラーが表示されず、インタラクティブな MariaDB コンソールにアクセスできる場合は、TLS との接続は成功します。
TLS を無効にして、
example
ユーザーとして接続を試みます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow mysql -u example -p -h server.example.com --skip-ssl
# mysql -u example -p -h server.example.com --skip-ssl ERROR 1045 (28000): Access denied for user 'example'@'server.example.com' (using password: YES)
このユーザーに TLS が必要だが無効になっているため、サーバーはログインの試行を拒否しました (
--skip-ssl
)。