Белый список с брандмауэром Windows

в 7:17, , рубрики: firewall, powershell, безопасность, брандмауэр, вирусы, информационная безопасность, системное администрирование

image

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

Введение

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

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

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

Скриншоты
image

image

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

Скриншоты
image

image

image

image

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

Скриншоты
image

image

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

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

Обновив систему с Windows 8.1 до Windows 10, я не мог создать работоспособное правило для OneDrive. Вроде бы простое правило для %USERPROFILE%AppDataLocalMicrosoftOneDriveOneDrive.exe и все должно работать. Но, потратив несколько месяцев, я пришел к тому, что, оказывается, надо было прописывать прямой путь C:UsersProfileNameAppDataLocalMicrosoftOneDriveOneDrive.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:Windowsexplorer.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 Exploreriexplore.exe')),

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

    ('Доступ для Google Chrome',
            (${env:ProgramFiles(x86)}+'GoogleChromeApplicationchrome.exe')),
    
    ('Доступ для Google Update',
            (${env:ProgramFiles(x86)}+'GoogleUpdateGoogleUpdate.exe')),
    
    ('Доступ для Tor Browser',
            ($env:USERPROFILE+'AppDataLocalTor BrowserBrowserfirefox.exe')),
    
    ('Доступ для Tor Browser updater',
            ($env:USERPROFILE+'AppDataLocalTor BrowserBrowserupdater.exe')),
    
    ('Доступ для Yandex.Browser',
            ($env:USERPROFILE+'AppDataLocalYandexYandexBrowserApplicationbrowser.exe')),
    
    ('Доступ для Notepad++ (GUP)',
            (${env:ProgramFiles(x86)}+'Notepad++updaterGUP.exe')),
    
    ('Доступ для Visual Studio 2015',
            (${env:ProgramFiles(x86)}+'Microsoft Visual Studio 14.0Common7IDEdevenv.exe')),
    
    ('Доступ для Blend (Visual Studio)',
            (${env:ProgramFiles(x86)}+'Microsoft Visual Studio 14.0Common7IDEBlend.exe')),
    
    ('Доступ для qBittorrent',
            (${env:ProgramFiles(x86)}+'qBittorrentqbittorrent.exe')),
    
    ('Доступ для HWMonitor',
            ($env:ProgramFiles+'CPUIDHWMonitorHWMonitor.exe')),
    
    ('Доступ для OneDrive',
            ($env:USERPROFILE+'AppDataLocalMicrosoftOneDriveOneDrive.exe')),
    
    ('Доступ для PowerShell (выключить для безопасности)',
            ($env:SystemRoot+'System32WindowsPowerShellv1.0powershell.exe')),
    
    ('Доступ для PowerShell ISE (выключить для безопасности)',
            ($env:SystemRoot+'System32WindowsPowerShellv1.0powershell_ise.exe')),
    
    ('Доступ для Steam',
            (${env:ProgramFiles(x86)}+'SteamSteam.exe')),
    
    ('Доступ для steamwebhelper',
            (${env:ProgramFiles(x86)}+'Steambinsteamwebhelper.exe')),
    
    ('Доступ для Steam CS GO',
            ('D:GamesSteamLibrarysteamappscommonCounter-Strike Global Offensivecsgo.exe')),
    
    ('Доступ для TeamViewer',
            (${env:ProgramFiles(x86)}+'TeamViewerTeamViewer.exe')),
            
    ('Доступ для TeamViewer_Service',
            (${env:ProgramFiles(x86)}+'TeamViewerTeamViewer_Service.exe'))

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

