TT Lab
はじめる
学ぶ 学習パス コース

見知らぬシステムの前で

触らずに答える。触ったら必ず戻す

TT Labで続きを見る

目標

顧客の本番サーバーに関する5つの質問に、読み取り専用の手段だけで答えます。そのあと、ディレクトリの状態をフィンガープリントで固めて比較するツールを作り、どうしても変える必要がある設定1行を変更して確認し、実際に元に戻して、スナップショットと内容が違うファイルが0個であることを証明します。

なぜ重要なのか

調査中に何かを変えると、それ以降に見える値が元の値なのか私たちが作った値なのかわからなくなります。顧客がその間に見た指標も汚染され、「いつからこうなったのですか」という質問に、私たち自身が答えの一部になります。 小さな変更ほど、元に戻すのを忘れます。そして、元に戻したと信じることと、元に戻したことが証明されていることは別です。「元どおりにしました」は検証できない文で、「元に戻したあとスナップショットと比較したところ、内容が違うファイルは0個です」は確認できる文です。 それより先に問うべきことは、本当に変えなければ答えが出ないのかです。多くの場合、同じ質問に読み取り専用で答える道があります。読み取り専用かどうかを自分でごまかさない方法は、使ったコマンドを記録することです。 このラボは、顧客の承認を得て反映する変更作業とは違います。その前の段階、つまり調査中に手が滑る瞬間についての、最初の週の規律です。 採点ツールは、提出された文言を信じません。5つの答えは採点ツールが自分でもう一度測り、スナップショットツールには、ファイルの追加、削除、内容の変更、権限だけの変更、時刻だけの変更の場所を作って、5つを分けられるかを確かめます。

ステップ

  1. /root/readonly/gen_site.pyを作成して実行し、siteディレクトリを作成してください(保存先: /root/readonly/site/)。設定・注文元帳240行・ログ180行・照会ツールが入ります。
  2. 読み取り専用の手段だけで5つの質問に答えて、/root/readonly/answers.jsonに書いてください。答えごとに、使ったコマンドを一緒に残します。
  3. /root/readonly/snapshot.pyを作成し、ディレクトリをたどってファイルごとにフィンガープリント・サイズ・権限・更新時刻を入れ、現在の状態を固めてください(保存先: /root/readonly/baseline.json)。
  4. --baseline <스냅샷>を追加し(プレースホルダーはスナップショットのパスです)、比較した結果を出力させてください。added・removed・changed・mtime_only・sameの5つに分けます。
  5. 設定のmax_retryを3から5に変更し、何をなぜ変えるのかと元に戻すコマンドを書いてください(保存先: /root/readonly/change.json)。
  6. 照会ツールで変更の効果を確認して、/root/readonly/verify.jsonに書いてください。
  7. 元に戻したあと、スナップショットと比較した結果を残してください(保存先: /root/readonly/revert_diff.json)。内容が違うファイルが0個である必要があります。
  8. /root/readonly/readonly_report.mdに4つの節で書いてください。

参考

本番サーバーを手に入れる

/root/readonly/gen_site.pyを作成して実行し、siteディレクトリを作成してください(保存先: /root/readonly/site/)。etc/app.conf、data/app.db(ordersテーブル240行)、var/log/app.log(180行)、bin/report.pyが入ります。

照会ツールのreport.pyは、顧客のサーバーにすでにあるツールだと考えてください。私たちが作ったものではなく、そこにあったもので、私たちは実行してみることしかできません。作成したら、照会ツールを一度実行して、何を尋ねられるかを見てください。

読み取りだけで答える

/root/readonly/answers.jsonに5つの質問の答えを書いてください。idはapp_version・pending_orders・log_errors・backoff_ms・oldest_pending_daysで、答えごとに実際に使ったコマンドをhowに残します。

設定は開いて読み、元帳は読み取り専用で開いて数え、ログは行を数えれば足ります。すでにある照会ツールを使うのも読み取りです。howに書いたコマンドに書き込みが混ざっていると採点ツールが検出するので、書きながら自分でも確認してください。

変更前の状態を固める

/root/readonly/snapshot.pyを作成して--dir --outでディレクトリをたどり、現在のsiteの状態を固めてください(保存先: /root/readonly/baseline.json)。ファイルごとにsha256・bytes・mode・mtimeを入れます。

固めておかなければ、あとで元に戻したことを証明するものがありません。パスは--dirを基準にした相対パスで入れ、ディレクトリとシンボリックリンクは入れません。modeは権限の3桁だけ、mtimeは秒単位の整数で書いてください。

比較する機能を加える

--baseline <스냅샷>を追加し(プレースホルダーはスナップショットのパスです)、比較した結果を出力させてください。added・removed・changed・mtime_only・sameの5つに分け、changedには変わった項目の名前だけをfieldsに入れます。

内容とサイズと権限が同じで更新時刻だけが違う場合をchangedに入れると、元に戻したあとの結果が常に真っ赤になり、何の情報も与えられません。その場合を別に数えることが、このツールの核心です。採点ツールは5つのケースをすべて作って入れます。

1件だけ、元に戻す準備をして

設定のmax_retryを3から5に変更し、target_file・key・before・after・sha256_before・sha256_after・why・approved_by・baseline・apply・rollbackを書いてください(保存先: /root/readonly/change.json)。rollbackには元の値が入っている必要があります。

元に戻すコマンドは、変更する前に書いてください。変更したあとに書こうとすると、元の値を記憶に頼ることになり、3だったのか30だったのかは、30分後には驚くほどぼやけます。承認も1行で残してください。なければ、あとでその変更は私たちがこっそり行ったことになります。

意図した効果が出たかを値で見る

照会ツールで変更の効果を確認して、/root/readonly/verify.jsonにquestion・command・before・after・confirmedを書いてください。questionはretry_budgetで、beforeとafterは変更前と変更後の照会ツールの出力です。

変更したという事実と、変更したものが意図した効果を出したという事実は別です。照会ツールは--confで別の設定ファイルを渡せるので、変更前の値を入れた一時設定で1回実行して、beforeを得られます。出力はそのまま文字列で書いてください。

元に戻して証明する

change.jsonのrollbackどおりに元に戻したあと、スナップショットと比較した結果を残してください(保存先: /root/readonly/revert_diff.json)。addedとremovedが空で、changedが0個である必要があります。更新時刻だけが違うファイルは、mtime_onlyに残ります。

元に戻したと信じることと、元に戻したことが証明されていることは別です。比較した結果が証明です。更新時刻の違いを隠すために時刻まで合わせないでください。そのときから、私たちが痕跡を消したことになります。

何に触れて何を元に戻したかを書く

/root/readonly/readonly_report.mdに、## 읽기만으로 답한 것、## 꼭 바꿔야 했던 한 건、## 바꾼 뒤 무엇을 확인했나、## 되돌린 증거の4つの節で書いてください(韓国語の見出しは順に「読み取りだけで答えたこと」「どうしても変える必要があった1件」「変更後に何を確認したか」「元に戻した証拠」という意味です)。5つの質問のid、変更したキーと値、照会ツールの出力の変化、比較した結果の数字が、すべて出ている必要があります。

レポートは手で書かず、answers・change・verify・revert_diffの4つのファイルから生成してください。最後の節には、残った痕跡(更新時刻だけが違うファイル)もそのまま書いてください。隠すと、そのときから私たちが痕跡を消したことになります。