私の友人が組織で働いていて、ある晴れた日、彼は自分のマシンのローカル管理者アクセス権を持っていることに気付きました。彼は当初、彼には特権がなく、ソフトウェアのインストールを要求する必要があることを私に誓った。私は彼らの書面によるポリシーにもそのように書かれていることを確認しました。
ある特権ドメインユーザーがローカル管理者グループに誤って追加したと仮定すると、それを行ったユーザーをどのように見つけることができますか?
監査ログを確認し、友達にローカル管理者権限を付与したユーザーを特定する方法について具体的な回答が得られると助かります。
@Leoによる投稿は正しいですが、多くのイベントをくまなく処理すると、パフォーマンスの問題が発生する可能性があります。理想的なアプローチは、探しているものに固有のフィルターを作成することです。ローカル管理者グループのSIDは既知(S-1-5-32-544
)であるため、次のXMLフィルターを使用できます。これをコピーしてイベントビューアに貼り付けるか([現在のログをフィルタ]> [XML])、PowerShellで使用できます。
<QueryList>
<Query Id="0" Path="Security">
<Select Path="Security">
*[System[(EventID=4732)]]
and
*[EventData[Data[@Name='TargetSid'] and Data='S-1-5-32-544']]
</Select>
</Query>
</QueryList>
PowerShellで使用するには、XMLフィルターを変数に設定してから、Get-WinEvent
を実行します。
$xmlFilter = @"
<QueryList>
<Query Id="0" Path="Security">
<Select Path="Security">
*[System[(EventID=4732)]]
and
*[EventData[Data[@Name='TargetSid'] and Data='S-1-5-32-544']]
</Select>
</Query>
</QueryList>
"@
Get-WinEvent -FilterXml $xmlFilter
このようなイベントの発生後にカスタムアクションを実行する場合は、最近[ ブログ-Microsoftイベントログアラート に投稿したので、Scheduled Tasks
を介してアラートを設定できます。これを行うには、2つの部分が必要です。
次のPowerShellコマンドは、メンバーがBuiltIn\Administrators
に追加されたときにのみトリガーされるようにスケジュールされたタスクを設定します。これらの構成設定の多くは、GUIからは使用できないことに注意してください。
# NOTE - ExecutionPolicy set to Unrestricted should only be used for testing.
$Action = New-ScheduledTaskAction -NoLogo `
-Execute "C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe" `
-NoProfile `
-NonInteractive `
-WindowStyle Hidden `
-File .\Security_4732.ps1 -RecordID $(eventRecordID) `
-ExecutionPolicy Unrestricted' `
-WorkingDirectory "C:\AlertScripts\"
$Principal = New-ScheduledTaskPrincipal -UserId "NT AUTHORITY\SYSTEM" `
-LogonType ServiceAccount
$Settings = New-ScheduledTaskSettingsSet -DisallowDemandStart `
-Compatibility Win8 `
-Hidden `
-WakeToRun `
-RunOnlyIfNetworkAvailable `
-AllowStartIfOnBatteries
$Settings.RunOnlyIfIdle = $FALSE
$Settings.ExecutionTimeLimit = "PT5M"
$Settings.StartWhenAvailable = $TRUE
$Settings.StopIfGoingOnBatteries = $FALSE
$Settings.DisallowStartOnRemoteAppSession = $FALSE
$Settings.DisallowStartIfOnBatteries = $FALSE
# Create Trigger via Security Event ID 4732 & Local Admin Group
$cimTriggerClass = Get-CimClass -ClassName MSFT_TaskEventTrigger `
-Namespace Root/Microsoft/Windows/TaskScheduler:MSFT_TaskEventTrigger
$Trigger = New-CimInstance -CimClass $cimTriggerClass -ClientOnly
$Trigger.Subscription = @"
<QueryList>
<Query Id="0" Path="Security">
<Select Path="Security">
*[System[(EventID=4732)]]
and
*[EventData[Data[@Name='TargetSid'] and Data='S-1-5-32-544']]
</Select>
</Query>
</QueryList>
"@
$Trigger.ExecutionTimeLimit = 'PT5M'
$Trigger.Enabled = $TRUE
# Set ValueQueries so the RecordID can be passed to the script
$Trigger.ValueQueries = [CimInstance[]]$(Get-CimClass -ClassName MSFT_TaskNamedValue `
-Namespace Root/Microsoft/Windows/TaskScheduler:MSFT_TaskNamedValue)
$Trigger.ValueQueries[0].Name = "eventRecordID"
$Trigger.ValueQueries[0].Value = "Event/System/EventRecordID"
Register-ScheduledTask -TaskName "Security_4732" `
-Description "Run script when user is added to local administrators group." `
-TaskPath "\AlertScripts\" `
-Action $Action `
-Trigger $Trigger `
-Settings $Settings `
-Principal $Principal
スケジュールされたタスクのセットアップで、次のPowerShellコードをC:\AlertScripts\Security_4732.ps1
に保存します。これを自分のメールで使用できるようにカスタマイズしてください。本当にカスタマイズできますが、好きなようにできます。スケジュールされたタスクの更新も必要になる本番環境にデプロイする場合は、署名されたスクリプトのみを許可するようにしてください。
param([int]$RecordID)
$xmlQuery = @"
<QueryList>
<Query Id="0" Path="Security">
<Select Path="Security">*
[System[(EventRecordID=$($RecordID))]]
</Select>
</Query>
</QueryList>
"@
$triggeredEvent = Get-WinEvent -FilterXml $xmlQuery
Send-MailMessage -To "[email protected]" -From "$($env:COMPUTERNAME)@my-domain.local" `
-SmtpServer "smtp.my-domain.local" `
-Subject "User Added to Local Administrators Group" `
-Body "RecordID: $($RecordID)`r`n$($triggeredEvent.Message)" `
-Priority High
XMLクエリをコピー/貼り付けしようとしたときに問題が発生しました。イベントビューアでも機能しないように見えるクエリがあったため、徹底的にテストしてください。手動で再入力しない限り、それらは機能しませんでした。
マイクロソフトは、詳細な説明を提供することで、イベントを文書化する作業を大幅に改善しました。この特定のイベントのページはここにあります:
4732(S):メンバーがセキュリティが有効なローカルグループに追加されました。
ここでは、Subject:の下にリストされているアカウントがこのリクエストを作成する責任があります。
Powershellを使用して適切なイベントをフィルタリングできます。
Get-EventLog Security -InstanceId 4732
以下は、ユーザーがローカル管理者に追加されたすべてのイベントログエントリを取得するためのpowershellコマンドです。
Get-EventLog Security -InstanceId 4732 | `
Where-Object {$_.Message -like "*Administrators*"}`
| Select-Object *
残念ながら、私は家にいてADにアクセスできないため、コマンドをテストできませんでした。しかし、あなたはそのような出力を得るはずです:
EventID : 4732
MachineName : localhost
Data : {}
Index : 165325
Category : (13826)
CategoryNumber : 13826
EntryType : SuccessAudit
Message : A member was added to a security-enabled local group.
Subject:
Security ID: SID of the user that added the user to the group.
Account Name: bob
Account Domain: contoso.com
Logon ID: 0x59461
Member:
Security ID: SID of your friends user account
Account Name: -
Group:
Security ID: S-1-5-32-544
Group Name: Administrators
Group Domain: Builtin
Additional Information:
Privileges: -
Expiration time: %11
Source : Microsoft-Windows-Security-Auditing
ReplacementStrings : {-, some sid, Users, Builtin...}
InstanceId : 4732
TimeGenerated : 26.01.2017 21:08:49
TimeWritten : 26.01.2017 21:08:49
UserName :
Site :
Container :
たぶん、私のスクリプトの一部を変更する必要があるかもしれませんが、管理者を見つけるには、すべての情報が必要です。
編集:私のpowershellコマンドを変更しました。それでも、個々のユーザーを検索するにはフィルターが必要です。