8

.Net Framework 4.7.2 を使用して Windows Server 2019 で ASP.NET アプリケーションをテストしています。IIS アプリケーションは、管理者権限を持たないユーザーを偽装するように設定されています。

アプリケーションはEventLog.SourceExists、新しいソースを作成する前に、イベント ログ ソースが存在するかどうかを確認するために呼び出します。この方法では、ソースの既存のイベント ログを検索するために管理者権限が必要であることを理解しています [1]。これを実現するもう 1 つの方法は、ユーザーにレジストリ キーHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLogとすべての子に対する読み取りアクセス許可を明示的に与えることです。

これは、Windows Server 2019 (2016、2012 R2、2018) より前のバージョンで機能します。

テストすると、この同じアプリケーションが Windows Server 2019 で失敗し、例外が発生します。

ソースは見つかりませんでしたが、一部またはすべてのイベント ログを検索できませんでした。アクセスできないログ: 状態。

procmon を実行しているときに、「状態」イベント ログのレジストリ キーを開こうとすると、アクセスが拒否されました。HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\State

"State" レジストリ キーは、Windows Server 2019 で新たに追加されました。これも保護されています。SYSTEM によって所有されており、管理者は読み取り専用に制限されています。ユーザーに読み取り権限を付与しようとすると、アクセスが拒否されます。その結果、管理者以外のユーザーとして実行しているアプリケーションは、Inaccessible logs: StateEventLog.SourceExists を呼び出すときに失敗します。

Stateレジストリ キーの所有権を取得して、ユーザーを追加できることに気付きました。ただし、これを行う前に、Windows Server 2019 のこの新しいレジストリ キー (イベント ログ) について知っている人がいるかどうかを確認したいと思います。

ありがとう。

[1] https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.eventlog.sourceexists?view=netframework-4.7.2

4

1 に答える 1

8

根本的な原因:

HKLM\SYSTEM\CCS\Services\EventLog ツリーの「状態」ハイブには、奇妙なセキュリティ構成があります。このため、イベント ソースを列挙しようとするすべてのアプリケーションは、最終的に「アクセスが拒否されました」という例外に遭遇し、終了します。

デフォルトの権限は次のとおりです。

  • SYSTEM (フル コントロール)
  • EventLog (フル コントロール)
  • 管理者 (読み取りキー)

これらは、たとえば「セキュリティ」ハイブと同じように継承されません。対照的に、'Parameters' という名前の 2 番目の新しいハイブは、アクセス許可を継承します。

列挙は通常、次のようにアプリケーションで行われます。

[System.Diagnostics.EventLog]::SourceExists("Source Name")

PowerShell を使用して列挙しようとしても、「アクセスが拒否されました」と表示されます。

PS C:\> (gci -Recurse HKLM:\System\CurrentControlSet\services\eventlog).Name

「状態」ハイブが正確に何をしているのかはわかりませんが (Microsoft はそれについて詳しく説明していません)、これを修正する方法を見つけました。

解決:

  1. REGEDIT を使用したインタラクティブなソリューション:

    a) 'PSexec' を使用して SYSTEM として REGEDIT を実行し、b) REGEDIT の UI を使用して、IIS_IUSRS またはサービスまたは IIS アプリケーション プールを実行する任意のアカウントの 'State' ハイブに読み取りアクセス許可を付与します。

  2. PowerShell を使用したスクリプトによるアプローチ:

    a) 'PSexec' を使用して SYSTEM として PowerShell を実行し、b) 'Get-ACL' / 'Set-ACL' コマンドレットを使用して、IIS_IUSRS またはサービスまたは IIS アプリケーション プールが実行する任意のアカウントの 'State' ハイブに読み取りアクセス許可を付与します。と

SYSTEM ユーザーとしてアプリケーションを実行するには、Microsoft SysInternals サイト ( https://docs.microsoft.com/en-us/sysinternals/downloads/psexec )から無料でダウンロードできる PSexec を使用するのが最適です。

PS C:\> PSexec.exe -accepteula -d -i -s powershell.exe

これにより、NT AUTHORITY\System として実行されている PowerShell ウィンドウが開きます。ここから、REGEDIT を使用して、「状態」ハイブのサービス ユーザー アカウントまたは IIS アプリケーション プール ユーザーのアクセス許可を変更します。または、Get-ACL / Set-ACL コマンドレットを使用して、スクリプト化された方法で同じことを行います。「キーの読み取り」権限で十分です。「フルコントロール」は必要ありません。

PS C:\> $hive = HKLM:\System\CurrentControlSet\services\eventlog\state; $acl = Get-ACL $hive; $rule = New-Object System.Security.AccessControl.RegistryAccessRule ("IIS_IUSRS","ReadKey","ContainerInherit","None","Allow"); $acl.SetAccessRule($rule); $acl |Set-ACL $hive

これで、アプリケーションは、実行されているマシン上のすべてのイベント ソースを列挙し、列挙で見つからない場合はイベント ソースを作成できるようになります。

于 2019-07-30T12:46:22.953 に答える