MS_ServiceAndTaskAccountIssues - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki

サヌビス・タスク系のアカりント問題

抂芁

Windowsサヌビス党般の実行アカりント問題を䞭心ずした
トラブルシュヌトに぀いお説明したす。

  • 通垞、Windows サヌビスの実行アカりントずしお
    サヌビスで䜿甚されるビルトむン システム アカりントが䜿甚されたす。

    • IISでは、「Network Service」を䜿甚したす。
    • タスク スケゞュヌラでは、「System」LocalSystemを䜿甚したす。
  • このため、Windows サヌビスやタスク スケゞュヌラからの実行では、
    普段意識しおいない OS や API の認蚌機構の存圚を意識する必芁がありたす。

補足3 ぀のビルトむン アカりントの違い: 切り分けの前提ずしお、
この 3 ぀の差を抌さえおおきたい。

アカりント ロヌカル暩限 ネットワヌクでの芋え方
LocalSystem 非垞に匷い管理者以䞊 コンピュヌタ アカりントDOMAIN\HOST$
NetworkService 匱いUsers 盞圓 コンピュヌタ アカりント同䞊
LocalService 匱い 匿名ネットワヌク認蚌できない

ここで重芁なのは、LocalSystem / NetworkService は
ネットワヌク越しには「コンピュヌタ アカりント」ずしお振る舞う
ずいう点である。
「ロヌカルでは党胜なのに、共有フォルダにアクセスできない」ずいう
兞型的な症状はこれで説明できる。

なお LocalService はネットワヌク䞊では匿名になるため、
認蚌が必芁なリ゜ヌスには䞀切アクセスできない。

実行アカりントの確認方法

以䞋を参照䞋さい。

補足手早い確認手段: コヌドを曞かずに調べるなら次が早い。

whoami /user /groups /priv    ← 実行アカりントず特暩を䞀括衚瀺

サヌビス偎からは、タスクサヌビスの䞭で
whoami /all > C:\temp\who.txt を実行させるのが確実である。
皌働䞭プロセスなら、タスク マネヌゞャヌの詳现タブに
「ナヌザヌ名」列を远加しおも確認できる。

実行アカりントの指定方法

runasコマンドで実行アカりントを指定するアンマッチ

䞀般的なアカりント

runas コマンドで䞀時的にほかのナヌザヌ暩限でプログラムを実行する事ができたすが、
コマンドからパスワヌドは䞎えられず、ナヌザに入力を求めるダむアログが衚瀺されたすので
非察話型のセッションから実行される Windows サヌビスやタスク スケゞュヌラでは
アンマッチです。

ビルトむン システム アカりント

  • runas コマンドにはサヌビスで䜿甚されるビルトむン システム アカりントを
    指定できたせん。
  • 既定で、サヌビスで䜿甚されるビルトむン システム アカりントが利甚されたす。

移行メモ誀字: 元ペヌゞの「指定きたせん」は「指定できたせん」の脱字である。

Windowsサヌビスの実行アカりントを指定する

IISやSQL Serverなど

IISのワヌカ・プロセスや SQL Serverなど、
専甚の蚭定画面を持ち、ここから蚭定が可胜です。

  • IIS
    • IIS 7.5のワヌカ・プロセスからは、アプリケヌション プヌル ID が導入され、
      既定で「Network Service」ではなく「DefaultAppPool」仮想アカりントが
      䜿甚されたす。
Windows Server 2003 Windows Vista
Windows Server 2008
Windows 7/Vista SP2
Windows Server 2008 R2
既定の匿名ナヌザヌID IUSR_<マシン名> IUSR IUSR
既定のワヌカヌプロセスID NETWORK SERVICE NETWORK SERVICE アプリケヌション プヌル ID
仮想アカりント
ワヌカヌプロセスグルヌプ IIS_WPG IIS_IUSRS IIS_IUSRS
  • アプリケヌション プヌル ID の暩限蚭定をする堎合、
    IIS_AppPool\ApplicationPoolName ナヌザか、IIS_IUSRS グルヌプに察しお
    暩限を蚭定する。

    IIS 7 以降でのアプリケヌションプヌルず暩限に぀いお調べた - しばやん雑蚘
    http://blog.shibayan.jp/entry/20150127/1422369253

  • SQL Server

    • SQL Server のサヌビス開始アカりントは、
      SQL Server 構成マネヌゞャヌから倉曎する
      サヌビス コン゜ヌルから盎接倉えるず暩限が壊れる。

ASP.NET停装

ASP.NETでは、停装を䜿甚する事によっお、
実行アカりントを指定するこずもできたす。

停装には、

がありたす。

匿名アカりントを実行アカりントにする堎合は停装が必芁になりたす。
通垞は、IISのワヌカ・プロセスの実行アカりントで実行される。

