GCEからGCS上のSSL証明書を参照する方法 | Google Cloud Platform

今回はGCE(google compute engine)からGCS(google cloud storage)上のSSL証明書を参照する方法についての備忘録です。

【事の発端は、、】

Google Cloud Platform上でwebサービスを構成する上でインスタンスグループに対してSSLを行いたいとき、基本的にはインスタンスグループにHTTPS ロードバランサを接続し、Google マネージド証明書をHTTPS ロードバランサに適用することで、これを可能にします。

今回は訳あって上記の方法が使用できないケースのお話です。

まずインスタンス単体(1機)の場合、インスタンス内にSSL証明書を配置すれば問題なくSSLが行えます。

しかしインスタンスグループのようにGCEを複数使用しているとき、同じ証明書を参照するためには、、同じものを2つ配置するの??となってしまいます。

そのため今回はSSL証明書を外部のGCSに配置してそれを両インスタンスから参照する作業に取り掛かりました。

 

【GCEからGCSへのマウント】

こちらにはCloud Storage FUSEを使用しました。
インストール等は公式のドキュメントを見るだけで難なく行えます。

Cloud Storage FUSE公式ドキュメント

ドキュメントにもありますが、

gcsfuse {GLOBAL_OPTIONS} {BUCKET_NAME} {MOUNT_POINT}

だけでGCSのバケットがGCE内にマウントされます。

 

【SSL証明書周りのコピー】

こちらはcpコマンドで行います。
今回はletsencryptを採用していますので、
/etc/letsencrypt 以下のディレクトリをそのままマウント先にコピーします。
それだけでGCSへのアップロードが完了します。

前回cloud functionsからGCEへsshコマンドを飛ばす記事を書きました。
こちらはletsencrypt(certbot)の更新用に使用していますので、このコマンドの後に上記のcpコマンドも飛ばしてあげることでSSL証明書の更新とGCSへのアップロードが同時にできます。

【SELinuxの設定を変更する】

nginx.confのSSL証明書の位置をマウント先へ変えていざ起動!!

実はこのままでは起動しません。。

SE Linuxが邪魔しているからです。

lsコマンドに – Z オプションを付けてマウント先のファイルのタイプを見ると、
system_u:object_r:fusefs_t:s0
となっています。
fuseによってマウントしたファイルのタイプは上記のようになるそうです。
それによってSE Linuxにはじかれてしまします。

そのため

sudo setsebool -P httpd_use_fusefs on

/* 結果確認用 */
getsebool httpd_use_fusefs
httpd_use_fusefs --> on  /* onならOK */

これでfusefs_tのタイプがSE Linuxによってはじかれなくなります。

 

【Cloud Storage FUSEによるマウントの永続化】

公式ドキュメントにある方法で起動時に自動的にマウントを行うように設定します。
ネットワーク起動タイミングの後にあるように_netdevを入力します。

/* /etc/fstabに追記 */
# # /etc/fstab 
# Created by anaconda on Wed May 18 17:47:57 2022 
# # Accessible filesystems, by reference, are maintained under '/dev/disk' 
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info 
# 
UUID=f9701201-0ee2-4d41-921e-xxxxxxxxxxxx / xfs defaults 0 0 
UUID=xxxx-xxxx /boot/efi vfat defaults,uid=0,gid=0,umask=0077,shortname=winnt 0 0 
{バケット名} {マウント先} gcsfuse rw,_netdev,allow_other /* <---ここを追記 */

 

/etc/fstabを設定後、「systemctl daemon-reload」コマンドを実施または再起動すると、マウント Unit ファイルが /run/systemd/generator/ ディレクトリに作成されます。
起動順序が大事になってくる場合はこちらのUnitファイルを変更してみてください。
今回はnginx.serviceよりも前にマウントを行う必要がありますが、
マウントのユニット→空のターゲット(remote-fs.target)→nginx.service
という順番だったので変更の必要はありません。
サービスの開始タイミングについては
systemd-analyze plot
のコマンドを叩くとグラフ表示されますのでこれを確認して行うと進めやすいです。
【おわりに】
インスタンスグループでSSLを行う場合はgoogleマネージドの証明書を使用するのがセオリーなせいか、SSL証明書をGCSに配置する記事はありそうでなかなか見つかりませんでした。
箇所箇所の内容もGSP周りやLinuxがある程度わかっていないとできないことばかり。
特にSE Linuxの設定やsystemdのunitの起動順序あたりは非常にややこしいなと思っています。
ここら辺を一気にスキップできる”HTTPSロードバランサー×インスタンスグループ×googleマネージド証明書”の組み合わせは、改めて強力だなと感じました。

--------------------------
システム開発のご要望・ご相談はこちらから

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です