サービスのセキュリティとアクセス権
Windows セキュリティ モデルを使用すると、サービス コントロール マネージャー (SCM) とサービス オブジェクトへのアクセスを制御できます。 次のセクションでは、詳細情報を提供します。
Service Control Manager のアクセス権
SCM の特定のアクセス権を次に示します。
アクセス権 | 形容 |
---|---|
SC_MANAGER_ALL_ACCESS (0xF003F) | この表のすべてのアクセス権に加えて、STANDARD_RIGHTS_REQUIREDが含まれます。 |
SC_MANAGER_CREATE_SERVICE (0x0002) | CreateService 関数を呼び出してサービス オブジェクトを作成し、データベースに追加するために必要です。 |
SC_MANAGER_CONNECT (0x0001) | サービス コントロール マネージャーに接続するために必要です。 |
SC_MANAGER_ENUMERATE_SERVICE (0x0004) |
EnumServicesStatus を呼び出すか、EnumServicesStatusEx関数をして、データベース内のサービスを一覧表示するために必要です。 NotifyServiceStatusChange 関数を呼び出して、サービスが作成または削除されたときに通知を受信するために必要です。 |
SC_MANAGER_LOCK (0x0008) | データベースのロックを取得するために、LockServiceDatabase 関数を呼び出すために必要です。 |
SC_MANAGER_MODIFY_BOOT_CONFIG (0x0020) | NotifyBootConfigStatus 関数を呼び出すために必要です。 |
SC_MANAGER_QUERY_LOCK_STATUS (0x0010) | QueryServiceLockStatus 関数を呼び出して、データベースのロック状態情報を取得するために必要です。 |
SCM の 汎用アクセス権 を次に示します。
アクセス権 | 形容 |
---|---|
GENERIC_READ |
SC_MANAGER_ENUMERATE_SERVICE SC_MANAGER_QUERY_LOCK_STATUS |
GENERIC_WRITE |
SC_MANAGER_CREATE_SERVICE SC_MANAGER_MODIFY_BOOT_CONFIG |
GENERIC_EXECUTE |
SC_MANAGER_CONNECT SC_MANAGER_LOCK |
GENERIC_ALL |
|
適切なアクセス権を持つプロセスは、OpenService、EnumServicesStatusEx、および QueryServiceLockStatus関数使用できる SCM へのハンドルを開くことができます。 CreateService および LockServiceDatabase関数で使用できる SCM へのハンドルを開くことができるのは、管理者特権を持つプロセスだけです。
システムは、SCM のセキュリティ記述子を作成します。 SCM のセキュリティ記述子を取得または設定するには、QueryServiceObjectSecurity を使用し、SCManager オブジェクトへのハンドルを持つ SetServiceObjectSecurity関数をします。
Windows Server 2003 および Windows XP: 他のセキュリティ保護可能なオブジェクトとは異なり、SCM のセキュリティ記述子は変更できません。 この動作は、Windows Server 2003 Service Pack 1 (SP1) の時点で変更されています。
次のアクセス権が付与されます。
アカウント | アクセス権 |
---|---|
リモート認証ユーザー |
|
ローカル認証ユーザー (LocalService と NetworkService を含む) |
SC_MANAGER_ENUMERATE_SERVICE SC_MANAGER_QUERY_LOCK_STATUS STANDARD_RIGHTS_READ |
LocalSystem |
SC_MANAGER_ENUMERATE_SERVICE SC_MANAGER_MODIFY_BOOT_CONFIG SC_MANAGER_QUERY_LOCK_STATUS STANDARD_RIGHTS_READ |
管理者 |
|
ネットワーク経由で認証されたが、対話形式でログオンしていないリモート ユーザーは SCM に接続できますが、他のアクセス権を必要とする操作は実行されないことに注意してください。 これらの操作を実行するには、ユーザーが対話形式でログオンしているか、サービスがいずれかのサービス アカウントを使用する必要があります。
Windows Server 2003 および Windows XP: リモート認証ユーザーには、SC_MANAGER_CONNECT、SC_MANAGER_ENUMERATE_SERVICE、SC_MANAGER_QUERY_LOCK_STATUS、および STANDARD_RIGHTS_READ アクセス権が付与されます。 これらのアクセス権は、Windows Server 2003 SP1 の前の表で説明したように制限されています
プロセスが OpenSCManager 関数を使用して、インストールされているサービスのデータベースへのハンドルを開くと、アクセス権を要求できます。 システムは、要求されたアクセス権を付与する前に、SCM のセキュリティ記述子に対してセキュリティ チェックを実行します。
サービスのアクセス権
サービスの特定のアクセス権を次に示します。
アクセス権 | 形容 |
---|---|
SERVICE_ALL_ACCESS (0xF01FF) | この表のすべてのアクセス権に加えて、STANDARD_RIGHTS_REQUIRED も含まれます。 |
SERVICE_CHANGE_CONFIG (0x0002) | サービス構成を変更するには、ChangeServiceConfig または ChangeServiceConfig2関数呼び出すために必要です。 これにより、システムが実行する実行可能ファイルを変更する権限が呼び出し元に付与されるため、管理者にのみ付与する必要があります。 |
SERVICE_ENUMERATE_DEPENDENTS (0x0008) | EnumDependentServices 関数を呼び出して、サービスに依存するすべてのサービスを列挙するために必要です。 |
SERVICE_INTERROGATE (0x0080) | ControlService 関数を呼び出して、サービスに状態を直ちに報告するように要求するために必要です。 |
SERVICE_PAUSE_CONTINUE (0x0040) | サービスを一時停止または続行するには、ControlService 関数を呼び出すために必要です。 |
SERVICE_QUERY_CONFIG (0x0001) | QueryServiceConfig を呼び出し、QueryServiceConfig2関数をしてサービス構成を照会するために必要です。 |
SERVICE_QUERY_STATUS (0x0004) |
QueryServiceStatus を呼び出すか、または QueryServiceStatusEx関数呼び出して、サービスの状態についてサービス コントロール マネージャーに問い合わせるために必要です。 NotifyServiceStatusChange 関数を呼び出して、サービスの状態が変化したときに通知を受け取るために必要です。 |
SERVICE_START (0x0010) | サービスを開始するために、StartService 関数を呼び出すために必要です。 |
SERVICE_STOP (0x0020) | サービスを停止するために、ControlService 関数を呼び出すために必要です。 |
SERVICE_USER_DEFINED_CONTROL(0x0100) | ユーザー定義コントロール コードを指定するために、ControlService 関数を呼び出すために必要です。 |
サービスの 標準アクセス権 を次に示します。
アクセス権 | 形容 |
---|---|
ACCESS_SYSTEM_SECURITY | SACL にアクセスするために、QueryServiceObjectSecurity または SetServiceObjectSecurity関数呼び出すために必要です。 このアクセスを取得する適切な方法は、呼び出し元の現在のアクセス トークンで SE_SECURITY_NAME特権 を有効にし、ACCESS_SYSTEM_SECURITY アクセスのハンドルを開き、特権を無効にすることです。 |
DELETE の (0x10000) | サービスを削除するために DeleteService 関数を呼び出すために必要です。 |
READ_CONTROL (0x20000) | QueryServiceObjectSecurity 関数を呼び出して、サービス オブジェクトのセキュリティ記述子を照会するために必要です。 |
WRITE_DAC (0x40000) | SetServiceObjectSecurity 関数を呼び出して、サービス オブジェクトのセキュリティ記述子の Dacl メンバーを変更するために必要です。 |
WRITE_OWNER (0x80000) | SetServiceObjectSecurity 関数を呼び出して、サービス オブジェクトのセキュリティ記述子の 所有者 およびグループ メンバーを 変更するために必要です。 |
アクセス権 | 形容 |
---|---|
GENERIC_READ |
SERVICE_QUERY_CONFIG SERVICE_QUERY_STATUS SERVICE_INTERROGATE SERVICE_ENUMERATE_DEPENDENTS |
GENERIC_WRITE |
SERVICE_CHANGE_CONFIG |
GENERIC_EXECUTE |
SERVICE_START SERVICE_STOP SERVICE_PAUSE_CONTINUE SERVICE_USER_DEFINED_CONTROL |
SCM は、CreateService 関数によってサービスがインストールされるときに、サービス オブジェクトのセキュリティ記述子を作成します。 サービス オブジェクトの既定のセキュリティ記述子は、次のアクセス権を付与します。
アカウント | アクセス権 |
---|---|
リモート認証ユーザー | 既定では付与されません。windows Server 2003 sp1 を使用した: SERVICE_USER_DEFINED_CONTROL Windows Server 2003 および Windows XP: リモート認証ユーザーのアクセス権は、ローカル認証ユーザーのアクセス権と同じです。 |
ローカル認証ユーザー (LocalService と NetworkService を含む) |
SERVICE_ENUMERATE_DEPENDENTS SERVICE_INTERROGATE SERVICE_QUERY_CONFIG SERVICE_QUERY_STATUS SERVICE_USER_DEFINED_CONTROL |
LocalSystem |
SERVICE_ENUMERATE_DEPENDENTS SERVICE_INTERROGATE SERVICE_PAUSE_CONTINUE SERVICE_QUERY_CONFIG SERVICE_QUERY_STATUS SERVICE_START SERVICE_STOP SERVICE_USER_DEFINED_CONTROL |
管理者 |
READ_CONTROL SERVICE_ALL_ACCESS WRITE_DAC WRITE_OWNER |
操作を実行するには、ユーザーが対話形式でログオンしているか、サービスがいずれかのサービス アカウントを使用する必要があります。
サービス オブジェクトのセキュリティ記述子を取得または設定するには、QueryServiceObjectSecurity と SetServiceObjectSecurity関数使用します。 詳細については、「サービスの DACL の変更」を参照してください。
プロセスが OpenService 関数を使用する場合、システムは要求されたアクセス権をサービス オブジェクトのセキュリティ記述子に対してチェックします。
信頼されていないユーザー (SERVICE_CHANGE_CONFIG や SERVICE_STOPなど) に特定のアクセス権を付与すると、サービスの実行に干渉し、LocalSystem アカウントでアプリケーションを実行できる可能性があります。
EnumServicesStatusEx 関数 呼び出されると、呼び出し元がサービスに対する SERVICE_QUERY_STATUS アクセス権を持っていない場合、サービスはクライアントに返されるサービスの一覧から暗黙的に省略されます。