Мы хотели бы распространить программу межсетевого экрана вместе с нашим продуктом.
Я могу настроить брандмауэр Windows на блокировку исходящих подключений (чего он не делает по умолчанию)
netsh advfirewall set allprofiles firewallpolicy blockinbound,blockoutbound
Но тогда мне нужно знать, когда один из них заблокирован, чтобы он мог спросить, нужно ли его разблокировать.
Я попытался включить ведение журнала, но он не записывает путь к exe. Есть ли способ зарегистрировать это?
Я отправил вопрос о StackOverflow, чтобы попробовать метод обнаружения событий, но если есть способ включить ведение журнала пути к exe, я хотел бы знать об этом. Я надеюсь остаться с Java, которая ограничена в обнаружении событий.
Я не против вызова любых программ командной строки, а также не против использования сценариев vbscripts. Но мне нужно знать, как только исходящее соединение из exe заблокирован и который exe.
p0rkjello ответил правильно, но оставил ключевые вещи, после нескольких часов борьбы я нашел решение.
auditpol /set /subcategory:"{0CCE9226-69AE-11D9-BED3-505054503030}" /success:disable /failure:enable
event viewer
и перейти к Windows logs > Security
Filter log > Keywords > Select "Audit failure"
Информация, которую можно найти здесь, - это имя приложения, IP-адрес назначения, направление подключения и многое другое.
Изменить: 9 апреля 2020 г.
У меня есть более простой способ проверить журнал событий с помощью команды PowerShell ниже
Get-EventLog security -newest 10 -InstanceId 5157 -Message *Destination* | Select @{Name="message";Expression={ $_.ReplacementStrings[1] }}
Я считаю, что это то, что вы ищете: ведение журнала приложений
После настройки он будет зарегистрирован в системном журнале, и будет указано имя приложения.
Как было указано в ссылке, правильный источник - это аудит событий платформы фильтрации Windows. Мы можем вывести необходимые данные с помощью следующего cmd-скрипта:
@echo off
for /f "tokens=2 delims==" %%s in ('wmic os get LocalDateTime /value') do set datetime=%%s
auditpol /set /subcategory:{0CCE9225-69AE-11D9-BED3-505054503030} /failure:enable > nul
pause
wmic ntevent where "LogFile='security' AND EventCode = 5152 AND TimeGenerated > '%datetime%'" get InsertionStrings
auditpol /set /subcategory:{0CCE9225-69AE-11D9-BED3-505054503030} /failure:disable > nul
"{0CCE9225-69AE-11D9-BED3-505054503030}" - это GUID события "Отброс пакетов платформы фильтрации", 5152 - это код. На pause
время запустить интересующую программу / действие программы и возобновить выполнение сценария по окончании теста. Пример вывода:
InsertionStrings
{"504", "\device\harddiskvolume2\windows\system32\svchost.exe", "%%14592", "10.0
.0.254", "67", "255.255.255.255", "68", "17", "89509", "%%14610", "44"}
{"3348", "\device\harddiskvolume2\another\program.exe", "%%14593", "10.0.0.1", "
52006", "123.123.123.123", "80", "6", "89523", "%%14611", "48"}
С участием get Message /value
вместо того get InsertionStrings
в команде wmic вывод более информативен, но намного длиннее:
Message=The Windows Filtering Platform has blocked a packet.
Application Information:
Process ID: 3128
Application Name: \device\harddiskvolume2\path\to\program.exe
Network Information:
Direction: Outbound
Source Address: 10.0.0.1
Source Port: 50099
Destination Address: 1.2.3.4
Destination Port: 80
Protocol: 6
Filter Information:
Filter Run-Time ID: 69203
Layer Name: Connect
Layer Run-Time ID: 48
Это просто выдержки из журнала безопасности, которые также доступны в графическом интерфейсе.
Этот vbscript будет перечисляться через настройки правила брандмауэра Windows:
' This VBScript file includes sample code that enumerates
' Windows Firewall rules using the Microsoft Windows Firewall APIs.
Option Explicit
Dim CurrentProfiles
Dim InterfaceArray
Dim LowerBound
Dim UpperBound
Dim iterate
Dim rule
' Profile Type
Const NET_FW_PROFILE2_DOMAIN = 1
Const NET_FW_PROFILE2_PRIVATE = 2
Const NET_FW_PROFILE2_PUBLIC = 4
' Protocol
Const NET_FW_IP_PROTOCOL_TCP = 6
Const NET_FW_IP_PROTOCOL_UDP = 17
Const NET_FW_IP_PROTOCOL_ICMPv4 = 1
Const NET_FW_IP_PROTOCOL_ICMPv6 = 58
' Direction
Const NET_FW_RULE_DIR_IN = 1
Const NET_FW_RULE_DIR_OUT = 2
' Action
Const NET_FW_ACTION_BLOCK = 0
Const NET_FW_ACTION_ALLOW = 1
' Create the FwPolicy2 object.
Dim fwPolicy2
Set fwPolicy2 = CreateObject("HNetCfg.FwPolicy2")
CurrentProfiles = fwPolicy2.CurrentProfileTypes
'// The returned 'CurrentProfiles' bitmask can have more than 1 bit set if multiple profiles
'// are active or current at the same time
if ( CurrentProfiles AND NET_FW_PROFILE2_DOMAIN ) then
WScript.Echo("Domain Firewall Profile is active")
end if
if ( CurrentProfiles AND NET_FW_PROFILE2_PRIVATE ) then
WScript.Echo("Private Firewall Profile is active")
end if
if ( CurrentProfiles AND NET_FW_PROFILE2_PUBLIC ) then
WScript.Echo("Public Firewall Profile is active")
end if
' Get the Rules object
Dim RulesObject
Set RulesObject = fwPolicy2.Rules
' Print all the rules in currently active firewall profiles.
WScript.Echo("Rules:")
For Each rule In Rulesobject
if rule.Profiles And CurrentProfiles then
WScript.Echo(" Rule Name: " & rule.Name)
WScript.Echo(" ----------------------------------------------")
WScript.Echo(" Description: " & rule.Description)
WScript.Echo(" Application Name: " & rule.ApplicationName)
WScript.Echo(" Service Name: " & rule.ServiceName)
Select Case rule.Protocol
Case NET_FW_IP_PROTOCOL_TCP WScript.Echo(" IP Protocol: TCP.")
Case NET_FW_IP_PROTOCOL_UDP WScript.Echo(" IP Protocol: UDP.")
Case NET_FW_IP_PROTOCOL_ICMPv4 WScript.Echo(" IP Protocol: UDP.")
Case NET_FW_IP_PROTOCOL_ICMPv6 WScript.Echo(" IP Protocol: UDP.")
Case Else WScript.Echo(" IP Protocol: " & rule.Protocol)
End Select
if rule.Protocol = NET_FW_IP_PROTOCOL_TCP or rule.Protocol = NET_FW_IP_PROTOCOL_UDP then
WScript.Echo(" Local Ports: " & rule.LocalPorts)
WScript.Echo(" Remote Ports: " & rule.RemotePorts)
WScript.Echo(" LocalAddresses: " & rule.LocalAddresses)
WScript.Echo(" RemoteAddresses: " & rule.RemoteAddresses)
end if
if rule.Protocol = NET_FW_IP_PROTOCOL_ICMPv4 or rule.Protocol = NET_FW_IP_PROTOCOL_ICMPv6 then
WScript.Echo(" ICMP Type and Code: " & rule.IcmpTypesAndCodes)
end if
Select Case rule.Direction
Case NET_FW_RULE_DIR_IN WScript.Echo(" Direction: In")
Case NET_FW_RULE_DIR_OUT WScript.Echo(" Direction: Out")
End Select
WScript.Echo(" Enabled: " & rule.Enabled)
WScript.Echo(" Edge: " & rule.EdgeTraversal)
Select Case rule.Action
Case NET_FW_ACTION_ALLOW WScript.Echo(" Action: Allow")
Case NET_FW_ACTION_BLOCk WScript.Echo(" Action: Block")
End Select
WScript.Echo(" Grouping: " & rule.Grouping)
WScript.Echo(" Edge: " & rule.EdgeTraversal)
WScript.Echo(" Interface Types: " & rule.InterfaceTypes)
InterfaceArray = rule.Interfaces
if IsEmpty(InterfaceArray) then
WScript.Echo(" Interfaces: All")
else
LowerBound = LBound(InterfaceArray)
UpperBound = UBound(InterfaceArray)
WScript.Echo(" Interfaces: ")
for iterate = LowerBound To UpperBound
WScript.Echo(" " & InterfaceArray(iterate))
Next
end if
WScript.Echo("")
end if
Next
Это пришло из Вот, что должно направить вас на верный путь.