GCEのファイアウォールでsshを制限しながら、GCPのブラウザからのsshもできるようにする


やりたいこと

SSH制限されたNWなど、sshできないのでクラウド上のサーバーにアクセスできない。
そんな環境で役に立つのが、GCPのブラウザからのsshの機能。
GCPのコンソール画面から、GCEのWEBターミナルを起動できる。
GCPのこの機能は地味に気に入っている。

公式の画像

しかし、この機能はssh許可やパブリックIP付与が必要になる。
セキュリティポリシーで、サーバーへのsshの制限が必要だけど、アクセス経路としてGCPのブラウザからのsshを使いたい場合のメモ。

(2020/11/13)もっと良い方法が出てきたので、こっちの記事参照

GCPのブラウザからのsshの条件

GCPのブラウザからのsshの機能だが、
GCEのファイアウォールで外部のSSHを制限しようとしたり、
グローバルからアクセスできるパブリックIPアドレスのないノードだったりするとアクセスできない。
理由は下記のとおり

公式からの抜粋

  • ポート上の SSH アクセスを許可するファイアウォール ルールがない。 ポート 22 上の SSH アクセスは、すべての Compute Engine インスタンスでデフォルトで有効になっています。アクセスを無効にしている場合、ブラウザからの SSH は機能しません。22 以外のポートで sshd を実行する場合は、カスタムのファイアウォール ルールを使用してそのポートへのアクセスを有効にする必要があります。

  • SSH アクセスを許可するファイアウォール ルールが有効になっているが、GCP Console サービスからの接続を許可するように構成されていない。ブラウザベースの SSH セッションの送信元 IP アドレスは、GCP Console によって動的に割り当てられ、セッションごとに異なることがあります。この機能を動作させるには、任意の IP アドレスからの接続、または公開 SPF レコードを使用して取得できる Google の IP アドレス範囲からの接続を許可する必要があります。

公開 SPF レコードを許可IPにする

2019/9/3時点の公開 SPF レコードは以下のとおり。

_netblocks.google.com
>nslookup -q=TXT _netblocks.google.com 8.8.8.8
"v=spf1 ip4:35.190.247.0/24 ip4:64.233.160.0/19 ip4:66.102.0.0/20 ip4:66.249.80.0/20 ip4:72.14.192.0/18 ip4:74.125.0.0/16 ip4:108.177.8.0/21 ip4:173.194.0.0/16 ip4:209.85.128.0/17 ip4:216.58.192.0/19 ip4:216.239.32.0/19 ~all"
_netblocks2.google.com
>nslookup -q=TXT _netblocks2.google.com 8.8.8.8
"v=spf1 ip6:2001:4860:4000::/36 ip6:2404:6800:4000::/36 ip6:2607:f8b0:4000::/36 ip6:2800:3f0:4000::/36 ip6:2a00:1450:4000::/36 ip6:2c0f:fb50:4000::/36 ~all"
_netblocks3.google.com
>nslookup -q=TXT _netblocks3.google.com 8.8.8.8
"v=spf1 ip4:172.217.0.0/19 ip4:172.217.32.0/20 ip4:172.217.128.0/19 ip4:172.217.160.0/20 ip4:172.217.192.0/19 ip4:108.177.96.0/19 ip4:35.191.0.0/16 ip4:130.211.0.0/22 ~all"

GCEのファイアウォールルールに上記の_netblocks.google.comのセグメントと、_netblocks3.google.comのセグメントをssh許可にする。
※IPv6はGCEでサポートしていないので不要
公式:IPv6 はまだ Compute Engine 上でサポートされていないため無効になっています。

所感

上記の対処だと、
- 許可しているIP範囲広い
- パブリックIPなしはブラウザsshできる踏み台(Bastion)サーバを利用する
- いつのまにか公開SPFレコード変わってたらやだなー
といったところが残り、解決しきった感はない。

GCEはデフォルトでSSH許可されているし(鍵認証で外部アクセスを制限)、
BeyondCorpな考え方がベースにあるのかなとも思うけど、
ブラウザからのsshはグローバルからではなく、GCPのプライベートから可能にするか、せめて許可IPの範囲を狭めてほしいなーと思う。