トップ回答者
SharePointのAPPプールアカウントをNetworkServiceに選択できないですか?(Kerberos認証)

質問
-
こんにちは。
SharePoint2013を使っています。
SharePointのカスタムWebパーツでSystem.Io.Fileクラスを使いたいところですが、このクラスは呼び出すユーザーをApplicationPoolのアカウントにしているのでSharePointに接続しているユーザー(Windowsのログインユーザー)であのクラスを呼び出すことができません。
実際解決策になるかどうかわからないが、とにかくケルベロス認証を使えばApplicationPoolではなく接続しているてユーザーがTokenをもらって認証する仕組みのようですので、どうせ他に解決方法などないし最後の方法としてKerberos認証を使ってみたいです。
ASP.NETで試してみたところApplicationPoolのアカウントをNetworkServiceにしなければいけないようですが、SharePointサイトのAPPPoolをNetworkServiceにすればサイトに接続できずエラーになります。エラーは500系でメッセージは
「SQL Server で構成データベースの読み取り権限を持つユーザーによってサーバー ファームに接続されたコンピューターでのみ、この操作を実行できます。このサーバーをサーバー ファームに接続するには、[スタート] メニューの Microsoft SharePoint 2010 製品にある SharePoint 製品構成ウィザードを使用してください。 」です。このメッセージはGoogleで探しても情報が見つかりませんでした。
普段怖くてこんなことまではしないですが...本当に最後の希望なのでSQLを起動してすべてのデーターベースに接続する権限をAT authority/Network Serviceユーザーに与えてみましたが治りませんでした。
ドメインアカウントにすれば普通にサイトに接続はできますが...ASP.NETのKerberos認証でNetworkServiceにするのはあのNetworkServiceというのがサイトに接続しているユーザーに対して動的にそのアカウントを習得するものなのかな...と予想しています、だからケルベロス認証を使えば行けるのかな...と思っていますのでドメインアカウントにしてしまうとケルベロス認証の意味がないのではないかと予想しています...
この問題についてご存知の方いらっしゃいますか。宜しくお願いいたします。
回答
-
最初に質問に「System.Io.Fileクラスを使いたい」と書いてあったので、ワーカープロセスのファイルアクセス権限の問題かと思っていましたが、そうではなくて、問題はワーカープロセスの SQL Server へのログインと DB へのアクセス権の設定のようですね。
そもそも NETWORK SERVICE は SQL Server にログインできているのでしょうか?
エラーメッセージに重要な情報が書かれていると思いますので、よく見てください。
【追伸】
> を参考してSQLにServer\PC$ をユーザーに追加して
というところですが、上記で Server はドメイン名、PC は Web サーバー名でなければなりません。また、Web サーバーと DB サーバーは同一ドメイン内に属していなければなりません。そのあたりは問題ないですか?
先に紹介したページ「How To: ASP.NET で Network Service アカウントを使用してリソースにアクセスする方法」の説明に書いてあるとおりです。
- 編集済み SurferOnWww 2014年4月1日 4:49 追伸を追加
- 回答の候補に設定 佐伯玲 2014年4月9日 7:25
- 回答としてマーク 佐伯玲 2014年4月10日 2:44
-
【追伸2】
まず最初に、タイトルの、
> SharePointのAPPプールアカウントをNetworkServiceに選択できないですか?(Kerberos認証)
というところに関し意識合わせするべきだったと、今さらながらですが思い始めましたので、そのあたりについてコメントします。
なお、自分は SharePoint の知識はないので、IIS + ASP.NET + SQL Server のレベルで話をしています。SharePoint 独自のプラスアルファ(?)があって、それが認証・承認に重要な影響を及ぼしている場合は話が合わないと思います。その場合はご容赦ください。
まず、アプリケーションプールのアカウント(ワーカープロセスの ID)ですが、これは IIS6, IIS7 の場合デフォルトで NETWORK SERVICE です。(IIS7.5 以降は違います。詳しくは先のレスで紹介した記事「アプリケーション プール ID」を参照ください)
SharePoint がデフォルトを変更していなければ NETWORK SERVICE のままのはずです。なので、「APPプールアカウントをNetworkServiceに選択できないですか」ということは必要ないはずです。質問者さんの SharePoint のサイト(またはアプリケーション?)に割り当てられているアプリケーションプールの ID が何か不明であれば、IIS マネージャーで調べてください。
IIS7 の IIS マネージャーの場合なら 「アプリケーションプール」を開くと、そのリストに DefaultAppPool とか ASP.NET V2.0 などいろいろあると思いますが、そのうちどれかが SharePoint のサイトに割り当てられているはずです。当該アプリケーションプールの詳細設定ダイアログを開いて、その中の「プロセスモデル」の「ID」を見れば NETWORK SERVICE か否かが分かります。
ASP.NET 偽装が「有効」になってなければ(=「無効」になっていれば。IIS + ASP.NET のデフォルト設定では「無効」です)、ワーカープロセスが外部リソース(共有フォルダのファイルや SQL Server)にアクセスに行く時の ID は NETWORK SERVICE になります。SharePoint での偽装の設定は分かりませんが、これも IIS マネージャーで調べられますので見てください。
従って、ASP.NET 偽装が「無効」になっていれば、NETWORK SERVICE に外部リソースに対する必要なアクセス権限を与えれば、ファイルアクセスも SQL Server へのログインもうまくいくはずです。
先のレスで紹介した記事「How To: ASP.NET で Network Service アカウントを使用してリソースにアクセスする方法」は上記のように、ワーカープロセスの ID が IIS6, IIS7 のデフォルトの NETWORK SERVICE であり、かつ、ASP.NET 偽装が「無効」であることが条件です。
ただし、サーバー間認証には以下のような SharePoint のプラスアルファ(?)があって、話が違ってくるのかもしれません。そのあたりは自分には分かりません。
SharePoint 2013 でサーバー間認証を計画する
http://technet.microsoft.com/ja-JP/library/jj219546(v=office.15).aspx
次に Kerberos の話ですが、Kerberos は Active Directory を使ったドメイン環境で統合 Windows 認証を利用している場合の認証プロトコル(の一つ)です。SharePoint にも、IIS + ASP.NET と同様に、いろいろ認証方式があるようですが、Kreberos をいう言葉が出てきたので、質問者さんの SharePoint サイトは統合 Windows 認証を利用してシングルサインオンを実現しているいると理解しています。
その理解が正しければ、最初の質問にあった・・・
> ドメインアカウントにすれば普通にサイトに接続はできますが...ASP.NETのKerberos認証で
> NetworkServiceにするのはあのNetworkServiceというのがサイトに接続しているユーザーに
> 対して動的にそのアカウントを習得するものなのかな...と予想しています、だからケルベロ
> ス認証を使えば行けるのかな...と思っていますのでドメインアカウントにしてしまうとケル
> ベロス認証の意味がないのではないかと予想しています...・・・というのはちょっと違います。
ASP.NET 偽装が「有効」になっている場合、ワーカープロセスが外部リソースにアクセスに行く際、実際にワーカープロセスが動いている NETWORK SERVICE アカウントではなく、ブラウザから SharePoint サイトにアクセスしたユーザーのドメインアカウントを「偽装」して、そのユーザーのドメインアカウントの資格情報でアクセスに行くということです。
なので、ASP.NET 偽装が「有効」になっている場合は NETWORK SERVICE に権限を与えてもダメで、アクセスするユーザーのドメインアカウントに必要な権限を与えることになります。
ワーカープロセスが外部リソースにアクセスする時の ID が「偽装」によってどう変わるかは、以下のページの「WindowsIdentity.GetCurrent」のセクションを見てください。
ASP.NET の ID オブジェクト
http://surferonwww.info/BlogEngine/post/2014/01/20/id-objects-in-aspnet-page.aspx
すべての返信
-
以下のスレッドの話の続きですか?
System.IO.File.Exists And set IIS
http://social.technet.microsoft.com/Forums/ja-JP/44817c70-2efc-486e-a85f-cd885664339b/systemiofileexists-and-set-iis?forum=sharepointdevelopmentそうであればその旨書いて、先のスレッドの問題との関連性を説明していただければと思います。
SharePoint = IIS + ASP.NET + SQL Server と理解してレスします。違っていたら失礼しました。以下のレスは無視してください。今回の問題が、ワーカープロセスによるファイルアクセスの問題であれば、以下のページの「ファイル アクセス」のセクションに書いてあるように Network Service アカウントに適切な権限を与えれば解決できると思います。Network Service はネットワーククレデンシャルを持っているので、リモートのファイルサーバーの共有フォルダにもアクセスできます。
How To: ASP.NET で Network Service アカウントを使用してリソースにアクセスする方法
http://msdn.microsoft.com/ja-jp/library/ms998320.aspx上のページに書いてある IIS_WPG グループは IIS7 以降では IIS_IUSRS グループに変更されているので注意してください。詳しくは以下のページを見てください。
IIS 7.0 での組み込みユーザーとグループ アカウントとは
http://technet.microsoft.com/ja-jp/library/dd939094.aspxまた、IIS7.5 以降は Network Service がアプリケーション プール ID に変更されていますので注意してください。詳しくは以下のページを見てください。
アプリケーション プール ID
http://technet.microsoft.com/ja-jp/library/ee886292.aspx- 編集済み SurferOnWww 2014年3月31日 4:52 訂正:Sharpoint ⇒ SharePoint
- 回答の候補に設定 佐伯玲 2014年4月1日 1:16
-
返信有難うございます。
一番上のリンクの続きです、System.IO.FileクラスがApplicationPoolのアカウントから呼び出していることがわかったので、解決策としてケルベロス認証を使ったら行けるかなと思ってケルベロス認証を試していましたがうまくいかなかったので質問いたしました。
教えていただいたリンクなど参考してASP.NETのWebフォームでは普通にケルベロス認証の設定ができてApplication PoolのアカウントもNetworkServiceに設定できましたが、やっぱりSharePointサイトのアプリケーションプールはNetworkServiceにすると上記のSQL権限の問題ぽいエラーになりました。
http://support.microsoft.com/kb/832769/ja
を参考してSQLにServer\PC$ をユーザーに追加してdbreader, db_security administratorなど権限も全部付けましたがダメでした...
SharePointの構成や設定などで他に必要なところがあるのか調べていますが、SharePointのケルベロス認証でNetworkServiceを使った事例があまりないようですw
なんか見つかって解決できたらまたコメントします。
-
最初に質問に「System.Io.Fileクラスを使いたい」と書いてあったので、ワーカープロセスのファイルアクセス権限の問題かと思っていましたが、そうではなくて、問題はワーカープロセスの SQL Server へのログインと DB へのアクセス権の設定のようですね。
そもそも NETWORK SERVICE は SQL Server にログインできているのでしょうか?
エラーメッセージに重要な情報が書かれていると思いますので、よく見てください。
【追伸】
> を参考してSQLにServer\PC$ をユーザーに追加して
というところですが、上記で Server はドメイン名、PC は Web サーバー名でなければなりません。また、Web サーバーと DB サーバーは同一ドメイン内に属していなければなりません。そのあたりは問題ないですか?
先に紹介したページ「How To: ASP.NET で Network Service アカウントを使用してリソースにアクセスする方法」の説明に書いてあるとおりです。
- 編集済み SurferOnWww 2014年4月1日 4:49 追伸を追加
- 回答の候補に設定 佐伯玲 2014年4月9日 7:25
- 回答としてマーク 佐伯玲 2014年4月10日 2:44
-
【追伸2】
まず最初に、タイトルの、
> SharePointのAPPプールアカウントをNetworkServiceに選択できないですか?(Kerberos認証)
というところに関し意識合わせするべきだったと、今さらながらですが思い始めましたので、そのあたりについてコメントします。
なお、自分は SharePoint の知識はないので、IIS + ASP.NET + SQL Server のレベルで話をしています。SharePoint 独自のプラスアルファ(?)があって、それが認証・承認に重要な影響を及ぼしている場合は話が合わないと思います。その場合はご容赦ください。
まず、アプリケーションプールのアカウント(ワーカープロセスの ID)ですが、これは IIS6, IIS7 の場合デフォルトで NETWORK SERVICE です。(IIS7.5 以降は違います。詳しくは先のレスで紹介した記事「アプリケーション プール ID」を参照ください)
SharePoint がデフォルトを変更していなければ NETWORK SERVICE のままのはずです。なので、「APPプールアカウントをNetworkServiceに選択できないですか」ということは必要ないはずです。質問者さんの SharePoint のサイト(またはアプリケーション?)に割り当てられているアプリケーションプールの ID が何か不明であれば、IIS マネージャーで調べてください。
IIS7 の IIS マネージャーの場合なら 「アプリケーションプール」を開くと、そのリストに DefaultAppPool とか ASP.NET V2.0 などいろいろあると思いますが、そのうちどれかが SharePoint のサイトに割り当てられているはずです。当該アプリケーションプールの詳細設定ダイアログを開いて、その中の「プロセスモデル」の「ID」を見れば NETWORK SERVICE か否かが分かります。
ASP.NET 偽装が「有効」になってなければ(=「無効」になっていれば。IIS + ASP.NET のデフォルト設定では「無効」です)、ワーカープロセスが外部リソース(共有フォルダのファイルや SQL Server)にアクセスに行く時の ID は NETWORK SERVICE になります。SharePoint での偽装の設定は分かりませんが、これも IIS マネージャーで調べられますので見てください。
従って、ASP.NET 偽装が「無効」になっていれば、NETWORK SERVICE に外部リソースに対する必要なアクセス権限を与えれば、ファイルアクセスも SQL Server へのログインもうまくいくはずです。
先のレスで紹介した記事「How To: ASP.NET で Network Service アカウントを使用してリソースにアクセスする方法」は上記のように、ワーカープロセスの ID が IIS6, IIS7 のデフォルトの NETWORK SERVICE であり、かつ、ASP.NET 偽装が「無効」であることが条件です。
ただし、サーバー間認証には以下のような SharePoint のプラスアルファ(?)があって、話が違ってくるのかもしれません。そのあたりは自分には分かりません。
SharePoint 2013 でサーバー間認証を計画する
http://technet.microsoft.com/ja-JP/library/jj219546(v=office.15).aspx
次に Kerberos の話ですが、Kerberos は Active Directory を使ったドメイン環境で統合 Windows 認証を利用している場合の認証プロトコル(の一つ)です。SharePoint にも、IIS + ASP.NET と同様に、いろいろ認証方式があるようですが、Kreberos をいう言葉が出てきたので、質問者さんの SharePoint サイトは統合 Windows 認証を利用してシングルサインオンを実現しているいると理解しています。
その理解が正しければ、最初の質問にあった・・・
> ドメインアカウントにすれば普通にサイトに接続はできますが...ASP.NETのKerberos認証で
> NetworkServiceにするのはあのNetworkServiceというのがサイトに接続しているユーザーに
> 対して動的にそのアカウントを習得するものなのかな...と予想しています、だからケルベロ
> ス認証を使えば行けるのかな...と思っていますのでドメインアカウントにしてしまうとケル
> ベロス認証の意味がないのではないかと予想しています...・・・というのはちょっと違います。
ASP.NET 偽装が「有効」になっている場合、ワーカープロセスが外部リソースにアクセスに行く際、実際にワーカープロセスが動いている NETWORK SERVICE アカウントではなく、ブラウザから SharePoint サイトにアクセスしたユーザーのドメインアカウントを「偽装」して、そのユーザーのドメインアカウントの資格情報でアクセスに行くということです。
なので、ASP.NET 偽装が「有効」になっている場合は NETWORK SERVICE に権限を与えてもダメで、アクセスするユーザーのドメインアカウントに必要な権限を与えることになります。
ワーカープロセスが外部リソースにアクセスする時の ID が「偽装」によってどう変わるかは、以下のページの「WindowsIdentity.GetCurrent」のセクションを見てください。
ASP.NET の ID オブジェクト
http://surferonwww.info/BlogEngine/post/2014/01/20/id-objects-in-aspnet-page.aspx