(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【GCP】CloudSQLをSSLコネクションで利用する

スポンサーリンク

はじめに

GCPにはCloudSQLというMySQLまたはPostgreSQLのPaaSが提供されており、以下に該当しない場合は利用が推奨されています。

  • DBサーバに対して特定のOS要件がある
  • DBの構成ファイルに対して特定の要件が必要である
  • DBのバックアップに関して特定の要件がある

VMを用意し、自分が用意したDBサーバとの接続であればDBの知識のみで対応可能ですがPaaSになればプラットフォームを提供するサービスについて新たに学ぶ必要が出てきます。

本記事ではGoogleCloudPlatformにてCloudSQLというPaaSを利用した際にクライアントとなる仮想マシンからSSL通信にてDB接続するあたりを解説します。

DBサーバを用意する

メニュー画面におけるSQL > Create a Cloud SQL instanceにてDBインスタンスを生成できます。

DBはMySQLかPostgreSQLから選択します。他にもディスクをHDDかSDDにするか、バックアップの設定、そしてrootユーザのパスワードを設定します。作成するとGUI上でIPアドレスが確認できるので、こちらをメモしておきます。

DBサーバと接続するために仮想マシンを用意します。

$ gcloud beta compute instances create test-client ...

Created ...test-client.
NAME         ZONE           MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP  STATUS
test-client  us-central1-a  n1-standard-1               X.X.X.X   Y.Y.Y.Y  RUNNING

仮想マシン側はクライアントなのでmysql-clientをインストールします。

$ apt-get install mysql-client

あとはDBインスタンスのIPアドレスを指定してrootユーザで接続すればDB接続が可能です。

$ mysql --host=ZZ.ZZ.ZZ.ZZ -u root -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is XX
...
MySQL [(none)]> 

ちなみにパスワードを間違えると以下のようにエラーとなります。

client:~$ mysql --host=$IP_ADDRESS_SQL -u root -p
Enter password: 
ERROR 1045 (28000): Access denied for user 'root'@'ZZ.ZZ.ZZ.ZZ' (using password: YES)

ここから、SSLでの接続する方式に切り替えます。

SSL通信に切り替える

こちらはInstance Detail > CONNECTIONS > SSL>にある「Allow Only SSL connectionsの箇所を押下するのみです。

そうすると以下の3ファイルがダウンロードできます。

  • server-ca.pem
  • client-cert.pem
  • client-key.pem

試しにサーバ証明書の中身を見てみました。

$ openssl x509 -text -noout -in server-ca.pem
...
Issuer: dnQualifier=XXX, CN=Google Cloud SQL Server CA, O=Google, Inc, C=US
...

認証局(Certification Authority)証明書にあたるものですね。

補足 SSL証明書関連


あとはVM側に配置し、接続オプションを以下のように指定して接続します。

$ mysql -u root -p -h ZZ.ZZ.ZZ.ZZ --ssl-ca=server-ca.pem --ssl-cert=client-cert.pem --ssl-key=client-key.pem
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is X
...
MySQL [(none)]>

試しに初めの接続方法で接続しにいくと

$ mysql --host=ZZ.ZZ.ZZ.ZZ -u root -p
Enter password: 
ERROR 1045 (28000): Access denied for user 'root'@'ZZ.ZZ.ZZ.ZZ' (using password: YES)

パスワード誤りのようなエラーコードですが、こちらはSSLによるエラーです。

一部の引数を不足させると

$ mysql -u root -p -h ZZ.ZZ.ZZ.ZZ --ssl-ca=server-ca.pem --ssl-cert=client-cert.pem
Enter password: 
SSL error: Unable to get private key from 'client-cert.pem'
ERROR 2026 (HY000): SSL connection error: Unable to get private key

それらしいエラーが出ます。

終わりに

サーバ間の接続を秘匿にする要件は、クラウド上でのやりとりにおいて特に重要です。
該当の作業を行う際の、参考になれば幸いです。