かつて山市良と呼ばれたおじさんのブログ

セイテクエンジニアのブログ  かつて山市良と呼ばれたおじさんのブログ  vol.44 USBドライブのマウントを強制解除|コマンド&スクリプト強化週間

 

 

vol.44 USBドライブのマウントを強制解除|コマンド&スクリプト強化週間

2024年09月19日配信
2024年09月19日更新
執筆者:山内 和朗

 コマンド&スクリプト強化週間(2024秋)の第4弾は、USBポートにUSBリムーバブルデバイスが接続され、ローカルドライブとしてマウントされたときに、一部の例外を除いて強制的にマウント解除するスクリプトです。なお、USBリムーバブルデバイスは、USBフラッシュメモリを想定しており、リムーバブルデバイスとして認識されないUSB接続のハードディスクやSSDは除外されます。

 

USBデバイスの全面禁止は難しい?

 

 USBフラッシュメモリ(USBメモリ)は便利な一方で、その利用は情報漏えいやマルウェア感染を媒介するセキュリティ上のリスクになります。特に、企業では従業員へのUSBメモリの危険性のセキュリティ教育や、ルール化に加えて、実際に利用を制限するシステム的な対応を行っているところも多いはずです。


 USBデバイスの完全な禁止は簡単です。BIOSレベルでポートを使用不能にすればよいのです。しかし、それではUSB接続のキーボードやマウス、その他の周辺機器の接続も制限されてしまうため、完全はヘッドレス環境でなければ実施は難しいでしょう(画面1)。ソフトウェア的に対応する方法としては、例えば、Active Directoryのグループポリシーで、コンピューターまたはユーザー(グループ)ごとに、すべてのリムーバブル記憶域クラスへのアクセスを禁止したり、リムーバブルディスクへの読み取りや書き込みを拒否したりすることができます(画面2)。許可されていないUSBデバイスを確実に排除する、セキュリティ製品やソリューションを利用するのも有効です。

 

画面1
画面1 USBポートの物理的な無効化は簡単だが、あらゆる種類のUSBデバイスが利用できなくなる

 

画面2
画面2 グループポリシーによるリムーバブルディスクまたはリムーバブル記憶域クラスに対するアクセス制御

 USBデバイスの使用制限が難しいケースもあるかもしれません。例えば、アプリのアクティブ化用のUSBドングルの使用や、指紋認証のためのUSBデバイス、USBメモリで提供されるOSやアプリの起動やインストール、USBメモリの使用を前提とした業務システムなどです。サーバーやPCが正常起動しなくなったときの、トラブルシューティングにもUSBデバイスの使用の可否は影響します。

 

ローカルドライブへのマウントを強制解除するというアプローチ

 

 WindowsでUSBデバイスを切断したい場合、GUIによる操作は直観的で簡単です。例えば、タスクバーのシステムトレイ上のUSBアイコンからの「取り出し」の実行や、「ディスクの管理」スナップインからの「取り出し」の実行です。前者の方法の場合、アプリで使用中のアクセスがあり、安全に取り出せない場合、取り出しは失敗します(画面3)。

 

画面3
画面3 タスクバーから「ハードウェアの安全な取り外し」を実行する。アクセス中のアプリがあって安全に取り外せない場合、取り外しは失敗

 USBデバイスの「取り出し」と同等の操作をコマンドラインだけで実現するのは簡単ではありません。GUIでは簡単でも、コマンドラインからの場合、USBデバイスのクラスやデバイスIDなどを調べることから始めなければならないからです。


 より現実的で簡単な方法があります。ドライブ文字のマウントを解除してしまえば、通常の方法(エクスプローラーやCOPYコマンド)ではアクセスできなくなります。PowerShellであれば、「mountvol ドライブ文字(G:など) /d」を管理者として実行するだけです。USBデバイスの接続はそのままですが、使用中のファイルがあったとしても、ドライブ文字の割り当ては即座に削除されるはずです(画面4)。

 

画面4
画面4 画面3と同じ状況(アプリでG:ドライブにアクセス)でも、mountvolコマンドによるマウント解除は即座に行われた

 

USBメモリのドライブを検出し、マウント解除するスクリプト(例外付き)

 

 次のPowerShellサンプルスクリプト「umount-usbdrives.ps1」は、リムーバブルドライブとして認識される(DriveType -eq 2)、論理ドライブのドライブ文字を取得し、mountvolコマンドでマウントを解除するスクリプトです。スクリプトの出力結果は、「日時, 重要度(Information|Warning|Error), 説明)としており、CSVファイルへのリダイレクトが可能です(画面5)。

 

画面5
画面5 PowerShellサンプルスクリプト「umount-usbdrives.ps1」の実行結果

 スクリプトでは、既知のドライブや会社提供のUSBメモリを例外的に扱えるようにもしました。$knowndrives変数には、例外的にマウント解除しない既知のドライブ文字を定義(A:とB:は例)します。$knowndrvice変数には、ドライブルートに指定したファイルが存在すれば例外的にマウント解除しないようにするファイル名を指定します。

[umount-usbdrives.ps1].txt形式でダウンロード

$knowndrives = @("A:","B:")
$knowndrvice = "\.CompanyAuthorizedDevices.txt"

$outstr = ""
$usbdrives = (Get-WmiObject CIM_LogicalDisk | Where-Object DriveType -eq 2).DeviceID
if ($usbdrives.Length -eq 0) {
  $outstr = $outstr + (Get-Date -Format "yyyy/MM/dd HH:mm") + ", Information, No USB removable device found.`n"
} else { 
  foreach ($usbdrive in $usbdrives){
    if ( -not ($knowndrives.ToUpper() -contains ($usbdrive).ToUpper())){
      $outstr = $outstr + (Get-Date -Format "yyyy/MM/dd HH:mm") + ", Warinig, USB removable device found. (" + $usbdrive + ")`n"
      if (Test-Path $usbdrive$knowndrvice) {
        $outstr = $outstr + (Get-Date -Format "yyyy/MM/dd HH:mm") + ", Information, The device is authorized by the company. (" + $usbdrive + ")`n"
      } else {
        mountvol $usbdrive /d
        if ($LASTEXITCODE -eq 0) {
          $outstr = $outstr + (Get-Date -Format "yyyy/MM/dd HH:mm") + ", Information, Successfully unmounted. (" + $usbdrive + ")`n"
        } else {
          $outstr = $outstr + (Get-Date -Format "yyyy/MM/dd HH:mm") + ", Error, Unmounting failure. (" + $usbdrive + ")`n"
        }
      }
    }
  }
}
$outstr


 このスクリプトを何らかの方法(タスクスケジューラーや無限ループの別のスクリプト、運用管理製品など)で定期的に実行し、ログファイルにリダイレクトすれば状況を追跡できるでしょう。例えば、製品コラム「USBメモリの監視-BOM for Windows活用例(Job Director連携)」では、USBデバイスの接続を監視し、それがUSBメモリであるかどうかをチェックして、USBメモリであれば、Job Directorのジョブネットワークを開始して、USBメモリの内容を再帰的に走査する活用例を紹介しています。Job Directorのジョブネットワークを呼び出すカスタムアクションを、このPowerShellスクリプト「umount-usbdrives.ps1」の実行と入れ替えることで、USBメモリの使用を効果的に制限することができるでしょう(画面6)。

画面6
画面6 BOM for Windowsのカスタムアクションとして、PowerShellスクリプト「umount-usbdrives.ps1」を実行させ、ログを出力する設定例

 

 

blog_subscribe

blog_comment

最新記事