Amazon WorkSpacesでIEセキュリティ強化の構成(IE ESC)を無効にする方法

2020.11.03

しばたです。

単純な様にみえて異常にハマりました...

通常の方法とハマったポイント

Amazon WorkSpacesはVDIとしてユーザーにWindows 10相当の環境を提供しますが、実体としてはユーザーにWindows Server 2016 Desktop Experienceを提供しています。 *1
このため通常のWindows 10とは異なりIEセキュリティ強化の構成(IE ESC)がデフォルトで有効にされています。

WorkSpacesはデスクトップ環境としてサーバーを使うのでこの機能を無効にするケースも多いかと思います。
通常のやり方としては「サーバーマネージャー」を起動し「ローカルサーバー」を選択、画面右にある「IE セキュリティ強化の構成」から無効にしてやります。

これで設定したユーザーは接続先を制限されることなくIEを使うことができます。

ハマったポイント

ここまでは良いのですが、問題となるのはこの設定を施したイメージを他のユーザーに展開する場合です。
先述の状態で新しいイメージとバンドルを作成し別ユーザーに展開すると、

  • サーバーマネージャー上の設定ではIE ESCは無効と表示されるものの、ユーザーがIEを利用しようとすると「IE ESCは有効である」と警告されてしまう

現象に遭遇します。

要はイメージ展開の際に上手く設定が引き継がない問題が起きているわけです。
一応新しいユーザーで再度サーバーマネージャーの設定をやり直すとIE ESCは無効にできますが、できればはじめから無効になっていてほしいですしこの挙動が問題となる場合もあるでしょう。

原因は何なのか?

起きている事象の予測はつくものの根本原因の特定までは至れませんでした。

IE ESCに限らずIEの設定全般はレジストリに保存されマシン全体の設定(HKLM配下)とユーザー毎の設定(HKCU配下)それぞれに複雑に分散されています。

WorkSpacesでは新しいユーザーが利用するたびにユーザプロファイルが新規に作成されユーザー毎のレジストリ設定も新規に作られます。
この際にマシン全体の設定との不整合を起こしてるものと推測されます。
(通常のWindows Serverであれば新しいユーザーが新規にプロファイルを起こす際に不整合は起こさないのですが、WorkSpacesでは独自の処理を挟んでいるのか不明ですが何故か問題がおきてしまいます...)

ちなみにIE ESCの具体的な設定箇所についてはMicrosoftが出している以下のFAQにまとまっています。

対応策

この問題を解消するために上記FAQ等を参考にして様々な手段を講じ、ハマりまくったものの、最終的には以下の方法で解決できました。
ダメだった方法についても後述しますが、この問題を解決するにあたり重要な結果として

不整合をSysprepに関わる全てのフェーズで改善することはできず、ユーザープロファイル作成後にレジストリ設定の同期コマンドを実施するしかなかった

点を先に言っておきます。

これを踏まえてイメージ作成前のレジストリ設定とユーザー初回ログオン時に処理を仕込む二段階の設定で対処しています。

1. 事前のレジストリ設定

ここは通常の方法でIE ESCを無効にしてOKです。

先述のFAQIEHArden_V5.batという同様の設定を行うバッチも提供されていますのでこれを使っても構いません。

今回はこのバッチを使って事前設定をします。
管理者としてPowerShellコンソールを起動しIEHArden_V5.batを実行しておいてください。

  • IEHArden_V5.bat
ECHO OFF
REM  IEHarden Removal Project
REM  HasVersionInfo: Yes
REM  Author: Axelr
REM  Productname: Remove IE Enhanced Security
REM  Comments: Helps remove the IE Enhanced Security Component of Windows 2003 and 2008(including R2)
REM  IEHarden Removal Project End
ECHO ON
::Related Article
::933991 Standard users cannot turn off the Internet Explorer Enhanced Security feature on a Windows Server 2003-based terminal server
::http://support.microsoft.com/default.aspx?scid=kb;EN-US;933991

:: Rem out if you like to Backup the registry keys
::REG EXPORT "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Active Setup\Installed Components\{A509B1A7-37EF-4b3f-8CFC-4F3A74704073}" "%TEMP%.HKEY_LOCAL_MACHINE.SOFTWARE.Microsoft.Active Setup.Installed Components.A509B1A7-37EF-4b3f-8CFC-4F3A74704073.reg" 
::REG EXPORT "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Active Setup\Installed Components\{A509B1A7-37EF-4b3f-8CFC-4F3A74704073}" "%TEMP%.HKEY_LOCAL_MACHINE.SOFTWARE.Microsoft.Active Setup.Installed Components.A509B1A8-37EF-4b3f-8CFC-4F3A74704073.reg" 

REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Active Setup\Installed Components\{A509B1A7-37EF-4b3f-8CFC-4F3A74704073}" /v "IsInstalled" /t REG_DWORD /d 0 /f
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Active Setup\Installed Components\{A509B1A8-37EF-4b3f-8CFC-4F3A74704073}" /v "IsInstalled" /t REG_DWORD /d 0 /f 
::x64
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432node\Microsoft\Active Setup\Installed Components\{A509B1A8-37EF-4b3f-8CFC-4F3A74704073}" /v "IsInstalled" /t REG_DWORD /d 0 /f 

