Пользователь
0,0
рейтинг
20 января в 10:17

Разработка → Белый список с брандмауэром Windows из песочницы

image

Если паранойя подсказывает, что вы недостаточно защищены, а под рукой имеются только бесплатные инструменты для безопасности, то нужно это чувство удовлетворить! Под катом будем создавать белый список программ для выхода в сеть с помощью стандартного брандмауэра Windows, в том числе и на PowerShell.

Введение


Большинство энкодеров, троянов и других плохих вещей из мира киберугроз для своих темных делишек используют возможность выхода в сеть с устройства жертвы: получение ключа для шифрования файлов, отправка конфиденциальной информации и так далее. Антивирусные компании в борьбе с такими противниками натаскивают свои проактивные технологии, выпускают даже отдельные продукты для шифровальщиков, ну а для простых пользователей бесплатной защиты остается только более тонко настраивать свои рубежи самостоятельно. Со времен Vista встроенный в Windows брандмауэр стал неплох, но большую часть времени простаивает без дела, отбивая лишь неписаные входящие соединения в лучшем случае. Не все знают, но он умеет чуточку больше — фильтровать и исходящие соединения, стоит лишь только включить этот режим и правильно настроить.

Итак, приступим


Первым делом необходимо запретить все исходящие соединения (входящие, считаем, уже запрещены — нужное ПО само, как правило, прописывает для себя исключения). Для этого идем в Панель управления -> Система и безопасность -> Брандмауэр Windows -> Дополнительные параметры. Далее выбираем «Брандмауэр Windows в режиме повышенной безопасности» и через правую кнопку мыши открываем Свойства. В зависимости от вашего сетевого профиля (частный — локальная сеть с маршрутизатором, общий — напрямую в интернет, домен — доменная сеть) выбирается вкладка профиля и для исходящих соединений выбирается режим «Блокировать» (я настраивал для всех профилей одинаково).

Скриншоты
image

image

На данный момент никакая программа выйти в сеть не может (кроме уже имеющих правила). Легко это проверить, открыв браузер с любым сайтом — наверняка получим ошибку сети. Чтобы загрузить страницу необходимо создать соответствующее правило. Рассмотрим Internet Explorer — имеется у всех на Windows. Нажимаем правой кнопкой на «Правила для исходящего подключения» -> Создать правило. Открывается окно с 4-мя типами правил, для IE подойдет первый — «Для программы». Далее нужно указать путь к программе — в нашем случае — C:\Program Files\Internet Explorer\iexplore.exe. Не забываем, что обладатели 64-битных систем должны создать еще одно такое же правило, только для Program Files (x86) (там IE тоже установлен). После выбора файла необходимо выбрать пункт «Разрешить подключение», далее отметить галками нужные сетевые профили. Осталось только придумать название для нашего правила. Рекомендую все правила писать с одного и того же слова/символа, потом искать будет удобнее. Созданное правило будет отображаться в общем списке.

Скриншоты
image

image

image

image

Для программ правила делать научились, а что со службами? Пусть необходимо добавить в исключения службу Mozilla Maintenance Service. Создаем новое правило, выбираем тип «Настраиваемое». Далее нажимаем «Настроить», выбираем «Применять к службе» и ищем в списке нужную службу или чуть ниже вводим название службы вручную. Затем предлагается настроить протокол и порты, но в данном случае их можно оставить по умолчанию — программа доверенная и шут ее знает, чем она там пользуется при доставке и установке обновлений. IP-адреса аналогично не трогаем. Далее разрешаем подключение, выбираем профили и задаем название для правила.

Скриншоты
image

image

