web-dev-qa-db-ja.com

インターネット経由でMySQLWorkbenchを使用しても安全ですか?

地球の反対側のどこかにSQLデータベースを備えたサーバーがあるとしましょう。インターネット経由で接続を確立しても安全ですか?例えばMySQLWorkbenchを使用します。

サーバーへの接続は、特に上記のソフトウェアを使用して、デフォルトで暗号化されていないと聞いたので、私は尋ねています。すべてのリモート接続にSSLを強制した場合、どのようなリスクが残りますか?オープンMySQLポートはそれ自体がセキュリティリスクですか?

MySQLリファレンスマニュアルには全体があります セキュリティのための第6章

まず、インターネット上のどこからでも接続を許可するのではなく、既知の信頼できるホストからのみ接続を許可する必要があります。ユーザーは許可されたホストのリストも持っていますが、 6.1.1セキュリティガイドライン は、ホストがMySQLサーバー(デフォルトポート3306)に接続する前に、ファイアウォールレベルでこれを行うことをお勧めします。これにより、潜在的なエクスプロイトの使用が防止されるため、セキュリティが向上します。

ローカルワークベンチとリモートMySQLサーバーを直接接続する必要がある場合は、 セキュア接続を使用 。ただし、SQLサーバーへの接続を保護する方法は他にもあります。アクセス制御とOpenSSLを使用したSQL接続の保護に必要な労力を考慮すると、はるかに実用的です。

  1. SSHトンネルを使用すると、Workbenchがあったのと同じようにMySQLサーバーに接続できます。この例では、ローカルポート13306とトンネル接続をリモート側のlocalhost:3306にバインドします。

    ssh -L 13306:localhost:3306 [email protected]
    
  2. VPNを使用し、内部VPNネットワークからの接続のみを許可します。

これらのアプローチの両方を使用すると、MySQLをlocalhostのみにバインドできます。これが最も安全なオプションです。

4
Esa Jokinen

あなたの質問に答えるために:いいえ、それは安全ではありません。

いくつかのセキュリティ問題を挙げれば:

1:ログインログインデータはインターネット経由でプレーンテキストで転送されますが、明らかにそれは望ましくありません:)

2:SQLクエリ送信するクエリ(およびその応答)はプレーンテキストで送信されますが、データが簡単に改ざんされる可能性があるため、これは望ましくありません。

さらに、機密情報を含む可能性のあるプレーンテキストにクエリ結果を戻すことは、まったく別の問題です。個人ファイルの場合、一部の国では、個人データの安全ガイドラインを無視/無視したとして訴えられる可能性さえあります。

3:インターネット上で開いているSQLポートは、潜在的な悪意のあるユーザーにとって常に追加の攻撃ベクトルです。リモートのmysqlサーバーのエクスプロイトなどを考えてみてください。

本当にリモート接続が必要な場合は、SSLを使用してください。

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経由です:)

この答えがあなたが探していた答えであることを願っています。

1
timmeyh