Добавляем в $programs
    ('Доступ для AvastUI+',
            ($env:ProgramFiles+'AVAST SoftwareAvastAvastUI.exe')),
    
    ('Доступ для AvastSvc',
            ($env:ProgramFiles+'AVAST SoftwareAvastAvastSvc.exe')),
    
    ('Доступ для Avast планировщик (AvastEmUpdate)',
            ($env:ProgramFiles+'AVAST SoftwareAvastAvastEmUpdate.exe')),
    
    ('Доступ для Avast обновления (instup)',
            ($env:ProgramFiles+'AVAST SoftwareAvastsetupinstup.exe')),
    
    ('Доступ для Mozilla Firefox',
            (${env:ProgramFiles(x86)}+'Mozilla Firefoxfirefox.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+'System32svchost.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) можно обнаружить под спойлером ниже.

Итоговый скрипт
$programs = 
    ('Доступ для Internet Explorer (x86)',
            (${env:ProgramFiles(x86)}+'Internet Exploreriexplore.exe')),
    
    ('Доступ для Internet Explorer',
            ($env:ProgramFiles+'Internet Exploreriexplore.exe')),
    
    ('Доступ для Google Chrome',
            (${env:ProgramFiles(x86)}+'GoogleChromeApplicationchrome.exe')),
    
    ('Доступ для Google Update',
            (${env:ProgramFiles(x86)}+'GoogleUpdateGoogleUpdate.exe')),
    
    ('Доступ для Tor Browser',
            ($env:USERPROFILE+'AppDataLocalTor BrowserBrowserfirefox.exe')),
    
    ('Доступ для Tor Browser updater',
            ($env:USERPROFILE+'AppDataLocalTor BrowserBrowserupdater.exe')),
    
    ('Доступ для Yandex.Browser',
            ($env:USERPROFILE+'AppDataLocalYandexYandexBrowserApplicationbrowser.exe')),
    
    ('Доступ для Notepad++ (GUP)',
            (${env:ProgramFiles(x86)}+'Notepad++updaterGUP.exe')),
    
    ('Доступ для Visual Studio 2015',
            (${env:ProgramFiles(x86)}+'Microsoft Visual Studio 14.0Common7IDEdevenv.exe')),
    
    ('Доступ для Blend (Visual Studio)',
            (${env:ProgramFiles(x86)}+'Microsoft Visual Studio 14.0Common7IDEBlend.exe')),
    
    ('Доступ для qBittorrent',
            (${env:ProgramFiles(x86)}+'qBittorrentqbittorrent.exe')),
    
    ('Доступ для HWMonitor',
            ($env:ProgramFiles+'CPUIDHWMonitorHWMonitor.exe')),
    
    ('Доступ для OneDrive',
            ($env:USERPROFILE+'AppDataLocalMicrosoftOneDriveOneDrive.exe')),
    
    ('Доступ для PowerShell (выключить для безопасности)',
            ($env:SystemRoot+'System32WindowsPowerShellv1.0powershell.exe')),
    
    ('Доступ для PowerShell ISE (выключить для безопасности)',
            ($env:SystemRoot+'System32WindowsPowerShellv1.0powershell_ise.exe')),
    
    ('Доступ для Steam',
            (${env:ProgramFiles(x86)}+'SteamSteam.exe')),
    
    ('Доступ для steamwebhelper',
            (${env:ProgramFiles(x86)}+'Steambinsteamwebhelper.exe')),
    
    ('Доступ для Steam CS GO',
            ('D:GamesSteamLibrarysteamappscommonCounter-Strike Global Offensivecsgo.exe')),
    
    ('Доступ для TeamViewer',
            (${env:ProgramFiles(x86)}+'TeamViewerTeamViewer.exe')),
            
    ('Доступ для TeamViewer_Service',
            (${env:ProgramFiles(x86)}+'TeamViewerTeamViewer_Service.exe')),

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

    ('Доступ для AvastUI+',
            ($env:ProgramFiles+'AVAST SoftwareAvastAvastUI.exe')),
    
    ('Доступ для AvastSvc',
            ($env:ProgramFiles+'AVAST SoftwareAvastAvastSvc.exe')),
    
    ('Доступ для Avast планировщик (AvastEmUpdate)',
            ($env:ProgramFiles+'AVAST SoftwareAvastAvastEmUpdate.exe')),
    
    ('Доступ для Avast обновления (instup)',
            ($env:ProgramFiles+'AVAST SoftwareAvastsetupinstup.exe')),
 
    ('Доступ для Mozilla Firefox',
            (${env:ProgramFiles(x86)}+'Mozilla Firefoxfirefox.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+'System32svchost.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

Источник

Поделиться новостью

* - обязательные к заполнению поля