どうもこんにちは、20BのSysAd班の@hijiki51です。
この記事はSysAdTechBlogの第一回目の記事です🎉
これ以降も月に1~2本、SysAdTechBlogのタグでSysAdの技術を紹介する記事を出す予定なのでお楽しみに!
早速ですが、つい最近traPサービスの管理に使っているDevOpsBotが一時的に機能しなくなるということがありました。
今回はDevOpsBotの紹介も兼ねて、そのことを書こうと思います。
DevOpsBotとは?
traPで運用している各サービスのデプロイなどをtraQ上から実行できるようにするBotです。
このBotは一年ほど前に@takashi_trapさんが作成してくれました。
最初はMDとanke-toのみの対応でしたが、その後追記修正されていき、今はほぼすべてのサービスが対応しています。
開発の経緯
DevOpsBotが開発される以前は、各種開発サービスをデプロイするために権限がある人に依頼する必要がありました。これは開発チームにとって、手間なことだし、権限のある人がメッセージを見てデプロイするのを待たなければならないという問題もありました。
そこでサービスのバージョンアップなど、その開発チームが自由に操作できるようにChatOps化したいという要望のもと、DevOpsBotは開発されました。
仕組み
traQのメッセージをWebhookで受け取り、各サーバーにtrapyojoのアカウントを使ってSSH接続した後、あらかじめ設定してあるデプロイ用シェルスクリプトを実行しています。
実行状況及び結果はコマンドを打ったメッセージへのスタンプという形で確認できます。
サーバーへの認証にはlibnss-jsonを利用しています。
libnss-jsonとは?
UNIX系OSではName Service Swith(NSS)という、システムが使用する各種データの検索順を指定するため機能があります。
デフォルトのNSSだと、SSH接続時のユーザー存在確認をローカルからしか行ってくれないので、サーバーごとにユーザー情報を設定する必要が生じます。そこで、リモートからも読み込むように設定し、かつその設定ファイルをJSON形式で配布できるようにするのがlibnss-jsonです。
libnss-jsonを用いることで、外部に設定したJSON形式のユーザー情報を利用できるようになるので、その情報をもとにユーザーの存在確認を行います。
存在した場合、AuthorizedKeysCommandに設定したコマンド: curl https://github.com/$1.keys
が実行されることでユーザーのGitHubに登録されている公開鍵が取得され、秘密鍵と照合されます。
Deployできなくなった!
原因
trapyojoのSSH公開鍵が消されていたことが原因でした。
なんで?
一年間認証に使われていないSSH鍵はセキュリティ上の理由からGithubから消されてしまうらしいです。trapyojoのSSH鍵は参照こそされどGithubで認証することはなかったので消されてしまったのですね、悲しい。
この後、秘密鍵から再生成した鍵を再登録して解決しました。
まとめ
僕は何もしていませんが(寝て起きたら始まって終わってた)、この記事を書くにあたりSSHの仕組みやNSS周りについての知識を増やすことができました。