ITセキュリティ用のPowerShellアプリケーション。 パートIII:予算の分類





前回、PowerShellコードを数行だけ使用して、まったく新しいカテゴリのソフトウェアであるファイルアクセス分析を開始しました。 15分間の名声はほぼ終わりましたが、PowerShellにはファイルアクセスイベントを監視する実用的な機能があることを指摘できました。 この記事では、ファイルアクセス分析ツールの作業を終了し、PowerShellデータの分類に進みます。



イベントベースの分析



分析スクリプトで、Register-WmiEventコマンドレットを使用して、特定のフォルダー内のファイルアクセスイベントを表示したことを思い出してください。 また、現在のデータと比較するために、イベントの強度に関する神話上の参照値を作成しました。 (これに完全に興味を持っている人のために、そのような指標を測定する方法の全範囲があります-ウェブサイトへの訪問、コールセンターへの呼び出し、コーヒーマシンからの人々の流れ、そしてこの男はそれを研究した最初の人です)



ファイルアクセスの数が標準インジケータを超えると、コードの別の部分によって呼び出され、ファイルアクセス分析ダッシュボードを表示するプログラムで生成されたイベントを開始しました。



この起動はNew-Eventコマンドレットによって実行されます。これにより、イベントを他の情報と共に受信者に送信できます。 イベントデータを読み取るには、WMI-Eventコマンドレットがあります。 両方のイベントコマンドレットが同じSourceIdentifierを使用しているため、受信側の役割に異なるスクリプトが存在する場合もあります(この場合はバースト)。

これらはすべてオペレーティングシステムの基本的な考え方です。実際、PowerShellはシンプルなメッセージングシステムを提供します。 そして非常にうまくいきましたが、それでもシグナルを送るコマンド言語を使用しています。



それはともかく、驚くべき完全なコードを以下に示します。



