ある日の(やらかしが起こって解消するまでの一連の)出来事
登場人物
- k-nishigaki:筆者、たぶんインフラエンジニア、以下私
- 開発さん:すごいプログラマ
開発さん「k-nishigaki さん、今やってる○○案件の機能テストで staging 環境のストレージに EC2 からアクセスしたいんすけど、なんか制限かかってます?」
k-nishigaki「あー、LB で IP 制限してありますな。追加しときます。」
〜〜数分後〜〜
開発さん「やっぱなんかネットワークレベルで切られちゃうっぽいんですけど。」
私「あるぇー?おっかしいなぁ……一瞬 firewall 落として疎通だけ見てみっか1……。」
私「えーっと、LB に ssh して、sudo systemctl stop firewalld
っと……うーん、つながらないなぁ。経路の問題かな?とりあえず戻さないと。sudo systemctl start firewalld
っと……ん?なんか通信切れた?」
私「あるぇー?なんでだろ……新規ウィンドウでも ssh できない、てか ping も通らない……ってかこれ本番さーb
ーー鳴り響くアラート、つながらないままの本番 LB、つながらなくなる本番ストレージ。
ーーこの感じ、覚えがある。**「やらかし」だ。俺は久しぶりに「やらかし」**をやっている。
ーーあぁ、この血の気が引いて視界が狭くなっていく感じ、本当に懐かしい……。
なんてポエムってる場合ではなく。とにかく復旧しなければなりません。
まずは震える指先で障害発生報告を打ち込み送信、裏では ping タイムアウトが続いているコンソール画面を確認。
自分が何をやらかしたのか、コンソールを遡って確認するも、どう考えても firewall の stop/start をしただけ。
再起動で書き換わるような変な設定はしていないはずだが、まずは事実を受け止め、対処をしないといけません。
幸い、該当サーバは稼働系と待機系の冗長構成だったため、コンソール接続を諦め、遠隔からサーバの電源リセットを強行。
数十秒後、待機系が稼働を開始し、無事にアラートが解消、サービスも正常動作していることを確認。
やらかし期間は数分で済みました・・・。
何が起こっていたのか?
さて、実際に起ったことは「firewall を再起動したら何故かあらゆるアクセスが遮断された」です。
一体何が起こったのか?と 今度こそ staging のサーバで firewall を再起動したところ、同じことが起こりました。
staging なので停止しても気にせず、遠隔でサーバコンソールを確認します。
すると、firewalld 自身はきちんと再起動しているのに、ZONE へのインタフェース割当が消失していることに気づきました。
実はこのサーバ、とある理由で NetworkManager を停止していたサーバだったのです。
どうやら firewalld は NetworkManager と連動してインタフェースを ZONE へ割り当てる挙動をするようです。(参考)
インタフェースには ZONE の設定を書いていましたが、NetworkManager を停止していたことが原因で「firewall を再起動すると ZONE 設定が行われずあらゆる通信が遮断される」という事象が引き起こされたのでした。
firewalld のみで ZONE とインタフェースを紐付けるには、change-interface オプションを利用します。
これを使ってインタフェースを明示しておけば、firewalld を再起動してもきちんと ZONE 設定が残ります。
惨劇は何故起こってしまったのか?
NetworkManager を停止した状態では ZONE を記憶するために firewall 自身に設定を入れる必要があった、というのは上記にある通りです。
しかし、惨劇の原因自体は他にあります。
それは**「うっかり本番へ接続」し、「それと気づかず軽率に sudo した」**ことです。
もしちゃんと staging で操作をしていたら、これはやらかしではなくヒヤリハットで留められた問題でした。
もし本番で軽率に sudo を実行しなければ、というのも同様です。
運用(緊急時対応)の利便性を追求するがあまり、staging と本番で接続・コマンド実行に対するハードルが同じになっていたのが最大の原因でしょう。
どうすれば惨劇は回避できたのか?
命名規則やチェックシートなど色々考えられますが、一番はやはり「不要な権限は与えない」ことだと思います。
緊急時の対応として該当サーバへ ssh しやすい権限を持っていた、というのは仕方ないことかも知れません。
しかし、該当サーバは「普段これと言ってつなぐ必要がない」かつ「別に root の必要なコマンドも全然実行しない」ようなサーバでした。
こんなサーバに sudo nopassword は不要ですよね。
「権限は必要最低限にする」のが鉄則です。
さらば NOPASSWD: ALL
。
せめて一回 root になるとかそういうクッション挟ませようね。
-
普通に考えたら分かると思いますが、普通はやってはいけません。k-nishigaki はとくしゅなくんれんを受けています。 ↩