38
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

本番環境でやらかしちゃった人Advent Calendar 2021

Day 15

firewall を再起動しただけなのに

Last updated at Posted at 2021-12-14

ある日の(やらかしが起こって解消するまでの一連の)出来事

登場人物

  • 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 になるとかそういうクッション挟ませようね。

  1. 普通に考えたら分かると思いますが、普通はやってはいけません。k-nishigaki はとくしゅなくんれんを受けています。

38
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
38
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?