MySQL
SSL接続のセットアップ
サーチ…
Debianベースのシステム用のセットアップ
(これは、MySQLがインストールされており、 sudo
が使用されていることを前提としています)。
CAおよびSSLキーの生成
OpenSSLとライブラリがインストールされていることを確認してください:
apt-get -y install openssl
apt-get -y install libssl-dev
次に、SSLファイルのディレクトリを作成して入力します。
mkdir /home/ubuntu/mysqlcerts
cd /home/ubuntu/mysqlcerts
鍵を生成するには、鍵に署名する認証局(CA)を作成します(自己署名)。
openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 3600 -key ca-key.pem -out ca.pem
各プロンプトで入力した値は、設定に影響しません。次に、サーバーの鍵を作成し、前のCAを使用して署名します。
openssl req -newkey rsa:2048 -days 3600 -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 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem
次に、クライアントのキーを作成します。
openssl req -newkey rsa:2048 -days 3600 -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 -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem
すべてが正しく設定されていることを確認するには、キーを確認します。
openssl verify -CAfile ca.pem server-cert.pem client-cert.pem
MySQLに鍵を追加する
MySQL設定ファイルを開きます 。例えば:
vim /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
セクションの下に、次のオプションを追加します。
ssl-ca = /home/ubuntu/mysqlcerts/ca.pem
ssl-cert = /home/ubuntu/mysqlcerts/server-cert.pem
ssl-key = /home/ubuntu/mysqlcerts/server-key.pem
MySQLを再起動します。例えば:
service mysql restart
SSL接続をテストする
同じ方法で接続し、生成されたクライアント鍵を使用して、オプションのssl-ca
、 ssl-cert
、およびssl-key
を渡します。たとえば、 cd /home/ubuntu/mysqlcerts
ます。
mysql --ssl-ca=ca.pem --ssl-cert=client-cert.pem --ssl-key=client-key.pem -h 127.0.0.1 -u superman -p
ログイン後、接続が本当に安全であることを確認します。
[email protected] [None]> SHOW VARIABLES LIKE '%ssl%';
+---------------+-----------------------------------------+
| Variable_name | Value |
+---------------+-----------------------------------------+
| have_openssl | YES |
| have_ssl | YES |
| ssl_ca | /home/ubuntu/mysqlcerts/ca.pem |
| ssl_capath | |
| ssl_cert | /home/ubuntu/mysqlcerts/server-cert.pem |
| ssl_cipher | |
| ssl_crl | |
| ssl_crlpath | |
| ssl_key | /home/ubuntu/mysqlcerts/server-key.pem |
+---------------+-----------------------------------------+
次の項目もチェックできます:
[email protected] [None]> STATUS;
...
SSL: Cipher in use is DHE-RSA-AES256-SHA
...
SSLの実施
これは、 REQUIRE SSL
を使用してGRANT
を介して行われます。
GRANT ALL PRIVILEGES ON *.* TO 'superman'@'127.0.0.1' IDENTIFIED BY 'pass' REQUIRE SSL;
FLUSH PRIVILEGES;
今、 superman
は SSL経由で接続する必要があります。
クライアント鍵を管理しない場合は、以前のクライアント鍵を使用して、それをすべてのクライアントに自動的に使用します。 MySQLの設定ファイルを開きます。例:
vim /etc/mysql/mysql.conf.d/mysqld.cnf
[client]
セクションで、次のオプションを追加します。
ssl-ca = /home/ubuntu/mysqlcerts/ca.pem
ssl-cert = /home/ubuntu/mysqlcerts/client-cert.pem
ssl-key = /home/ubuntu/mysqlcerts/client-key.pem
superman
は、SSLを介してログインするために次のように入力するだけです:
mysql -h 127.0.0.1 -u superman -p
Pythonなどの別のプログラムから接続する場合は、通常、connect関数の追加パラメータが必要です。 Pythonの例:
import MySQLdb
ssl = {'cert': '/home/ubuntu/mysqlcerts/client-cert.pem', 'key': '/home/ubuntu/mysqlcerts/client-key.pem'}
conn = MySQLdb.connect(host='127.0.0.1', user='superman', passwd='imsoawesome', ssl=ssl)
参考文献およびさらなる読書:
- https://www.percona.com/blog/2013/06/22/setting-up-mysql-ssl-and-secure-connections/
- https://lowendbox.com/blog/getting-started-with-mysql-over-ssl/
- http://xmodulo.com/enable-ssl-mysql-server-client.html
- https://ubuntuforums.org/showthread.php?t=1121458
CentOS7 / RHEL7のセットアップ
この例では、2つのサーバーを想定しています。
- dbserver(データベースが存在する場所)
- appclient(アプリケーションがどこにあるか)
FWIWでは、両方のサーバがSELinuxを強制しています。
まず、dbserverにログオンします。
証明書を作成するための一時ディレクトリを作成します。
mkdir /root/certs/mysql/ && cd /root/certs/mysql/
サーバー証明書を作成する
openssl genrsa 2048 > ca-key.pem
openssl req -sha1 -new -x509 -nodes -days 3650 -key ca-key.pem > ca-cert.pem
openssl req -sha1 -newkey rsa:2048 -days 730 -nodes -keyout server-key.pem > server-req.pem
openssl rsa -in server-key.pem -out server-key.pem
openssl x509 -sha1 -req -in server-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem
サーバー証明書を/ etc / pki / tls / certs / mysql /
ディレクトリパスはCentOSまたはRHELとみなされます(他のディストリビューションでは必要に応じて調整します)。
mkdir /etc/pki/tls/certs/mysql/
フォルダとファイルに対するアクセス許可を設定してください。 mysqlには完全な所有権とアクセス権が必要です。
chown -R mysql:mysql /etc/pki/tls/certs/mysql
MySQL / MariaDBを設定する
# vi /etc/my.cnf
# i
[mysqld]
bind-address=*
ssl-ca=/etc/pki/tls/certs/ca-cert.pem
ssl-cert=/etc/pki/tls/certs/server-cert.pem
ssl-key=/etc/pki/tls/certs/server-key.pem
# :wq
その後、
systemctl restart mariadb
ファイアウォールを開いてappclientからの接続を許可することを忘れないでください(IP 1.2.3.4を使用)
firewall-cmd --zone=drop --permanent --add-rich-rule 'rule family="ipv4" source address="1.2.3.4" service name="mysql" accept'
# I force everything to the drop zone. Season the above command to taste.
今すぐfirewalldを再起動する
service firewalld restart
次に、dbserverのmysqlサーバにログインします。
mysql -uroot -p
以下を発行して、クライアントのユーザーを作成します。 GRANT文でSSLを要求してください。
GRANT ALL PRIVILEGES ON *.* TO ‘iamsecure’@’appclient’ IDENTIFIED BY ‘dingdingding’ REQUIRE SSL;
FLUSH PRIVILEGES;
# quit mysql
最初のステップから/ root / certs / mysqlにいなければなりません。そうでない場合は、以下のいずれかのコマンドを入力してcdに戻ってください。
クライアント証明書を作成する
openssl req -sha1 -newkey rsa:2048 -days 730 -nodes -keyout client-key.pem > client-req.pem
openssl rsa -in client-key.pem -out client-key.pem
openssl x509 -sha1 -req -in client-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem
注 :私は、サーバー証明書とクライアント証明書の両方に同じ共通名を使用しました。 YMMV。
この次のコマンドではまだ/ root / certs / mysql /であることを確認してください
サーバーとクライアントのCA証明書を1つのファイルに結合する:
cat server-cert.pem client-cert.pem > ca.pem
2つの証明書が表示されることを確認してください。
cat ca.pem
今すぐサーバー側の仕事の終わり。
別の端末を開き、
ssh appclient
前と同じように、クライアント証明書の永続的なホームを作成する
mkdir /etc/pki/tls/certs/mysql/
次に、クライアント証明書(dbserverで作成)をappclientに配置します。あなたはそれらをscpしたり、ファイルを一つずつコピーして貼り付けたりすることができます。
scp dbserver
# copy files from dbserver to appclient
# exit scp
再度、フォルダとファイルに対するアクセス許可を設定してください。 mysqlには完全な所有権とアクセス権が必要です。
chown -R mysql:mysql /etc/pki/tls/certs/mysql
3つのファイルが必要です。各ファイルは、ユーザmysqlが所有しています。
/etc/pki/tls/certs/mysql/ca.pem
/etc/pki/tls/certs/mysql/client-cert.pem
/etc/pki/tls/certs/mysql/client-key.pem
[client]
セクションでappclientのMariaDB / MySQL設定を編集し[client]
。
vi /etc/my.cnf
# i
[client]
ssl-ca=/etc/pki/tls/certs/mysql/ca.pem
ssl-cert=/etc/pki/tls/certs/mysql/client-cert.pem
ssl-key=/etc/pki/tls/certs/mysql/client-key.pem
# :wq
appclientのmariadbサービスを再起動します。
systemctl restart mariadb
まだここのクライアントに
これが返されるはずです:ssl TRUE
mysql --ssl --help
さて、appclientのmysqlインスタンスにログインしてください
mysql -uroot -p
以下の両方の変数にYESと表示されるはずです
show variables LIKE '%ssl';
have_openssl YES
have_ssl YES
最初に私は見た
have_openssl NO
mariadb.logの概要を明らかにした:
SSLエラー: '/etc/pki/tls/certs/mysql/client-cert.pem'から証明書を取得できません
問題は、rootが所有していたclient-cert.pemとそのフォルダを含むことでした。解決策は、/ etc / pki / tls / certs / mysql /の所有権をmysqlに設定することでした。
chown -R mysql:mysql /etc/pki/tls/certs/mysql
必要に応じて、すぐ上のステップからmariadbを再起動します。
今すぐ安全な接続をテストする準備ができています
私たちはまだここにappclientにいる
上で作成したアカウントを使用してdbserverのmysqlインスタンスに接続しようとします。
mysql -h dbserver -u iamsecure -p
# enter password dingdingding (hopefully you changed that to something else)
少し運があれば、間違いなくログインする必要があります。
SSLを有効にして接続していることを確認するには、MariaDB / MySQLプロンプトから次のコマンドを発行します。
\s
それはバックスラッシュs、別名ステータスです
接続のステータスが表示されます。接続は次のようになります。
Connection id: 4
Current database:
Current user: iamsecure@appclient
SSL: Cipher in use is DHE-RSA-AES256-GCM-SHA384
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server: MariaDB
Server version: 5.X.X-MariaDB MariaDB Server
Protocol version: 10
Connection: dbserver via TCP/IP
Server characterset: latin1
Db characterset: latin1
Client characterset: utf8
Conn. characterset: utf8
TCP port: 3306
Uptime: 42 min 13 sec
接続の試行でエラーが許可されなくなった場合は、上記のGRANTステートメントを調べて、迷いのある文字や記号がないことを確認してください。
SSLエラーが発生した場合は、このガイドに戻って手順が順調であることを確認してください。
これはRHEL7で動作し、おそらくCentOS7でも動作します。これらの正確な手順が別の場所で機能するかどうかは確認できません。
これは誰かが少し時間と悪化を節約することを願っています。