Казалось бы, основные моменты пройдены, что теперь? А теперь подводные камни. Если кто-нибудь использует в своей деятельности программу удаленного управления TeamViewer, которая ставит с собой службу, то вроде бы достаточно найти в списке службу и добавить правило для нее. Но это не сработает. Необходимо вместо службы добавлять правило «Для программы» и выбирать исполняемый файл службы C:\Program Files (x86)\TeamViewer\TeamViewer_Service.exe (путь для 64-битной системы). Это частая ситуация, поэтому не спешите добавлять службы, начинайте с exe. Кроме этого в нашей системе перестанет работать ping. Для него необходимо добавить правило по типу «Настраиваемое», все оставлять по умолчанию, только протокол выбрать ICMPv4 и внизу нажать «Настроить», где поставить галочку только рядом с «Эхо-запрос». Теперь ping и tracert будут работать. Для IPv6 повторить, но уже с протоколом ICMPv6. Если правило уже создано, но необходимо что-то в нем изменить, это легко можно сделать, выбрав нужное правило в списке и зайдя в его свойства. На вкладках можно все настроить на любой вкус — привязать службу к определенному exe, ограничить программу в портах и т.д.

Скриншот
image
Свойства уже созданного правила для ping

Обновив систему с Windows 8.1 до Windows 10, я не мог создать работоспособное правило для OneDrive. Вроде бы простое правило для %USERPROFILE%\AppData\Local\Microsoft\OneDrive\OneDrive.exe и все должно работать. Но, потратив несколько месяцев, я пришел к тому, что, оказывается, надо было прописывать прямой путь C:\Users\ProfileName\AppData\Local\Microsoft\OneDrive\OneDrive.exe, хотя в предыдущих ОС того же семейства все благополучно работало и с первым вариантом (загадка?).

Накопленный опыт и PowerShell


Список правил, накопленный за N-ое время, я представлю в виде команд для PowerShell — легче автоматизировать. Чтобы можно было запустить в PowerShell скрипт на исполнение, необходимо дать на это разрешение для неподписанных скриптов в системе (для параноиков можно потом вернуть на место):

Set-ExecutionPolicy Unrestricted
Set-ExecutionPolicy Default    # Отмена

Блокировка всех исходящих соединений брандмауэром выглядит так:

Set-NetFirewallProfile -All -DefaultOutboundAction Block

Команда для добавления правила для всех профилей и исходящего направления для explorer.exe — обновление плиток на Windows 8.1. Полагаю, что и на 10-ке используется:

New-NetFirewallRule -Program 'C:\Windows\explorer.exe' -Action Allow -Profile Any -DisplayName 'Доступ для explorer.exe' -Direction Outbound

Пусть у нас первая ячейка содержит название правила, а вторая ячейка хранит путь до программы. И у нас будет N таких двухячеечных строк — сколько штук правил. Все это будем хранить в $programs. Начнем с простого: Internet Explorer, Google Chrome, Tor Browser, Yandex.Browser, Notepad++, Visual Studio 2015, qBittorrent, HWMonitor, OneDrive, PowerShell, PowerShell ISE, Steam, CS GO, TeamViewer и так далее — все более-менее простые приложения, которым для выхода в сеть нужен доступ из 1-2 файлов exe.

