製品コラム

セイテクエンジニアのブログ  製品コラム  USBメモリの監視ーBOM for Windows活用例(Job Director連携)

 

 

USBメモリの監視ーBOM for Windows活用例(Job Director連携)

2024年07月17日配信
2024年07月17日更新
執筆者:セイ・テクノロジーズ エバンジェリスト

 USBメモリは、業務やプライベートでちょっとしたデータの保存や移動に利用できる便利なリムーバブルデバイスが、機密データの外部への漏洩やマルウェアの持ち込みの原因にもなり得ます。サーバーにUSBメモリが接続される機会は、メンテナンスなどごく限られているでしょう。その接続は厳重に管理されるべきです。今回は、「BOM for Windows Ver.8.0 SR1」(以下、BOM)でサーバーに接続されるUSBメモリの接続を監視し、「Job Director R16」(以下、Job Director)と連携して接続されたUSBメモリの中身をログに記録するというソリューション例を紹介します。

 

USBデバイスの接続とUSBメモリの有無を調べる方法の考察

 

 WindowsでUSB接続を検知する方法としてよく知られているのが、「Microsoft-Windows-DriverFrameworks-UserMode/ Operational」ログの有効化(既定でこのログは無効)によるイベントログの監視です。USBデバイスが接続されると、UMDF(ユーザーモードドライバーフレームワーク)ホストプロセスが、そのデバイス用のドライバーを読み込むように要求したことが、イベントID「2003」として記録されます。また、ドライバーの読み込みが正常に完了すると、イベントID「2006」として記録されます。

 「Operational」ログを調べても、それが何のUSBデバイスなのか判断するのは難しいでしょう。USBメモリの接続を確認するには、PowerShellで次のコマンドラインを実行することで、そのUSBデバイスがUSBメモリを知ることができます。このスクリプトは、ファイルシステムが認識できる論理ドライブのDriveType「2」、つまりUSBメモリなどのリムーバブルディスクのすべてを検索して、そのドライブ文字(H:など)を表示し、最後にドライブ数を返します(画面1)。

PS:\> $usbdrives = (Get-CimInstance CIM_LogicalDisk | Where-Object DriveType -eq 2).DeviceID
if ($usbdrives.Length -eq 0) {
  Write-Host "########## No USB removable device. ##########"
} else { 
  foreach ($usbdrive in $usbdrives){
    Write-Host "########## USB removable ("$usbdrive") device found. ##########"
 }
}
return $usbdrives.Count


画面1
画面1 「Microsoft-Windows-DriverFrameworks-UserMode/Operational」ログのイベントID「2006」を監視し、PowerShellスクリプトでUSBメモリのドライブ数を調べる例

 

 PowerShellでUSBメモリを含むデバイスの情報を得る方法としては、CIM_LogicalDisk(Win32_LogicalDisk→Microsoft)の他にも、Win32_USBControllerDeviceクラス(→Microsoft)やWin32_DiskDriveクラス(→Microsoft)を使用する方法がありますが、これらのクラスからは直接的にドライブ文字を得ることができません。

 

BOMでUSBメモリの接続の有無を効率的に監視する

 

 次のPowerShellスクリプト「get-usbdrives.ps1」は、USBメモリの数を返すだけのシンプルなスクリプトです。永続的に接続される既知のUSBメモリがあるかもしれないので、$knowndrivesに既知のドライブ文字を追加できるようにしています。A:とB:は設定例です。ちなみに、A:、B:がWindowsによって新しいデバイスに自動割り当てされることはありません。

 

[get-usbdrives.ps1]

