GitLabのマネをしました。
作業していたら突然サーバが爆発しました。怖いです。
ええと、何があったのかというと、ミスってWebアプリのデータの大部分を吹き飛ばしてしまいました。 個人鯖じゃなくて、大学サークルの部内システムが全部乗っかってるサーバなのでやばばばいです。
原因
これです。Win機ではいつもrloginというsshクライアントを使って作業しているんですが、 このクライアントにはコマンドを複数のサーバに同時送信する機能が搭載されています。
ボクはこの事を知らなかったんですが、クリックミスでいつの間にか有効化してしまっていたんですね。
で、このときボクは来る新入生歓迎CTF大会の鯖を構築していました。 設定ファイルをコピーするために、メインサーバにもSSHログインした状態でした。 鯖構築序盤なので、いろいろ試行錯誤しつつrm -rf
なんかも連打してたんですね……
本鯖にもrm -rf
が飛んでることなど露知らず……! メインサーバ落ちてるよ~って連絡を受けて確認したらすっかりCTFサーバと化したメインアプリサーバが……。
被害
バックアップ等から復元して、ほとんどのアプリは事なきを得たのですが、部内SNS(内製)だけが致命的な打撃を被りました。
一番被害が大きかったのがアップロードされたファイル群です。これらが一時全て削除されてしまいました。 これらは、非常に大容量なので別の場所にバックアップするのが億劫になって放ったらかしになっていたのでした……
また、重要な設定ファイルが損失してこちらの復旧も非常に大変でした。
対応
4/16夜から4/17早朝にかけてのお話です
19:40 CTF鯖が起動
サーバ構築を始めました。この時点でコマンドブロードキャストが有効になっています。 (そういえばカーソルが変な形になってて妙だな……と思っていたのでした。。。)
20:00 メインサーバに致命的なコマンドが飛ぶ
ちょっとやり直そうと思ってrm -rf
で色んな所消しました。 メインサーバの大事なトコロにも直撃してます。
20:10 メインサーバの死が報告され始める
— 乾 ぱん (@NorthWest_Bread) April 16, 2017
この時点では何が起きたのか分かってません。
20:30 全てを悟る
さっきまで弄っていたCTF鯖とメイン鯖の.bash_history
が一致しているのを見て何が起きたのか気が付きました。 (なるほどね)(時既に遅し)(やばい)
20:40 メインサーバを止める
復元することを考えて、ディスクに上から書き込まれてしまわないようにサーバを止めました。 ddrescue
でディスクをダンプしておきました。
20:50 いろいろ試してみる
extundeleteとかを試してみますが、歯が立たず。
21:00 データが無事なアプリを別サーバに移す
とりあえず、ディスクをダンプしたデータから無事なアプリを復旧する作業に移る。 新しくサーバを立て直します。
22:00 gitホスティングサービスが復旧
メンテナンス用コードなんかも入っているので真っ先に復旧させました。
22:30 ブログが復旧
ブログにアップロードされたデータは全てオブジェクトストレージに逃がしていたので、無傷でした。
22:50 wikiが復旧
wikiも同じく、データの大部分がオブジェクトストレージにあるため無事。
23:00 photorec/foremostでファイルを救出する作戦に出る
extundeleteが不発だったので、👆を使ってファイルを抜き出します。 ただし、ファイル名がわからなくなってしまうのでDBとの整合性を取る作業が非常に大変になりそうだなぁとか思ってました。 そもそも、アップロードされたファイルの情報は元のファイル名とサイズとタイムスタンプ、MIMEタイプしかありません。 このなかで使えるのはMIMEタイプとファイルサイズのみです。
00:30 DBマイグレーション時の対応表を発見
昔にDBスキーマを変更したときのバックアップデータを見つけました。 このデータを使うことで、約30%のデータが完全復旧できました。
02:30 復元スクリプトが完成
photorec/foremostを併用してデータ復元作業を行います。
03:10 復元完了
およそ 75% データが復元できました。 13% のデータは、破損していて元に戻せませんでした。 残りの 12% は、データはおそらく拾い出せているが、同じサイズやMIMEタイプのデータが複数存在するため、元のファイルがどれかわからない状態です。 こちらについては、人力で対応表を作ればもとに戻せる可能性はあります。
03:20 部内SNS復旧作業
こちらもなかなか難航しました。 なくなってしまったファイルの扱いについて、アプリの改修を行う必要がありました。
部内のシステムは全て独自方式SSOで接続されており、ここでは公開鍵暗号を使って認証を行っています。 ここで用いていた権威サーバの秘密鍵が失われたので、アプリ側に配布している公開鍵を全て更新する作業が必要になりました。
また、APNsやGCMの通知に使うキーも失われたので再発行を行いました。
05:00 再開
全て元に戻りました。 25%くらいのデータが欠けてしまいましたが……。
まとめ
対策
- バックアップは取る
- むやみにrootにならない
- いちいちsudoうつの面倒だったんだもん><
extundelete
無能 (ext4だったからね)
photorecとforemost
photorecで戻せたけどforemostで戻らないファイルとか、その逆もある。 両方合わせて使うと良いかもしれない。あとCTFer御用達のbinwalk
でも似たようなことができるのかな?
感想
同時送信怖すぎる…… というかもっとわかりやすく表示してくれ
お陰でCTFの準備が一ミリも進んでなくてマズい というかリアルにフォレンジックすることになるとは思わんかった
教訓にします
ゴメンナサイm(_ _)m