俺TUEEE系エンジニアが本番サーバーを0.1秒で落とした話 @yutkat
俺TUEEE系エンジニアとは
※ ここの章は独断と偏見がかなり入ってるのでネタとして読んでください
俺TUEEE系エンジニアとは、「まあどんなセキュリティもオレには全然関係ないけど」(出典:BLOODY MONDAY)ウィザード級ハッカー(出典:ne0;lation)等に代表されるようなある種の厨二的価値観を捨てきれずに社会人になってしまったエンジニアです。
俺TUEEE系エンジニアは基本的に虚栄心があって傲慢です。だいたい自分の開発環境に酔いしれてます。生産性を高めて、作業のスピードを上げ、他の人に一目置かれることを生きがいとしています。まあざっくりいうと俺TUEEE系エンジニアとは、なんとなくハッカーを気取りたい、人と同じものを使いたくないエンジニアのことです。
俺TUEEE系エンジニアは、だいたい自分の作業用PC(クライアントPC)を完全にLinuxにしていることが多いです。しかし、ただLinuxを入れてるだけだと俺TUE系なので、ArchLinuxにします。これで俺TUEE系になれます。さらにデスクトップ環境をi3(sway,awesome)等のタイル型にします。これで晴れて俺TUEEE系エンジニアになれました。俺TUトリプルEですね。
俺TUEEE系エンジニアは基本ターミナル内で生活しています。マウスはあまり使わないです。キーボードはだいたいHHKBかKinesis Advantage2かRealforceかThinkpadの外付けか自作を使ってます。
そう私です。
俺TUEEE系エンジニアは、いつも効率を意識してるので、最小の手数で物事を処理していきます。
そんな俺TUEEE系でもやらかすときはやらかしてしまうんですよね〜こわい世界だ。
やらかしはあなたのすぐ後ろにいる。
事案発生までの記録
俺TUEEE系エンジニアの一日はまずパッケージ更新から始まる。なぜなら新しいものが大好きだからだ。新しいものを使うとバグに出会う確率もあがる。自分の作るバグは嫌いだが、他人の作るバグは好きだ。バグったらマジかよーって言いながらもその目はラキラと輝いている。
今日は何が更新されているのか、ArchLinuxのパッケージ更新コマンドを打って yay -Syyu っと。
💬(おお、今日はカーネルの更新もあるようだな。もうバージョン5.8かw。Linusもがんばってるな)
その後は効率的に業務のIssueをこなしていく。本番サーバーでやらなくてはいけない作業もあったので、tmuxの新しいウィンドウを開いてsshでログインして作業を開始。
💬(シェルの起動スピードもうちょっと速くしたいな。あーあと、ここらへんは自動化したいなー)
とりあえず作業も一段落したので、ちょっとvim-jpのslackでも覗くか。
💬(今日はどのデフォルトmapを潰せるかで盛り上がってるのか。こいつらほんとこういうの好きだよな〜)
💬(あ、そういえば今日カーネルの更新きてたな。このあとの作業は長くなりそうだし、区切りもいいから一旦再起動しておくか)
i3(Linuxのデスクトップマネージャー)で終了はWin+Shift+eを押してメッセージが表示されてから
r で再起動
💬(ってめんどくさいな!)
まあ普通にそこにあるターミナルから再起動しよう。
sudo rebootっと
ん?あれ?再起動しないぞ??
そう再起動したのは本番サーバーだったのです。
惨劇はなぜおこってしまったのか
単純にコマンドを打つ場所を間違えたというよくありがちなしょーもないミスです。気をつけるようにはしていたのですが、集中力が切れたところでやられてしまいました。一応クライアントのプロンプトと本番プロンプトは違う見た目にはなっていましたが、目立ってはいなかったのでミスを防ぐには至りませんでした(文字を読む前に神速のタイピングでコマンドとEnterの入力が終了していた)。
原因としては油断と慣れがあったと思います。
特にArchLinuxの場合がカーネルが高頻度で更新されるのでクライアントPCの再起動を結構行います。しかも、なんとなく作業のキリがいいからという中途半端なタイミングで実施してしまったがために、本番サーバーとのセッションが残ったままのssh上で実行してしまうことになってしまいました。
復旧作業
幸いなことに再起動してしまったサーバーは、プログラムはcronのように一定時間で起動するものだったため大事には至りませんでした。OSの再起動、サービスの起動を確認して、報告書(まあいわゆる始末書)を書いて事態は収まりました。
二度と惨劇を起こさないためにどうしたらいいか
本番サーバーのターミナルの背景色を他と変えて認識しやすくしておく(必須)
本番サーバー側に軽い設定を入れるパターン
他の人がミスらないためにも、サーバー側でひと手間加えてあげるのが一番よいと思います。どちらか一方は必ずやるようにしましょう。
プロンプトの見た目をド派手に変える
ssh先の~/.bashrcのPS1を変更してプロンプトをわかりやすく変更します。ちょっと変えただけだと気づかないことがあるのでめちゃくちゃ目立たせるといいでしょう。
↓もっとおしゃれなものにしても良いと思いますが目立つのが大事です!
色の付け方については、こちらを参考のこと
PS1="[\[\e[37;41;1m\]prrrrrrrrrrrrrrrrrodunction\[\e[37;49m\] \u@\h \W]\$ "
サンプル
背景を自動で変える
~/.bashrcに
echo -e "\033]11;#400000\a"
reset
を設定して、ログインしたら強制的にターミナルの背景色を変更します。
本番サーバーは不可侵領域だから自分のPCだけでなんとかするパターン
サーバー側で必要ない(?)設定を入れることはまかり通らん!って環境に住んでいる人は、他の人は救えないですが、最低限自分だけでも守りましょう。
作業するターミナルの背景色を動的に変える方法もありますが、個人的におすすめなのはターミナルアプリ自体を変えてしまう方法です。
作業するターミナルアプリ自体を変える方法
メインじゃない方のターミナルアプリの背景をドギツイ色になるように、ターミナルの背景設定から変更します。
作業するターミナルの背景色を動的に変える方法
- tmuxで動的にpaneの色を変える方法 https://bacchi.me/linux/change-terminal-bgcolor/
- sshを関数で上書きして動的に変更する方法(~/.bashrcなどに追記してください)
function ssh () { echo -e "\033]11;#400000\a" command ssh "$@" reset}
作業する前にPS1を書き換える方法
あまりおすすめしませんが、sshしたあと作業開始する前にプロンプトを再設定する方法もあります。他の人に影響なく自分のプロンプトだけを一時的に変更します。当然ですが、ログアウトしてまたログインすれば元に戻っています。
OSのクリップボードにスニペットとして保存しておくなどしたらよいと思います。ただし、打ち忘れたら意味がないので注意が必要です。
PS1の設定はプロンプトの見た目を変えると同様です。
他にできること
- クライアントPCを再起動するときはGUIの機能で行う。安易にsudo rebootしない
- 本番サーバーでの作業時間を最小にすること。作業がなくなったらきちんとログアウトすること
- rmとかddのようにあからさまに怖いコマンドでないものの中にも、危険はコマンドがあることを理解すること
他にもっとやっておいてほしいこと
本番環境にsshしなくていいように、IaC(Infrastructure as code)や CD(Continuous delivery)、システムモニター環境を整えるのが必須だと思います。今まさに本番環境にsshしてるなら、できるだけ早くそこから脱却する仕組みを作り込んだほうがよいですね。
ただ、会社の規模や環境によってはそれができてなかったり、おざなりになってたりすると思いますでそのときはくれぐれもお気をつけて・・・!
俺TUEEE系エンジニアで居続けるために
普段の行いにもよりますが、周りから「俺TUEEEなのにこんなミスすんだ」って思われてる気がします。プライドは高いので、すごく傷つきます。俺TUEEE系エンジニアでいたいのであれば絶対に凡ミスをしないように作業環境を作り込んだほうがよいですね。。。
本来の意味で 「俺またなんかやっちゃいましたか?」 にならないように・・・
単語メモ
- ウィザード級ハッカー:ハッカー以上の技術者のことを指します。優れたハッキング能力を持つ人です。
- Linux:OSです。コンピューターのハードウェアを管理しているソフトウェアのことを指します。自分で解発したWebアプリは仮装サーバー(VPS/Virtual Private Server)を借りることになりますが、その時にインストールできる標準的なOSです。
- ArchLinux:独自開発された用途にたいおうできる万能ディストリビューションです。Archは、最小限の基本システムの状態でインストールでき、ユーザーの理想とする環境のために必要なものだけをインストールして構築できます。
- i3(i3 Window Manager):タイル型ウィンドウマネージャーの一つです。GitHubで解発されています。ウィンドウの配置や生成・消去などを操作します。
- sway:C言語で書かれるタイル型ウィンドウマネージャです。既存のi3の設定ファイルで動作し、独自の新機能を提供しています。
- awesome(オーサム):ウィンドウマネージャ。C言語、Lua言語で解発されています。複数のレイアウト(フロート配置、タイル配置)をサポートすることを目指したものです。
- HHKB(Happy Hacking Keyboard):最高級キーボードです。使いやすいキーボードで様々なモデルが登場し続けています。価格が高いものの、作業効率が格段に上がる魅力があります。
- yay(イェーイ):ArchLinuxで使用するコマンドです。ユーザー入力を最小限に抑え、パックマンのようなインターフェイスを提供する目的があります。
- yay -Syu:ArchLinuxで使用するコマンドです。3世代分のパッケージがずっと保存されます。
- Issue(イシュー):「答えるべき問い、議論すべき問い」で、ユーザーとの議論において明確にしておくことが重要です。
- tmux(Terminal Multiplexer):ターミナルマルチプレクサです。Linux系のターミナル画面を複数のセッション・ウィンドウ・ペインに分割して利用できます。
- shell(シェル):OSを構成するソフトウェアで、利用者からの操作の受付や利用者への情報提示を担当します。
- vim-jp:テキストエディタのVimと日本・日本語に関わるリソースを集約することを目的にしたコミュニティです。最先端で速いVimは、どこでも使え非常に高機能です。
- reboot(リブート):コンピューターの使用中にシステムを再起動することです。
- cron:OSで標準的に利用される常駐プログラムの一種で、利用者の設定したスケジュールに従って指定されたプログラムを定期的に起動してくれます。
- .bashrc:設定ファイルで、bashを起動した時に読み込まれる設定ファイルです。Shellのひとつでログインした後に読み込めます。
- PS1(PowerShell Version 1):拡張子で、ファイルの種類を表す目印です。
- プロンプト:コマンドプロンプトは、利用者がコンピュータに文字で命令を打ち込んで操作するコマンドラインインターフェースで、システムが入力を受け付けられる状態であることを示す短い文字や記号の並びです。
- .bash_logout:ログアウトした時に読み込まれる設定ファイルです。
- pane(ペイン):窓枠、窓ガラス、跳ねめいたなどの意味を持つ英単語で、ウィンドウなどの表示領域の内部をいくつかに分割した区画のことです。左右に分割したものは、カラムと呼ぶこともあります。
- snippet(スニペット):切れ端や断片、抜粋などの意味で、プログラムに挿入して利用できる短いコードのまとまりを指します。
- rm:コンピューターに命令する文章(コマンド)です。ファイルやディレクトリを削除します。
- dd:Linuzのコマンドです。ブロック単位でファイルをコピー、変換できます。
- IaC(Infrastructure as code):手動のプロセスではなく、コードを使用してインフラストラクチャの管理とプロビジョニング(必要に応じてネットワーク、コンピュータの設備などのリソースを提供できるよう準備すること)です。設定しようを体系化および文章化しています。
- CD(Continuous delivery):継続的デリバリー(デプロイ)と同じ意味で、開発者によるアプリケーションへの変更に対して、バグがないか自動的にテストし、リポジトリにアップロードします。