Андрей Бирюков
Windows Firewall: защищаем внутренние ресурсы сети
Сейчас локальная сеть любой, даже совсем небольшой организации, защищена от внешних угроз. Настолько ли хорошо защищены ресурсы внутренней сети?
Защита снаружи, но не изнутри
Современные средства защиты корпоративных ресурсов от внешних угроз весьма разнообразны, существуют как аппаратные и программные межсетевые экраны (например, Cisco PIX, CheckPoint или Microsoft ISA), так и системы обнаружения вторжения, разбирающие проходящие пакеты до уровня приложений, а также шлюзовые антивирусы, фильтрующие определенный вид трафика. Все эти грозные и дорогостоящие средства защищают наши ресурсы от посягательств извне. Однако стоит оказаться внутри локальной сети компании, как тут же обнаруживается, что на большинстве пользовательских машин персональные межсетевые экраны или отключены, или работают в режиме разрешения всех входящих соединений. Такое положение вещей многие системные администраторы объясняют просто: «Нам нужен полный доступ к локальной машине пользователя, и у нас нет времени на настройку портов». Таким образом, получаем ситуацию, когда рабочие станции не защищены персональным межсетевым экраном и в случае если вредоносный код каким-либо образом сумеет проникнуть в локальную сеть, последствия могут оказаться весьма неприятными.
Проблему защиты рабочих станций можно решать с помощью различных средств. Например, многие корпоративные антивирусы имеют встроенный межсетевой экран, политики для которого можно задавать централизованно, но сегодня я продемонстрирую аналогичную защиту рабочих станций с помощью стандартных средств Windows, Active Directory и WSH. Сначала опишу, как автоматически установить firewall и задать соответствующие разрешения для машин, находящихся в домене, а затем, как проделать то же самое у пользователей, не входящих в домен, с помощью сценариев Windows Script Host.
Персональный межсетевой экран Windows XP SP2 и Windows 2003 Server SP 1 автоматически включен и используется для защиты всех сетевых соединений, однако для того чтобы гарантировать запуск службы Firewall на машине пользователя, пропишем его в групповой политике. Предварительно необходимо все пользовательские машины, на которых предполагается включить firewall, поместить в отдельную организационную единицу (Organization Unit). Категорически не рекомендуется применять политики, о которых речь пойдет далее, ко всему домену, так как тогда они применются и к серверам, вследствие чего могут быть закрыты порты, необходимые для нормального функционирования клиент серверных приложений. Итак, необходимая организационная единица создана, и пользовательские машины туда помещены. Теперь на контроллере домена откройте оснастку Active Directory Users And Computers, далее «Computer Management -> Windows Settings -> Security Settings -> System Services -> Windows Firewall». Включаем использование этого сервиса (Enable) и метод запуска автоматический (Startup Automatic) (см. рис. 1).
Рисунок 1. Список сервисов, запускаемых в GPO
Теперь в вашей сети на всех пользовательских машинах запущен сервис Windows Firewall. Следующим шагом укажите приложения и порты, к которым вы хотите разрешить доступ снаружи. К сожалению, версия персонального межсетевого экрана, входящая в состав Windows XP 2003, не позволяет блокировать исходящие соединения, только входящие, поэтому будет открываться доступ только снаружи внутрь.
Что и кому открывать
Так как правила межсетевого экрана работают по принципу «запрещено всё, что не разрешено», то прежде чем включить firewall, вам необходимо определиться с тем, какие порты должны быть открыты на клиентской машине. По возможности постарайтесь минимизировать это количество, так как чем меньше открытых портов, тем меньше потенциальных уязвимостей в защите системы.
В качестве примера буду открывать порты для корпоративного антивируса, удаленного управления и видеоконференций, а также явным образом буду блокировать доступ к порту, используемому сетевыми играми. Также доступ к каждому из портов должен быть разрешен только с определенных узлов или подсетей. Вот что нужно открыть (см. таблицу).
Правила, которые необходимо настроить на межсетевом экране
Порт
|
Протокол
|
Источник
|
Действие
|
Описание
|
10001
|
TCP
|
172.29.0.0/24
|
Enable
|
Antivirus
|
3999
|
TCP
|
172.29.0.2, 172.29.0.200
|
Enable
|
Remote Admin
|
666
|
TCP
|
*
|
Disable
|
No Games
|
999
|
UDP
|
Localsubnet
|
Enable
|
Stream Video
|
Небольшое пояснение к предъявляемым требованиям: в первой строке я разрешаю доступ по порту 10001 всем хостам, находящимся в подсети 172.29.0.0 с маской 255.255.255.0, во второй – к порту 3999 только двум хостам 172.29.0.2, 172.29.0.20, в третьей всем пользователям явным образом запрещено устанавливать соединение по порту, который используют сетевые игры, и наконец в четвертой строке все пользователи локальной подсети могут отправлять UDP-пакеты на порт 999.
Отдельно скажу про ICMP. Администратор должен иметь возможность пропинговать любой узел в своей сети, но при этом не следует разрешать любые операции с этим протоколом, так как существуют виды атак, позволяющие с помощью атак вида Denial Of Service осуществить отказ в обслуживании системы. Таким образом, подводя итог всему изложенному в данном абзаце, будет разрешаться только отклик на входящий эхо-запрос.
Открываем порты
Определившись с тем, какие порты и кому вы хотите открыть, пропишите все эти правила в групповых политиках Active Directory. Для этого откройте ту же групповую политику, которую вы использовали для запуска сервиса Firewall, затем раздел «Computer Management -> Administrative Templates -> Network -> Network Connections -> Windows Firewall». Далее есть два профиля Domain и Standard. Профиль Domain применяется, когда машина подключена к Active Directory, обычно Domain Profile используется для рабочих станций пользователей. Профиль Standard применяется, когда машина не подключена к Active Directory, как правило Standard Profile используется для ноутбуков и портативных компьютеров. В нашем примере мы будем рассматривать Domain Profile.
Как видно из рис. 2, у межсетевого экрана имеется 14 свойств, которые мы и будем сейчас настраивать:
- Protect All Network Connections – использовать ли межсетевой экран для всех соединений (LAN, Dial Up и др.).
- Do not allow exceptions – не позволять исключения. В нашем случае необходимо выставить Disabled, так как исключения, то есть открытые порты, у нас есть.
- Define program exceptions – определяет приложения, обращение к которым разрешено извне. Не самый безопасный способ, лучше ограничивать по портам, чем по приложениям.
- Allow local program exceptions – разрешать исключения для приложений.
- Allow remote administration exception – разрешать удаленное администрирование средствами Windows.
- Allow file and printer sharing exception – разрешать доступ к файловым ресурсам и принтерам, подключенным к данной машине.
- Allow ICMP exceptions – разрешать исключения для протокола ICMP. В соответствии с тем, что было сказано ранее про ICMP, мы разрешим только Inbound echo request (см. рис. 3).
- Allow Remote Desktop exception – разрешать установку соединения по протоколу RDP.
- Allow UPnP exception – позволять исключения для universal Plug and Play (технология, позволяющая различным интеллектуальным устройствам устаналивать соединения интернет-технологий).
- Prohibit notifications – запрещать уведомления пользователя.
- Allow logging – разрешать журналирование. При этом вы можете сохранять информацию об отклоненных пакетах и об успешных соединениях. Как правило имеет смысл вести журналирование только отброшенных пакетов, в случае учета всех соединений лог становится практически нечитаемым из-за своего большого размера.
- Prohibit unicast response to multicast or broadcast – запрещать отправку пакетов в ответ на широковещательные запросы.
- Define port exceptions – определяем порты, которые будут открыты на межсетевом экране.
- Allow local port exceptions – разрешить локальные исключения для портов.
Рисунок 2. Свойства межсетевого экрана
Рисунок 3. Исключения для протокола ICMP
Итак, укажите те порты, которые хотите открыть на всех пользовательских машинах в организационной единице.
Открыв свойства «Define Port Exceptions», выбираете «Enabled», затем «Define port exceptions: Show…». В открывшемся окне вам необходимо определить список портов в соответствии со следующим форматом.
<порт>:<протокол>:<источник>:<действие>:<описание>
Таким образом, после выполнения этих действий вы получите список портов, которые необходимо открыть либо явным образом закрыть (рис. 4).
Рисунок 4. Определяем список портов
Вот собственно и все, что нужно сделать для того, чтобы развернуть на машинах в локальной сети под управлением Active Directory межсетевой экран и открыть необходимые порты.
Для тех, кто вне домена…
Что же делать, если у вас имеются машины, не входящие в домен, например, сеть филиала или ноутбуки сотрудников, находящихся в командировке. В такой ситуации можно прибегнуть к помощи сценариев Windows Script Host. Этот сценарий можно отправить по электронной почте, снабдив получателя соответствующими инструкциями по его запуску. Кстати, сценарий, открывающий порты на межсетевом экране, может быть также полезен при развертывании приложений, которым для работы необходимы открытые порты на firewall.
При работе с Windows Firewall через сценарии WSH обратите внимание на то, что этот объект не является WMI-классом, а СОМ-объектом из библиотеки HNetCfg (Home Networking Configuration), которая в свою очередь обеспечивает большинство функций межсетевого экрана.
Для обращения к библиотеке HNetCfg в нашем сценарии обязательно должна присутствовать строка:
Set objFirewall = CreateObject("HNetCfg.FwMgr")
Эта библиотека содержит ряд объектов:
- LocalPolicy – этот объект определяет, использовать ли локальную политику межсетевого экрана (в оснастке Group Policy она называлась Standard) или же доменную политику (Domain).
- Profile – объекты управляют профилем Windows Firewall и включают следующие свойства:
- AuthorizedApplications – набор авторизованных приложений, к которым разрешено обращение снаружи. Этот список использует объект Profile.
- CurrentProfile – свойство задает текущий профиль межсетевого экрана. Для установки этого значения используйте команду NetCfg.FwMgr.LocalPolicy.CurrentProfile.
- CurrentProfileType –устанавливает тип профиля, который использует Windows Firewall. Может иметь значения: 0 (ноль), если используемый профиль является доменным, или 1, если это стандартный профиль.
- ExceptionsNotAllowed – свойство указывает, разрешать ли использование исключений в Windows Firewall, может иметь значения TRUE или FALSE. Это необходимый элемент для любого профиля.
- FirewallEnable – данное свойство определяет, должен ли быть включен межсетевой экран на машине, возможные значения TRUE или FALSE. Это свойство доступно через объект Profile.
- GetProfileByType – позволяет получить тип профиля (Domain или Standard). Например, вызов HNetCfg.FwMgr.GetProfileByType для сценария, используемого в данной статье вернет 0 (Domain). Может использоваться только для объекта CurrentProfile.
- GloballyOpenPorts – это список открытых портов для данного профиля. Данное свойство доступно через объект профиля.
- IcmpSettings – свойство доступно только для чтения и определяет настройки по протоколу ICMP. Также доступно через свойства профиля.
- NotificationsDisabled – определяет, отправлять ли пользователю уведомления, возможные значения TRUE или FALSE. Доступно через свойства профиля.
- RemoteAdminSettings – разрешать или запрещать удаленное управление системой. Доступно через свойства профиля.
- Services – набор служб (Services), содержащихся в профиле. Также доступно через свойства профиля.
- Type – показывает тип профиля, доменный или стандартный (0 для доменного и 1 для стандартного). Доступно через свойства профиля.
Определившись с объектами, которые вы можете использовать при написании WSH-сценария, попробуйте открыть нужные порты на пользовательской машине. Отмечу, что сценарий использует тот же набор параметров, что и групповая политика Active Directory, с одной лишь разницей, что здесь есть возможность динамически задавать и изменять политику межсетевого экрана. Развернуть сценарий на удаленной машине можно, к примеру, отправив данный файл прикрепленным к письму или с помощью FTP. В любом случае вмешательство пользователя для установки сценария будет минимальным.
Листинг 1. Сценарий для открытия нового порта
' объявляется объект HNetCfg
Set objFirewall = CreateObject("HNetCfg.FwMgr")
' используется текущий профиль
Set objPolicy = objFirewall.LocalPolicy.CurrentProfile
' создается новый открытый порт
Set objPort = CreateObject("HNetCfg.FwOpenPort")
objPort.Port = 10001 ' номер порта
objPort.Name= "Antivirus" ' наименование
objPort.IPVersion=4 ' версия IP
objPort.Protocol= "TCP" ' вид протокоа
' с каких адресов разрешен доступ
objPort.RemoteAddresses="172.29.0.0/24"
objPort.Enabled = TRUE ' доступ разрешен
' используется список уже открытых портов
Set colPorts = objPolicy.GloballyOpenPorts
' добавляется новый порт в список уже открытых портов
errReturn = colPorts.Add(objPort)
По аналогии для остальных портов вы сможете написать подобный сценарий. В приведенном примере указание версии протокола IP является необязательным, так как по умолчанию используется IP v4. Как видно из примера, сначала открывается порт, затем прописываются необходимые параметры, такие как вид транспортного протокола, подсеть, которой разрешен доступ и наименование. И в завершении все данные по новому порту добавляются в список уже открытых портов.
В продолжении темы приведу пример сценария, который разрешает доступ по сети к указанному приложению, то есть авторизовывает приложение. Как уже упоминалось выше, этот способ является не слишком безопасным, так как приложение может использовать различные порты, но иногда он более удобен, чем явное открытие портов. В следующем примере откроем доступ для приложения, находящегося по адресу c:\myapp.exe для всех узлов по протоколу IP версии 4.
Листинг 2. Сценарий для авторизации приложения
' объявляем объект
Set objFirewall = CreateObject("HNetCfg.FwMgr")
' используем текущий профиль
Set objPolicy = objFirewall.LocalPolicy.CurrentProfile
' объявляем объект
Set objApplication = CreateObject("HNetCfg.FwAuthorizedApplication")
objApplication.Name = "Corp App" ' указываем имя
objApplication.IPVersion = 4 ' версия IP
' путь к приложению
objApplication.ProcessImageFileName = "c:\myappl.exe"
' с каких адресов разрешен доступ
objApplication.RemoteAddresses = "*"
objApplication.Enabled = True
' авторизуем приложение
Set colApplications = objPolicy.AuthorizedApplications
' и добавляем его в список авторизованных приложений
colApplications.Add(objApplication)
Иногда возникает необходимость в получении списка всех открытых портов, а также их свойств:
Листинг 3. Сценарий, выводящий список всех открытых портов
Set objFirewall = CreateObject("HNetCfg.FwMgr")
Set objPolicy = objFirewall.LocalPolicy.CurrentProfile
Set colPorts = objPolicy.GloballyOpenPorts
For Each objPort in colPorts
Wscript.Echo "Port name: " & objPort.Name
Wscript.Echo "Port number: " & objPort.Port
Wscript.Echo "Port IP version: " & objPort.IPVersion
Wscript.Echo "Port protocol: " & objPort.Protocol
Wscript.Echo "Port scope: " & objPort.Scope
Wscript.Echo "Port remote addresses: " & objPort.RemoteAddresses
Wscript.Echo "Port enabled: " & objPort.Enabled
Wscript.Echo "Port built-in: " & objPort.Builtin
Next
Эта информация вам пригодится, когда вы будете изучать состояния текущих правил межсетевого экрана и определять, какие порты необходимо открыть или закрыть.
Завершая тему персональных межсетевых экранов, отмечу, что по утверждениям представителей корпорации Microsoft, в следующей версии операционной системы Windows межсетевой экран будет двусторонним, то есть можно открывать/закрывать как входящие, так и исходящие соединения. Что ж, посмотрим, но думаю, подобное нововведение окажется весьма полезным, так как позволит еще больше защитить рабочие станции и пользователей.
Поживем – увидим.
- Don Jones, Jeffery Hicks Advanced VBScript for Microsoft Windows Administrators.
- Windows Server 2003. Справочник администратора.