Каковы минимальные разрешения для доступа WMI к процессам CommandLine?
Я пытался получить удаленный список запущенных процессов Windows, включая их атрибут CommandLine/ExecutablePath через WMI как пользователь домена без прав администратора для инструмента мониторинга. Мне удалось получить список процессов, используя ответ ниже, но атрибут CommandLine всегда был пустым.
[ Какие разрешения / права нужны пользователю для доступа к WMI на удаленных компьютерах?
Предоставление пользователю права на "отладку программ" в локальной политике безопасности позволяет получить доступ к информации CommandLine/ExecutablePath. Но тогда учетная запись пользователя мониторинга может потенциально вторгаться в процессы, а не просто запрашивать информацию о них. Есть ли меньшее пользовательское право или другой способ разблокировать информацию о CommandLine? Я использовал аргументы wmic, показанные ниже для тестирования.
wmic / node: "имя_сервера" /user: имя пользователя / пароль: пароль PROCESS получить имя, командную строку, путь к исполняемому файлу
Заранее спасибо за любую информацию, которую вы можете дать мне.
2 ответа
Наконец-то мне удалось обойти эту проблему, предоставив группе AD больше разрешений для отдельных служб. Таким образом, инструмент мониторинга мог бы контролировать службы, подлежащие мониторингу, но, по крайней мере, не сможет вторгнуться в любой процесс, выполняющийся на целевых машинах. Я использовал приведенный ниже скрипт Powershell для достижения этой цели. Вам нужно будет ввести свою собственную группу AD и изменить список служб Windows, чтобы удовлетворить ваши потребности. Этот сценарий можно запустить через групповую политику и применить его к группе серверов.
function AddSDDL() {
Param(
[Parameter(Mandatory=$True)]
[string]$Username,
[Parameter(Mandatory=$True)]
[string]$Service
)
$servicetest = Get-Service | where {$_.name -eq "$service"}
if (!$servicetest -and $service -ne "scmanager") {
Write-Host "Service $service does not exist. Please supply the name and not the display name"
return $false;
}
$domain = ($username.split("\"))[0]
$user = ($username.split("\"))[1]
$ntaccount = New-Object System.Security.Principal.NTAccount($domain,$user)
$sid = ($ntaccount.Translate([System.Security.Principal.SecurityIdentifier])).value
if (!$sid) {
Write-Host "User $username cannot be resolved to a SID. Does the account exist?"
return $false;
}
$sddl = [string](cmd /c "sc.exe sdshow $service");
if ($sddl -match $sid) {
Write-Host "User $username already has some sort of access in the SDDL. Remediate manually"
return $false;
}
if($sddl -match "S:\(") {
$sddl = $sddl -replace "S:\(","(A;;CCLCLORPRC;;;$sid)S:("
} elseif($sddl -match "D:" -and $sddl.LastIndexOf(":") -lt 3) {
$sddl += "(A;;CCLCLORPRC;;;$sid)";
} else {
Write-Host "SDDL contains multiple description types like D: and A:, but not S:, remediate manually"
return $false;
}
$sddlCommand = "sc.exe sdset $service $sddl";
Write-Host($sddlCommand);
$sddlset = cmd /c $sddlCommand
if ($sddlset -notlike "*SUCCESS*") {
Write-Host "Permissions did not set"
Write-Host "Full error: $sddlset"
}
else {
Write-Host "Permissions set successfully for $username on $service"
}
return $true;
}
clear;
# default 2012 R2 scmanager: D:(A;;CC;;;AU)(A;;CCLCRPRC;;;IU)(A;;CCLCRPRC;;;SU)(A;;CCLCRPWPRC;;;SY)(A;;KA;;;BA)(A;;CC;;;AC)S:(AU;FA;KA;;;WD)(AU;OIIOFA;GA;;;WD)
# default 2012 R2 w32time: D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;CCLCSWRPLOCRRC;;;LS)(A;;CCSWWPLORC;;;LS)
# default 2008 R2 scmanager: D:(A;;CC;;;AU)(A;;CCLCRPRC;;;IU)(A;;CCLCRPRC;;;SU)(A;;CCLCRPWPRC;;;SY)(A;;KA;;;BA)S:(AU;FA;KA;;;WD)(AU;OIIOFA;GA;;;WD)
# default 2008 R2 w3svc: D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)
# default 2008 R2 aspnet_state: D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)
# with list content (LC), read all properties (RP) and read permissions (RC) for authenticated users: D:(A;;CCLC;;;AU)(A;;CCLCRPRC;;;IU)(A;;CCLCRPRC;;;SU)(A;;CCLCRPWPRC;;;SY)(A;;KA;;;BA)(A;;CC;;;AC)S:(AU;FA;KA;;;WD)(AU;OIIOFA;GA;;;WD)
$serviceNames = @("DHCPServer","TlntSvr","RpcSs","SamSs","DNS","Dnscache","LanmanWorkstation","Netlogon","Kdc","IsmServ","DFSR","W32Time","LanmanServer","WAS","aspnet_state","W3SVC","scmanager");
$serviceNames += Get-Service | Where-Object{$_.Name -like "*sql*"} | ForEach-Object{$_.Name};
$serviceNames += Get-Service | Where-Object{$_.Name -like "*ReportServer*"} | ForEach-Object{$_.Name};
foreach($serviceName in $serviceNames) {
Write-Host("SDDL of $serviceName before update: ") -NoNewline;
sc.exe sdshow $serviceName
$wmiGroup = "YOUR_DOMAN\AD_GROUP_FOR_WMI_MONITORING"
$modified = AddSDDL -Username $wmiGroup -Service $serviceName;
if($modified) {
Write-Host("SDDL of $serviceName after update: ") -NoNewline;
sc.exe sdshow $serviceName
}
}
Здесь они предлагают следующее решение с использованием WmiSecurity:
WmiSecurity.exe /C="%computername%" /A /N=Root/CIMV2 /M=" DOMAIN\USER:REMOTEACCESS" /R
Кроме того, вы можете использовать встроенную утилиту, как показано здесь.
Но я думаю, что оба решения не могут ограничить доступ только к информации о процессах.