親愛なるコミュニティこんにちは!
ITインフラストラクチャは常に動的です。 数千の変更が毎分発生します。 それらの多くは登録が必要です。 システム監査は、情報セキュリティ組織の不可欠な部分です。 変更管理は、さらなる重大なインシデントの防止に役立ちます。
この記事では、組織のサーバーでのユーザーログイン(およびログアウト)イベントの追跡の経験について説明し、監査ログの分析中に生じた詳細を詳細に説明し、この問題の解決策を段階的に説明します。
私たちが追求する目標は次のとおりです。
- 端末サーバーを含む組織のサーバーへの毎日のユーザー接続を監視します。
- ドメインユーザーとローカルユーザーの両方からのイベント登録。
- ユーザーアクティビティの監視(到着/出発)。
- IT部門から情報セキュリティサーバーへの接続の制御。
まず、監査を有効にし、Windowsログオンイベントを記録する必要があります。 ドメインコントローラーとして、Windows Server 2008 R2が提供されています。 監査を有効にすると、監査ポリシーで定義されたイベントを取得、フィルタリング、分析する必要があります。 さらに、分析のために、たとえばDLPの3番目のシステムに送信されることになっています。 別の方法として、Excelでレポートを生成する機能を提供します。
ログ分析は、システム管理者の日常的な操作です。 この場合、ドメイン内の記録されたイベントの量は、それ自体が難しいほどです。 監査はグループポリシーに含まれています。
ログオンイベントが生成されます。
1.ドメインアカウントのチェック中のドメインコントローラー。
2.ローカルアカウントを使用する場合のローカルコンピューター。
ポリシー(アカウントと監査)の両方のカテゴリが有効になっている場合、ドメインアカウントを使用したログインは、ワークステーションまたはサーバーでログオンまたはログオフイベントを生成し、ドメインコントローラーでログオンイベントを生成します。 したがって、ドメインマシンの監査は、コントローラーのGPOスナップイン、ローカル監査、MMCスナップインを使用したローカルセキュリティポリシーによって構成する必要があります。
監査のセットアップとインフラストラクチャの準備:
このステップを詳細に検討してください。 情報量を減らすために、成功したエントリイベントと終了イベントのみを調べます。 Windowsセキュリティログのサイズを増やすことは理にかなっています。 デフォルトは128メガバイトです。
ローカルポリシーを設定するには:
政治家エディターを開きます-開始、検索バーでgpedit.mscと入力してEnterを押します。
次のパスを開きます。
ローカルコンピューターポリシー→コンピューターの構成→Windowsの設定→セキュリティの設定→ローカルポリシー→監査ポリシー。グループポリシー設定[
ログオンイベントの監査(
ログオン監査)]および[
アカウントログオンイベントの監査(
ログオンイベントの監査)]をダブルクリックします。 プロパティウィンドウで、[成功]チェックボックスを設定して、成功したログインのログに書き込みます。 オーバーフローを回避するために、[
失敗]チェックボックスをインストールすることはお勧めしません。 ポリシーを適用するには、コンソールで「gpupdate / force」と入力します
グループポリシーを構成するには:
「Audit AD」という名前の新しいGPO(グループポリシー)を作成します。 編集セクションに移動し、「
コンピューターの構成」→「ポリシー」→「Windowsの設定」→「セキュリティの設定」→「監査構成の詳細」の順に展開します。 このグループポリシーブランチには、Windowsオペレーティングシステムでアクティブ化してさまざまなイベントを追跡できる高度な監査ポリシーが含まれています。 Windows 7およびWindows Server 2008 R2では、監査できるイベントの数は53に増加します。これらの53の監査ポリシー(いわゆる詳細監査ポリシー)は、[セキュリティの設定] \ [監査ポリシーの詳細]ブランチにあります
構成と10のカテゴリにグループ化:
含まれるもの:
- アカウントログオン-資格情報の検証、Kerberos認証サービス、Kerberosチケット操作、およびその他のログインイベントの監査。
- ログオン/ログオフ-コンピューターおよびドメインサーバーへのログオンの対話型およびネットワーク試行、およびアカウントロックの監査。
変更後、gpupdate / forceを実行します。
将来のスクリプトが分析するイベントの種類をすぐに指定します。
- リモートアクセス-RDPセッションを介したリモートログイン。
- インタラクティブ-コンソールからのローカルユーザーログイン。
- コンピューターのロック解除-ロックされたステーションのロックを解除します。
- ログオフ-ログアウト。
Windows 2008では、成功したログインイベントにはイベントID 4624があり、ログオフにはイベントID 4672があります。多数のレコードを分析できるツールを選択する必要があります。 標準ツールを使用してすべてを作成できるように思われます。 ただし、Powershellの形式のリクエスト
get-eventlog security | where {$_.EventId -eq 4624 -and ($_.TimeGenerated.TimeOfDay -gt '08:00:00' )}
2人のユーザー用のドメインコントローラーを備えたスタンドでのみ自慢してください。 実稼働環境では、サーバーからログを収集するのにそれぞれ20分かかりました。 ソリューションの検索は、以前にHabrでレビューされていたLOG PARSERユーティリティにつながりました。
データ処理速度が大幅に向上し、1台のPCからレポートを作成するフルランが10秒に短縮されました。 このユーティリティは多くのコマンドラインオプションを使用するため、powershellからcmdを呼び出して、一連の特殊文字をエスケープします。 クエリを作成するには、GUI-Log Parser Lizardを使用できます。 無料ではありませんが、65日間の試用期間で十分です。 以下はクエリ自体です。 興味のあるものに加えて、さらに使用する場合に備えて、システムに入るための他のオプションを作成します。
SELECT eventid, timegenerated, extract_token(Strings, 5, '|' ) as LogonName, extract_token(Strings, 18, '|' ) as LogonIP, case extract_token(Strings, 8, '|' ) WHEN '2' THEN 'interactive' WHEN '3' THEN 'network' WHEN '4' THEN 'batch' WHEN '5' THEN 'service' WHEN '7' THEN 'unlocked workstation' WHEN '8' THEN 'network logon using a cleartext password' WHEN '9' THEN 'impersonated logons' WHEN '10' THEN 'remote access' ELSE extract_token(Strings, 8, '|' ) end as LogonType, case extract_token(Strings, 1, '|' ) WHEN 'SERVER$' THEN 'logon' ELSE extract_token(Strings, 1, '|' ) end as Type INTO \\127.0.0.1\c$\AUDIT\new\report(127.0.0.1).csv FROM \\127.0.0.1\Security WHERE (EventID IN (4624) AND extract_token(Strings, 8, '|' ) LIKE '10') OR (EventID IN (4624) AND extract_token(Strings, 8, '|' ) LIKE '2') OR (EventID IN (4624) AND extract_token(Strings, 8, '|' ) LIKE '7') OR EventID IN (4647) AND TO_DATE( TimeGenerated ) = TO_LOCALTIME( SYSTEM_DATE() ) ORDER BY Timegenerated DESC
以下は、ロジックの一般的な説明です。
- ローカルに構成された監査でホストのリストを手動で作成するか、ログの収集元のドメインコントローラーを指定します。
- スクリプトはホスト名のリストをループでたどり、それぞれに接続し、リモートレジストリサービスを開始し、パーサーを使用してaudit.sql SQLクエリを実行してシステムセキュリティログを収集します。 要求は、各反復でプリミティブな正規表現を使用して、新しいホストごとに変更されます。 受信したデータはcsvファイルに保存されます。
- CSVファイルから、Excelファイル(検索の美しさと利便性のため)およびHTML形式のレターの本文でレポートが生成されます。
- 電子メールメッセージはレポートファイルごとに個別に作成され、3番目のシステムに送信されます。
テストスクリプト用にサイトを準備します。
スクリプトが正しく機能するには、次の条件が満たされている必要があります。
スクリプトを実行するサーバー/ワークステーションにディレクトリを作成します。 スクリプトファイルをC:\ audit \ディレクトリに配置します。 ホストのリストとスクリプトは同じディレクトリにあります。
管理フレームワークの一部として、
MS Log Parser 2.2およびWindows powershell 3.0サーバーに追加のソフトウェアをインストールします。 PSコンソールで$ Host.versionと入力すると、Powershellのバージョンを確認できます。
ワークステーション名ごとに、C:\ audit \ディレクトリにある監査対象のlist.txtのサーバーのリストに入力します。 監査ポリシーを構成します。 動作することを確認します。
リモートレジストリサービスが開始されているかどうかを確認します(適切な権限がある場合、スクリプトはサービスを開始し、自動モードに移行しようとします)。 2008/2012サーバーでは、このサービスはデフォルトで開始されます。
システムに接続してログを収集する管理者権限を確認してください。
リモートマシンで署名されていないPowerShellスクリプトを実行する機能を確認します(スクリプトに署名するか、制限ポリシーをバイパス/無効にします)。
署名されていないスクリプトの起動パラメーターへの注意-サーバーでの実行ポリシー:
スクリプトに署名して禁止をバイパスするか、起動時にポリシー自体を無効にすることができます。 例:
powershell.exe -executionpolicy bypass -file :\audit\new\run_v5.ps1
スクリプトリスト全体を示します。
Get-ChildItem -Filter report*|Remove-Item -Force $date= get-date -uformat %Y-%m-%d cd 'C:\Program Files (x86)\Log Parser 2.2\' $datadir="C:\AUDIT\new\" $datafile=$datadir+"audit.sql" $list=gc $datadir\"list.txt" $data=gc $datafile $command="LogParser.exe -i:EVT -o:CSV file:\\127.0.0.1\c$\audit\new\audit.sql" $MLdir= [System.IO.Path]::GetDirectoryName($datadir) function send_email { $mailmessage = New-Object system.net.mail.mailmessage $mailmessage.from = ($emailfrom) $mailmessage.To.add($emailto) $mailmessage.Subject = $emailsubject $mailmessage.Body = $emailbody $attachment = New-Object System.Net.Mail.Attachment($emailattachment, 'text/plain') $mailmessage.Attachments.Add($attachment) #$SMTPClient.EnableSsl = $true $mailmessage.IsBodyHTML = $true $SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 25) #$SMTPClient.Credentials = New-Object System.Net.NetworkCredential("$SMTPAuthUsername", "$SMTPAuthPassword") $SMTPClient.Send($mailmessage) } foreach ($SERVER in $list) { Get-Service -Name RemoteRegistry -ComputerName $SERVER | set-service -startuptype auto Get-Service -Name RemoteRegistry -ComputerName $SERVER | Start-service $pattern="FROM"+" "+"\\$SERVER"+"\Security" $pattern2="report"+"("+$SERVER+")"+"."+"csv" $data -replace "FROM\s+\\\\.+", "$pattern" -replace "report.+", "$pattern2"|set-content $datafile <# #IF WE USE IP LIST $data -replace "FROM\s+\\\\([0-9]{1,3}[\.]){3}[0-9]{1,3}", "$pattern" -replace "report.+", "$pattern2"|set-content $datafile #> cmd /c $command } cd $datadir foreach ($file in Get-ChildItem $datadir -Filter report*) { #creating excel doc# $excel = new-object -comobject excel.application $excel.visible = $false $workbook = $excel.workbooks.add() $workbook.workSheets.item(3).delete() $workbook.WorkSheets.item(2).delete() $workbook.WorkSheets.item(1).Name = "Audit" $sheet = $workbook.WorkSheets.Item("Audit") $x = 2 $colorIndex = "microsoft.office.interop.excel.xlColorIndex" -as [type] $borderWeight = "microsoft.office.interop.excel.xlBorderWeight" -as [type] $chartType = "microsoft.office.interop.excel.xlChartType" -as [type] For($b = 1 ; $b -le 5 ; $b++) { $sheet.cells.item(1,$b).font.bold = $true $sheet.cells.item(1,$b).borders.ColorIndex = $colorIndex::xlColorIndexAutomatic $sheet.cells.item(1,$b).borders.weight = $borderWeight::xlMedium } $sheet.cells.item(1,1) = "EventID" $sheet.cells.item(1,2) = "TimeGenerated" $sheet.cells.item(1,3) = "LogonName" $sheet.cells.item(1,4) = "LogonIP" $sheet.cells.item(1,5) = "LogonType" $sheet.cells.item(1,6) = "Type" Foreach ($row in $data=Import-Csv $file -Delimiter ',' -Header EventID, TimeGenerated, LogonName, LogonIP, LogonType, Tipe) { $sheet.cells.item($x,1) = $row.EventID $sheet.cells.item($x,2) = $row.TimeGenerated $sheet.cells.item($x,3) = $row.LogonName $sheet.cells.item($x,4) = $row.LogonIP $sheet.cells.item($x,5) = $row.LogonType $sheet.cells.item($x,6) = $row.Tipe $x++ } $range = $sheet.usedRange $range.EntireColumn.AutoFit() | Out-Null $Excel.ActiveWorkbook.SaveAs($MLdir +'\'+'Audit'+ $file.basename.trim("report")+ $date +'.xlsx') if($workbook -ne $null) { $sheet = $null $range = $null $workbook.Close($false) } if($excel -ne $null) { $excel.Quit() $excel = $null [GC]::Collect() [GC]::WaitForPendingFinalizers() } $emailbody= import-csv $file|ConvertTo-Html $EmailFrom = "audit@vda.vdg.aero" $EmailTo = foreach ($a in (Import-Csv -Path $file).logonname){$a+"@"+"tst.com"} $EmailSubject = "LOGON" $SMTPServer = "10.60.34.131" #$SMTPAuthUsername = "username" #$SMTPAuthPassword = "password" $emailattachment = "$datadir"+"$file" #$$filexls send_email }
Excelで完全なレポートを作成するには、スクリプトが機能するステーション/サーバーにExcelをインストールします。
毎日実行するためのスクリプトをWindowsスケジューラに追加します。 最適な時間は1日の終わりです。イベントは最終日に検索されます。
イベント検索は、Windows 7、Windows Server 2008システムから開始できます。
以前のWindowsには異なるイベントコードがあります(コード値は4096未満です)。
メモと結論:
もう一度、実行されたアクションを要約します。
- 必要なサーバーにローカルおよびドメインの監査ポリシーを設定し、サーバーのリストを収集しました。
- スクリプトを実行するマシンを選択し、必要なソフトウェア(PS 3.0、LOG PARSER、Excel)をインストールしました。
- LOG PARSERのリクエストを書きました。
- この要求をリストのループで実行するスクリプトを作成しました。
- 結果を処理する残りのスクリプトを作成しました。
- 毎日起動するためのスケジューラを設定します。
以前に生成されたレポートは、次のスクリプト実行までディレクトリにあります。 接続しているユーザーのリストは、メッセージの受信者に自動的に追加されます。 これは、レポートを分析システムに送信する際の正しい処理のために行われます。 一般に、LOG PARSERのおかげで、非常に強力であることが判明しました。おそらく、このタスクを自動化する唯一の手段です。 驚いたことに、広範な機能を備えたこのような便利なユーティリティは普及していません。 このユーティリティの短所には、弱いドキュメントが含まれます。 要求は試行錯誤によって実行されます。 実験の成功をお祈りします!