То, чего services.msc никогда не делал

Снимки и дрейф

Любой другой инструмент говорит, как машина выглядит сейчас. Вопрос, который на самом деле стоит перед администратором, - что отличается от того, как было, когда всё работало, - и на обычной Windows на него не отвечает ничто.

Что хранит снимок

Вся машина в один момент: каждая служба и драйвер с типом запуска, учётной записью, путём запуска и аргументами, хешем и подписантом запускаемого файла, зависимостями и тем, что зависит от неё, триггерами, требуемыми привилегиями, типом SID и дескриптором безопасности, а также имя машины, учётная запись, сделавшая снимок, и была ли эта учётная запись администратором.

bws snapshot create before.json --note "before the patch"

Это 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.
  • Конфигурация и состояние выполнения сообщаются раздельно. Два снимка с разницей в день различаются тем, что случайно работает, и почти ничто из этого не дрейф. Смешанная вместе, единственная строка, которая важна, - тип запуска, который кто-то изменил, - тонет под сорока неважными.
  • То, что нельзя было сравнить, перечислено, а не скрыто. Поле, которое один из двух снимков никогда не читал, потому что у того сеанса не было на него прав, выходит как not compared под своей записью, а итог считает такие записи. Поэтому сравнение, говорящее ничего не изменилось, означает, что ничего не изменилось в том, что видели обе стороны.
  • Снимок с повышенными правами против снимка без них солгал бы, сообщив как удалённые записи, которых никто не удалял. Каждый файл записывает, был ли администратором сделавший его аккаунт, и сравнение говорит об этом.
  • Два файла, а не только файл и эта машина. Сделайте один на тестовой среде и один на рабочей и сравните их где угодно - ответу на вопрос почему тестовая среда отличается не нужна ни одна из машин.

Окно делает то же самое в разделе Audit.... Take snapshot... пишет тот же файл, с примечанием, если вы его наберёте, а Compare with this machine... или Compare two snapshots... показывает вместо списка, что изменилось, одной строкой на поле, со всем, что делает сравнение менее точным, сказанным над таблицей. Show сужает его до различий или до одного поля, а 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, кто-то узнает об этом в первую же ночь, а не утром, когда что-то сломается.

Использование этого для аудита