MySQLは、Windows、Linux、MacOS、FreeBSDなどの多くのオペレーティングシステムで動作するオープンソースのリレーショナルデータベースシステムです。これはおそらく最も人気のあるOpenSourceRDBMSであり、LAMPおよびLEMPスタックの中心的なコンポーネントです。 Wordpress、Joomla、TYPO3、phpBBなどのMySQLに依存する多くのアプリケーションがあります。
このチュートリアルでは、リモート接続用にMySQLを安全に構成する方法を段階的に説明します。 MySQLにリモートでアクセスする必要がある場合は、MySQLが転送されたデータを暗号化しないため、VPNを使用するか、このチュートリアルで示すように、SSLを使用するようにMySQLを構成できます。この構成では、正しいSSL証明書ファイルを持つユーザーのみがMySQLサーバーへの接続を許可され、トラフィックは暗号化されます。 MySQLの最新バージョンをインストールしてから、リモート接続用にSSLを構成します。基本システムには、CentOS7サーバーを使用します。
私たちが行うこと:
- MySQLをインストールします。
- MySQLルートパスワードを設定します。
- 新しい自己署名SSL証明書ファイルを生成します。
- MySQLのSSLを有効にします。
- リモート接続を有効にします。
- テスト。
前提条件
- CentOS7サーバー
- root権限
このチュートリアルでは、現時点で最新バージョンのMySQL5.7を使用します。 MySQLリポジトリからインストールされるため、最初に新しいCentOSリポジトリをシステムに追加する必要があります。
以下のyumコマンドを使用してMySQLの新しいリポジトリを追加します。
yum localinstall https://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm
新しいパッケージをインストールするように求められます。「y」と入力します。 'を押して'Enter '確認します。
これで、MySQLの最新バージョン5.7を次のようにサーバーにインストールできます。
yum -y install mysql-community-server
インストールが完了したら、MySQLサービスを開始し、systemctlコマンドを使用して起動時に自動的に実行できるようにします。
systemctl start mysqld
systemctl enable mysqld
MySQL(3306)が使用するポートをチェックして、MySQLが実行されていることを確認します。以下のnetstatコマンドで確認してください。
netstat -plntu
MySQLはMySQLリポジトリからCentOS7にインストールされています。
デフォルトでは、MySQL 5.7は、サービスを初めて開始するときにデフォルトのルートパスワードを生成します。パスワードはMySQLログファイル'/var/log/mysqld.log'に保存されます。
デフォルトのMySQLルートパスワードを表示するには、以下のgrepコマンドを使用できます。
grep 'temporary' /var/log/mysqld.log
以下のような結果が表示されます。私のデフォルトのパスワードは「wxtX8Te&Uh1K」です。 '。
A temporary password is generated for [email protected]: wxtX8Te&Uh1K
デフォルトのパスワードを使用してMySQLシェルに接続し、パスワードを独自のパスワードに置き換えます。
mysql -u root -p
TYPE IN DEFAULT PASSWORD
次に、デフォルトのパスワードを独自のパスワードに置き換えます。このチュートリアルでは、「[メール保護]を使用します '新しいMySQLルートパスワードとして。以下のMySQLクエリを実行します。
ALTER USER 'root'@'localhost' IDENTIFIED BY '[email protected]';
flush privileges;
exit;
これで、新しいパスワード「[メール保護]」で再度接続できます。
mysql -u root -p
TYPE NEW PASSWORD '[email protected]'
デフォルトでは、MySQL5.7の'/ var / lib/mysql'ディレクトリに独自のSSL証明書ファイルがあります。ただし、このチュートリアルでは、OpenSSLを使用して独自のSSL証明書ファイルを生成し、MySQLを使用してそれらを構成する方法を示します。
このステップでは、新しい自己署名証明書ファイルを生成します。 CA証明書、サーバー証明書とキー、クライアント証明書とキーの3つの証明書が必要です 。 OpenSSLで作成します。
SSL証明書ファイル'/etc / certs /'の新しいディレクトリを作成し、そのディレクトリに移動します。
mkdir -p /etc/certs
cd /etc/certs
新しいCA証明書ca.pemファイルを生成します。
openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 3600 -key ca-key.pem -out ca.pem
次に、サーバー側の証明書を作成する必要があります。新しいサーバー証明書server-cert.pemファイルとserver-key.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
次に、クライアントの証明書ファイルを生成します。 MySQLサーバーは、これらの証明書ファイルを持つクライアントからのリモート接続のみを受け入れます。新しいクライアント証明書ファイルを生成し、パスフレーズを削除して、CA証明書を使用して署名します。
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
注:
CA証明書情報は、クライアントおよびサーバー情報とは異なる必要があります。
このセットアップに必要なすべての証明書が生成されました。これで、以下のコマンドを使用して証明書ファイルを確認できます。
openssl verify -CAfile ca.pem server-cert.pem client-cert.pem
エラーがないことを確認してください。結果は次のとおりです。
すべての証明書ファイルが検証されました。 certsディレクトリの所有者を「mysql」ユーザーに変更し、すべてのキーファイルの権限を変更します。
chown -R mysql:mysql /etc/certs/
chmod 600 client-key.pem server-key.pem ca-key.pem
このステップでは、MySQLのSSLを有効にします。 MySQLでSSLの構成と有効化を開始する前に、デフォルトの証明書ファイルを新しいバックアップディレクトリにバックアップする必要があります。
新しいバックアップディレクトリを作成します'mysql-certs 'すべての証明書。
mkdir -p ~/mysql-certs/
'/ var / lib / mysql'ディレクトリに移動し、すべてのデフォルト証明書をバックアップディレクトリに移動します。
cd /var/lib/mysql/
mv ca.pem ca-key.pem ~/mysql-certs/
mv server-key.pem server-cert.pem ~/mysql-certs/
mv client-key.pem client-cert.pem ~/mysql-certs/
mv private_key.pem public_key.pem ~/mysql-certs/
次に、MySQLサービスを再起動します。
systemctl restart mysqld
次に、MySQLシェルからSSLを確認します。新しいパスワードでmysqlにログインします:
mysql -u root -p
TYPE NEW PASSWORD '[email protected]'
以下のクエリを実行して、MySQLのSSLステータスを確認します。
SHOW GLOBAL VARIABLES LIKE '%ssl%';
STATUS;
SSLステータスが「無効」であることがわかります '、およびrootユーザーがSSLなしで接続されている 。
次に、MySQLのSSL接続を有効にします。 MySQL構成ファイル'my.cnfを編集する必要があります 'vimを含むファイル。
vim /etc/my.cnf
' [mysqld] 'セクションで、以下の構成を貼り付けます。
# Type your own certificates directory
ssl-ca=/etc/certs/ca.pem
ssl-cert=/etc/certs/server-cert.pem
ssl-key=/etc/certs/server-key.pem
ファイルを保存してvimを終了し、MySQLサービスを再起動します。
systemctl restart mysqld
次に、MySQLに再度ログインして、SSLを確認します。
mysql -u root -p
TYPE NEW PASSWORD '[email protected]'
以下のクエリを実行して、SSLセクションの値が'はいであることを確認します '。
SHOW VARIABLES LIKE '%ssl%';
STATUS;
MySQLのSSLが有効になっていることがわかりますが、rootユーザーはまだSSL接続を使用して接続していません。
SSLを使用したすべてのローカルユーザー接続を強制するには、mysql構成ファイル' my.cnfを編集します。 'もう一度。
vim /etc/my.cnf
以下の構成を行の最後に貼り付けます。
[client]
ssl-ca=/etc/certs/ca.pem
ssl-cert=/etc/certs/client-cert.pem
ssl-key=/etc/certs/client-key.pem
保存して終了し、MySQLを再起動します。
systemctl restart mysqld
MySQLに再度接続し、接続とSSLが有効になっていることを確認します。
mysql -u root -p
TYPE NEW PASSWORD '[email protected]'
SHOW VARIABLES LIKE '%ssl%';
STATUS;
SSLが有効になっており、ローカル接続でもSSLが使用されています。
上記の手順では、MySQLサーバーに対してSSLをすでに有効にしており、ローカル接続はSSLを使用するように強制されています。このステップでは、MySQLのリモート接続を有効にしますが、MySQLサーバーに接続するためにCAによって署名された証明書ファイルを持つクライアントのみを許可します。
MySQL構成ファイルをvimで編集します。
vim /etc/my.cnf
' [mysqld]の最後にこの構成を貼り付けます 'セクション。
bind-address = *
require_secure_transport = ON
ファイルを保存してエディタを終了し、MySQLを再起動します。
systemctl restart mysqld
次に、リモート接続用の新しいユーザーを作成します。 ' hakaseという名前の新しいユーザーを作成します 'パスワード付き'[メール保護] 'そして'ハカセにすべての特権を付与します 'ユーザー。 'ハカセ 'ユーザーは証明書キーでのみ接続できます。
mysql -u root -p
TYPE NEW PASSWORD '[email protected]'
create user 'hakase'@'%' identified by '[email protected]' REQUIRE X509;
grant all privileges on *.* to 'hakase'@'%' identified by '[email protected]' REQUIRE X509;
flush privileges;
リモート接続用の新しいユーザーが作成されました。
注:
'1つの警告が表示される場合があります 'mysqlクエリ結果。 'GRANT'クエリは次のリリースで非推奨になるため、GRANTの代わりにALTERUSERクエリを使用することについて警告しています。
このチュートリアルの最後のセクションでは、「hakase」という名前の新しいユーザーが証明書ファイルを使用してMySQLサーバーにリモートで接続できるかどうかをテストします。クライアント用の3つの証明書をダウンロードする必要があります。
- CA証明書-ca.pem
- クライアント証明書-client-cert.pem
- クライアントキー-client-key.pem
別のLinuxシステムにログインし、そこにmysql-clientパッケージをインストールしました。次に、SCPを使用してすべてのクライアント証明書ファイルをダウンロードしました。次に、証明書ファイルを使用してMySQLサーバーに接続します。
mysql -h 10.0.15.11 -u hakase \
--ssl-ca=ca.pem \
--ssl-cert=client-cert.pem \
--ssl-key=client-key.pem -p
10.0.15.11=MySQLサーバーのIPアドレス。
以下のこのクエリで接続ステータスを確認できます。
STATUS;
IPアドレスが10.0.15.10のユーザーハカセ IPアドレス10.0.15.11でMySQLサーバーに接続しました 、 TCP / IPを介した接続 ポート3306 SSLを使用します 。
証明書ファイルなしで接続しようとすると、次のようなエラーが表示されます。
次に、ホストのMySQLWorkbenchGUIを使用してテストします。
以下は私の設定です-パラメータの設定。
SSL構成-SSLの設定。
そして、SSLクライアント証明書ファイルとの接続の結果の下にあります。
新しいユーザーは、SSL接続を使用してMySQLデータベースサーバーにリモートで正常に接続しました。ユーザーが証明書ファイルなしで接続しようとすると、結果は「拒否」になります。 '。 SSL接続を使用したMySQLのインストールと構成は正常に完了しました。