セイテクエンジニアのブログ 製品コラム 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メモリの中身をログに記録するというソリューション例を紹介します。
WindowsでUSB接続を検知する方法としてよく知られているのが、「Microsoft-Windows-DriverFrameworks-UserMode/ Operational」ログの有効化(既定でこのログは無効)によるイベントログの監視です。USBデバイスが接続されると、UMDF(ユーザーモードドライバーフレームワーク)ホストプロセスが、そのデバイス用のドライバーを読み込むように要求したことが、イベントID「2003」として記録されます。また、ドライバーの読み込みが正常に完了すると、イベントID「2006」として記録されます。
「Operational」ログを調べても、それが何のUSBデバイスなのか判断するのは難しいでしょう。USBメモリの接続を確認するには、PowerShellで次のコマンドラインを実行することで、そのUSBデバイスがUSBメモリを知ることができます。このスクリプトは、ファイルシステムが認識できる論理ドライブのDriveType「2」、つまりUSBメモリなどのリムーバブルディスクのすべてを検索して、そのドライブ文字(H:など)を表示し、最後にドライブ数を返します(画面1)。
画面1 「Microsoft-Windows-DriverFrameworks-UserMode/Operational」ログのイベントID「2006」を監視し、PowerShellスクリプトでUSBメモリのドライブ数を調べる例
PowerShellでUSBメモリを含むデバイスの情報を得る方法としては、CIM_LogicalDisk(Win32_LogicalDisk→Microsoft)の他にも、Win32_USBControllerDeviceクラス(→Microsoft)やWin32_DiskDriveクラス(→Microsoft)を使用する方法がありますが、これらのクラスからは直接的にドライブ文字を得ることができません。
次のPowerShellスクリプト「get-usbdrives.ps1」は、USBメモリの数を返すだけのシンプルなスクリプトです。永続的に接続される既知のUSBメモリがあるかもしれないので、$knowndrivesに既知のドライブ文字を追加できるようにしています。A:とB:は設定例です。ちなみに、A:、B:がWindowsによって新しいデバイスに自動割り当てされることはありません。
[get-usbdrives.ps1]
コメントアウト行(行頭が#の行)は、このスクリプトを使用してログファイルを作成する場合のコードの例です。すべてアンコメントすれば、$logfileに指定したファイルに、USBメモリの接続の有無と、接続されている場合は、再帰的にその内容を走査した結果を書き込みます。
スクリプトをアンコメントした上で、BOMのカスタム監視でこのスクリプトを定期的に実行することで監視することも可能ですが、今回は少し異なるアプローチで監視させることにします。BOMでは単純にUSBメモリの数のみを監視させます。それも、必要時にのみスクリプトを実行させることにします。
BOMに専用の監視グループ(USBメモリ監視)を作成し、その中に「イベントログ監視」と「カスタム監視」の2つの監視項目を追加します。イベントログ監視では、30秒間隔で「Microsoft-Windows-DriverFrameworks-UserMode」ログのイベントID「2006」の発生を監視させます(画面2)。USBデバイスはさまざまな種類があるので、しきい値「1以上」を「注意」、「10以上」を「危険」にして、「危険」ステータスになることを抑制します。
画面2 イベントログ監視で「Microsoft-Windows-DriverFrameworks-UserMode」ログのイベントID「2006」を監視する
もう一方のカスタム監視では、1分間でPowerShellスクリプト「get-usbdrives.ps1」を実行するように設定しますが、「全般」タブで「有効」のチェックを外し、初期状態では監視を無効にしておき、必要時にのみ実行されるようにします(画面3)。なお、PowerShellスクリプトのログへの出力はコメントアウトしたままの状態です。
画面3 初期状態で「無効」な監視項目として、PowerShellスクリプト「get-usbdrives.ps1」を実行するカスタム監視を設定する
次に、イベントログ監視のアクションとして、2つの「監視有効/無効」アクションを追加します。一方では、監視するステータスが「注意」および「危険」のとき、同じ監視グループのカスタム監視を「有効」に切り替え、「正常」のとき「無効に切り替えるように構成します(画面4)。また、カスタム監視のアクションとしても1つの「監視有効/無効」アクションを追加し、カスタム監視のステータスが「正常」のときに、カスタム監視を「無効」にするように構成します。
画面4 「監視有効/無効」アクションを使用して、イベントログ監視のステータスに応じて、カスタム監視の有効/無効を切り替える。「監視有効/無効」アクションについては、カスタム監視のアクションにも追加しておく
以上の設定により、何らかのUSBデバイスが接続されると30秒以内にイベントログ監視がそれを検知し、カスタム監視による監視を開始して接続中のUSBメモリの数を取得します。カスタム監視ではUSBメモリでなければ「0」が返ってきます。そして、イベントログ監視の監視ステータスが正常(値が「0」)になるか、カスタム監視の値が「0」の場合は、カスタム監視を停止するという監視フローが出来上がりました。
BOMではUSBメモリの数を監視しているだけです。BOMのカスタム監視に、さらなるアクションを組み込む(例えば、スクリプトでコメントアウトしている内容)こともできますが、今回はBOMによる監視に基づいて、Job Directorのジョブネットワークを呼び出してみます。Job Directorのジョブネットワークを使用すると、トラッカにより履歴を追跡できるという利点があります。
作成したジョブネットワーク(CheckUSBDrives)は、1行のコマンドラインをスクリプトに記述したジョブだけのシンプルなものです(画面5)。「powershell.exe -Command "& {<スクリプトブロック>}"」の<スクリプトブロック>の部分は、以下のPowerShellスクリプトを1行にしたものです。
画面5 Job Directorのジョブネットワーク「CheckUSBDrives」は、1行のPowerShellスクリプトを実行するシンプルなもの
Job DirectorのジョブネットワークはCL/Winの「Nscl_Submit.exe」(またはMG/SVの「jnwsubmitcmd.exe」)コマンドを使用して、コマンドラインから開始することができます。詳しくは、「Job Director R16 コマンドリファレンス」(JD_コマンドリファレンス.pdf)で説明されています。このコマンドラインをカスタム監視の「カスタムアクション」として設定します(画面6)
b
画面6 BOMの監視ステータスに応じて、JDのジョブネットワークを呼び出す
以上の設定により、BOMの監視を開始すると、USBデバイスの接続を検出し、USBメモリの数が「1」以上であれば、Job Directorのジョブネットワークが呼びされ、実行されるようになります。ジョブネットワークの実行履歴はJob Directorのトラッカとして保持されているので、例えば数分間USBメモリが接続され、何かしらのファイルがコピーされた場合、その痕跡を見つけることができる可能性があります(画面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接続のリムーバブルドライブ(DriveType=2)だけを監視します。USB外付けハードディスクやSSDドライブなど、固定ディスクとして認識されるものについては監視できません。最近は、USBメモリサイズのSSDドライブも低価格が進み、USBメモリの代わりに使っている人も増えてきました。
固定ディスクを含めて監視するには、既知のドライブを例外として定義し、PowerShellスクリプトでDriveTypeが2(リムーバブルメディア)または3(固定ディスク)の両方のドライブを検索すればよいでしょう(画面8)。
画面8 PowerShellスクリプトをリムーバブルメモリだけでなく、固定ディスクにも対応させる例
2024年11月20日 | カスタム監視でHyper-Vレプリカの監視を強化-BOM for Windows活用例 |
---|---|
2024年11月13日 | カスタム監視でフェールオーバークラスターの監視を強化-BOM for Windows活用例 |
2024年11月06日 | IEのアンインストールの可否について-BOM for Windows FAQ(仮) |
2024年10月30日 | Windows Server CoreにBOMをインストールしてみた(サポート外) |
2024年10月23日 | ネットワークドライブの容量監視-BOM for Windows FAQ(仮) |
2024年10月16日 | PowerShell: Excelシートからセルの値を取得したい-Windows FAQ(仮) |
2024年10月09日 | VMのV2V移行、移行前と移行後で何が変わるの?-SSD-assistance活用例 |
2024年10月02日 | BOM 8.0のMicrosoft 365向けOAuth 2.0対応について-BOM for Windows FAQ(仮) |
2024年09月25日 | 英語版OSへのBOMのインストールについて-BOM for Windows FAQ(仮) |
2024年09月18日 | BOM製品が使用するネットワークポート-BOM for Windows FAQ(仮) |