この記事はアイスタイル Advent Calendar 2020の20日目の記事です。
アイスタイルTechブログをご覧の皆様、はじめまして。
株式会社アイスタイルにて通知基盤を担当しています、usuitです。
通知基盤とはPush通知を送る社内基盤や、アプリで表示されるユーザーへのお知らせを返すAPIなどで構成されるサービスです。
今日のテーマはタイトルのとおりです。
ややショッキングな内容ですが、先日、私のミスによって社内のステージング環境のサーバー1つに接続不可能になってしまいました。
反省と自戒の念を込めて事の詳細をこのブログに記すことにした次第であります。
また、内容は事件が起きた経緯と反省がメインとなっており技術的な話はあまりありません。
あらかじめご了承ください。
前提
- 葬り去ったサーバーは物理サーバーではなく、仮想マシンとしてのサーバーのことです
ことの始まり
11月の下旬、通知基盤のDBにデータを登録する簡単なバッチプログラムを作成しました。
データを登録するだけのツールであるため、実装は問題にはなりませんでした。
問題はこのツールのデプロイ方法でした。
もちろん、アイスタイルにも自動デプロイの仕組みが存在します。
しかし、その時点での私はその設定方法を理解しておりませんでした。
また、すぐにこのバッチプログラムを動かす必要があったため、Gitからソースコードを直接cloneしてサーバーに配置する事にしました。
これが悲劇を招くとはその時は思いもよりませんでした。
そして悲劇は起こった
悲劇までの過程は以下の通りです。
- 作成したプログラムをGitからclone
- Permissionで怒られたため、sudoをつけてcloneを実行(sudoで実行したためclone先の所有者とグループはroot)
- 所有者とグループはバッチ実行ユーザーである必要があることに気づく
- 所有権を変更
4でやらかしました。
結論から言います。
サーバーの全ディレクトリの所有者をバッチプログラムの実行ユーザーにしてしまったのです。
やりたかったコマンド
$ chown -R user:group ./
この時、私はcloneしたディレクトリ以下の所有権を再帰的にすべて変更しようとしたのです。
何も疑わずにコマンドを実行しました。
そしてコンソールに表示される大量のメッセージ。
何が起きたか分からない私。
とりあえず実行したコマンドを確認。
実際に実行したコマンド
$ chown -R user:group /
ああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ
ここで取り乱してはいけません。
いやもう取り乱してますがなんとかする必要があります。
あきらめたらそこで試合終了です。
心の中の安西先生もそう言っています。
少し考えて、まず/rootディレクトリの所有者はrootのはずだからもとに戻そうと思い立ちました。
とりあえず以下のコマンドを実行。
$ sudo chown -R root:root /root
sudo: 実効 uid が 0 ではありません、sudo は setuid root を設定してインストールされていますか?
どうやらsudoが実行できない状態になった模様・・・
ヤバいヤバいヤバいヤバいヤバいヤバいヤバいヤバいヤバいヤバいヤバいヤバいヤバいヤバいヤバいヤバいヤバいヤバいヤバいヤバいヤバいヤバい
こういう時、まず重要なのは迅速な報連相です。
まずは部長さんに相談です。
この部長さんは私とは比べ物にならないくらい優秀な方です。
Linuxに関する知識も私の数百倍は持っておられることでしょう。
それでも、部長さんなら・・・部長さんならきっとなんとかしてくれる・・・!!
藁にもすがる思いで部長さんに相談しました。
まだあわてるような時間じゃない。
部長さんはそう言ってくれると信じて。
リモートワーク中であるためSlackで部長さんにSOSを出します。
私 「すみません。(・・・やらかした内容を説明・・・)」
部長さん 「作り直しかなw」
ああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ
何が起きたか
全ディレクトリの所有権が変更されたことにより、一部のコマンドが使用できなくなりました。
その一部のコマンドに sudo
も含まれていたのです。
この時点でサーバーに新規でssh接続することもできなくなっていました。
sudo
コマンドが使用できなくなった理由は以下のメッセージがすべてを物語っています。
sudo: 実効 uid が 0 ではありません、sudo は setuid root を設定してインストールされていますか?
sudo
コマンドを実行するためには /usr/bin/sudo
の所有者がrootである必要があるのです。
ネットで調べればrootユーザーでログインする、レスキューモードで起動する等の解決策が紹介されています。
やろうと思えば上記の手段を駆使してsudoコマンドを実行したり、ssh接続はできるようになったかもしれません。
しかし、すでに全ディレクトリの所有権を変更しているため、どう戻せばいいか検討がつかず、完全復旧は不可能な状態になっておりました。
かくしてこのサーバーの復活は諦められ、ただ物理サーバーのディスク容量を占有するだけの存在となったのです。
そして私が接続していたセッションも我が家のネット分断により切断され、このサーバーは永久に闇に葬られることとなりました。
どうすれば悲劇を防げたか
ちゃんと自動デプロイの仕組みを利用していればこのような悲劇は起こりませんでした。
やはり、事故を防ぐためには人の手による作業を減らし自動化をすすめる必要があります。
しかし、これは直接の原因ではありません。
結局のところ 「sudoコマンドを打つ重大さを忘れてしまっていた自分自身」 に問題があったのです。
sudoコマンドを使用すればあらゆるコマンドの実行が可能になります。
この事件を起こした時の私はこの言葉に立ちかえる必要があったのです。
「大いなる力には大いなる責任が伴う」
誰にでもミスは起こります。
これを読んでくださっている皆様も、私のような事故を起こさないよう、今一度気を引き締めていただければと思います。
終わりに
- 壊したサーバーはまだ完全ではないですが新しいサーバーで復旧できました
- バッチプログラムもなんとかリリースできました
- このようなミスをした私ですが、エンジニアなら1度は通る道と笑って許していただけました
- アイスタイルは温かくて働きやすい職場です
アイスタイルで働くことに少しでも興味を持たれたらまずはこちらをご覧ください!
かくいう私は今回受けた多大なる恩赦に感謝し、エンジニアとしてスキルアップすることで少しでもアイスタイルに貢献できればと思います。
そう、施されたら施し返す、恩返しです!!