Заполнение таблицы $programs
# $env - системные переменные %USERPROFILE%, %SystemRoot% и т.д.
$programs = 
    ('Доступ для Internet Explorer (x86)',
            (${env:ProgramFiles(x86)}+'\Internet Explorer\iexplore.exe')),

    ('Доступ для Internet Explorer',
            ($env:ProgramFiles+'\Internet Explorer\iexplore.exe')),

    ('Доступ для Google Chrome',
            (${env:ProgramFiles(x86)}+'\Google\Chrome\Application\chrome.exe')),
    
    ('Доступ для Google Update',
            (${env:ProgramFiles(x86)}+'\Google\Update\GoogleUpdate.exe')),
    
    ('Доступ для Tor Browser',
            ($env:USERPROFILE+'\AppData\Local\Tor Browser\Browser\firefox.exe')),
    
    ('Доступ для Tor Browser updater',
            ($env:USERPROFILE+'\AppData\Local\Tor Browser\Browser\updater.exe')),
    
    ('Доступ для Yandex.Browser',
            ($env:USERPROFILE+'\AppData\Local\Yandex\YandexBrowser\Application\browser.exe')),
    
    ('Доступ для Notepad++ (GUP)',
            (${env:ProgramFiles(x86)}+'\Notepad++\updater\GUP.exe')),
    
    ('Доступ для Visual Studio 2015',
            (${env:ProgramFiles(x86)}+'\Microsoft Visual Studio 14.0\Common7\IDE\devenv.exe')),
    
    ('Доступ для Blend (Visual Studio)',
            (${env:ProgramFiles(x86)}+'\Microsoft Visual Studio 14.0\Common7\IDE\Blend.exe')),
    
    ('Доступ для qBittorrent',
            (${env:ProgramFiles(x86)}+'\qBittorrent\qbittorrent.exe')),
    
    ('Доступ для HWMonitor',
            ($env:ProgramFiles+'\CPUID\HWMonitor\HWMonitor.exe')),
    
    ('Доступ для OneDrive',
            ($env:USERPROFILE+'\AppData\Local\Microsoft\OneDrive\OneDrive.exe')),
    
    ('Доступ для PowerShell (выключить для безопасности)',
            ($env:SystemRoot+'\System32\WindowsPowerShell\v1.0\powershell.exe')),
    
    ('Доступ для PowerShell ISE (выключить для безопасности)',
            ($env:SystemRoot+'\System32\WindowsPowerShell\v1.0\powershell_ise.exe')),
    
    ('Доступ для Steam',
            (${env:ProgramFiles(x86)}+'\Steam\Steam.exe')),
    
    ('Доступ для steamwebhelper',
            (${env:ProgramFiles(x86)}+'\Steam\bin\steamwebhelper.exe')),
    
    ('Доступ для Steam CS GO',
            ('D:\Games\SteamLibrary\steamapps\common\Counter-Strike Global Offensive\csgo.exe')),
    
    ('Доступ для TeamViewer',
            (${env:ProgramFiles(x86)}+'\TeamViewer\TeamViewer.exe')),
            
    ('Доступ для TeamViewer_Service',
            (${env:ProgramFiles(x86)}+'\TeamViewer\TeamViewer_Service.exe'))


Также в табличку можно при желании добавить хитрый Avast (ему еще нужна служба) и Firefox (+служба).

Добавляем в $programs
    ('Доступ для AvastUI+',
            ($env:ProgramFiles+'\AVAST Software\Avast\AvastUI.exe')),
    
    ('Доступ для AvastSvc',
            ($env:ProgramFiles+'\AVAST Software\Avast\AvastSvc.exe')),
    
    ('Доступ для Avast планировщик (AvastEmUpdate)',
            ($env:ProgramFiles+'\AVAST Software\Avast\AvastEmUpdate.exe')),
    
    ('Доступ для Avast обновления (instup)',
            ($env:ProgramFiles+'\AVAST Software\Avast\setup\instup.exe')),
    
    ('Доступ для Mozilla Firefox',
            (${env:ProgramFiles(x86)}+'\Mozilla Firefox\firefox.exe'))


Все строки таблицы будем обрабатывать поштучно следующим образом:
foreach($prog in $programs)
{
    try
    {
        New-NetFirewallRule -Program $prog[1] -Action Allow -Profile Any -DisplayName $prog[0] -Direction Outbound
        Write-Host 'Успех: '$prog[0]
    }
    catch
    {
        Write-Host 'Ошибка: '$prog[0]
    }
    Write-Host
}

Кроме этого необходимо разобраться с нестандартными правилами и службами. Например, центр обновления работает через svchost.exe по протоколу TCP через порты 80 и 443. А магазин приложений использует для обновления отдельную службу WSService. Помимо этого не забываем про пинг и службы для нужных приложений:

