「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-[[戻る>サービス・タスク系のいろいろ]]

* 目次 [#v30eb84e]
#contents

*概要 [#l0270871]
Windowsサービス全般の実行アカウント問題を中心としたトラブルシュートについて説明します。

-通常、Windowsサービスの実行アカウントとして~
[[サービスで使用されるビルトイン システム アカウント>ビルトイン システム アカウント#w367092e]]が使用されます。

--IISでは、「Network Service」を使用します。
--タスク スケジューラでは、「System」(LocalSystem)を使用します。

-このため、Windowsサービスやタスク スケジューラからの実行では、~
普段意識していないOSやAPIの認証機構の存在を意識する必要があります。

*実行アカウントの確認方法 [#fa199add]
以下を参照下さい。

-@IT:.NET TIPS ユーザーのセキュリティ権限を確認するには?(基本編)~
http://www.atmarkit.co.jp/fdotnet/dotnettips/346rolebasesec1/rolebasesec1.html

*実行アカウントの指定方法 [#qfb184c7]

**runasコマンド実行アカウントを指定する(アンマッチ) [#k04d844d]

***一般的なアカウント [#ed143222]
runasコマンドで一時的にほかのユーザー権限でプログラムを実行する事ができますが、~
コマンドからパスワードは与えられず、ユーザに入力を求めるダイアログが表示されますので~
非対話型のセッションから実行されるWindowsサービスやタスク スケジューラではアンマッチです。

-一時的にほかのユーザー権限でプログラムを~
実行する方法(runasコマンドを利用する方法) - @IT~
http://www.atmarkit.co.jp/fwin2k/win2ktips/758runascmd/runascmd.html

***ビルトイン システム アカウント [#m8e1abe9]
-runasコマンドには[[サービスで使用されるビルトイン システム アカウント>ビルトイン システム アカウント#w367092e]]を指定きません。~

-既定で、[[サービスで使用されるビルトイン システム アカウント>ビルトイン システム アカウント#w367092e]]が利用されます。

**Windowsサービスの実行アカウントを指定する [#nafecdec]

***IISやSQL Serverなど [#i6f10ade]
IIS(のワーカ・プロセス)やSQL Serverなど、~
専用の設定画面を持ち、ここから設定が可能です。

-IIS
--IIS7.5(のワーカ・プロセス)からは、アプリケーションプール IDが導入され、~
既定で「[[Network Service>ビルトイン システム アカウント]]」ではなく「[[DefaultAppPool>仮想アカウント]]」が使用されます。

--IIS 7 のアクセス許可~
http://awoni.net/tips/iis_acl/

|BGCOLOR(#cccccc):||||c
||Windows Server 2003|Windows Vista&br;Windows Server 2008|Windows 7/Vista sp2&br;Windows Server 2008 R2|h
|既定の匿名ユーザーID|IUSR_<マシン名>|IUSR|IUSR|
|既定のワーカープロセスID|NETWORK SERVICE|NETWORK SERVICE|アプリケーション プール ID&br;([[仮想アカウント]])|
|ワーカープロセスグループ|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 インストールのセキュリティに関する注意点~
http://msdn.microsoft.com/ja-jp/library/ms144228.aspx
--サーバーの構成 - サービス アカウント~
http://msdn.microsoft.com/ja-jp/library/cc281953.aspx
--SQL Server のサービス開始アカウントの変更 (SQL Server 構成マネージャー)~
http://msdn.microsoft.com/ja-jp/library/ms345578.aspx

***ASP.NET(偽装) [#vaded437]
ASP.NETでは、偽装を使用する事によって、~
実行アカウントを指定することもできます。

>ASP.NET アプリケーションに偽装を実装する方法~
http://support.microsoft.com/kb/306158/ja

偽装には、

-[[サーバ信頼セキュリティ モデル]]
>特定のアカウントに偽装する。

-[[ベース クライアント セキュリティ モデル]]
>Windowsサービスにアクセスしてきたユーザの認証アカウントに偽装する。

があります。

匿名アカウントを実行アカウントにする場合は偽装が必要になります。~
通常は、IIS(のワーカ・プロセス)の実行アカウントで実行される。

-@IT:連載:プログラミングASP.NET 第17回 ASP.NETにおける認証と認定~
http://www.atmarkit.co.jp/fdotnet/aspnet/aspnet17/aspnet17_03.html~

***APIを使用した偽装 [#jf5ddc79]
ASP.NETのように、偽装の機能が実装されているWindowsサービスも有りますが、~
Win32APIを使用して偽装することもできます(区間的、部分的な偽装)。

-参考
--ASP.NET アプリケーションに偽装を実装する方法~
http://support.microsoft.com/kb/306158/ja
--コード内で認証中のユーザーを偽装する 
--コード内で特定のユーザーを偽装する 

--[[Open棟梁のIdentityImpersonation.ImpersonateValidUser+UndoImpersonationメソッド>https://github.com/OpenTouryoProject/OpenTouryo/blob/develop/root/programs/CS/Frameworks/Infrastructure/Public/Security/IdentityImpersonation.cs#L144]]
---[[区間偽装のサンプル - Open 棟梁 Wiki>http://opentouryo.osscons.jp/index.php?%E5%8C%BA%E9%96%93%E5%81%BD%E8%A3%85%E3%81%AE%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB]]

**タスク スケジューラの実行アカウントを指定する [#s12d2472]
以下のKBにあるように、タスク スケジューラは実行アカウントを指定して実行させる事ができます。

-ユーザー アカウントにパスワードがないとタスク スケジューラでタスクが実行されない~
http://support.microsoft.com/kb/299854/ja

コマンドからは以下の様に設定します。

-TechNet

--Command-line Reference > A-Z List
---Atコマンド~
http://technet.microsoft.com/ja-jp/library/cc772590.aspx
---Schtasksコマンド~
http://technet.microsoft.com/ja-jp/library/cc725744.aspx

--タスクのセキュリティ コンテキスト~
http://technet.microsoft.com/ja-jp/library/cc722152.aspx

*ネットワーク [#oa6e5c5f]

**ネットワーク間認証 [#faa96fc2]
-[[サービスで使用されるビルトイン システム アカウント>ビルトイン システム アカウント#w367092e]]を使用するとネットワーク間で認証できません。
-[[サービスで使用されるビルトイン システム アカウント>ビルトイン システム アカウント#w367092e]]はADのグループに入れる事ができないのでAD環境下でもNGです。

-このため、一般的に匿名アクセスを許可する以外、ネットワーク間の認証には~

--[[ミラーアカウント>#n5e7f04e]]
--[[ドメイン アカウント>#i41d6d52]]
--[[net use(WNetAddConnection)>#f712aad2]]

>の何れかを使用する必要があります。

***[[ミラーアカウント]] [#n5e7f04e]
WORKGROUP環境で利用。

***[[ドメイン アカウント]] [#i41d6d52]
Active Directory環境で利用。
-コンピュータ・アカウント~
AD環境下の場合、[[サービスで使用されるビルトイン システム アカウント>ビルトイン システム アカウント#w367092e]]を使用する場合、~
[[コンピュータ・アカウント>ドメイン アカウント#fdd7575b]]のアクセス許可をリソースに付与するだけでも良い。
-仮想アカウント~
AD環境下の場合、[[仮想アカウント]]は自動的に管理され、~
ドメイン環境でネットワークにアクセスすることができる。

***net use(WNetAddConnection) [#f712aad2]
-[[net use(WNetAddConnection)>サービス・タスク系のいろいろ#aec9f79c]]~
WORKGROUP環境・Active Directory環境でも利用可能。

**リモート・コマンド [#g35786fe]
-RSH(rshsvcサービス)や
-PowerShell(WinRMサービス)で

リモート・コマンドを実行する場合、~
リモートでコマンドを実行する際の~
実行アカウントを考慮する必要があります。

***RSH [#j2c36322]
rshsvc.exeは、渡されたシェルを実行しますが、シェルの実行アカウントは、~
[[サービスで使用されるビルトイン システム アカウント>ビルトイン システム アカウント#w367092e]]であるLocal Systemとなるようです。

***WinRM [#od280807]
WinRMサービスは、渡されたPowerShellを実行しますが、PowerShellの実行アカウントは、~
[[サービスで使用されるビルトイン システム アカウント>ビルトイン システム アカウント#w367092e]]であるNetwork Serviceとなるようです。~

しかし、WinRMサービスは実行時にCredentialを渡す事で実行アカウントを指定でき、~
また、色々設定を行う事によってWinRMでは[[ダブルホップ>#r02409ee]]も可能であるようです。~

***PsExec [#a18ceed3]
RSH(rshsvcサービス)など、上記の実行アカウントで~
実行できないコマンドをリモート実行したい場合、PsExecが利用できる。

-リモート・コンピュータ上でプログラムを実行する(PsExec編) - @IT~
http://www.atmarkit.co.jp/fwin2k/win2ktips/1416psexec/psexec.html~

--ローカル・アカウントと同じ資格情報得で偽装しリモート・タスクを実行する。~
ただし、この偽装アカウントは[[ダブルホップ>#r02409ee]]問題を持つため適切な設定が無いと~
リモート・タスク上のネットワーク・アクセス時の認証等に失敗する。

--リモートで実行するときのアカウントを指定できる。

--Systemアカウントでプログラムを実行するよう指定できる。

***ダブルホップ [#r02409ee]
ローカルの実行アカウントを引き継いでリモートアクセスする場合に知っておきたい~
「ダブルホップ」については「[[ベース クライアント セキュリティ モデル]]」→「[[委任]]」を参照。

*その他 [#zf5dda66]

**コンピューター スタートアップ スクリプトの実行アカウント [#q95796ff]
スタートアップ スクリプトは Local System アカウントとして実行されるらしい。

-コンピューター スタートアップ スクリプトを割り当てる~
https://technet.microsoft.com/ja-jp/library/cc770556.aspx

**Windowsサービスの偽装スレッドからEXE起動をした場合 [#ub7a5256]
また、ASP.NETなどの偽装スレッドからEXE起動をした場合、~
EXEが偽装スレッドの実行アカウントで実行されない問題があります。

***Win32 API [#r5468029]
-Microsoft ASP.NET で偽装ユーザーの~
コンテキストで実行されるプロセスを生成する方法。~
http://support.microsoft.com/kb/889251/ja
>偽装ユーザーのコンテキストで実行されるプロセスを起動するのには、 ~
System.Diagnostics.Process.Startメソッドを使用できません。

-偽装スレッドの実行アカウントでEXEを起動する場合は、~
DuplicateTokenEx→CreateProcessAsUser関数を使用し、~
独自に、ユーザ権限を割り当てる必要があるようです。

***注意点 [#j47c2029]
以下の点に注意が必要のようです。

-ASP.NET偽装や、ImpersonateValidUserの偽装レベルは~
SecurityImpersonationなので、これに合わせる必要がある。

-独自偽装の、偽装レベルは、どちらでも良いが、双方を合わせる必要がある。
--SecurityImpersonation
--SecurityDelegation

-実行アカウントには、以下の設定が必要になる。

--「プロセス レベル トークンの置き換え」セキュリティ・ポリシー~
このセキュリティ設定は、あるWindowsサービスから別のWindowsサービスを開始するために、~
CreateProcessAsUser() Win32APIを呼び出せるユーザ アカウントを決定します。~
このユーザー権利を使用するプロセスの 1 つがタスク スケジューラです。

---既定値:Network Service、Local System

-参考情報
--CreateProcessAsUser  すなのかたまり~
http://msmania.wordpress.com/tag/createprocessasuser/
---[Win32] [C++] LogonUser と CreateProcessAsUser  すなのかたまり~
http://msmania.wordpress.com/2011/02/06/win32-c-logonuser-%e3%81%a8-createprocessasuser/
---[Win32] [C++] CreateProcessAsUser  #1 特権編  すなのかたまり~
http://msmania.wordpress.com/2011/12/31/win32-c-createprocessasuser-1-%E7%89%B9%E6%A8%A9%E7%B7%A8/
---[Win32] [C++] CreateProcessAsUser  #2 トークン編  すなのかたまり~
http://msmania.wordpress.com/2011/12/31/win32-c-createprocessasuser-2-%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E7%B7%A8/
---[Win32] [C++] CreateProcessAsUser  #3 ソース  すなのかたまり~
http://msmania.wordpress.com/2011/12/31/win32-c-createprocessasuser-3-%E3%82%BD%E3%83%BC%E3%82%B9/
---[Win32] [C++] CreateProcessAsUser  #4 セキュリティ記述子  すなのかたまり~
http://msmania.wordpress.com/2012/01/01/win32-c-createprocessasuser-4-%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E8%A8%98%E8%BF%B0%E5%AD%90/

--[[Open棟梁のIdentityImpersonation.CreateProcessAsImpersonationUserメソッド>https://github.com/OpenTouryoProject/OpenTouryo/blob/develop/root/programs/CS/Frameworks/Infrastructure/Public/Security/IdentityImpersonation.cs#L283]]

*事例 [#x6f2977d]
-[[svnコマンド>初回が遅い!#tfc1f81b]]

----
Tags: [[:あるある]], [[:Windows]], [[:アカウント]], [[:セキュリティ]], [[:障害対応]], [[:デバッグ]]

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS