マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。

目次

概要

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

  • IISでは、「Network Service」を使用します。
  • タスク スケジューラでは、「System」(LocalSystem?)を使用します。
  • このため、Windowsサービスやタスク スケジューラからの実行では、
    普段意識していないOSやAPIの認証機構の存在を意識する必要があります。

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

以下を参照下さい。

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

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

一般的なアカウント

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

ビルトイン システム アカウント

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

IISやSQL Serverなど

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

  • IIS
    • IIS7.5(のワーカ・プロセス)からは、アプリケーションプール IDが導入され、
      既定で「Network Service」ではなく「DefaultAppPool」が使用されます。
Windows Server 2003Windows Vista
Windows Server 2008
Windows 7/Vista sp2
Windows Server 2008 R2
既定の匿名ユーザーIDIUSR_<マシン名>IUSRIUSR
既定のワーカープロセスIDNETWORK SERVICENETWORK SERVICEアプリケーション プール ID
仮想アカウント
ワーカープロセスグループIIS_WPGIIS_IUSRSIIS_IUSRS
  • アプリケーション プール IDの権限設定をする場合、
    IIS_AppPool?\ApplicationPoolName?ユーザか、IIS_IUSRSグループに対して権限を設定する。

    IIS 7 以降でのアプリケーションプールと権限について調べた - しばやん雑記
    http://blog.shibayan.jp/entry/20150127/1422369253

ASP.NET(偽装)

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

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

偽装には、

があります。

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

APIを使用した偽装

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

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

タスク スケジューラの実行アカウントを指定する

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

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

  • TechNet?

ネットワーク

ネットワーク間認証

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

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

ミラーアカウント

WORKGROUP環境で利用。

ドメイン アカウント

Active Directory環境で利用。

net use(WNetAddConnection?)

リモート・コマンド

  • RSH(rshsvcサービス)や
  • PowerShell(WinRMサービス)で

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

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

  • Microsoft ASP.NET で偽装ユーザーの
    コンテキストで実行されるプロセスを生成する方法。
    http://support.microsoft.com/kb/889251/ja

    偽装ユーザーのコンテキストで実行されるプロセスを起動するのには、
    System.Diagnostics.Process.Startメソッドを使用できません。

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

注意点

以下の点に注意が必要のようです。

  • ASP.NET偽装や、ImpersonateValidUser?の偽装レベルは
    SecurityImpersonation?なので、これに合わせる必要がある。
  • 独自偽装の、偽装レベルは、どちらでも良いが、双方を合わせる必要がある。
    • SecurityImpersonation?
    • SecurityDelegation?
  • 実行アカウントには、以下の設定が必要になる。
  • 「プロセス レベル トークンの置き換え」セキュリティ・ポリシー
    このセキュリティ設定は、あるWindowsサービスから別のWindowsサービスを開始するために、
    CreateProcessAsUser?() Win32APIを呼び出せるユーザ アカウントを決定します。
    このユーザー権利を使用するプロセスの 1 つがタスク スケジューラです。
  • 既定値:Network Service、Local System

事例


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


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-01-31 (木) 11:06:58 (234d)