HTTPS 接続を使用してクライアント ブラウザと Web サーバー間のトラフィックを暗号化し、Web サーバーと MySQL インスタンスが同じマシン上にあることは既に述べました。
HTTPS 接続が安全であると仮定すると、パブリック ネットワーク上でデータを保護するために必要なのはこれだけであり、ローカル マシンにのみ存在する接続に安全なトンネルを使用すると、不必要な複雑さが増すだけです。
次の例を検討してください。
1 つ目は、安全なトンネルなしで接続がどのように見えるかです。
browser <--HTTPS--> [ webserver <--> mysql ]
したがって、このシナリオでは、Web サーバーと mysql 間の接続は暗号化されていません。マシンにアクセスできる人 (パーミッションに応じて) は、Web サーバー間のすべてのトラフィックを監視したり、ディスクから物理データベースを読み取ったりすることができます。
今、安全なトンネルで
[ webserver <--> stunnel <--ENCRYPTED--> stunnel <--> mysql ]
Web サーバーと 1 つの安全なトンネル エンドポイントとの間の接続、および mysql ともう 1 つのエンドポイントとの間の接続が両方とも暗号化されていないことがわかると思います。このシナリオでは、前とまったく同じように、マシンにアクセスできる誰かがすべてのトラフィックを確認し、ディスクからデータベースを読み取る可能性があります。
追加のセキュリティは達成されていません。
最後に
[ webserver <--> stunnel ] <--ENCRYPTED--> [ stunnel <--> mysql ]
2 つの別個のサーバーを使用している場合、ローカル トラフィックはまだ暗号化されていませんが、stunnelは 2 つのマシン間のストリームを保護します。マシンへのローカル アクセス権を持つユーザーはトラフィックを監視してデータを読み取ることができますが、サーバー間のネットワーク トラフィックを監視するユーザーはできません。
解決策?
とはいえ、PHP と MySQL の間のトラフィックを本当に暗号化したい場合は、同じマシン上であっても、stunnel を使用するよりもわずかに優れたソリューションが存在します。
MySQL はネイティブで SSL をサポートしており、両方がSSL サポート付きでコンパイルされている場合、PHP も同様です。(インストールはすでにこのように構成されている可能性があります。確認するのはあなた次第です)
MySQL のマニュアルには、SSL サポートを使用して MySQL サーバーを構成する方法が詳しく説明されており、PHP は機能を提供します。mysqli_ssl_set
この組み合わせを使用すると、PHP と mysql サーバー間の接続をネイティブに暗号化できます。
[ webserver <--ENCRYPTYED --> mysql ]
ただし、マシンにアクセスできるユーザーは、暗号化されていないデータベースをディスクから読み取ることができ、実行中のプロセスのメモリを観察できる場合があります。
おっしゃる通り、インターネットは危険な場所であり、適切なセキュリティが不可欠です。サーバー自体とそこに含まれるデータが保護されていない場合、データがサーバーに出入りする方法を保護するためにどんな予防措置を講じても、すべてが失われます。