防災訓練概論
以前東証一部の大手企業に勤めていた際、地震や火事を想定して、防災グッズやヘルメットが社員一人ひとりに配られたり、定期的に各部署から1人が実際に火事などを想定して避難するなどしていました。
が、今回お話したいのは、「WEBアプリケーションの防災訓練」です。どんな災害を想定しているかと言うと
- なんか知らんけど、サービスがダウンしている
- ランサムウェアにサービスを乗っ取られた
- DDos攻撃でサイトに繋がりづらくなった
- 新人が間違った操作で本番のデータ、本番環境を壊してしまった
- 重大なセキュリティホールが見つかり、意図しない個人情報が閲覧出来てしまった
- 新しい機能をリリースしたら、バグだらけで、ユーザーがお怒り
- etc
そもそも防災とは
災害対策基本法によると、防災とは「災害を未然に防止し、災害が発生した場合における被害の拡大を防ぎ、及び災害の復旧を図ることをいう」と定義されています。
WEBサービスの災害も、未然に防ぐ事が出来れば理想ですが、防ぎようのない攻撃や、人災・人的ミスは必ず何かしらの形で起きます。ですので、WEBサービスにおける防災では、万が一の事態を想定して、被害の拡大を防ぎ、及び災害の復旧を図るがその目的となります。
災害が起きた時、
- サービスがいつまで経っても復旧しない
- 個人情報が流出し続ける
- 新たに怒り出すユーザーが現れる
- 復旧作業に失敗して、二次災害(破壊的なデータ損失)が発生する
などの事態を未然に防ぐことが防災です。
防災訓練とは
リアルな防災訓練と基本は同じです、緊急事態を想定して、実際の動き方を実践します。
- どうやって避難するのか?
- 防災グッズはどこにあるのか?
- 防災グッズはどう使うのか?
と同じ様に
- どうやってバグ前の状態に戻すのか?
- サーバのログやヘルスメーターはどこにあるのか?
- 万が一の時の手順書はどこにあるのか?
- 手順書通りに本当にできるのか?
を事前に展開、開発環境を使って実演、不手際や不足を洗い出し、対策を講じることで、いざという時に備える事がまさに防災訓練といえます。
防災訓練のこころえ4選
リアル防災訓練のこころえや、実際にWEBの防災訓練を通じて、私は以下の4つが大事という結論に至りました。
- 役職・部署を問わず、多くの人が参加せよ
- 明確な目的・目標を定めよ
- 具体的な災害状況を設定せよ
- シナリオを変えよ
1.部署・役職問わず、多くの人が参加せよ
災害が盆暮れ正月に起きて、防災訓練に参加した人が誰も居ない…みたいなケースは十分想定されます。その際、「本番環境に入れません」「インフラの事わからないので、操作出来ません」と、管理者や防災訓練を受けた人が来るのを指を加えて待っているだけ、という状況がまさに最悪です。
管理者不在の罠
サービスをよく理解している担当者、管理者だけが参加しておけば…みたいな甘い気持ちはNGです。かならず、その人たちが不在な状況を想定して、より多くの人が参加しましょう。
部署の壁の罠
災害は部署を跨ぎます。サービスが別だから分からない、自分たちの部署の範囲だけ防災訓練をすればよいというわけではありません。部署間横断で必ず行いましょう。
トップダウンの重要性
他部署の防災訓練に積極的に参加する企業文化が無い、なんてこともあるでしょう。故に、上位マネージャーがトップダウンで「絶対に参加しろ」と伝える事が非常に重要になります。
2.明確な目的・目標を定めよ
避難訓練は、参加者が「当事者意識」を持ち、積極的に訓練に取り組む必要があります。故に、訓練自体にはっきりとした目標を定めておく必要があります。訓練前に「プラン通りで対処できるかの確認」「操作マニュアルに不備がないかの確認」「初参加が実際に手を動かし、知識や経験を積む」「ログを取得、読めるようにする」などの訓練の目的を設定し、参加者に伝えておくと、より効果の高い訓練になります。
惰性で参加しない為の工夫
目的・目標を設定せず、ただ単に話を聞いてオシマイ、だといざという時に本当に役に立ちません。実際に手を動かしたり、過去に訓練を受けた人には講師役をお願いするなども効果的です。
3.具体的な災害状況を設定せよ
防災訓練の質を上げるためには、具体的な災害状況の設定が不可欠です。曖昧な内容では、参加者も当事者意識を持って、訓練に取り組むことができません。サービスは利用状況、感染の有無、原因が不明かあたりがついているか、などの被害状況は、より具体的に設定しておきましょう。それによって、より具体性のある防災訓練が実現できます。
過去に起きた災害のトレース
過去に起きた災害があれば、訓練には取り込んでおきましょう。その時に実際に行った作業をトレースし、当時のトラブルを再発しないかなど見直すことで、実際の訓練の成果が可視化出来ます。
ダブルチェック・声出しの重要性
災害状況を具体化することで、より具体的なアクションや操作が明確になります。その際、ダブルチェックで、声を出して行うは二次災害を防ぐ上で非常に重要です。
4.シナリオを変えよ
毎回同じシナリオで防災訓練を行えば、参加者は積極的に訓練に取り組みづらくなります。訓練ごとに、起きたサービス、災害の内容を変えることで、より効果のある防災訓練が実現します。他部署の環境を実際に操作することで、サービスの構成や、使っているインフラなどの理解もすすみ、組織全体の知識レベルが上がることにも寄与します。
具体的な取り組みの例の紹介
切り戻し対応
- シナリオ
- リリースに致命的なバグを仕込んでしまった
- 災害状況
- その機能があることで、重要な別の機能が使えなくなった状況
- ユーザーからクレームが入り、返金騒動に発展しそう
- 目的・目標
- 1つ前のバージョンのリリースに本番環境を戻す
- 上記操作を全員が出来るようにしておく
サービスの強制ダウン
- シナリオ
- サーバ内にトロイの木馬やランサムウェアが入り込んだ
- 災害状況
- サービスは生きている
- サービスサーバが利用可能な状態、ネットワークにつながった状態だと、被害が拡大する
- 目的・目標
- サービスサーバを落とす
- サービスサーバより前、ロードバランサ時点で、メンテナンス画面を掲示する
- 手順書やプラン通りで対処できるかの確認
- ※サービスによってロードバランサの種類がちがったりして、共通手順が機能しなかったりする
原因究明の高速化
- シナリオ
- サービスがダウンしているが、原因が不明
- 実は異常トラフィックが発生しており、サーバのリソースが足りなくなってしまっている
- 災害状況
- サービスが断続的にアクセス不能になっている
- 直近週間は特にリリースをしておらず、安定稼働している
- 目的・目標
- 原因究明を若手エンジニアも出来るようにする
- ヘルスログの場所、見方を知ってもらう
- 実際に操作して、ログの画面まで行ってもらう