スナップショットとドリフト
ほかのどのツールも、マシンが今どう見えるかを教えてくれます。管理者が実際に抱えている質問は動いていたときと何が違うかであり、標準の Windows にはそれに答えるものが何もありません。
スナップショットに含まれるもの
ある時点のマシン全体です。すべてのサービスとドライバーについて、スタートアップの種類、アカウント、起動パスと引数、実行するファイルのハッシュと署名者、依存関係と依存されている関係、トリガー、必要な特権、SID の種類、セキュリティ記述子が含まれます。さらに、マシンの名前、取得したアカウント、そしてそのアカウントが管理者だったかどうかも含まれます。
bws snapshot create before.json --note "before the patch"
1 行に 1 フィールドの JSON です。これは意図的なものです。スナップショットをリポジトリに入れて git diff で読めるので、ツール自身の比較だけが見る方法ではなくなります。
それにふさわしい扱いで保管してください。スナップショットは、すべての起動パスとセキュリティ記述子に至るまで、マシン全体を記述しています。保存先ディレクトリがすでに持っているアクセス許可のまま書き込まれ、ツールは何も絞り込みません。そのため、ほかの人が読めるディレクトリでは、その人たちがそのすべてを読めます。
それから、何が違うかを尋ねる
$ bws snapshot diff before.json --live --exit-code
Changed (2):
Spooler Print Spooler
startType: Manual -> Automatic
status: Stopped -> Running (running state, not configuration)
wlidsvc Microsoft Account Sign-in Assistant
status: Stopped -> Running (running state, not configuration)
Added 0, removed 0, changed 2. Fields differing: 1 in configuration, 2 in running state.
- 構成と実行状態は分けて報告されます。1 日あけて取得した 2 つのスナップショットは、たまたま実行されているものが異なり、そのほとんどはドリフトではありません。混ぜてしまうと、重要な 1 行(誰かが変更したスタートアップの種類)が、重要でない 40 行の下に埋もれます。
- 比較できなかったものは、隠さず一覧に出ます。2 つのスナップショットのうち片方が一度も読み取らなかったフィールド(そのセッションに権限がなかったため)は、そのエントリの下に not compared と表示され、サマリーはそのようなエントリを数えます。したがって、何も変わっていないと示す差分は、両方が見られた範囲で何も変わっていないという意味です。
- 昇格したスナップショットと昇格していないスナップショットを比較すると、誤った結果になります。誰も削除していないエントリが削除されたと報告されてしまいます。各ファイルには、取得したアカウントが管理者だったかどうかが記録され、比較はそのことを伝えます。
- ファイルとこのマシンだけでなく、2 つのファイルでも比較できます。ステージング環境と本番環境でそれぞれ取って、どこでも比較できます。ステージング環境はなぜ違うのかという問いに、どちらのマシンもその場に必要ありません。
ウィンドウでも Audit... から同じことができます。Take snapshot... は同じファイルを書き込み、入力すればメモも付きます。Compare with this machine... または Compare two snapshots... は、一覧の代わりに何が変わったかをフィールドごとに 1 行で表示し、比較が完全に正確ではなくなる事情はすべて表の上に書かれます。Show は差分または 1 つのフィールドに絞り込み、Export... は CSV ファイルに書き出します。
終了コードが要点です
--exit-code は、構成が異なる場合に 5 で終了します。エントリが追加または削除された場合、または設定が変わった場合です。単に自力で停止または開始したサービスは報告されますが、数えません。Windows がサインインしているセッションごとに作るユーザーごとのコピーも、同様に数えず、省いたうえで件数を報告します。失敗ではありません。ドリフトは、このツールが見つけるために存在するものであり、見つけることは失敗ではありません。だからこそ、何かがおかしいことを意味する番号を借りず、専用の番号があります。
# マシンが稼働を開始する日
bws snapshot create C:\baselines\web01.json --note "after the build"
# 毎晩、スケジュールされたタスクから
bws snapshot diff C:\baselines\web01.json --live --exit-code --json > C:\logs\drift.json
# 0 - 構成のドリフトなし
# 5 - 構成がドリフトした。drift.json に内容が書かれる
# 3 - 実行されたが、すべてを読み取れなかった。そのため答えは部分的
これが仕組みのすべてです。マシンが正常だとわかっているときに取ったベースラインと、毎晩尋ねる質問です。初日の夜に 5 が返れば、何かが壊れた朝ではなく、その初日の夜に誰かが気づきます。