Windowsで、特定のユーザーに特定のサービスの再起動を許可する



Windowsで、ユーザーごとに、サービスレベルで操作権限(サービスの開始、停止など)を与える話です。

流れとしては、scコマンドで、サービスの随意アクセス制御リスト (DACL) に対し、セキュリティ記述子定義言語 (SDDL) 構文で、アクセス制御情報を追加することになります。

これにより、あるユーザーはOracleの再起動だけ許可、あるユーザーはTomcatの再起動だけ許可、など、細かい権限設定が可能です。
サーバーのマシン自体の再起動権限は与えられないけど、アプリケーションサーバープログラムや、DBサーバープログラムの再起動だけは許可したい、などのシチュエーションに使えます。

サービスのDACLは、名の通り、サービス単位で権限を制御するためのACLです。

SDDLは、ACLを文字列で記述するための構文です。
「;」で各フィールドを区切る形です。詳細については、こちら。に公式ドキュメントg
サービスの操作権限をユーザーレベルで制御するには、最低限、下記のように3つのフィールドを設定すれば良いようです。

(許可 (A)/拒否 (D);;アクセス許可の文字列;;;SID)

;;や;;;って何だよ、と最初見た時思いましたが、フィールドが空で、デリミター(;)だけが並んでいるだけですね。

許可 (A)/拒否 (D)には、サービスに対する特定の操作を許可する場合はA、拒否する場合はDを設定します。

(許可または拒否する)サービスに対する特定の操作は、アクセス許可の文字列で設定します。
このページに、アクセス許可の文字列に設定できる値が一覧されています。
再起動の場合は、RP(Start)とWP(Stop)の操作を許可すれば良いので、RPWPを指定すれば良いです。

SIDは、ユーザーオブジェクトに固有のIDで、要はユーザーのIDです。権限を付与したいユーザーのSIDを指定します。
権限を付与したいユーザーで、コマンドプロンプトからwhoamiコマンドをuserオプション付きで実行することにより、SIDを取得できます。

> whoami /user

WIndowsにもwhoamiコマンドがあったんですね。知らなかった。

まとめると、特定のユーザーに再起動権限を許可する場合は、下記のようになります。

(A;;RPWP;;;SID)

SIDには、 「whoami /user」コマンドで得られた、S-N-N-N-NNNNNNNNN-NNNNNNNNNN-NNNNNNNNNN-NNN のような文字列を指定(Nは、0〜9までの数字)

上の文字列を、scコマンドで指定します。

実際のコマンドは、下記のようになります。 

sc sdset "サービス名" D:(A;;RPWP;;;SID)<既存のアクセス許可>

<既存のアクセス許可>を指定しないと、既存の権限が上書きされて消されてしまいます。
なので、予め下記のコマンドで<既存のアクセス許可>を調べ、書き留めておきます。

sc sdshow "サービス名"

サービス名には、その名の通り、サービス名を指定します。
タスクマネージャーのサービスの「名前」の部分の名前です。

SIDは、上述の通り、権限を付与したいユーザーのSIDです。

これで、特定のユーザーに、特定のサービスの、特定の操作を、許可することができます。
これで、このユーザーはOracleの再起動だけ許可、このユーザーはTomcatの再起動だけ許可、など、細かい権限設定が可能になります。

コメント

このブログの人気の投稿

PowerShell 6で、Shift_JISのCSVをImport-Csvで読み込んだら文字化けした

PowerShellでイベントログを取得する時、「指定した選択条件に一致するイベントが見つかりませんでした。」が煩わしいのでcatchする