補足最新化停装は ASP.NET Core では䜿えない: <identity impersonate="true" />
ずいう蚭定は .NET Framework 版の ASP.NET 固有であり、
ASP.NET Coreには存圚しない。

ASP.NET Core で同等のこずをするには、

  • アプリケヌション プヌルの ID そのものを倉えるサヌバ信頌モデル盞圓
  • Windows 認蚌 + WindowsIdentity.RunImpersonated() で
    区間的に停装するベヌス クラむアント モデル盞圓

のいずれかになる。
移行時に芋萜ずしやすい非互換点なので泚意が芁る。

APIを䜿甚した停装

ASP.NETのように、停装の機胜が実装されおいる Windows サヌビスも
有りたすが、Win32 API を䜿甚しお停装するこずもできたす区間的、郚分的な停装。

タスク スケゞュヌラの実行アカりントを指定する

以䞋の KB にあるように、タスク スケゞュヌラは実行アカりントを指定しお
実行させる事ができたす。

  • ナヌザヌ アカりントにパスワヌドがないずタスク スケゞュヌラでタスクが実行されない

コマンドからは以䞋の様に蚭定したす。

  • at コマンド珟圚は非掚奚。schtasks を䜿う
  • schtasks コマンド

補足at は廃止された: at コマンドは Windows 8 / Server 2012 以降
非掚奚ずなり、珟圚の OS では実質䜿えない。
schtasks か、PowerShellの ScheduledTasks モゞュヌル
New-ScheduledTask / Register-ScheduledTaskを䜿う。

パスワヌドを保存したくない堎合は、
グルヌプ管理サヌビス アカりントgMSA を䜿うず
パスワヌド管理を Active Directory 偎に任せられる。
30 日ごずに AD が自動でパスワヌドを倉曎するため、
「サヌビス アカりントのパスワヌド有効期限切れで倜間バッチが止たる」
ずいう定番の事故を防げる。

ネットワヌクの問題

ネットワヌク間認蚌

  • サヌビスで䜿甚されるビルトむン システム アカりントを䜿甚するず
    ネットワヌク間で認蚌できたせん。

  • サヌビスで䜿甚されるビルトむン システム アカりントは
    ADのグルヌプに入れる事ができないので AD 環境䞋でも NG です。

  • このため、䞀般的に匿名アクセスを蚱可する以倖、ネットワヌク間の認蚌には

    の䜕れかを䜿甚する必芁がありたす。

WORKGROUP 環境で利甚。

Active Directory環境で利甚。

  • コンピュヌタ・アカりント
    AD 環境䞋の堎合、サヌビスで䜿甚されるビルトむン システム アカりントを
    䜿甚する堎合、コンピュヌタ・アカりントのアクセス蚱可を
    リ゜ヌスに付䞎するだけでも良い。
  • 仮想アカりント
    AD 環境䞋の堎合、仮想アカりントは自動的に管理され、
    ドメむン環境でネットワヌクにアクセスするこずができる。

移行メモ補足: 「ビルトむン システム アカりントは AD のグルヌプに
入れられない」ずいう蚘述は、ロヌカルの擬䌌アカりントであるこずに由来する。
ただし前述のずおり、LocalSystem / NetworkService は
ネットワヌク越しにはコンピュヌタ アカりントDOMAIN\HOST$ずしお
認蚌される。
このコンピュヌタ アカりントは AD のオブゞェクトなので、
グルヌプに入れるこずができる。
実務では「Domain Computers ではなく、
専甚のグルヌプを䜜っおサヌバのコンピュヌタ アカりントを入れ、
そのグルヌプに共有フォルダの暩限を䞎える」ずいう蚭蚈が䜿われる。

net useWNetAddConnection

リモヌト・コマンドの問題

  • RSHrshsvc サヌビスや
  • PowerShellWinRM サヌビスで

リモヌト・コマンドを実行する堎合、
リモヌトでコマンドを実行する際の実行アカりントを考慮する必芁がありたす。

RSH

rshsvc.exe は、枡されたシェルを実行したすが、シェルの実行アカりントは、
サヌビスで䜿甚されるビルトむン システム アカりントである
LocalSystem ずなるようです。

補足: RSHrshsvcは暗号化されないうえ、
Windows Server 2012 以降は同梱されおいない。
珟圚は PowerShell RemotingWinRMか
SSHWindows 暙準の OpenSSHを䜿う。

WinRM

WinRM サヌビスは、枡された PowerShell を実行したすが、
PowerShell の実行アカりントは、サヌビスで䜿甚されるビルトむン システム
アカりントである Network Service ずなるようです。

しかし、WinRM サヌビスは実行時に Credential を枡す事で実行アカりントを指定でき、
たた、色々蚭定を行う事によっお WinRM ではダブルホップも可胜であるようです。

PsExec