try
{
    $i = 'Доступ для Windows Update/Modern Apps'
    New-NetFirewallRule -Program ($env:SystemRoot+'\System32\svchost.exe') -Protocol TCP -RemotePort 80, 443 -Action Allow -Profile Any -DisplayName $i -Direction Outbound

    $i = 'Доступ для Avast (служба)'
    New-NetFirewallRule -Service 'avast! Antivirus' -Action Allow -Profile Any -DisplayName $i -Direction Outbound

    $i = 'Доступ для Mozilla Maintenance Service'
    New-NetFirewallRule -Service 'MozillaMaintenance' -Action Allow -Profile Any -DisplayName $i -Direction Outbound
    
    $i = 'Доступ для ping (v4)'
    New-NetFirewallRule -Profile Any -Action Allow -DisplayName $i -Protocol ICMPv4 -IcmpType 8 -Direction Outbound
    
    $i = 'Доступ для ping (v6)'
    New-NetFirewallRule -Profile Any -Action Allow -DisplayName $i -Protocol ICMPv6 -IcmpType 8 -Direction Outbound

    $i = 'Доступ для Службы Магазина Windows'
    New-NetFirewallRule -Service 'WSService' -Action Allow -Profile Any -DisplayName $i -Direction Outbound

    # На редкие исключения, когда огненную стену надо приопустить (при установке программ, например)
    $i = 'Доступ для Частного профиля (выключить)'
    New-NetFirewallRule -Enabled False -Action Allow -Profile Private -DisplayName $i -Direction Outbound

    Write-Host 'Успех при применении особых правил'
}
catch
{
    Write-Host 'Ошибка при применении особых правил на шаге:' $i 
}
Write-Host

Вот и, пожалуй, все. На этом повествование можно заканчивать. Передаю инициативу теперь в ваши руки, дерзайте! Надеюсь, Вы узнали что-то новое или хотя бы вспомнили хорошо забытое старое. Итоговый скрипт (.ps1) можно обнаружить под спойлером ниже.

Итоговый скрипт
Set-NetFirewallProfile -All -DefaultOutboundAction Block

$programs = 
    ('Доступ для Internet Explorer (x86)',
            (${env:ProgramFiles(x86)}+'\Internet Explorer\iexplore.exe')),
    
    ('Доступ для Internet Explorer',
            ($env:ProgramFiles+'\Internet Explorer\iexplore.exe')),
    
    ('Доступ для Google Chrome',
            (${env:ProgramFiles(x86)}+'\Google\Chrome\Application\chrome.exe')),
    
    ('Доступ для Google Update',
            (${env:ProgramFiles(x86)}+'\Google\Update\GoogleUpdate.exe')),
    
    ('Доступ для Tor Browser',
            ($env:USERPROFILE+'\AppData\Local\Tor Browser\Browser\firefox.exe')),
    
    ('Доступ для Tor Browser updater',
            ($env:USERPROFILE+'\AppData\Local\Tor Browser\Browser\updater.exe')),
    
    ('Доступ для Yandex.Browser',
            ($env:USERPROFILE+'\AppData\Local\Yandex\YandexBrowser\Application\browser.exe')),
    
    ('Доступ для Notepad++ (GUP)',
            (${env:ProgramFiles(x86)}+'\Notepad++\updater\GUP.exe')),
    
    ('Доступ для Visual Studio 2015',
            (${env:ProgramFiles(x86)}+'\Microsoft Visual Studio 14.0\Common7\IDE\devenv.exe')),
    
    ('Доступ для Blend (Visual Studio)',
            (${env:ProgramFiles(x86)}+'\Microsoft Visual Studio 14.0\Common7\IDE\Blend.exe')),
    
    ('Доступ для qBittorrent',
            (${env:ProgramFiles(x86)}+'\qBittorrent\qbittorrent.exe')),
    
    ('Доступ для HWMonitor',
            ($env:ProgramFiles+'\CPUID\HWMonitor\HWMonitor.exe')),
    
    ('Доступ для OneDrive',
            ($env:USERPROFILE+'\AppData\Local\Microsoft\OneDrive\OneDrive.exe')),
    
    ('Доступ для PowerShell (выключить для безопасности)',
            ($env:SystemRoot+'\System32\WindowsPowerShell\v1.0\powershell.exe')),
    
    ('Доступ для PowerShell ISE (выключить для безопасности)',
            ($env:SystemRoot+'\System32\WindowsPowerShell\v1.0\powershell_ise.exe')),
    
    ('Доступ для Steam',
            (${env:ProgramFiles(x86)}+'\Steam\Steam.exe')),
    
    ('Доступ для steamwebhelper',
            (${env:ProgramFiles(x86)}+'\Steam\bin\steamwebhelper.exe')),
    
    ('Доступ для Steam CS GO',
            ('D:\Games\SteamLibrary\steamapps\common\Counter-Strike Global Offensive\csgo.exe')),
    
    ('Доступ для TeamViewer',
            (${env:ProgramFiles(x86)}+'\TeamViewer\TeamViewer.exe')),
            
    ('Доступ для TeamViewer_Service',
            (${env:ProgramFiles(x86)}+'\TeamViewer\TeamViewer_Service.exe')),

    ('Доступ для explorer.exe',
            ($env:SystemRoot+'\explorer.exe')),

    ('Доступ для AvastUI+',
            ($env:ProgramFiles+'\AVAST Software\Avast\AvastUI.exe')),
    
    ('Доступ для AvastSvc',
            ($env:ProgramFiles+'\AVAST Software\Avast\AvastSvc.exe')),
    
    ('Доступ для Avast планировщик (AvastEmUpdate)',
            ($env:ProgramFiles+'\AVAST Software\Avast\AvastEmUpdate.exe')),
    
    ('Доступ для Avast обновления (instup)',
            ($env:ProgramFiles+'\AVAST Software\Avast\setup\instup.exe')),
 
    ('Доступ для Mozilla Firefox',
            (${env:ProgramFiles(x86)}+'\Mozilla Firefox\firefox.exe'))


