見出し画像

cogを用いたSSH通信の改善

*この記事は2020年10月30日にSREチームメンバーのピート・エマーソン)Pete Emersonによって書かれた記事です。

私が2019年1月にStandard Cognitionに着任したとき、ベアメタルサーバーへのSSHアクセスは非常に散らかっていました。
 
Saltによるユーザー管理はまだ始まったばかりでしたが、エンジニアはパスワード付きのアカウントを追加するためにsudo /usr/sbin/useraddを実行し、運が良ければカスタムスクリプトでSSHキーをプッシュしていたかもしれません。
 
SREチームが誕生したことで、これからはもっと良いものに移行する必要があると思いました。当時、NetflixのBLESSのようなものがあれば素晴らしいとは思っていましたが(私たちはAWSショップではありませんが)、そこまで大きな仕事に挑戦するのは意味がないと思いました。
そこで、以前にもやったことのある、Ansibleによるユーザー管理を導入してみました。ユーザー管理をかなり良い状態にした後、この問題を片付け、他の問題に目を向けました。
私がAnsibleで実装したユーザー管理には、いくつかの重大な欠陥がありました。: そのため、SSH キーをプッシュする必要があり、インフラ全体で Ansible を実行することになりました。ユーザーのアクセス権を削除することも同じ意味でした。
オンボーディングは単純なものではありませんでした。:エンジニアが自分のキーと UID と GID を定義した YAML を PR として提出すると、PR を受け入れ、工場全体で Ansible を実行し、ユーザーに初期の 2FA コードを与えます。 (libpam-google-authenticator を使っていました。) ユーザーは、私たちの要塞ホストにSSH接続して、URLを示すファイルをキャットし、ブラウザでそのURLにアクセスし、QRコードを2FAアプリにスキャンし、その後のログインにそれを使用するのです。
綺麗ではなかったですが機能しました。
2019年第4四半期、私はユーザー管理に再び目を向けることができました。より良いユーザーエクスペリエンスと、より良い管理エクスペリエンスを求めていました。多要素認証を保持したかった¹ SSH公開鍵の押し付け合いを止めたかったのです。¹
既存のものでは、私たちのニーズにぴったり合うものがありませんでした。HashiCorp Vault署名付きSSH証明書を作成できることは知っていました。Google Identity Aware Proxyを使用していました。これらの部品を組み合わせることは理にかなっていました。
cogはMITライセンスでオープンソース化されています.一旦デプロイされると、cogはエンドユーザに対して透過的です。
彼らはcogのバイナリ(彼らの環境に特化したもの)をダウンロードし、cog initを実行し、その後は通常と同じようにSSHを使用することができます。
舞台裏では、cogはHashiCorp VaultへのIdentity-Aware Proxyを作成し、OIDC経由でログインして、SSH証明書に署名を受けます。その後、目的のホストにSSH接続し、中間ホップとしてBastionホストを使用します。
その裏側では、こんなことが行われているのです。:


¹OpenSSH 8.2 は FIDO/U2F ハードウェア認証をサポートしており、これはおそらくパズルのもうひとつの興味深い部分でしょう。 
² ACLはLDAPなどとの連携で簡単にできるかもしれません。残念ながら、GoogleはOIDCのログイン時にグループ情報を提供しないので、そのような方法でパーミッションの設定を行うことはできません。