::Disables IE Harden for user if set to 1 which is enabled
REG ADD "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap" /v "IEHarden" /t REG_DWORD /d 0 /f
REG ADD "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap" /v "IEHarden" /t REG_DWORD /d 0 /f
REG ADD "HKEY_CURRENT_USER\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap" /v "IEHarden" /t REG_DWORD /d 0 /f

::Removing line below as it is not needed for Windows 2003 scenarios. You may need to enable it for Windows 2008 scenarios
::Rundll32 iesetup.dll,IEHardenLMSettings
Rundll32 iesetup.dll,IEHardenUser
Rundll32 iesetup.dll,IEHardenAdmin
Rundll32 iesetup.dll,IEHardenMachineNow

::This apply to Windows 2003 Servers
REG DELETE "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup\OC Manager\Subcomponents" /v "iehardenadmin" /f /va
REG DELETE "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup\OC Manager\Subcomponents" /v "iehardenuser" /f /va

REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup\OC Manager\Subcomponents" /v "iehardenadmin" /t REG_DWORD /d 0 /f
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup\OC Manager\Subcomponents" /v "iehardenuser" /t REG_DWORD /d 0 /f

::REG DELETE "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Active Setup\Installed Components\{A509B1A7-37EF-4b3f-8CFC-4F3A74704073}" /f /va
::REG DELETE "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Active Setup\Installed Components\{A509B1A8-37EF-4b3f-8CFC-4F3A74704073}" /f /va

:: Optional to remove warning on first IE Run and set home page to blank. remove the :: from lines below
:: 32-bit HKCU Keys
REG DELETE "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main" /v "First Home Page" /f
REG ADD "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main" /v "Default_Page_URL" /t REG_SZ /d "about:blank" /f
REG ADD "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main" /v "Start Page" /t REG_SZ /d "about:blank" /f
:: This will disable a warning the user may get regarding Protected Mode being disable for intranet, which is the default.
:: See article http://social.technet.microsoft.com/Forums/lv-LV/winserverTS/thread/34719084-5bdb-4590-9ebf-e190e8784ec7 
:: Intranet Protected mode is disable. Warning should not appear and this key will disable the warning
REG ADD "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main" /v "NoProtectedModeBanner" /t REG_DWORD /d 1 /f

:: Removing Terminal Server Shadowing x86 32bit 
REG DELETE "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\Install\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap" /v "IEHarden" /f
:: Removing Terminal Server Shadowing Wow6432Node
REG DELETE "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Terminal Server\Install\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap" /v "IEHarden" /f

(上図ではC:\ImageSetup\IEHArden_V5.batにファイルを持ってきて実行)

2. 初回ログオン時の設定

前項の手順でマシン全体の設定が完了したので次にユーザー毎の設定を仕込みます。

最初に以下のPowerShellスクリプトをWorkSpace内の適当なフォルダに保存します。
今回はC:\ImageSetup\というフォルダを作りIEHarden-User.ps1という名前で保存しています。

  • C:\ImageSetup\IEHarden-User.ps1
<#
    IEHarden Removal Project for user registry
#> 
& {
    # Disables IE Harden for user if set to 1 which is enabled
    reg.exe ADD 'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap' /v 'IEHarden' /t REG_DWORD /d 0 /f
    reg.exe ADD 'HKEY_CURRENT_USER\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap' /v 'IEHarden' /t REG_DWORD /d 0 /f
    # Rundll32 iesetup.dll,IEHardenLMSettings
    rundll32.exe iesetup.dll,IEHardenUser
    rundll32.exe iesetup.dll,IEHardenAdmin
    rundll32.exe iesetup.dll,IEHardenMachineNow
} *> (Join-Path $env:USERPROFILE 'Desktop\IEHarden.log')

このスクリプトは先述のIEHArden_V5.batからユーザー毎設定に関わる部分のみを抽出しPowerShellに変換したものです。
デバッグしやすいようにログをデスクトップ環境に吐く様にしていますがこの点は適宜改変して使ってください。

このスクリプトで特に重要なのは

# Rundll32 iesetup.dll,IEHardenLMSettings
rundll32.exe iesetup.dll,IEHardenUser
rundll32.exe iesetup.dll,IEHardenAdmin
rundll32.exe iesetup.dll,IEHardenMachineNow

の部分であり、ここがレジストリ設定をシステムに反映させる部分になります。

次にこのスクリプトをユーザーの初回ログイン時に実行させてやる様にします。
Sysprepには丁度このための設定があり、oobeSystemパスの中でMicrosoft-Windows-Shell-Setupコンポーネントを以下の様に指定してやるとC:\ImageSetup\IEHarden-User.ps1を初回ログイン時に実行してくれます。

