Архив метки: Firewall

EventViewer: Ограничения XPath 1.0

Просто на заметку. Никакого решения нет!

Если во встроенном Firewall включить по умолчанию запрещающую политику (как того требует стандарт безопасности), то в журнал будут попадать записи о заблокированных попытках выхода в интернет для всех приложений, которые не разрешены явно. Для многих это не проблема, т.к. можно создать правило, которое будет прекрасно работать. Но, в нашем мире есть два вида пришельцев, которые усложняю нам (админам) жизнь.

Первый вид — это разработчики инсталлятора Squirrel. Кому-то покажется, что они его не знают, но это не так. Взять хотя бы Яндекс-диск и Дискорд, как наиболее известные приложения, использующие его. Его можно «увидеть» в структуре папок, например:

C:\Users\Denis\AppData\Local\Discord\app-1.0.9010

или

C:\Users\Denis\AppData\Roaming\Yandex\YandexDisk2\3.2.24.4790

Думаю, общие черты уже видно. Проблема в папке, в названии которой есть номер версии. Если я использую SRP (Software Restriction Policies), я могу создать разрешающее правило такого вида:

%USERPROFILE%\AppData\Local\GitHubDesktop\app-1.0.*\GitHubDesktop.exe

Или даже такого:

%USERPROFILE%\AppData\Local\Discord\app-1.0.????\Discord.exe

В этом случае, если сменится номер версии, то программа запустится и не будет заблокирована.
Но в случае с брандмауэром (Windows Defender Firewall with Advanced Security) на сцену выходит второй вид людей, портящих нам жизнь — это его разработчики. Наверное во времена Windows XP SP2 действительно было необходимо экономить ресурсы компьютера, поэтому о маске пути думали лишь как о роскоши, но прошло почти 18 лет, а ничего не изменилось! Мы всё также не можем добавить правило с маской! Я подумал, что может просто уже давно всё сделали, но почему-то забыли снять это ограничение для графического интерфейса настроек файрвола и изменил правило через реестр (наивно конечно, но вдруг…):

Computer\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\SharedAccess\Parameters\FirewallPolicy\FirewallRules

В этом разделе были ключи примерно с таким содержанием:

v2.30|Action=Allow|Active=TRUE|Dir=Out|Protocol=6|RPort=443|App=C:\Users\Denis\AppData\Local\Discord\app-1.0.9010\Discord.exe|Name=Discord(2)|Desc=C:\Users\Denis\AppData\Local\Discord\app-1.0.9010\Discord.exe|EmbedCtxt=_USER|

Я попытался добавить сюда маску типа такой:

App=C:\Users\Denis\AppData\Local\Discord\app-1.0.????\Discord.exe

Или такой

App=C:\Users\Denis\AppData\Local\Discord\app-1.0.*\Discord.exe

Но увы, ничего не сработало.

Планировщик задач

Теперь мы уже ближе к теме заметки. Поскольку я сильно обломался с файрволом, то решил пойти обходным путём. В принципе я мог написать скрипт, который меняет путь для правила файрвол. Поскольку я уже хотел если не идеального решения, то хотя бы удобного для пользователя, то мне недостаточно было сменить путь к заблокированному файлу в правиле, я хотел, чтобы скрипт запускался автоматически. Примерно так:
1. Пользователь запускает приложение (к примеру Discord)
2. Приложение не может выйти в интернет, о чём пишет в журнал (вообще лог в журнал пишет не приложение, а сам файрвол, если включить соответствующую настройку)
3. Отловив это событие, мы запускаем скрипт, который меняет путь.
Вроде как «Бинго», но нет, т.к. тут тоже есть свои ограничения!
В Планировщике можно создать задачу, которая будет запускать файл/скрипт, при появлении в Журнале событий определённого события. При создании триггера из выпадающих меню можно выбрать «On an event», после чего выбрать тип события и даже номера ошибок. Но нам-то нужны не все события о блокировке, а только те, которые будут содержать определённый путь к файлу. В принципе, это тоже можно сделать!
CustomNew Event FilterXML
Здесь можно сформировать запрос уже гораздо более сложный:

<QueryList>
  <Query Id="0" Path="Security">
    <Select Path="Security">
      *[System[(Level=1 or Level=2 or Level=3 or Level=4 or Level=0 or Level=5) and (EventID=5152 or EventID=5157)]]
      and
      *[EventData[Data[@Name='Application'] = '\device\harddiskvolume8\program files (x86)\microsoft\edge\application\msedge.exe']]
    </Select>
  </Query>
</QueryList>

Это всё круто, только у нас проблема связана с тем, что упоротые разработчики инсталлятора Squirrel меняют путь при обновлении. А значит мы не знаем, какой путь будет у заблокированного приложения. Маски? Надежда была, но тут без сюрпризов — маски не поддерживаются, поскольку здесь так и остались в 2004 году. До сих пор в Планировщике для обработки XML используется XPath 1.0, а работа с масками есть только с версии XPath 2.0…