「マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
目次 †
概要 †
Windowsサービス全般の実行アカウント問題を中心としたトラブルシュートについて説明します。
- IISでは、「Network Service」を使用します。
- タスク スケジューラでは、「System」(LocalSystem?)を使用します。
- このため、Windowsサービスやタスク スケジューラからの実行では、
普段意識していないOSやAPIの認証機構の存在を意識する必要があります。
実行アカウントの確認方法 †
以下を参照下さい。
実行アカウントの指定方法 †
runasコマンド実行アカウントを指定する(アンマッチ) †
一般的なアカウント †
runasコマンドで一時的にほかのユーザー権限でプログラムを実行する事ができますが、
コマンドからパスワードは与えられず、ユーザに入力を求めるダイアログが表示されますので
非対話型のセッションから実行されるWindowsサービスやタスク スケジューラではアンマッチです。
ビルトイン システム アカウント †
Windowsサービスの実行アカウントを指定する †
IISやSQL Serverなど †
IIS(のワーカ・プロセス)やSQL Serverなど、
専用の設定画面を持ち、ここから設定が可能です。
| 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 |
ASP.NET(偽装) †
ASP.NETでは、偽装を使用する事によって、
実行アカウントを指定することもできます。
ASP.NET アプリケーションに偽装を実装する方法
http://support.microsoft.com/kb/306158/ja
偽装には、
があります。
匿名アカウントを実行アカウントにする場合は偽装が必要になります。
通常は、IIS(のワーカ・プロセス)の実行アカウントで実行される。
APIを使用した偽装 †
ASP.NETのように、偽装の機能が実装されているWindowsサービスも有りますが、
Win32APIを使用して偽装することもできます(区間的、部分的な偽装)。
タスク スケジューラの実行アカウントを指定する †
以下のKBにあるように、タスク スケジューラは実行アカウントを指定して実行させる事ができます。
コマンドからは以下の様に設定します。
- Command-line Reference > A-Z List
ネットワーク †
ネットワーク間認証 †
- このため、一般的に匿名アクセスを許可する以外、ネットワーク間の認証には
の何れかを使用する必要があります。
WORKGROUP環境で利用。
Active Directory環境で利用。
net use(WNetAddConnection?) †
リモート・コマンド †
リモート・コマンドを実行する場合、
リモートでコマンドを実行する際の
実行アカウントを考慮する必要があります。
RSH †
rshsvc.exeは、渡されたシェルを実行しますが、シェルの実行アカウントは、
サービスで使用されるビルトイン システム アカウントであるLocal Systemとなるようです。
WinRM †
WinRMサービスは、渡されたPowerShellを実行しますが、PowerShellの実行アカウントは、
サービスで使用されるビルトイン システム アカウントであるNetwork Serviceとなるようです。
しかし、WinRMサービスは実行時にCredentialを渡す事で実行アカウントを指定でき、
また、色々設定を行う事によってWinRMではダブルホップも可能であるようです。
PsExec? †
RSH(rshsvcサービス)など、上記の実行アカウントで
実行できないコマンドをリモート実行したい場合、PsExec?が利用できる。
- ローカル・アカウントと同じ資格情報得で偽装しリモート・タスクを実行する。
ただし、この偽装アカウントはダブルホップ問題を持つため適切な設定が無いと
リモート・タスク上のネットワーク・アクセス時の認証等に失敗する。
- Systemアカウントでプログラムを実行するよう指定できる。
ダブルホップ †
ローカルの実行アカウントを引き継いでリモートアクセスする場合に知っておきたい
「ダブルホップ」については「ベース クライアント セキュリティ モデル」→「委任」を参照。
その他 †
コンピューター スタートアップ スクリプトの実行アカウント †
スタートアップ スクリプトは Local System アカウントとして実行されるらしい。
Windowsサービスの偽装スレッドからEXE起動をした場合 †
また、ASP.NETなどの偽装スレッドからEXE起動をした場合、
EXEが偽装スレッドの実行アカウントで実行されない問題があります。
Win32 API †
- 偽装スレッドの実行アカウントでEXEを起動する場合は、
DuplicateTokenEx?→CreateProcessAsUser?関数を使用し、
独自に、ユーザ権限を割り当てる必要があるようです。
注意点 †
以下の点に注意が必要のようです。
- ASP.NET偽装や、ImpersonateValidUser?の偽装レベルは
SecurityImpersonation?なので、これに合わせる必要がある。
- 独自偽装の、偽装レベルは、どちらでも良いが、双方を合わせる必要がある。
- SecurityImpersonation?
- SecurityDelegation?
- 「プロセス レベル トークンの置き換え」セキュリティ・ポリシー
このセキュリティ設定は、あるWindowsサービスから別のWindowsサービスを開始するために、
CreateProcessAsUser?() Win32APIを呼び出せるユーザ アカウントを決定します。
このユーザー権利を使用するプロセスの 1 つがタスク スケジューラです。
- 既定値:Network Service、Local System
事例 †
Tags: :あるある, :Windows, :アカウント, :セキュリティ, :障害対応, :デバッグ