サーチ…


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-cassl-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)

参考文献およびさらなる読書:

CentOS7 / RHEL7のセットアップ

この例では、2つのサーバーを想定しています。

  1. dbserver(データベースが存在する場所)
  2. 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でも動作します。これらの正確な手順が別の場所で機能するかどうかは確認できません。

これは誰かが少し時間と悪化を節約することを願っています。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow