GitHubやSTNSと会話して公開鍵を取得・更新するツールkeypを作った

GMOペパボではLinuxユーザ、グループの管理にSTNSやOCTOPASSを利用しています*1

stns.jp

github.com

これらは簡単に言うとそれぞれTOMLファイルやGitHub(GHE)のユーザ情報をデータソースとしてLinuxユーザ、グループ、さらに公開鍵の管理をするものです。

正直何台あるかわからないサーバがSTNSやOCTOPASSを通じてユーザ、グループ管理されていることで「ログインできる必要があるサーバには即ログインできる」ということが実現されており、これらがない環境は正直考えられなくなってきています。ログインユーザ、グループ管理、公開鍵管理に疲弊している方は是非導入を検討して欲しいです。

さて、STNS/OCTOPASSはとても便利なのですが、実際の環境では様々な理由によりSTNS/OCTOPASS配下になっていないユーザも存在しています*2。本当に稀ですがそれらのユーザでログインするための公開鍵の登録作業が発生する事があるのも事実です。

細かいですが、上記のようなシチュエーションでも公開鍵をSTNSサーバ/GitHubと連動するようにするツールkeypを作成しました。

github.com

keyp

keypはGitHub(GHE)やSTNSサーバと会話して公開鍵を取得・更新するツールです。

例えばGitHubのユーザ alicebob と org my-org の team developers に所属しているユーザの公開鍵をまとめて取得したいときは、 keyp collect コマンドで

$ keyp collect -b github -u alice -u bob -t my-org/developers
ssh-rsa C1yc2EAAAADAQABAAACAQCmnCCt6PyH9jLZbPkMijSJYIu14nhxyFVw9M9eAkgcMQ3EsKf86GWlGPDfZcqcDqI+LP7LKQk4kAlmLOQQMavthrhGEURxxdX0Yk2A6pHjG3zrcW7X30ZBMwOzX/a6EWkPXPwPH6LcP3rM9yEIg95f2JntxO3z7l/8QjzJCoPIlqyoX4I7bxHus/rZVnRNh9C0PbUejbg/iWaTTxkNglSeEYpW+ID2k/4Absisa5XyY2zEOMw+6OyfRL9AlfGYv545J0g90qWS11iRSFnMR7A6FNUea/pVESIMmmBI56Ne+S8NmwR724u3d5kNJxuAKpmtThNPdxW/vmtuc5XBZgtPX/rzdAW0TQZvpVoLnoKaqYgfIpcrrkSAoPlcVxfq/NrpVlbIi6c9rZRZR4dcqmAK2eBGuDQZBiYJSESuPbE6i08GGnM8OblD8pshVeGMStztR+NuXywIXbRpyqNF2VNjil8r4qGNW9AB8ZVUB/1s6U8oxvtlbABoxXLrdNlKj3rl2YoPIZyCLAp9QDch8P1SnmQTEZK67YY5KNQrJZ2ql7pblo84JqsRbwuOrexTz6xrbBWFZMHWorFqF8ryX0LOw9TIaHbYqleynhqJ0a8VJHZMmwndYKjw3brtJ3SfCpXU0826LOExWXcjfBqHK65gM+MQ==
ssh-rsa AAADAQABAAACAQC8IEt4MqBed/yXQyjUTCZRdZoCUNhm0bEkOV8Ef5TduQvMIPDpBYyYIvFz7jxJyShPoiTMtIUnkkA2aDF0jhujFzqKmYm9H2tS7Tpf5iNwRJgJJJWv674tGUcu+6+ZadmDBQ//dwo8XWTHxmkWfgaybxs8/o0AlwZQ4pYFcky0q+/qP4cwPAmRW0rGCo0E5BhS/5eGssoLBXu4/Hcaz/93H8AtAe1UQrlCKma0rj0HIA9A9Q9EQtunw/zJTBtTyzE/TvxKcSMNulgdVmFSRmU6l84Ftc6tZPoiaCnxcvQUyjCEeQfy4DbtCWe1tEubyKeBLBTXTnpqWA3Gs9GryQA/bR7Ivan/03FshLFeVVnbvvO11sKNvkAJ8u417Q2/G9bcB1H30Xa9PSRE+2CbQ2maafhPVL17TJVBvkDCM5trmwxfM2tdlKA7R+mTj9nIrSLN4BYrge8IZ1fesC/sKMlMwhNEOrQYQQIZMIx8hfLAS37D8wbUPRodQFJsolrK6cHlNICR/TLcijNhCeHJkD8448EuJn1BCbYKglG7eUYKLbMXcVJAoTPlFTHPU80oaHJhmpLe0vFSxrhWVf/ha81zRefXOiye7Pbn/h+sa2qsKTnAMShpS1m+RP7QmHNmFAbHlPeTlnd0oJI/bt5Mysn5HHjX4vAJdQ==
[...]

というように一気に取得できます。

特定のLinuxユーザの ~/.ssh/authorized_key を更新するためのコマンドも用意しています。

ubuntu ユーザの ~/.ssh/authorized_key をSTNSで管理しているユーザ k1low とグループ some-team-developers に所属しているユーザの公開鍵で更新したいときは、rootユーザで以下のように keyp update-authorized-keys コマンドを実行すれば一気に更新してくれます。

$ keyp update-authorized-keys ubuntu -b stns -u k1low -g some-team-developers

また、CIで利用しているなど登録している公開鍵が上書きされたくない場合は --keep-key オプションで公開鍵の部分文字列を指定しておけば、部分文字列にマッチした鍵を上書きで消すこともありません。

上記 keyp update-authorized-keys コマンドをSystemd TimerやCronに登録しておけば簡易的な公開鍵同期の仕組みの出来上がりです。

まとめ

というわけで、ちょっと(いやかなり)細かいですがこれで公開鍵登録作業などがなくなればいいなと思っています。

他にどんな人に使ってもらえるかなーと思ったのですが、

  • ISUCONのデプロイユーザの公開鍵登録
  • 「ユーザ、グループの管理までしたいわけではないがデプロイユーザだけは公開鍵管理したい」みたいなプロジェクト
  • 公開鍵の登録方法(登録コマンド)を統一したい(プロジェクトAとBとCとDでいちいち新規メンバーの鍵をTerraformやChefやAnsibleなどのプロビジョニングツールに1つ1つ書いて運用するのが面倒)
  • 深遠なる理由でsshdの設定変更までは手が出せない

というところまでで力尽きました。

誰かに刺さればいいなー。

*1:他にも認証方式で採用しているものはあります

*2:例えば、初期構築時のユーザなど