feature image

2021年3月1日 | ブログ記事

DevOpsBOTがエラーを吐くようになった話

どうもこんにちは、20BのSysAd班の@hijiki51です。

この記事はSysAdTechBlogの第一回目の記事です🎉
これ以降も月に1~2本、SysAdTechBlogのタグでSysAdの技術を紹介する記事を出す予定なのでお楽しみに!

早速ですが、つい最近traPサービスの管理に使っているDevOpsBotが一時的に機能しなくなるということがありました。
今回はDevOpsBotの紹介も兼ねて、そのことを書こうと思います。

DevOpsBotとは?

traPで運用している各サービスのデプロイなどをtraQ上から実行できるようにするBotです。

traPtitech/DevOpsBot
Contribute to traPtitech/DevOpsBot development by creating an account on GitHub.

このBotは一年ほど前に@takashi_trapさんが作成してくれました。
最初はMDanke-toのみの対応でしたが、その後追記修正されていき、今はほぼすべてのサービスが対応しています。

開発の経緯

DevOpsBotが開発される以前は、各種開発サービスをデプロイするために権限がある人に依頼する必要がありました。これは開発チームにとって、手間なことだし、権限のある人がメッセージを見てデプロイするのを待たなければならないという問題もありました。

そこでサービスのバージョンアップなど、その開発チームが自由に操作できるようにChatOps化したいという要望のもと、DevOpsBotは開発されました。

仕組み

traQのメッセージをWebhookで受け取り、各サーバーにtrapyojoのアカウントを使ってSSH接続した後、あらかじめ設定してあるデプロイ用シェルスクリプトを実行しています。
実行状況及び結果はコマンドを打ったメッセージへのスタンプという形で確認できます。

サーバーへの認証にはlibnss-jsonを利用しています。

libnss-jsonとは?

UNIX系OSではName Service Swith(NSS)という、システムが使用する各種データの検索順を指定するため機能があります。
デフォルトのNSSだと、SSH接続時のユーザー存在確認をローカルからしか行ってくれないので、サーバーごとにユーザー情報を設定する必要が生じます。そこで、リモートからも読み込むように設定し、かつその設定ファイルをJSON形式で配布できるようにするのがlibnss-jsonです。

Aklakan/libnss-json
JSON bindings for the Name Service Switch (NSS). Contribute to Aklakan/libnss-json development by creating an account on GitHub.

libnss-jsonを用いることで、外部に設定したJSON形式のユーザー情報を利用できるようになるので、その情報をもとにユーザーの存在確認を行います。
存在した場合、AuthorizedKeysCommandに設定したコマンド: curl https://github.com/$1.keysが実行されることでユーザーのGitHubに登録されている公開鍵が取得され、秘密鍵と照合されます。

Deployできなくなった!

原因

trapyojoのSSH公開鍵が消されていたことが原因でした。

なんで?

一年間認証に使われていないSSH鍵はセキュリティ上の理由からGithubから消されてしまうらしいです。trapyojoのSSH鍵は参照こそされどGithubで認証することはなかったので消されてしまったのですね、悲しい。

この後、秘密鍵から再生成した鍵を再登録して解決しました。

SSH キーの削除または紛失 - GitHub Docs
セキュリティ上の理由から、過去 1 年間使用されていない SSH キーを GitHubは自動的に削除します。

まとめ

僕は何もしていませんが(寝て起きたら始まって終わってた)、この記事を書くにあたりSSHの仕組みやNSS周りについての知識を増やすことができました。

hijiki51 icon
この記事を書いた人
hijiki51

20B/理学院 Go書いたり競プロしたり

この記事をシェア

このエントリーをはてなブックマークに追加
共有

関連する記事

2022年4月5日
アーキテクチャとディレクトリ構造
mazrean icon mazrean
2021年5月16日
CPCTFを支えたインフラ
mazrean icon mazrean
2022年3月27日
ReactでToDoリストを作る(後編)
mehm8128 icon mehm8128
2022年3月19日
ReactでToDoリストを作る(中編)
mehm8128 icon mehm8128
2022年3月18日
ReactでToDoリストを作る(前編)
mehm8128 icon mehm8128
2021年4月2日
traQの検索機能が謎のエラーを吐いた話
toki icon toki
記事一覧 タグ一覧 Google アナリティクスについて