管理されたサービスアカウント

 
先日、Active Directory10周年のイベントに参加させていただいたときに
色々な方々とお話させていただく機会がありましたが、その中で
サービスアカウントについて、お話を伺うことができました。
色々とお話を伺ううちに、「サービスアカウントって、サービスを動かすために必要な権限だけを
割り当てるべき、という大事な原則があるのに、
あまり、そういう話をWebなどで見ることが(あまり)ないなあ」と思いました。
そこで、サービスアカウントの現状について、少し調べてみました。
 
 
サービスアカウントといえば、LocalSystem, LocalService, NetworkServiceの3種類が
デフォルトで提供されていました。
しかし、動作させるサービスに合わせて最小権限だけを割り当てたアカウントを用意したいという
場合には、いずれも「帯に短し、襷に長し」という状態でした。
 
そのため、ユーザーアカウントをサービスアカウント用に作成して、使うことも多いかと思いますが、
最小権限だけを割り当てるなら、
1.ユーザーアカウントには、もともとどのような権限があるのか?
2.自分が実行したいサービスに対して、追加でどのような権限を割り当てるべきか?
を考える必要があります。
この2つの課題のうち、ここでは1.について紹介します。
 
whoami /allコマンドを実行すれば、現在ログオン中のユーザーに対して、
どのような権限が割り当てられているか確認することができます。
管理されたサービスアカウントで実行してみようとしました。
ところが、、
Windows Server 2008 R2の新しい機能として提供されている、
管理されたサービスアカウントに割り当てられている権限を調べようと、
ローカルログオンしようとすると失敗します。
これは、管理されたサービスアカウントは
ローカルログオンする目的に作られていないからです。
そこで、今回はSCコマンドを使ってサービスを1つ作成し、
そのサービスを管理されたサービスアカウントで
起動した上で、サービスを乗っ取ってみました。
どうやってやったかは詮索しないでください(笑)
 
 
管理されたサービスアカウントで起動したサービスを乗っ取り、
コマンドプロンプトからwhoami /allを実行した様子はこちら。
 
 
 
見てみると、一般のユーザーとは以下の違いがあることがわかりました。
■所属するグループ
・NT AuthoritySERVICEグループのメンバーになっている
・Mandatory LabelHigh Mandatory Levelグループのメンバーになっている
  
■特権
・SeMachineAccountPrivilege(ドメインにワークステーションを追加 – 無効)
・SeImpersonatePrivilege(認証後にクライアントを偽装)
・SeCreateGlobalPrivilege(グローバルオブジェクトの作成)
この3つの特権が割り当てられていることがわかりました。
 
このことを認識したうえで、必要な権限を割り当てていけば、
最小限の権限だけを割り当ててサービスアカウントを運用することができますね。
 
 
■参考情報
Service Accounts Step by Step Guide