サービスのセキュリティとアクセス権
Windows セキュリティ モデルを使用すると、サービス コントロール マネージャー (SCM) とサービス オブジェクトへのアクセスを制御できます。 次のセクションでは、詳細情報を提供します。
サービス コントロール マネージャーのアクセス権
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 のセキュリティ記述子を取得または設定するには、SCManager オブジェクトへのハンドルを持つ QueryServiceObjectSecurity 関数と SetServiceObjectSecurity 関数を使用します。
Windows Server 2003 および Windows XP: 他のほとんどのセキュリティ保護可能なオブジェクトとは異なり、SCM のセキュリティ記述子は変更できません。 この動作は、Windows Server 2003 Service Pack 1 (SP1) の時点で変更されています。
次のアクセス権が付与されます。
Account | アクセス権が |
---|---|
リモートで認証されたユーザー |
|
ローカルで認証されたユーザー (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アクセス権が付与されます。 これらのアクセス権は、SP1 を使用した Windows Server 2003 の時点で前の表で説明したように制限されています
プロセスで 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) | サービス オブジェクトのセキュリティ記述子の Dacl メンバーを変更するには、SetServiceObjectSecurity 関数を呼び出すために必要です。 |
WRITE_OWNER (0x80000) | SetServiceObjectSecurity 関数を呼び出して、サービス オブジェクトのセキュリティ記述子の Owner メンバーと Group メンバーを変更するために必要です。 |
サービスの 汎用アクセス権 を次に示します。
アクセス権 | 説明 |
---|---|
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 |
サービスが CreateService 関数によってインストールされるときに、SCM によってサービス オブジェクトのセキュリティ記述子が作成されます。 サービス オブジェクトの既定のセキュリティ記述子は、次のアクセス権を付与します。
Account | アクセス権が |
---|---|
リモート認証ユーザー | 既定では付与されません。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アクセス権を持っていない場合、クライアントに返されるサービスの一覧からサービスは自動的に省略されます。