1. $cur = Get-Date 2. $Global:Count=0 3. $Global:baseline = @{"Monday" = @(3,8,5); "Tuesday" = @(4,10,7);"Wednesday" = @(4,4,4);"Thursday" = @(7,12,4); "Friday" = @(5,4,6); "Saturday"=@(2,1,1); "Sunday"= @(2,4,2)} 4. $Global:cnts = @(0,0,0) 5. $Global:burst = $false 6. $Global:evarray = New-Object System.Collections.ArrayList 7. 8. $action = { 9. $Global:Count++ 10. $d=(Get-Date).DayofWeek 11. $i= [math]::floor((Get-Date).Hour/8) 12. 13. $Global:cnts[$i]++ 14. 15. #event auditing! 16. 17. $rawtime = $EventArgs.NewEvent.TargetInstance.LastAccessed.Substring(0,12) 18. $filename = $EventArgs.NewEvent.TargetInstance.Name 19. $etime= [datetime]::ParseExact($rawtime,"yyyyMMddHHmm",$null) 20. 21. $msg="$($etime)): Access of file $($filename)" 22. $msg|Out-File C:\Users\bob\Documents\events.log -Append 23. 24. 25. $Global:evarray.Add(@($filename,$etime)) 26. if(!$Global:burst) { 27. $Global:start=$etime 28. $Global:burst=$true 29. } 30. else { 31. if($Global:start.AddMinutes(15) -gt $etime ) { 32. $Global:Count++ 33. #File behavior analytics 34. $sfactor=2*[math]::sqrt( $Global:baseline["$($d)"][$i]) 35. 36. if ($Global:Count -gt $Global:baseline["$($d)"][$i] + 2*$sfactor) { 37. 38. 39. "$($etime): Burst of $($Global:Count) accesses"| Out-File C:\Users\bob\Documents\events.log -Append 40. $Global:Count=0 41. $Global:burst =$false 42. New-Event -SourceIdentifier Bursts -MessageData "We're in Trouble" -EventArguments $Global:evarray 43. $Global:evarray= [System.Collections.ArrayList] @(); 44. } 45. } 46. else { $Global:burst =$false; $Global:Count=0; $Global:evarray= [System.Collections.ArrayList] @();} 47. } 48. } 49. 50. Register-WmiEvent -Query "SELECT * FROM __InstanceModificationEvent WITHIN 5 WHERE TargetInstance ISA 'CIM_DataFile' and TargetInstance.Path = '\\Users\\bob\\' and targetInstance.Drive = 'C:' and (targetInstance.Extension = 'txt' or targetInstance.Extension = 'doc' or targetInstance.Extension = 'rtf') and targetInstance.LastAccessed > '$($cur)' " -sourceIdentifier "Accessor" -Action $action 51. 52. 53. #Dashboard 54. While ($true) { 55. $args=Wait-Event -SourceIdentifier Bursts # wait on Burst event 56. Remove-Event -SourceIdentifier Bursts #remove event 57. 58. $outarray=@() 59. foreach ($result in $args.SourceArgs) { 60. $obj = New-Object System.Object 61. $obj | Add-Member -type NoteProperty -Name File -Value $result[0] 62. $obj | Add-Member -type NoteProperty -Name Time -Value $result[1] 63. $outarray += $obj 64. } 65. 66. 67. $outarray|Out-GridView -Title "FAA Dashboard: Burst Data" 68. }
      
      





ブラウジング中にラップトップを叩かないでください。



個々のテーブルビューを引き続き表示し、グラフィックスを処理するより適切な方法があることを理解しています。 PowerShellを使用すると、.NET Framework全体にアクセスできるため、リストチャートなどのオブジェクトを作成してそれらにアクセスし、必要に応じて更新できます。 これを宿題として残すまで。



分類は、データのセキュリティを確保する上で非常に重要な役割を果たします。



ファイルイベントの監視を先送りし、PowerShellのデータ分類のトピックを検討してみましょう。



Varonisでは 、客観的な理由から、「データの認識」の原則を使用しています。 有用なデータ保護プログラムを開発するための最初のステップの1つは、重要なデータまたは機密データの場所(クレジットカード番号、顧客の住所、秘密の法的文書、独自コード)を調べることです。



もちろん、目標は会社の貴重なデジタルデータを保護することですが、最初にそれらを構成によって決定する必要があります。 ちなみに、これは単なる良い考えではなく、データ保護に関する多くの法律や規制(たとえば、HIPAA)や業界標準(PCI DSS)では、実際のリスク評価で資産の識別が必要です。



PowerShellは、データ分類アプリケーションで使用する大きな可能性を秘めています。 PSはファイルに直接アクセスして読み取ることができますか? はい テキストのパターンマッチングを実行できますか? はい 彼は大規模に効率的にそれを行うことができますか? はい



いいえ、私が最後に作成したPowerShell分類スクリプトは、Varonis Data Classification Frameworkに置き換わるものではありません。 しかし、私が意図したシナリオ-機密データを含むフォルダーを監視する必要があるIT管理者-の試用PowerShellスクリプトは、満足のいく結果を示すだけでなく、たとえば4プラスで推定できます!



WQLおよびCIM_DataFile



イベントモニタリングに関する最初の記事で言及したWQL言語に戻りましょう。

このクエリ言語を使用してディレクトリ内のファイルイベントを検索したように、このスクリプトを変更して、指定されたディレクトリからすべてのファイルのリストを取得できます。 前と同じように、CIM_DataFileクラスを使用しますが、今回は、リクエストはフォルダー自体に影響し、それに関連付けられたイベントには影響しません。



 1. $Get-WmiObject -Query "SELECT * From CIM_DataFile where Path = '\\Users\\bob\\' and Drive = 'C:' and (Extension = 'txt' or Extension = 'doc' or Extension = 'rtf')"
      
      





いいね! このコード行は、ファイルパス名を持つ配列を生成します。



各ファイルの内容を変数に読み込むために、PowerShellにはGet-Contentコマンドレットが用意されています。 マイクロソフトに感謝します。



スクリプトにはもう1つのコンポーネントが必要です。パターンマッチングです。 当然のことながら、PowerShellには標準の式モジュールがあります。 私の目的ではこれは冗長ですが、間違いなく時間を節約できます。



セキュリティの専門家と話すとき、彼らはしばしば、企業が文書またはプレゼンテーションに生産または機密情報を適切に、たとえば「秘密」または「機密」という言葉で明示的にマークする必要があると私に言った。 これは推奨事項であり、明らかにデータ分類プロセスに役立ちます。



私のスクリプトでは、可能なラベリングテキストと一致する正規表現を含むPowerShellハッシュテーブルを作成しました。 この方法で明示的にマークされていないドキュメントについては、特別なプロジェクト名(この場合はスノーフレーク)も追加しました。これもチェックされています。 そして、ドロップのために、社会保障番号の正規表現を追加しました。



サンプルの読み取りとマッピングに使用したコードブロックを以下に示します。 読み取りおよびチェック用のファイル名は、パラメーターとして渡されます。



 1. $Action = { 2. 3. Param ( 4. 5. [string] $Name 6. 7. ) 8. 9. $classify =@{"Top Secret"=[regex]'[tT]op [sS]ecret'; "Sensitive"=[regex]'([Cc]onfidential)|([sS]nowflake)'; "Numbers"=[regex]'[0-9]{3}-[0-9]{2}-[0-9]{3}' } 10. 11. 12. $data = Get-Content $Name 13. 14. $cnts= @() 15. 16. foreach ($key in $classify.Keys) { 17. 18. $m=$classify[$key].matches($data) 19. 20. if($m.Count -gt 0) { 21. 22. $cnts+= @($key,$m.Count) 23. } 24. } 25. 26. $cnts 27. }
      
      





優れたマルチスレッドサポート



上記のコードを取得し、バインダーを追加し、Out-GridViewコマンドレットで結果を実行することで、プロジェクトを簡素化できます。



伝えたいことがあります。 企業のファイルシステム内の同じフォルダ内であっても、数百または数千ものファイルが存在する可能性があります。



スクリプトが各ファイルを順番に読み取るまで本当に待ちますか?

もちろん違います!



分類の場合のように、多数のファイルに対してI / Oが実行されるアプリケーションは、マルチスレッド処理に適しています-ファイルで多くのアクションを同時に実行できるため、結果を取得する時間が大幅に短縮されます。



PowerShellには、Jobと呼ばれるほぼ適切な(厄介ではあるが)バックグラウンド処理システムがあります。 しかし、マルチスレッドをサポートする印象的でエレガントな機能、Runspacesもあります。



Runspacesを使用していくつかの先駆者からいくつかの操作とコードを借りた後、私は本当に感銘を受けました。



Runspacesを使用すると、同期と同時実行の混乱を招くメカニズムをすべて処理できます。 これはすぐに理解できるものではなく、Microsoftと協力しているScripting Guysブロガーでさえ、このマルチスレッドシステムに精通しています。



それにしても、私は大胆に前進を続け、Runspacesを使用してファイルを並行して読み取りました。 以下は、スレッドを開始するためのコードの一部です。ディレクトリ内の各ファイルに対して、上記のスクリプトブロックを実行するスレッドを作成し、一致するパターンを配列に返します。



 1. $RunspacePool = [RunspaceFactory]::CreateRunspacePool(1, 5) 2. 3. $RunspacePool.Open() 4. 5. $Tasks = @() 6. 7. 8. foreach ($item in $list) { 9. 10. $Task = [powershell]::Create().AddScript($Action).AddArgument($item.Name) 11. 12. $Task.RunspacePool = $RunspacePool 13. 14. $status= $Task.BeginInvoke() 15. 16. $Tasks += @($status,$Task,$item.Name) 17. }
      
      





深呼吸してみましょう-私たちは多くの資料をカバーしました。



次のメモでは、完全なスクリプトを提示し、いくつかの(不快な)詳細について説明します。 その間、いくつかのファイルにテキストでマークを付けた後、Out-GridViewを使用して次の出力を作成しました。









コンテンツの分類はほとんど無料です!



同時に、2つのスクリプトを相互に接続する方法について考える必要があります。ファイルアクティビティ監視スクリプトと、この記事で説明する分類スクリプトです。

それでも、分類スクリプトは、ファイルアクティビティスクリプトで監視する必要があるものに関するデータを送信する必要があります。理論的には、アクティビティスクリプトは、新しいファイルが作成されたときに分類スクリプトに通知して、分類できるようにします(つまり、データ追加システムを実装します)。



PowerShellベースのセキュリティ監視プラットフォームという言葉を恐れずに提案しているようです。 次回はこの作業を開始します。



All Articles