Google Cloud SQL インスタンスはデフォルトではインターネットに公開されていません。サポートされている接続方法の1つは Cloud SQL Proxy で、Cloud SQLインスタンスをローカルポートにマッピングできます(たとえば、localhost:3306
)またはUNIXソケット。
サービスアカウントで認証しています。これは、実際には公開鍵と秘密鍵のペアです(ファイルとして、またはメタデータを介してCompute Engineインスタンスにアタッチされます)。
私の疑いは、stunnelと同様に機能し、サーバーがmysqlプロトコルをトンネルするSSLサービスを公開し、クライアントがクライアント証明書で認証することです。このプロトコルがどのように機能するかについての詳細情報はありますか?
どの接続が行われるか、どのようにキーが使用されるか、どの暗号化方式が使用されるか、および一般に、どのセキュリティ原則が接続を保護しているかを理解したいと思います。
同じサービスアカウントの認証情報を再利用して、自分のデータベース(Redisなど)への接続を認証できますか?もしそうなら、どうですか?
ありがとう!
クラウドSQLインスタンスのパブリックIPをnmapすると、次のようになります。
$ nmap -Pn -p 3306,3307,5432 35.197.181.190
Starting Nmap 7.70 ( https://nmap.org ) at 2019-07-13 01:11 AEST
Nmap scan report for 190.181.197.35.bc.googleusercontent.com (35.197.181.190)
Host is up (0.020s latency).
PORT STATE SERVICE
3306/tcp filtered mysql
3307/tcp open opsession-prxy
5432/tcp filtered postgresql
Nmap done: 1 IP address (1 Host up) scanned in 1.48 seconds
ポート3306および5432は、ファイアウォールによってフィルタリングされます。 Cloud SQL APIを使用して一時的にIPをホワイトリストに登録し、標準のデータベースクライアントを使用して接続できます。
ポート3307は常に開いており、TLS暗号化接続を受け入れます。 TLS接続には、そのクラウドSQLインスタンスに固有の認証局によって署名されたクライアント証明書が必要であり、プロキシは Cloud SQL APIのsslCerts部分 から一時/一時TLS証明書をリクエストします。
次に、Cloud SQLプロキシは、クライアントが接続するポート3306または5432でローカルに提示される(通常)ローカルにあるこのポートへのトンネルを開きます。