web-dev-qa-db-ja.com

Windows-Windowsサービスにローカルサービスまたはネットワークサービスアカウントを使用します

Windows OSの特定のディレクトリにあるファイルを監視するウィンドウのサービスを作成しました。ファイルが検出されると、サービスはファイルI/O、ファイルの読み取り、サブディレクトリの作成などを行います。このサービスは、データベース接続を使用して別のサーバーに接続します。私の計画は、サービスをデフォルトの「ローカルサービス」アカウントとして実行することです。書き込み/読み取り権限を許可する必要があるため、「ローカルサービス」アカウントではデフォルトでは許可されていないため、「ローカルサービス」アカウントに「フルコントロール」権限を明示的に設定します。読み取り/書き込み。

上記は良いと思います。私の質問は、読み取りと書き込みを行っているフォルダーに対して、フルコントロールアクセスで「ネットワークサービス」の役割を設定する必要があるかということです。サービスが別のサーバーへのデータベース接続を使用しているので、「ネットワークサービス」アカウントの設定が必要かどうか疑問に思っています。

「ネットワークサービス」アカウントの機能を誤解している可能性があります。

19
contactmatt

NT AUTHORITY\NetworkServiceアカウント は、アクセス制御のためにマシンの資格情報を必要とするドメイン内の他のコンピューターと通信している場合にのみ必要です。単純なインターネット/ネットワークアクセスには必要ありません。これは、Active Directoryドメインでの特定の目的にのみ必要です。

NT AUTHORITY\LocalService account は、システム上で最小限の特権を持っていることです。より多くの特権を与えると、システムが提供するように設計された低い特権レベルで実行するように設計された、システム上の多くのサービスのセキュリティが低下します。サービスにこれらの特権以上の特権が必要な場合は、必要な特権を備えたサービス用に新しいアカウントを作成し、そのアカウントをログオンタブで設定する必要がありますサービスのプロパティ。 (これはプログラムで行うこともできます。)

NT AUTORITY\LocalSystem account 、これはシステムに無制限にアクセスできますが、LocalServiceアカウントを使用してシステムのセキュリティを強化したいと思います。

19
Patches

他の回答は、ローカルサービスの使用についてあなたが言うことを確認します。要約すると、ネットワークサービスの追加のActive Directory SSPI機能が必要でない限り、ローカルサービスがサービスで使用する推奨アカウントです。

特定のフォルダへの読み取り/書き込みアクセスを制限するには、一般的なローカルサービスアカウントへのアクセスを許可するだけでは不十分です。他の人が指摘したように、問題はローカルサービスとして実行されている他のすべてのサービスへの読み取り/書き込みアクセスも与え、すべてのサービスがこれを行った場合、ローカルサービスはますます重要なリソースへのアクセスを受け取ることになります。

解決策は、代わりに特定のサービスSIDを使用してフォルダーにACLを適用することです。自分のサービスプロセスにのみサービスSIDが関連付けられているため、これによりリソースがさらにロックダウンされます。サービスSIDはsc showsid <service name>を使用して表示できます。サービスSIDはサービス名から生成されるため、すべてのマシンで同じになります。

サービスによるサービスSIDの使用を有効にするには、ChangeServiceConfig2SERVICE_SID_INFO 構造とともに使用してSERVICE_SID_TYPE_UNRESTRICTEDを設定します。 SERVICE_SID_TYPE_RESTRICTEDを設定して、サービスSIDで明示的に許可されたリソースへの書き込みアクセスのみを許可する、さらに制限されたSIDを取得することもできます。

このリンクには、サービスSIDと制限されたサービスSIDの概要が記載されています。 https://docs.Microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008- R2-and-2008/hh125927(v = ws.10)

2
zhuman - MSFT

以前の答えは直接質問に答えるようには見えなかったので、私はそれに追加すると思いました。

  1. 私の計画は、サービスをデフォルトの「ローカルサービス」アカウントとして実行することです。読み書きするフォルダの「ローカルサービス」アカウントに「フルコントロール」権限を明示的に設定します。上記は良い計画だと思います。

個人的には、この計画には大きな問題はないと思います。 BUILTINでは、次のいずれかを選択します。

  1. LOCALSYSTEMとして実行-このサービスが侵害された場合、攻撃者はEverythingを直ちに所有します。
  2. LOCALSERVICEとして実行-このサービス、またはこのアカウントで実行されている他の多くのサービスのいずれかが侵害された場合、攻撃者は1つの追加ディレクトリにアクセスできます。*

おそらく、2番目のオプションを使用できるように、いくつかの追加のACLを追加することをお勧めします。はい、特権が低く、セキュリティに非常に敏感なサービスの最も安全なオプションは、カスタマイズされた特権の低いサービスアカウントで実行することです。ただし、展開するすべてのサービスに対して新しいアカウント/管理パスワードを作成する場合を除き、重要ではない軽微なタスクにLocalServiceを使用することは、それほどひどいことではありません。これらの考慮事項に基づいて責任ある決定を下す必要があります。たとえば、そのディレクトリやデータベースに何があるか、違反した場合の影響などです。

繰り返しますが、最低限の特権の原則に従って、Full ControlModifyが本当に十分でない場合。

2.私の質問は、私が読み書きしているフォルダーについて、フルコントロールアクセスで「ネットワークサービス」の役割を設定する必要があるのですか?サービスが別のサーバーへのデータベース接続を使用しているので、「ネットワークサービス」アカウントの設定が必要かどうか疑問に思っています。

データベースでWindows統合/ SSPIログインが必要な場合は、はい、ネットワークサービス(またはドメインサービスアカウント)をどこでも使用する必要があります。つまり、RunAsとディレクトリのアクセス許可です。このデータベースへのコンピューター名$またはドメインアカウントのアクセスも許可したとします。あなたがそうしているとは思えないので、通常のユーザー名/パスワード認証を使用している場合は、LocalServiceですべてを実行できるはずです。 RunAsで両方ではなく、どちらかを使用して、そのディレクトリに対するアカウント権限を1つだけ付与する必要があります。

3.「ネットワークサービス」アカウントの機能を誤解している可能性があります。

LocalService / NetworkService は、ローカルコンピューター上のほとんど同じアカウントです。違いは主に、ネットワーク上でできることです。 NSは、ネットワーク上で実際の(コンピュータ)アカウントとして表示されるため、一部のネットワークリソースにアクセスできます。ただし、LSは匿名として表示されるため、ネットワーク上のほとんどすべてが拒否されます。

ちなみに、これにはサービスではなく、スケジュールされたタスクを使用する必要があります。

*Vista以降、 サービスの分離 により、侵害された1つのLocalServiceプロセスが別のLocalServiceプロセスを簡単に攻撃することはできません。各LocalService/NetworkServiceサービスプロセス/インスタンスは、Windows 2003とは異なり、独自の一意のログオンセッションSID(一意の所有者)を取得します。制限付きSIDと write-restricted tokens は、このコンテキストで言及されています。

2
Amit Naidu