<settings pass="oobeSystem">
  <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <FirstLogonCommands>
      <SynchronousCommand wcm:action="add">
        <CommandLine>powershell.exe -ExecutionPolicy Bypass C:\ImageSetup\IEHarden-User.ps1</CommandLine>
        <Order>1</Order>
        <Description>IE-ESC Hardening for current user.</Description>
        <RequiresUserInput>false</RequiresUserInput>
      </SynchronousCommand>
    </FirstLogonCommands>
  </component>
</settings>

WorkSpacesのSysprep応答ファイルunattend.xmlC:\ProgramData\Amazon\EC2-Windows\Launch\Sysprepにありますので下図の様に設定を追記し保存します。

(WorkSpacesのunattend.xmlには既存の Microsoft-Windows-Shell-Setup があるのでそこに追記している)

これで準備は完了となります。
あとは新しいイメージを作りユーザー展開してみてください。

初回ログイン時にPowerShellコンソールが起動し、少し待つと普通にデスクトップが使える様になります。
結果下図の様に意図した動作になってくれました。

(PowerShellの実行ログIEHarden.logもきちんと出力されています。)

補足 : ダメだった方法

補足として試してダメだった方法も挙げておきます。

1. unattend.xml に Microsoft-Windows-IE-ESC を設定

Sysprepの応答ファイルであるunattend.xmlの設定にはIE ESCに関わるMicrosoft-Windows-IE-ESCというコンポーネントがあり、specializeパスの中で指定することが可能となっています。

設定例は以下。

<settings pass="specialize">
  <component name="Microsoft-Windows-IE-ESC" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <IEHardenAdmin>false</IEHardenAdmin>
    <IEHardenUser>false</IEHardenUser>
  </component>
</settings>

この設定によりサーバーマネージャー側の設定を強制するところまではできたのですが、ユーザー設定に影響を及ぼすことはありませんでした。

2. SetupComplete.cmd で IEHArden_V5.bat を実行

SetupComplete.cmdはSysprepの一連の処理が終わった後に実行されるコマンドファイルで、ここにユーザー独自の処理を書くことでイメージ展開をカスタマイズすることができます。

SetupComplete.cmdからFAQで紹介されていたIEHArden_V5.batを呼び出す様にしてみましたが効果はありませんでした。

3. グループポリシー基本設定でユーザーレジストリを更新

先述のFAQにあるグループポリシー基本設定でHKEY_CURRENT_USER \Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMapの設定を変えようと試みたのですが、レジストリ設定が上手く行く場合とそうでない場合が発生しました。 原因は不明ですがどうもグループポリシーの適用後に新しいユーザープロファイルのロードに関わる処理が動いている雰囲気です...

ただ、レジストリ設定が上手くいった場合でも期待した挙動にはなりませんでした。
レジストリ設定がIE側の期待と同期していない雰囲気でした。

4. Default ユーザーのレジストリ設定を変更

Windowのユーザーには各ユーザープロファイルを作るベースとなるDefaultユーザーが存在します。
このDefaultユーザーのレジストリ設定を変更しておくと、以後新規に作成される全てのユーザーの設定に反映させることができます。

今回Defaultユーザーの\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMapを更新し、これにより新規ユーザーのレジストリ設定を期待した値にするところまではできたのですが、実際の動作は変わりませんでした。
ここまでやって変更したレジストリ設定はIEに通知してやる必要があると判断しました。

注意事項

この方法はWorkSpacesとしては本来非推奨です。
以下に明記されていますので気をつけてください。

Windows WorkSpaces の場合、イメージを作成する前にデフォルトのユーザープロファイル (C:\Users\Default) をカスタマイズしないでください。GPO を使用してユーザープロファイルをカスタマイズし、イメージの作成後に適用することをお勧めします。GPO を使用して行ったカスタマイズは変更やロールバックが容易なため、デフォルトのユーザープロファイルに対して行ったカスタマイズよりもエラーが発生しにくくなります。

5. ログオンスクリプトに IEHArden_V5.bat を登録

これは上手く行った方法になります。

各ユーザーのログオンスクリプトにIEHArden_V5.batを登録したら期待した動作になりました。
上手くいったもののログオンスクリプトだと毎ログインごと動作してしまうため今回はお蔵入りとしました。

最後に

以上となります。

正直こんなにハマるとは思いませんでした...
通常のWindows ServerだけでなくWorkSpacesとの組み合わせで発生してると思われる挙動を調査するのは非常に骨の折れる作業でした。
またWorkSpacesのイメージ展開は一回の処理に非常に時間がかかるのでその点もシンプルにつらかったです。(この点はWorkSpacesに限らずVDIの一般的な"つらみ"だとは思いますが...)

個人的にはサーバーのイメージ展開では無理をしてはいけないというお気持ちになりました。
イメージ展開で無理をせず、ユーザーに初回ログイン時に初期セットアップをさせるなどの運用をさせるほうが管理者の運用コストも下げることができてみんな幸せになれると思います。

脚注

  1. これはMicrosoftのライセンス上の規約の都合に寄るものなのですが今回はその点には触れません