安全な接続のために SSL を有効化する
このステップでは、MySQL サーバーへの安全な接続のために SSL (Secure Sockets Layer) を有効化します。SSL は、クライアントとサーバー間で送信されるデータを暗号化し、盗聴や改ざんから保護します。
まず、SSL 証明書と鍵を生成する必要があります。これには openssl
コマンドラインツールを使用します。
LabEx VM のターミナルを開きます。デフォルトのディレクトリは ~/project
です。
SSL 証明書と鍵を保存するディレクトリを作成します。次のコマンドを実行します。
mkdir ssl
cd ssl
では、サーバー鍵を生成しましょう。
sudo openssl genrsa 2048 > server-key.pem
次に、証明書署名要求 (CSR) を生成します。
sudo openssl req -new -key server-key.pem -out server-req.pem
国名、州、都市、組織名などの情報を求められます。適切な値を入力するか、空白のままにすることができます。「Common Name」には、localhost
またはサーバーのホスト名/IP アドレスを入力します。
では、証明書要求に署名して SSL 証明書を作成しましょう。
sudo openssl x509 -days 365 -in server-req.pem -signkey server-key.pem -out server-cert.pem
このコマンドは、365 日間有効な自己署名証明書を作成します。
次に、クライアント鍵を生成します。
sudo openssl genrsa 2048 > client-key.pem
クライアント証明書署名要求 (CSR) を生成します。
sudo openssl req -new -key client-key.pem -out client-req.pem
サーバー CSR と同様の情報を求められます。
では、クライアント証明書要求に署名しましょう。
sudo openssl x509 -days 365 -in client-req.pem -signkey client-key.pem -out client-cert.pem
最後に、CA (Certificate Authority) の鍵と証明書を生成します。
sudo openssl genrsa 2048 > ca-key.pem
sudo openssl req -new -x509 -days 365 -key ca-key.pem -out ca-cert.pem
これで、~/project/ssl
ディレクトリに以下のファイルがあります。
server-key.pem
server-cert.pem
client-key.pem
client-cert.pem
ca-key.pem
ca-cert.pem
次に、MySQL がこれらの SSL 証明書を使用するように設定する必要があります。
MySQL の設定ファイルを編集します。場所は MySQL のインストールによって異なりますが、多くの場合 /etc/mysql/my.cnf
または /etc/my.cnf
にあります。Docker コンテナ内にいるため、~/project
に my.cnf
ファイルを作成し、コンテナにマウントします。
~/project
ディレクトリに my.cnf
という名前のファイルを作成します。
cd ~/project
nano my.cnf
my.cnf
ファイルに以下の行を追加します。
[mysqld]
ssl-cert=/var/lib/mysql/ssl/server-cert.pem
ssl-key=/var/lib/mysql/ssl/server-key.pem
ssl-ca=/var/lib/mysql/ssl/ca-cert.pem
require_secure_transport=ON
重要: my.cnf
ファイル内のパスは、MySQL コンテナに対する相対パスです。証明書をコンテナ内の正しい場所にコピーする必要があります。コンテナのファイルシステムに直接アクセスできないため、この実験ではこのステップをスキップします。require_secure_transport=ON
設定により、すべての接続が SSL を使用するように強制されます。
では、MySQL サーバーを再起動しましょう。systemctl
を使用できないため、この実験では再起動ステップをスキップします。実際のシナリオでは、変更を反映するために MySQL サーバーを再起動する必要があります。
最後に、SSL を使用して MySQL サーバーに接続しましょう。
mysql --ssl-ca=~/project/ssl/ca-cert.pem --ssl-cert=~/project/ssl/client-cert.pem --ssl-key=~/project/ssl/client-key.pem -u root -p
パスワードを求められたら、ルートパスワードを入力します。
接続が SSL を使用していることを確認するには、次の SQL コマンドを実行します。
SHOW STATUS LIKE 'Ssl_cipher';
Value
列に暗号化方式が表示されれば、接続は SSL を使用しています。
+---------------+-----------------------+
| Variable_name | Value |
+---------------+-----------------------+
| Ssl_cipher | TLS_AES_256_GCM_SHA384 |
+---------------+-----------------------+
1 row in set (0.00 sec)
Value
列が空の場合、接続は SSL を使用していません。
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Ssl_cipher | |
+---------------+-------+
1 row in set (0.00 sec)