地球の反対側のどこかにSQLデータベースを備えたサーバーがあるとしましょう。インターネット経由で接続を確立しても安全ですか?例えばMySQLWorkbenchを使用します。
サーバーへの接続は、特に上記のソフトウェアを使用して、デフォルトで暗号化されていないと聞いたので、私は尋ねています。すべてのリモート接続にSSLを強制した場合、どのようなリスクが残りますか?オープンMySQLポートはそれ自体がセキュリティリスクですか?
MySQLリファレンスマニュアルには全体があります セキュリティのための第6章 。
まず、インターネット上のどこからでも接続を許可するのではなく、既知の信頼できるホストからのみ接続を許可する必要があります。ユーザーは許可されたホストのリストも持っていますが、 6.1.1セキュリティガイドライン は、ホストがMySQLサーバー(デフォルトポート3306
)に接続する前に、ファイアウォールレベルでこれを行うことをお勧めします。これにより、潜在的なエクスプロイトの使用が防止されるため、セキュリティが向上します。
ローカルワークベンチとリモートMySQLサーバーを直接接続する必要がある場合は、 セキュア接続を使用 。ただし、SQLサーバーへの接続を保護する方法は他にもあります。アクセス制御とOpenSSLを使用したSQL接続の保護に必要な労力を考慮すると、はるかに実用的です。
SSHトンネルを使用すると、Workbenchがあったのと同じようにMySQLサーバーに接続できます。この例では、ローカルポート13306
とトンネル接続をリモート側のlocalhost:3306
にバインドします。
ssh -L 13306:localhost:3306 [email protected]
VPNを使用し、内部VPNネットワークからの接続のみを許可します。
これらのアプローチの両方を使用すると、MySQLをlocalhost
のみにバインドできます。これが最も安全なオプションです。
あなたの質問に答えるために:いいえ、それは安全ではありません。
いくつかのセキュリティ問題を挙げれば:
1:ログインログインデータはインターネット経由でプレーンテキストで転送されますが、明らかにそれは望ましくありません:)
2:SQLクエリ送信するクエリ(およびその応答)はプレーンテキストで送信されますが、データが簡単に改ざんされる可能性があるため、これは望ましくありません。
さらに、機密情報を含む可能性のあるプレーンテキストにクエリ結果を戻すことは、まったく別の問題です。個人ファイルの場合、一部の国では、個人データの安全ガイドラインを無視/無視したとして訴えられる可能性さえあります。
3:インターネット上で開いているSQLポートは、潜在的な悪意のあるユーザーにとって常に追加の攻撃ベクトルです。リモートのmysqlサーバーのエクスプロイトなどを考えてみてください。
Linuxでmysqlサーバーを実行していると仮定して、従う必要のある手順を要約しました。
Mysql-serverで、mysqlssl証明書を生成します。
CAca秘密鍵を生成します。
openssl genrsa 4096 > ca-key.pem
以前に作成したキーを使用して証明書を生成します(デフォルトの質問に答えます)。
openssl req -sha256 -new -x509 -nodes -days 3650 -key ca-key.pem > ca-cert.pem
次に、mysqlサーバーの新しい秘密鍵を作成します(これもデフォルトの質問です)。
openssl req -sha256 -newkey rsa:4096 -days 730 -nodes -keyout server-key.pem > server-req.pem
秘密鍵のエクスポート:
openssl rsa -in server-key.pem -out server-key.pem
サーバー証明書を作成します。
openssl x509 -sha256 -req -in server-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem
次に、my.cnf(/etc/mysql/my.cnfにあります)でmysqldセクションを編集し、次のように追加します。
ssl-ca =/etc/mysql/ca-cert.pem ssl-cert =/etc/mysql/server-cert.pem ssl-key =/etc/mysql/server-key.pem
mysqlサービスを再起動します。
service mysql restart
これで、サーバー証明書を使用してmysqlサーバーを実行できます。次に、特定のアドレス(可能であればリモート静的IP)からユーザーを追加して、mysqlコンソールで次のコマンドを実行します。
GRANT ALL PRIVILEGES ON 'database'.* TO 'yourremotelogin'@'your.remote.ip.xxx' IDENTIFIED BY 'password' REQUIRE SSL;
FLUSH PRIVILEGES;
これで、特定のIPからSSLを介したリモート接続を受け入れるSSL mysqlサーバーができましたが、クライアント証明書を生成する必要があります。
したがって、まだmysqlサーバーで次を実行します。
openssl req -sha256 -newkey rsa:4096 -days 730 -nodes -keyout client-key.pem > client-req.pem
openssl rsa -in client-key.pem -out client-key.pem
openssl x509 -sha256 -req -in client-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem
次に、ca-cert.pem、client-key.pem、およびclient-cert.pemを、mysqlワークベンチが配置されているリモートPCにコピーします。
Mysqlワークベンチでサーバー接続管理を開き、サーバーへの既存の接続を編集します。 [接続]タブで、[SSL]サブタブを選択し、[SSLが必要なものを使用する]を選択します。
以下のフィールドで、SSL CAファイルにca-cert.pem、SSL CERTファイルにcielnt-cert.pem、SSLキーファイルにclient-key.pemを選択します。
これで、接続しようとすると、パスワード(前に定義したもの)の入力を求められますが、SSL経由です:)
この答えがあなたが探していた答えであることを願っています。