Postmortem Gitlab-CI実行不能になった件

作成日

20200915

障害発生期間

20200908 19:43 ~ 24:21

作者

SRE部 Zhai

ステータス

CIが正常に回されるようになった。
恒久対策も取っており、再発の可能性が極めて低いかと思われる。

サマリ

前任担当者が退社された後、日々普通のように運用されていたgitlabが、突如CIが実行不能となった。
原因は、CI関連のコンポーネント内弊社独自ドメインのdocker registryにloginするための認証情報がLDAPを使われており、
一度無効化されたら、docker loginできなくなったと判明。

インパクト

全gitlabプロジェクトのCIが5時間程度コケた。

根本原因

ミドルウェアなどの構築において、絶対に状態不確定な認証情報(LDAPユーザー)は関連させてはいけない、という一般的ルールに沿ってなかった

発生原因

・gitlabまわりの引き継ぎが完璧ではなかった
・社内規定通り、退職済みの前任担当者のLDAPアカウントが無効化されたのがきっかけ

対応

エラーメッセージ、該当アプリlogまわりから手がかりを探し、
googleや社内ドキュメント頼りにヒントをリサーチ、最終的に問題となったdocker login認証情報の場所を特定

検出

アプリチームからCIがコケたとの連絡

アクションアイテム

1.問題特定

Zhai
関連コンポーネントの該当時間帯のlogを逐一チェック

2.ヒント助言

G.Fさん
関連コンポーネントの該当時間帯のlogを逐一チェック

3.助言&障害アナウンス注意喚起

Sさん
railsアプリであるgitlabのハマりやすいポイントをアウトプット&障害アナウンスすべきと指摘

5.一時問題解消

zhai
自分のLDAP認証情報を差し替えサービス復帰させた

6.恒久対策

zhai
ローカルadminユーザーを作り、LDAP認証情報を差し替え、認証情報無効化のリスクをなくした

教訓

うまくいった事

・早期発見できて、当日解決でさらなる被害拡散は発生しなかった
・たくさん助言をいただき、問題特定に繋がった

うまくいかなかった事

・各コンポーネントのlog保存場所は違って、探すのに大変時間をかかった
・LDAPユーザーがあやしいとかなり初期の段階で感じたものの、手入力で自分のLDAPアカウントでdocker loginできないことを目を取られ、その認証情報格納場所は最後の最後でようやく発見した

幸運だった事

・問題発生時は定時後で、利用者が少なかった
・前任担当者とgitlabまわりの共同作業があって、ある程度、システムのアーキテクチャーを把握してる

再発防止の為にできる事

LDAPアカウントではなく、ローカルadminアカウントを新規作り、その認証情報を利用した

タイムライン

【20200908】
19:43 chatworkより、gitlab-ciがコケてる情報を入手
19:50 同一リポジトリで、他ユーザで問題再現
20:07 他リポジトリで、同一問題再現
20:30 各所ログを精査したところ、権限まわりに不備があるように思われた
20:40 CIがregistry.{弊社独自ドメイン}.jpへdocker loginできず、リトライした末失敗したと症状を判明
21:10 退職済みの先任担当者のLDAP情報はgitlab-ciに使われてるような痕跡を発見し、LDAPユーザー無効化によるdocker login認証エラーかと思われた
22:10 早期解決できず、全社に障害アナウンス
23:37 ドキュメントを参照に、障害ポイントのgitlab-ciはrunnerというコンポーネントで、それの元はbase-runnerであることを判明
24:10 base-runnerの.docker/直下のconfigファイルにbase64化され前任担当者のLDAP認証情報と思われるデータを発見
24:19 一時対策として、認証情報を差し替え、service再起動後、ci復活を確認
24:24 全社に復帰アナウンス
……
【20200911】
18:30 恒久対策として、gitlabローカルadminユーザーを作り、認証情報を再度差し替え、動作確認済み

参考情報

https://docs.gitlab.com/ee/administration/logs.html#productionlog
https://docs.gitlab.com/ee/ci/docker/using_docker_images.html#define-an-image-from-a-private-container-registry
https://openreggui.org/git/help/ci/docker/using_docker_images.md