前回の投稿では、未署名のアプリケーションのファイルハッシュを利用して、アプリケーションの実行許可を行いました。
デバイスガードでは、カタログファイルを使用して、未署名のアプリケーションの実行を許可することもできます。
今回の投稿では、カタログファイルを使用したパターンについてまとめてみたいと思います。
カタログファイルですが、Device Guardで保護されているデバイスでのアプリの実行で解説されている、「PackageInspector.exe」を使用する必要があります。
PackageInspector はアプリケーションのインストールなどでディスクに書き込まれたファイルをトレースし、該当のファイルをカタログとしてまとめることで、実行を許可するものとなります。
New-CIPolicy では、監査ログに出力された内容や特定のパスを指定して、署名やハッシュを検出してアプリケーションの実行を許可しました。
この方法では、複数のディレクトリに対してファイルを配置しているものや、大量のファイルを配置するのもに対して、漏れがなくファイルを検出するのが難しいことがあるかと思います。
PackageInspector では、ディスクの書き込みをキャプチャするため、トレースの期間に発生したディスクアクセスベースで、許可するファイルを自動的に検出することが可能なため、インストールプロセスをキャプチャすれば、漏れがなくファイルをキャプチャすることができます。
カタログファイルを使用する場合の流れですが、
- アプリケーションをインストールできる準備をする
- インストールを実行する前に、PackageInspector によるキャプチャを開始する
- インストールが完了したら、PackageInspector によるキャプチャを停止し、カタログを作成する
- カタログファイルにコード署名を付与する
- カタログファイルを既定のディレクトリに保存する
- デバイスガードを監査モードで実行する
- アプリケーションを実行する
- 監査モードでコード署名の証明書をキャッチする
- XML にマージしてコード整合性ポリシーを作成する
というような流れになります。
カタログを使用する場合は、カタログにファイルの一覧が取得されますので、そのカタログを署名し、その署名をコード整合性ポリシーで許可することで、カタログを介して透過的に、アプリケーションの実行を許可することになります。
コード署名の作成については、Device Guard 展開ガイド に記載されている方法で実施することができます。
作成したコード署名をカタログに署名するためには、Windows 10 SDK の SignTool.exe を使用することで実施できます。
コード署名の準備と、Windows 10 SDK がインストールされている前提で、作業の流れをざっくりと。
最初に PackageInspector をキャプチャの開始として実行します。
PackageInspector.exe start C:
これで変更に対してのキャプチャを実施することができます。
この状態で、アプリケーションのインストールを行います。
今回は、C:\App\TestApp.exe をコピーすることでインストールの代替としています。
ディスクの書き込みが発生すると、PackageInspector でキャプチャがされますので、以下のコマンドを実行して、カタログとキャプチャされたファイルを確認するための CDF ファイルを作成します。
$ExamplePath=$env:userprofile+"\Desktop" $CatFileName=$ExamplePath+"\LOBApp-Contoso.cat" $CatDefName=$ExamplePath+"\LOBApp.cdf" PackageInspector.exe stop C: -Name $CatFileName -cdfpath $CatDefName
PackageInspector には scan というオプションがあり、該当のファイルがどこに配置されるかが把握できているのであれば、Start → Stop をしないでも、以下でピンポイントでスキャンすることも可能です。
$ExamplePath=$env:userprofile+"\Desktop" $CatFileName=$ExamplePath+"\LOBApp-Contoso.cat" $CatDefName=$ExamplePath+"\LOBApp.cdf" PackageInspector.exe scan C:\App -Name $CatFileName -cdfpath $CatDefName
CDF ファイルには、以下のような内容が出力されますので、キャプチャが行われていれば、ファイル名とパスが出力された状態となっています。
# 「CatalogFiles」に何も出力がないとファイルのキャプチャが行われていない状態になるかと。
カタログファイルには、以下のようにファイルの情報が記載されており、実際に使用するのはこのカタログファイルのほうだけになります。
カタログファイルの作成が終了したら、カタログファイルに署名を行います。
$ExamplePath=$env:userprofile+"\Desktop" $CatFileName=$ExamplePath+"\LOBApp-Contoso.cat" &"C:\Program Files (x86)\Windows Kits\10\bin\x64\signtool.exe" sign /n "Device Guard" /fd sha256 /v $CatFileName
今回は、コード署名用の証明書として、ユーザーの個人のストアに「Device Guard」という名称のコード署名証明書を事前に格納した状態にしています。
コード署名の証明書のルート証明書が、実際にデバイスガードを設定する端末のルート証明書として登録されていれば、カタログの署名に使用したコード署名証明書は、デバイスガードで保護する端末には不要かと。
これで、「実行を許可するファイルの情報が格納された、コード署名証明書で署名済みのカタログファイル」が作成された状態となります。
カタログファイルの最後の作業としては、「C:\Windows\System32\CatRoot\{F750E6C3-38EE-11D1-85E5-00C04FC295EE}」に署名されたカタログファイルを配置します。
これについては、グループポリシーでも実施できるかと思いますが、今回は手動で配置しています。
あとは、デバイスガードにコード署名で使用した証明書の情報を連係します。
最初に監査モードでコード整合性ポリシーを実行しておきます。
次にアプリケーションを実行して、監査ログに出力されていることを確認します。
ログに出力されていることが確認できたら、以下のコマンドを実行して XML を生成します。
$CIPolicyPath=$env:userprofile+"\Desktop\" $InitialCIPolicy=$CIPolicyPath+"Catalog.xml" New-CIPolicy -Audit -Level PcaCertificate -FilePath $InitialCIPolicy -UserPEs
XML には、以下のようにカタログの証明書が出力されているかと思います。
最後にポリシーをマージして制限モードで起動します。
$CIPolicyPath=$env:userprofile+"\Desktop\" $InitialCIPolicy=$CIPolicyPath+"InitialScan.xml" $AuditCIPolicy=$CIPolicyPath+"Catalog.xml" $MergedCIPolicy=$CIPolicyPath+"CatalogMergedPolicy.xml" Merge-CIPolicy -PolicyPaths $InitialCIPolicy,$AuditCIPolicy -OutputFilePath $MergedCIPolicy $CatalogCIPolicy=$CIPolicyPath+"CatalogMergedPolicy.xml" $CIPolicyBin=$CIPolicyPath+"Catalog.bin" Set-RuleOption -Option 3 -FilePath $CatalogCIPolicy -Delete ConvertFrom-CIPolicy $CatalogCIPolicy $CIPolicyBin
これで、アプリケーション側は操作することなく、実行を許可することができるようになります。
カタログに使用している署名を許可している形になりますので、同一のコード署名でカタログを署名すれば、カタログを増やした場合のデバイスガードの設定変更は必要ないかと。
デバイスガード、全体的な流れを把握するのにかなり手間取りました。。。。