こんにちは!技術部プラットフォームグループの染矢です。
この記事では、Google CloudのOS Login機能とIdentity-Aware Proxy(IAP)サービスによって、LinuxサーバーにSSHするためのユーザー管理とネットワーク管理を簡易化する方法を紹介します。
背景
クラウド技術によって、複数のVMインスタンスを簡単に作成できるのが当たり前の時代になりました。
しかし、VMインスタンスをセキュアに扱うには、ログインユーザーのセキュアな管理が必要です。VMインスタンスの数が増えれば増えるほど、また管理者が増えれば増えるほど、Linuxユーザーとその鍵の複雑な管理が必要になります。
また、ログインできるネットワーク経路を制限するために、いわゆる「踏み台サーバー」を設置することもあります。踏み台サーバーとは、内部のサーバーにアクセスするために、外部からのログインを受け付けるためのサーバーです。踏み台サーバーを経由してのみ内部のサーバーに接続できるようにすれば、外部と接点を持つインスタンスの数を減らすことができます。しかし、踏み台としての機能しか持たないサーバーのためにインスタンスを保持するコストを払うことになります。さらに、踏み台サーバー自体をセキュアに保つことにもそれなりの労力がかかります。
ここで、サーバーがすべてGoogle CloudのCompute EngineのLinuxサーバーであれば、これらユーザーや踏み台サーバーの管理をすべてGoogle Cloudに任せることが可能です。具体的には、OS Login機能によってLinuxユーザーをGoogle IDに紐付け、IAPサービスによってアクセスポリシーに従ってTCP通信をネットワークの外から対象のインスタンスに転送できます。 なんとどちらの機能も現在は無料です。
それぞれの機能の概要
あとで実装例として記載する事例を理解するために、最低限必要な概念を簡単に説明します。 正確な説明は公式ドキュメントを読んでいただくのがよいです。
OS Login
https://cloud.google.com/compute/docs/oslogin?hl=ja
OS LoginはGoogle Compute Engineの機能の一つです。
それぞれのインスタンスにおいてLinuxユーザーをGoogleアカウントに紐付けて管理してくれます。ログインするための権限はGoogleアカウントに付与されるIAMで管理されます。
Identity-Aware Proxy(IAP)
https://cloud.google.com/iap/docs/concepts-overview?hl=ja
IAPは、Googleアカウントによる認証プロキシサービスであると表現できます。
外部からGoogle Cloudリソースへのアクセスを保護するために使えます。Googleアカウントに付与されたIAMの権限によってアクセスが認可されます。 HTTPアクセスからの保護だけでなく、TCP通信の転送もしてくれます。この記事では、TCP転送を主に取り扱います。
実装例
具体例として、想定シナリオに沿って実装方法を書いていきます。
外部IPを持たないインスタンスに、Googleアカウントの権限でSSHログインできるようにする
プロジェクトmy-project
のゾーンasia-northeast1-a
にあるインスタンスmy-instance
に、Googleアカウントme@example.com
の権限でSSHログインできるようにします。
インスタンスやアカウントに付与する設定を記述していきます。
OS Login
OS Loginはプロジェクトあるいはインスタンス単位で有効化できます。ここでは、インスタンスmy-instance
でのみ有効化します。
インスタンスmy-instance
のmetadataに次の値を設定します。
- キー:
enable-oslogin
- 値:
TRUE
ちなみに、OS Loginを有効化した時点で、インスタンスにある既存のauthorized_keys
は削除されます。ドキュメントに「VM の authorized_keys ファイルを削除します」と書かれている通りです。検証した挙動からの推測ですが、/home/*/.ssh/authorized_keys
がすべて削除されるものだと思われます。
また、GoogleアカウントがOS Loginをするためには適切なIAMロールを付与する必要があります。アカウントに必要な権限やアカウントが組織に属するかどうかで必要な権限は変わるのでご注意ください。ここでは、同一組織のユーザーであるme@example.com
にroles/compute.osAdminLogin
を付与します。
IAP
まず、インスタンスがIAPのソースレンジからのSSHアクセスを受け付けるようにする必要があります。IAPのソースレンジは35.235.240.0/20
です。VPCのファイアウォールルールで許可IPを追加しておくとよいでしょう。
また、ユーザーがIAPによるTCP転送を実行するためには適切なIAMロールを付与する必要があります。ここでは、me@example.com
にroles/iap.tunnelResourceAccessor
を付与します。
接続してみる
次のコマンドで接続できます。gcloud SDKがマシンにインストールされている前提です。
$ gcloud auth login
# 認証とGoogle Cloud SDK へのアクセス許可のためにブラウザが開く
# ブラウザ上でme@example.comとしてログインし、Google Cloud SDKがGoogleアカウントにアクセスすることを許可する
$ gcloud compute ssh my-instance --project=my-project--zone=asia-northeast1-a --tunnel-through-iap
OS Loginを有効化した後でも、既存のユーザーでSSHログインする
Compute Engineでは、インスタンスのmetadataによって手動でユーザーの鍵を管理できます。 もともとmetadataによってユーザーの鍵が管理されている状態で、検証としてOS Loginを有効化してみたいが、既存の接続方法も残しておきたい、というシナリオを想定してみます。
OS Loginを有効化した後の作業
もともと、インスタンスにuser
というユーザーがおり、user
ユーザーはsudo可能であったとします。
先述の通り、OS Loginを有効化すると、インスタンスのauthorizied_keys
は削除されます。
そのためこの場合、OS Loginを有効化した後に次の作業が必要です。
- authorized_keysの再配置
user
ユーザーのグループ再追加
前者については、ドキュメント中に「OS Login が有効になっている場合でも、ローカル ユーザー アカウントのアクセスをプロビジョニングするように authorized_keys ファイルを構成できます。」と書かれている通りです。 後者については、ドキュメント中に言及されている箇所は見つかりませんでした。Linuxユーザー自体は残るが、sudoersからは外れるという挙動のようです。
OS Loginが有効化されているがuser
ユーザーではログインできない状態であるため、作業のためにOS Loginでログインします。
me_example_com@my-instance:~$ sudo bash -c 'echo ""ssh-rsa AAAAAAA...THIS_IS_USER_PUBLIC_KEY....==' > /home/user/.ssh/authorized_keys
# 最小権限の原則に沿うために、所有者をuserにし、パーミッションを600にするべきである
me_example_com@my-instance:~$ sudo chown user:user /home/user/.ssh/authorized_keys
me_example_com@my-instance:~$ sudo chmod 600 /home/user/.ssh/authorized_keys
# 元のuserがsudoできるべきなら、グループへの追加が必要である
me_example_com@my-instance:~$ sudo adduser user google-sudoers
# 【補足】Ubuntuでは`adduser username groupname`の構文で追加する
# 参考: https://ubuntu.com/server/docs/user-management#:~:text=sudo%20delgroup%20groupname-,Add%20a%20user%20to%20a%20group,-To%20add%20a
これで、OS Loginを有効化したあとでも、既存のユーザーがこれまでと同様にSSHログインやインスタンスでの作業ができます。
プロジェクトとインスタンスをfuzzyに選択してgcloud compute ssh
をしたい
便利スクリプトを作ったので置いておきます。
https://github.com/kesompochy/gcloud-ssh/blob/master/gcloud-ssh
おわり
以上、Google Cloudの機能やサービスによって、VMインスタンスへのSSH接続のためのユーザーと踏み台の管理を簡単かつセキュアにする方法の紹介でした。
IaaSがGoogle Cloudだけで完結しているのであればこのような方法をとることができます。ちなみに、GMOペパボの連結企業であるGMOクリエイターズネットワークでは、IaaSとしてGoogle Cloudを全面的に利用しています。GMOクリエイターズネットワークでは、なんと、エンジニアを積極採用中です。よろしくお願いします!!