#$logfile = ".\usbdrives.log"
#Get-Date -Format "yyyy/MM/dd HH:mm:ss" 2>&1 > $logfile 
$knowndrives = @("A:","B:")
$usbdrivecount = 0
$usbdrives = (Get-CimInstance CIM_LogicalDisk | Where-Object DriveType -eq 2).DeviceID
if ($usbdrives.Length -eq 0) {
#  Write-Output "########## No USB removable device. ##########" 2>&1 >> $logfile
} else { 
  foreach ($usbdrive in $usbdrives){
    if ( -not ($knowndrives.ToUpper() -contains ($usbdrive).ToUpper())){
#      Write-Output "########## USB removable device found. ########## " 2>&1 >> $logfile
#      $usbdrive 2>&1 >> $logfile
#      get-childitem -Recurse $usbdrive 2>&1 >> $logfile
      $usbdrivecount = $usbdrivecount + 1
    }
  }
}
return $usbdrivecount

 

 コメントアウト行(行頭が#の行)は、このスクリプトを使用してログファイルを作成する場合のコードの例です。すべてアンコメントすれば、$logfileに指定したファイルに、USBメモリの接続の有無と、接続されている場合は、再帰的にその内容を走査した結果を書き込みます。

 スクリプトをアンコメントした上で、BOMのカスタム監視でこのスクリプトを定期的に実行することで監視することも可能ですが、今回は少し異なるアプローチで監視させることにします。BOMでは単純にUSBメモリの数のみを監視させます。それも、必要時にのみスクリプトを実行させることにします。

 BOMに専用の監視グループ(USBメモリ監視)を作成し、その中に「イベントログ監視」と「カスタム監視」の2つの監視項目を追加します。イベントログ監視では、30秒間隔で「Microsoft-Windows-DriverFrameworks-UserMode」ログのイベントID「2006」の発生を監視させます(画面2)。USBデバイスはさまざまな種類があるので、しきい値「1以上」を「注意」、「10以上」を「危険」にして、「危険」ステータスになることを抑制します。

 

画面2

画面2 イベントログ監視で「Microsoft-Windows-DriverFrameworks-UserMode」ログのイベントID「2006」を監視する

 

 もう一方のカスタム監視では、1分間でPowerShellスクリプト「get-usbdrives.ps1」を実行するように設定しますが、「全般」タブで「有効」のチェックを外し、初期状態では監視を無効にしておき、必要時にのみ実行されるようにします(画面3)。なお、PowerShellスクリプトのログへの出力はコメントアウトしたままの状態です。

 

画面3
画面3 初期状態で「無効」な監視項目として、PowerShellスクリプト「get-usbdrives.ps1」を実行するカスタム監視を設定する

 次に、イベントログ監視のアクションとして、2つの「監視有効/無効」アクションを追加します。一方では、監視するステータスが「注意」および「危険」のとき、同じ監視グループのカスタム監視を「有効」に切り替え、「正常」のとき「無効に切り替えるように構成します(画面4)。また、カスタム監視のアクションとしても1つの「監視有効/無効」アクションを追加し、カスタム監視のステータスが「正常」のときに、カスタム監視を「無効」にするように構成します。

 

画面4
画面4 「監視有効/無効」アクションを使用して、イベントログ監視のステータスに応じて、カスタム監視の有効/無効を切り替える。「監視有効/無効」アクションについては、カスタム監視のアクションにも追加しておく

 以上の設定により、何らかのUSBデバイスが接続されると30秒以内にイベントログ監視がそれを検知し、カスタム監視による監視を開始して接続中のUSBメモリの数を取得します。カスタム監視ではUSBメモリでなければ「0」が返ってきます。そして、イベントログ監視の監視ステータスが正常(値が「0」)になるか、カスタム監視の値が「0」の場合は、カスタム監視を停止するという監視フローが出来上がりました。

 

USBメモリが接続されたら、Job Directorと連携して内容を走査

 

 BOMではUSBメモリの数を監視しているだけです。BOMのカスタム監視に、さらなるアクションを組み込む(例えば、スクリプトでコメントアウトしている内容)こともできますが、今回はBOMによる監視に基づいて、Job Directorのジョブネットワークを呼び出してみます。Job Directorのジョブネットワークを使用すると、トラッカにより履歴を追跡できるという利点があります。

 作成したジョブネットワーク(CheckUSBDrives)は、1行のコマンドラインをスクリプトに記述したジョブだけのシンプルなものです(画面5)。「powershell.exe -Command "& {<スクリプトブロック>}"」の<スクリプトブロック>の部分は、以下のPowerShellスクリプトを1行にしたものです。

$knowndrives = @('A:','B:')
$usbdrives = (Get-CimInstance CIM_LogicalDisk | Where-Object DriveType -eq 2).DeviceID
if ($usbdrives.Length -eq 0) {
  Write-Host '########## No USB removable device. ##########'
} else { 
  foreach ($usbdrive in $usbdrives){
    if ( -not ($knowndrives.ToUpper() -contains ($usbdrive).ToUpper())) {
      Write-Host '########## USB removable ('$usbdrive') device found. #########'
      get-childitem -Recurse $usbdrive
    }
  }
}

 

画面5

画面5 Job Directorのジョブネットワーク「CheckUSBDrives」は、1行のPowerShellスクリプトを実行するシンプルなもの

 

 Job DirectorのジョブネットワークはCL/Winの「Nscl_Submit.exe」(またはMG/SVの「jnwsubmitcmd.exe」)コマンドを使用して、コマンドラインから開始することができます。詳しくは、「Job Director R16 コマンドリファレンス」(JD_コマンドリファレンス.pdf)で説明されています。このコマンドラインをカスタム監視の「カスタムアクション」として設定します(画面6)

b

bomsec04_scr06
画面6 BOMの監視ステータスに応じて、JDのジョブネットワークを呼び出す

 以上の設定により、BOMの監視を開始すると、USBデバイスの接続を検出し、USBメモリの数が「1」以上であれば、Job Directorのジョブネットワークが呼びされ、実行されるようになります。ジョブネットワークの実行履歴はJob Directorのトラッカとして保持されているので、例えば数分間USBメモリが接続され、何かしらのファイルがコピーされた場合、その痕跡を見つけることができる可能性があります(画面7)。

 

画面7
画面7 USBメモリが数分間接続されたままの場合、ジョブネットワークが繰り返し実行されることになり、その差分を確認できることがある

 今回の例ではジョブネットワークでUSBメモリの内容を走査しているだけですが、より時間のかかるタスクを実行させるのにも適しています。例えば、Microsoft Defenderウイルス対策によるスキャンの実行(※1)やWindows SysinternalsのProcess MonitorによるファイルI/Oのキャプチャなどです。

 

※1 Microsoft Defenderウイルス対策でカスタムスキャンをコマンドラインから実行するには、コマンドプロンプトからMpCmdRun.exeを実行するか、PowerShellからDefenderモジュールのStart-MpScanコマンドレットを実行します。システム全体の完全なスキャンを実施するには-File(-ScanPath)を指定せずに、、ScanType 2(FullScan)を指定して実行します。

C:¥> "C:¥Program Files¥Windows Defender¥MpCmdRun.exe" -Scan -ScanType 3 -File <ドライブ文字:¥>

PS C:¥> Start-MpScan -ScanType CustomScan -ScanPath <ドライブ:¥>; Get-MpThreat

 

固定ディスクタイプのUSBディスクを監視するには

 

 今回の監視ソリューションはUSB接続のリムーバブルドライブ(DriveType=2)だけを監視します。USB外付けハードディスクやSSDドライブなど、固定ディスクとして認識されるものについては監視できません。最近は、USBメモリサイズのSSDドライブも低価格が進み、USBメモリの代わりに使っている人も増えてきました。

 固定ディスクを含めて監視するには、既知のドライブを例外として定義し、PowerShellスクリプトでDriveTypeが2(リムーバブルメディア)または3(固定ディスク)の両方のドライブを検索すればよいでしょう(画面8)。

画面8

画面8 PowerShellスクリプトをリムーバブルメモリだけでなく、固定ディスクにも対応させる例

blog_column_subscribe

blog_column_comment

最新記事