画面の右上で、社内ポータルへの社内側 curl がようやく 200 を返した。
$ curl -sS -o /dev/null -w '%{http_code}\n' --max-time 5 http://portal.example.local/
200
隣で覗き込んでいた瀬戸が「やった、戻りましたね」と肩の力を抜く。氷室は画面に視線を落としたまま、指を一本だけ立てた。「戻ったのは、社内側からの新規接続だけよ。終わったとは、まだ書かないで」
直したつもりの一本が、ほかの三本に影を落としていないか。社内側から開けたことと、外部側からも今まで通り開けることは、別々の事実。そのうえで、いま手元にあるのは復旧した直後の事実だけ。これから氷室宛の報告書に残す手前にいる。


直す前に、戻し方を先に置く
前話までで分かっているのは、社内→DMZ の判断が Firewall 上で一本だけ抜けていた、ということ。show policy-map type inspect zone-pair の表には zp-inside-outside と zp-outside-dmz の二行は出ていたが、zp-inside-dmz に当たる行が無い。show running-config | section zone-pair でも、同じ方向の定義が存在しない。先週の archive log には、no zone-pair security zp-inside-dmz の差分が一行だけ残っていた。
瀬戸が手帳を開く。「ということは、その一本を入れ直せばいいんですよね? source は inside、destination は dmz、service-policy は pm-inside-dmz」
「そう。シンプル。でも、シンプルだから雑にやっていい話じゃないわ」氷室は手のひらを軽く卓に当てた。「configure terminal を叩いた瞬間に、あなたはもう、ほかの zone-pair を背負ってる。投入してから『どうやって戻すんですか』を考え始めるのは、新人の標準仕草よ」
「でも、復元するだけですよね? 悪さは、しないと思うんですけど」
「思う、で本番設定を入れるな」鋭い一拍。「仮に pm-inside-dmz が今は別の class-map を参照していたら。あなたの一行が、想定外の inspect 動作を呼ぶ可能性は、ゼロじゃない」
瀬戸の手が止まる。氷室は続けた。「だから、入れる前に決める。一、入れる範囲は inside→DMZ の一本だけ。ほかの zone-pair の整理や class-map の手直しは、この場でやらない。二、戻し方は no zone-pair security zp-inside-dmz で、変更前の状態に戻せる。三、戻すと判断する条件は、変更投入から三分以内に、社内側 curl と利用者確認が戻らないこと。または、別 zone(outside→DMZ など)で追加の影響が見える瞬間。四、承認は運用リーダー」
configure terminal
zone-pair security zp-inside-dmz source inside destination dmz
service-policy type inspect pm-inside-dmz
end
「戻すなら、これを no コマンドで一行消す」氷室はキーボードに触れず、画面の同じ位置を指す。
configure terminal
no zone-pair security zp-inside-dmz
end
瀬戸が指でなぞる。「つまり、戻すコマンドの方を、入れるコマンドより先に紙の隅へ書いておく、ってことですか?」
「やっとまともな文になったじゃない。投入は、戻し方を書き終えてからよ」
一本だけ戻す、ほかは触らない
瀬戸が画面の前で深呼吸をした。「Firewall ごと一度再起動した方が、まとめて綺麗になりませんか?」
氷室は眉一つ動かさない。「再起動は、片方向だけ抜けていた判断を戻すには影響が広すぎる。zp-inside-outside で流れている社内→外部の通信、zp-outside-dmz で外から DMZ へ届いている通信、それぞれの inspect の動作中セッションを全部止める意味、分かってる?」
瀬戸が首を横に振る。「……怖いですね」
「いま欠けているのは、source=inside、destination=dmz の一行。だから戻すのも一行。zp-inside-outside と zp-outside-dmz は観測上、引き続き正しく出ている。理由が無い手は出さない」
「あ、それから」瀬戸が口を開く。「いっそ、似たような zone-pair を一気に整理しなおすのは、どうでしょう」
「それは、いまの一次対応の場面でやることじゃない」氷室は紙の端をとんと叩く。「整理しなおすなら、影響面を洗い出して、変更前後の差分を併記して、レビューを通す。その手順自体が今回欠けていた、というのは報告書の最後に書く話。今この瞬間に追加で zone-pair をいじる仕事じゃない」
瀬戸が頷きながら、もう一度キーボードへ手を伸ばす。氷室がその手の少し手前で止めた。「投入前。承認は」
「運用リーダーへ確認します」瀬戸が席を半分立つ。
「コマンドと、戻し方と、戻す条件と、三分のタイマー。四つ揃えて見せて、口頭でいいから可否をもらう。承認の事実は、報告書の検証結果のすぐ下に書く欄を作っておきなさい」


承認はすぐに戻った。瀬戸が configure terminal から三行を投入する。エラーは出ない。end を叩いたあと、氷室が指でタイマーをひとつ、画面の隅に置いた。三分。
片側が戻ったあと、もう片側を見る
最初に走らせたのは社内端末からの curl だ。
$ curl -sS -o /dev/null -w '%{http_code}\n' --max-time 5 http://portal.example.local/
200
瀬戸が拳を握る。「来ました。来ましたよ。200 です」
「それは社内側だけの話」氷室の声色は変わらない。「外部側で、いまも同じように開けるかは、別の事実。投入直後で pm-inside-dmz が変な動きをして、戻りの inspect が引っかかっている可能性も、まだ言い切れない。zp-outside-dmz の通信、観測してきて」
瀬戸が外部側の端末役へ切り替える。
$ curl -sS -o /dev/null -w '%{http_code}\n' --max-time 5 http://portal.example.local/
200
「外部側も 200 です。さっきと同じです」
「同じ、が大事」氷室は短く頷いた。「変更前は外部側 200、社内側失敗。変更後は両側 200。社内側だけが動いて、外部側を壊していない。それが今あなたが言える範囲」
そのまま show policy-map type inspect zone-pair を開く。
Zone-pair name Source Destination Service-policy
zp-inside-outside inside outside pm-inside-outside
zp-outside-dmz outside dmz pm-outside-dmz
zp-inside-dmz inside dmz pm-inside-dmz
三行並んだ。瀬戸が指でなぞる。「zp-inside-dmz、ちゃんと source=inside、destination=dmz、service-policy=pm-inside-dmz で出てます。前話の表に出ていなかった行が、戻ってますね」
「設定を入れた事実と、判断方向表に出ている事実が、ようやく噛み合った」氷室が淡白に認める。「ここまでは、技術側からの復旧。次は、業務側」
瀬戸が一拍、首をかしげる。「業務側、というのは、利用部署さんに、ですか?」
「社内端末から、社内ポータルが普通に開けるか。チャットで一行確認するだけでいい。あなたの curl が通っても、利用者の端末で開けない理由が別にある可能性は、まだ消してない」
利用部署窓口へのチャットには短い行が一つ返ってきた。
開けることを確認しました。普段通り使えています。
「申告は来ていない?」
瀬戸が監視画面を見る。「追加の申告、いまのところゼロ件です」
「いま、ようやく『社内側からも普通に開ける』と書ける」氷室が画面の隅のタイマーをそっと指差した。タイマーはまだ二分も経っていない。「戻すための条件を先に置いたから、終わらせていい、と判断できる。置いていなかったら、二分の状態を、戻していい時間とも、待つべき時間とも、誰も言えない」
瀬戸が小さく息をつく。「つまり、戻す条件を先に決めておいたから、戻さなくていい、と決められた、ってことですか?」
「やっと、まともな文になったじゃない」
利用部署窓口へは、瀬戸が短い一文を返す。
社内ポータルは、社内端末から通常通り開ける状態に戻りました。外部側からも従来通り利用できます。追加でお気付きの点があれば、改めてご連絡ください。
「原因は書かない?」と瀬戸。氷室は短く頷くだけ。「いま言えるのは、社内側からの新規接続が戻った、外部側に影響が出ていない、その二つ。原因の整理は、これから氷室向けの報告書にまとめる側の話」
言える範囲だけを、報告書へ残す
氷室が腕を組み直す。「ここから、報告書。順番は、復旧した事実、原因として言える範囲、まだ言えない範囲、実施した修正、検証結果、記録へ戻す事項。六つの親項目。瀬戸、自分の言葉でいいから、まず復旧した事実だけを書いてみて」
瀬戸がノートに目を落とし、ゆっくり書く。
社内端末から DMZ 上の社内ポータルへの HTTP 接続が、
200を返す状態に戻った。外部側からの接続も従来通り200を返している。利用部署窓口からも、社内端末から通常通り開けることの確認を得た。追加申告は無い。
「悪くないわ」氷室は鼻をひとつ鳴らした。「直った、と書かずに、何が戻ったかを書いた。それだけで、随分まともに見える」
「次の、原因として言える範囲、ですか」瀬戸が次の段落へ進む。
「言える範囲、よ。書ける言葉に強い線を引いて」
先週の zone policy 整理時に、社内→DMZ の zone-pair が
no zone-pair security zp-inside-dmzで削除されていた。外部→DMZ と社内→外部 の zone-pair は残っていたため、外部側からは届き、社内側だけが片方向で drop されていた、と説明できる。
「ここまでは、archive log の差分と show running-config | section zone-pair の状態で支えられる」氷室が画面の三つの行を指す。「観測した事実と、復旧した事実から、原因として言える形にまでは落ちている」
瀬戸が、続けて打とうとした手を、ふっと止める。「あの、ここで、誤って削除した、まで書いてしまっていいんでしょうか?」
「書いたら、嘘になるわよ」氷室の目が一段下がる。「archive log には、housekeeping: clean up unused zone-pairs というコメントは残っているけれど、その整理が、意図的に外して戻し漏れたのか、誤って削除したのかは、判別できる材料が無い。あなたの手元に無いものを、報告書に書くな」
瀬戸が、ノートにもう一段、別の見出しを書く。
まだ言えない範囲
「ここに、未確認のまま残しておくこと」氷室が促す。
削除が誤操作か、整理上は意図的に外したものを戻し漏れたのかは、現時点で確認できていない。ほかの zone-pair に対しても、同じ整理操作の中で同様の取りこぼしが無かったかは、本対応の範囲では全件確認を行えていない。
「うん。隠さずに、言えない、と書く方が、報告書としては強い」氷室が認める。「『未確認』の欄は、消したくなるものよ。でも消した瞬間に、次回同じ整理ミスが起きたときの早期発見の手がかりが、誰の手にも残らなくなる」
瀬戸が頷きながら、実施した修正の段落へ進んだ。
inside→DMZ の zone-pair を、整理前と同じ source/destination/service-policy で復元した。具体的には
zone-pair security zp-inside-dmz source inside destination dmzの下にservice-policy type inspect pm-inside-dmzを適用した。他 zone-pair(inside→outside、outside→DMZ)と inspect class-map / policy-map 本体には、本対応では手を加えていない。
「手を入れていないものを、入れていない、と明示する」氷室が短く付け足す。「『最小範囲』と書くより、何に手を入れて何に入れていないかを並べる方が、後で読んだ人に届く」
検証結果の段落は、復旧確認の流れをそのまま並べる。
復旧確認は次の四つを揃えた。一、
show policy-map type inspect zone-pairでzp-inside-dmzが source=inside、destination=dmz、service-policy=pm-inside-dmz として表示されること。二、社内端末からhttp://portal.example.local/への HTTP 接続が200を返すこと。三、外部側からの HTTP 接続が引き続き200を返すこと。四、利用部署窓口から、社内端末で通常通り開ける旨の確認を得たこと。あわせて、変更投入から復旧確認完了までの間、追加申告は発生していない。
「両側、書けてる」氷室が満足げに頷く。「社内側だけ、では完了にしない。外部側を確認した、と書いてあるから、片側だけ戻して終わりにしていない、と読める」
最後に、記録へ戻す事項。
本事象は、先週の zone policy 整理で片方向の zone-pair が外されていたことに起因する可能性が高い。再発防止案としては、zone policy の追加・削除・整理を行う変更時に、変更前後の zone-pair 差分(追加・削除される定義)と影響面(どの方向のどの通信が止まる、または通るようになるか)を併記したうえで、レビュー承認を得る運用手順を加える、という方向を、運用手順候補として記録に戻す。
「『再発防止策として実施する』ではなく、『運用手順候補として記録に戻す』」氷室が文を一回読み直して、頷く。「あなたの一存で運用手順を変えるな、という意味でもあるし、未確認のまま今すぐ大きな箱に詰めるな、という意味でもある」
瀬戸が、ノートを少し離して全体を見渡す。「六つの親項目、ぜんぶ埋まりました。直った、復旧した、終わった、とだけ書いた一行よりも、随分、長くなりましたね」
「長くしたんじゃない。隠さなかったから、それだけ残った」氷室が、画面のタイマーをそっと閉じる。「報告書は、復旧の証拠を集める場所じゃない。次に同じ整理ミスが起きたときに、早く気付くための栞を残す場所よ。今回、栞は『zone policy の変更前後の差分と影響面を、レビュー時に併記する』のところに、あなたが置いた」
瀬戸が報告書のテキストをしばらく見つめてから、もう一度こちらを向く。「つまり、最小範囲で戻したのと同じくらい、未確認のまま残した範囲を消さなかったことが、報告書としては大事だった、ってことですか?」
氷室が、はじめて少しだけ口角を上げた。
「やっとまともな文になったじゃない」
社内側からの新規接続は戻り、外部側の通信は守られた。氷室宛の報告書には、復旧した事実、原因として言える範囲、まだ言えない範囲、実施した修正、検証結果、運用手順候補が、それぞれの欄に残った。手元には復旧の事実と、未確認のまま記録に戻した範囲の両方が、同じ紙の上に並んでいる。