foreach($prog in $programs)
{
    try
    {
        New-NetFirewallRule -Program $prog[1] -Action Allow -Profile Any -DisplayName $prog[0] -Direction Outbound
        Write-Host 'Успех: '$prog[0]
    }
    catch
    {
        Write-Host 'Ошибка: '$prog[0]
    }
    Write-Host
}

try
{
    $i = 'Доступ для Windows Update/Modern Apps'
    New-NetFirewallRule -Program ($env:SystemRoot+'\System32\svchost.exe') -Protocol TCP -RemotePort 80, 443 -Action Allow -Profile Any -DisplayName $i -Direction Outbound

    $i = 'Доступ для Avast (служба)'
    New-NetFirewallRule -Service 'avast! Antivirus' -Action Allow -Profile Any -DisplayName $i -Direction Outbound

    $i = 'Доступ для Mozilla Maintenance Service'
    New-NetFirewallRule -Service 'MozillaMaintenance' -Action Allow -Profile Any -DisplayName $i -Direction Outbound
    
    $i = 'Доступ для ping (v4)'
    New-NetFirewallRule -Profile Any -Action Allow -DisplayName $i -Protocol ICMPv4 -IcmpType 8 -Direction Outbound
    
    $i = 'Доступ для ping (v6)'
    New-NetFirewallRule -Profile Any -Action Allow -DisplayName $i -Protocol ICMPv6 -IcmpType 8 -Direction Outbound

    $i = 'Доступ для Службы Магазина Windows'
    New-NetFirewallRule -Service 'WSService' -Action Allow -Profile Any -DisplayName $i -Direction Outbound

    # На редкие исключения, когда огненную стену надо приопустить (при установке программ, например)
    $i = 'Доступ для Частного профиля (выключить)'
    New-NetFirewallRule -Enabled False -Action Allow -Profile Private -DisplayName $i -Direction Outbound

    Write-Host 'Успех при применении особых правил'
}
catch
{
    Write-Host 'Ошибка при применении особых правил на шаге:' $i 
}
Write-Host