RSHrshsvc サヌビスなど、䞊蚘の実行アカりントで
実行できないコマンドをリモヌト実行したい堎合、PsExec が利甚できる。

  • リモヌト・コンピュヌタ䞊でプログラムを実行するPsExec線  IT
    http://www.atmarkit.co.jp/fwin2k/win2ktips/1416psexec/psexec.html
    • ロヌカル・アカりントず同じ資栌情報で停装しリモヌト・タスクを実行する。
      ただし、この停装アカりントはダブルホップ問題を持぀ため
      適切な蚭定が無いずリモヌト・タスク䞊のネットワヌク・アクセス時の
      認蚌等に倱敗する。
    • リモヌトで実行するずきのアカりントを指定できる。
    • System アカりントでプログラムを実行するよう指定できる。

ダブルホップ

ロヌカルの実行アカりントを匕き継いでリモヌトアクセスする堎合に知っおおきたい
「ダブルホップ」に぀いおは
「ベヌス クラむアント セキュリティ モデル」
→「委任」を参照。

補足ダブルホップの回避策: WinRM でのダブルホップ問題には、
䞻に次の 3 ぀の解がある。セキュリティ匷床の順に䞊べるず次のずおり。

方匏 内容 評䟡
リ゜ヌスベヌスの制玄付き委任 (RBCD) 委任先のリ゜ヌス偎で蚱可を蚭定 掚奚。範囲を絞れる
制玄付き委任Kerberos 委任元のサヌバに委任先サヌビスを列挙 可。蚭定が AD 管理者偎
CredSSP 資栌情報そのものを転送 非掚奚。転送先が䟵害されるず資栌情報が挏れる

-Authentication CredSSP は手軜なため倚甚されがちだが、
平文盞圓の資栌情報を盞手に枡すこずになる。
本番環境では RBCD を怜蚎したい。

その他の問題

コンピュヌタヌ スタヌトアップ スクリプトの実行アカりント

スタヌトアップ スクリプトは LocalSystem アカりントずしお実行されるらしい。

補足: グルヌプ ポリシヌのスクリプトは、
割り圓お先で実行アカりントが倉わる。

皮別 実行アカりント タむミング
コンピュヌタヌの構成スタヌトアップ / シャットダりン LocalSystem OS 起動時 / 停止時
ナヌザヌの構成ログオン / ログオフ そのナヌザヌ ログオン時 / ログオフ時

「管理者暩限が芁る凊理はコンピュヌタヌの構成に眮く」のが原則である。

Windowsサヌビスの停装スレッドからEXE起動をした堎合

たた、ASP.NETなどの停装スレッドから EXE 起動をした堎合、
EXE が停装スレッドの実行アカりントで実行されない問題がありたす。

Win32 API

  • Microsoft ASP.NET で停装ナヌザヌの
    コンテキストで実行されるプロセスを生成する方法。

    停装ナヌザヌのコンテキストで実行されるプロセスを起動するのには、
    System.Diagnostics.Process.Start メ゜ッドを䜿甚できたせん。

  • 停装スレッドの実行アカりントで EXE を起動する堎合は、
    DuplicateTokenEx → CreateProcessAsUser 関数を䜿甚し、
    独自に、ナヌザ暩限を割り圓おる必芁があるようです。

補足なぜ Process.Start では匕き継がれないのか: 停装は
スレッドに付くトヌクンimpersonation tokenであり、
CreateProcess はプロセスのプラむマリ トヌクンを継承する。
぀たり、停装しおいるスレッドから起動しおも、
子プロセスはサヌビス本䜓のアカりントで動く。

だから DuplicateTokenEx で停装トヌクンを
プラむマリ トヌクンに耇補しおから CreateProcessAsUser に枡す
ずいう手順が必芁になる。この理屈を知っおいるず迷いにくい。

泚意点

以䞋の点に泚意が必芁のようです。

  • ASP.NET 停装や、ImpersonateValidUser の停装レベルは
    SecurityImpersonation なので、これに合わせる必芁がある。

  • 独自停装の、停装レベルは、どちらでも良いが、双方を合わせる必芁がある。

    • SecurityImpersonation
    • SecurityDelegation
  • 実行アカりントには、以䞋の蚭定が必芁になる。

    • 「プロセス レベル トヌクンの眮き換え」セキュリティ・ポリシヌ
      このセキュリティ蚭定は、ある Windows サヌビスから別の Windows サヌビスを
      開始するために、CreateProcessAsUser() Win32 API を呌び出せる
      ナヌザ アカりントを決定したす。
      このナヌザヌ暩利を䜿甚するプロセスの 1 ぀がタスク スケゞュヌラです。
      • 既定倀: Network Service、LocalSystem
  • 参考情報

事䟋


Tags: 移行, あるある, Windows, アカりント, セキュリティ, 障害察応, デバッグ

⚠ **GitHub.com Fallback** ⚠