@melt
карма
7,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (11)

  • +1
    Кстати, коли уж речь про белые списки зашла. Решил тут подарить своим восьмилетним детям компьютер, ну и выпустить их в интернет. Поставил десятку, благо апдейт бесплатный, а также из за «family safety», которую удобно администрировать прямо в онлайне. Собственно мне нужна возможность разрешить сайты только из моего «белого списка», куда я хочу занести три-четыре сайта, куда им можно ходить. И вот тут я жестоко обломался. В восьмёрке была честная опция «разрешить сайты только из белого списка». А в десятке эту опцию убрали, хотя список «белых сайтов» оставили. Короче, сломали они это дело. Я конечно временно решил проблему, тупо прописав несуществующий прокси и банально добавив нужные мне сайты в список исключений, но осадочек остался. Это в общем-то ключевая опция, которую поломать ну никак не должны были, однако вот смогли: Family Safety in Windows 10 Missing White List Feature
  • +2
    Да не сочтут за рекламу хабражители: брошу пару ссылок, вдруг кому лень разбираться в shell пригодится (оба по своему интересны, первый с исходниками ну и portable):
  • 0
    тоже статья по теме habrahabr.ru/post/267507
  • 0
    «Обновив систему с Windows 8.1 до Windows 10, я не мог создать работоспособное правило для OneDrive. Вроде бы простое правило для %USERPROFILE%\AppData\Local\Microsoft\OneDrive\OneDrive.exe и все должно работать. Но, потратив несколько месяцев...»

    Потому что брэндмауер запускается не от залогиненного юзера, а от system? Можно было бы потратить несколько минут на тостере…
    • +2
      брэндмауер запускается не от залогиненного юзера, а от system
      Было бы глупо иначе… Firewall Rule Properties Page: Programs and Services Tab см. секцию Important…

      Что мешает субституировать путь %AppData% до добавления правила? Или если оно должно действовать для нескольких пользователей, установить OneDrive for all users (install as administrator)?
      • 0
        Действительно, в 8.1 SkyDrive лежал в C:\Windows. Самое интересное, что брандмауэр сам автоматически путь сокращает до переменных, если создавать правило через интерфейсный режим. Спасибо за разъяснение.
      • 0
        Так а я что сказал?
        • 0
          Лично я отвечал Вам обоим. Вы правы. Спасибо :)
  • 0
    del
    • 0
      del
  • 0
    Хотелось бы дополнить статью в связи с выходом Windows 10 Anniversary Update. Для магазина приложений теперь используется два отдельных UWP-приложения: StorePurchaseApp и WindowsStore, а это значит, что они сами себя добавляют в правила брандмауэра. При этом из системы удалена служба магазина (WSService). Для скачивания приложений из магазина необходимо предоставить доступ (просто добавить в $programs, если по статье) для InstallAgentUserBroker.exe:
    $prog = 
       ('Доступ для InstallAgentUserBroker (скачивание приложений из Магазина)',
       ($env:SystemRoot+'\System32\InstallAgentUserBroker.exe'))
    
    New-NetFirewallRule -Program $prog[1] -Action Allow -Profile Any -DisplayName $prog[0] -Direction Outbound
    

    Для авторизации в приложениях с помощью учетной записи Microsoft (в OneNote и т.п.) необходимо дать доступ AuthHost.exe:
    $prog = 
       ('Доступ для AuthHost (авторизация в приложениях)',
       ($env:SystemRoot+'\System32\AuthHost.exe'))
    
    New-NetFirewallRule -Program $prog[1] -Action Allow -Profile Any -DisplayName $prog[0] -Direction Outbound
    

    Чтобы полноценно пользоваться стандартным почтовым клиентом, необходимо добавить в правило из статьи Доступ для Windows Update/Modern Apps порт 993 (imaps):
    $i = 'Доступ для Windows Update/Modern Apps'
    
    New-NetFirewallRule -Program ($env:SystemRoot+'\System32\svchost.exe') -Protocol TCP -RemotePort 80, 443, 993 -Action Allow -Profile Any -DisplayName $i -Direction Outbound
    

    Из мною замеченного на данный момент, вроде бы, все :)

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.