SPS2013 RSS ビューア Web パーツでプロキシサーバーを経由して外部 RSS フィードを参照できない

この記事では、SPS2013 において RSS ビューア Web パーツでプロキシサーバーを経由して外部 RSS フィードを参照できない問題について解説します。

現象

SPS2013 RSS ビューア Web パーツでプロキシサーバーを経由して外部 RSS フィードを参照できません。

Add-WindowsFeature

発生条件

この問題は SPS2013 で以下のすべての条件を満たす場合に発生します。

  • DNS サーバーで外部 RSS フィードを名前解決できない。

  • 外部 RSS サイトの参照にプロキシサーバーを経由する必要がある。

web.config の設定では以下のようにプロキシ サーバーを参照するように構成済みです。

  <system.net> <defaultProxy> <proxy usesystemdefault="false" proxyaddress="https://proxyserver" bypassonlocal="true" /> </defaultProxy> </system.net>(解説)usesystemdefault : アプリケーションで既定のシステム プロキシが使用されることを示します。bypassonlocal : ローカル アドレスでプロキシが使用されないことを示します。proxyaddress : インターネット プロキシの URI または IP アドレスを指定します。

原因

この問題は、SPS2013 のセキュリティ チェック機能の影響により発生します。
SPS2013 の既定の設定では、Web アプリケーションにおいて外部参照が行われた際に、ローカル イントラネットの呼び出しを許可しないようにセキュリティ機能が働きます。
このセキュリティチェックの際に、参照先のホスト名がローカル イントラネットかどうか判断するために、DNS サーバーを参照して呼び出し先のホスト名の IP アドレスを取得しますが、DNS サーバーにおいて外部インターネットの名前解決が行えない環境では、IP アドレスを取得できず、結果としてローカル イントラネットかどうかの判断ができないため、既定の動作として外部 RSS フィードへのアクセスが拒否されます。

解決策

以下のいずれかの方法で問題を回避できます。

  • ローカル イントラネットのセキュリティ チェック機能を無効にする

  • Hosts ファイルを使用する

  • RSS フィードの URL に IP アドレスを利用する

ローカル イントラネットのチェック機能は、後述の PowerShell コマンドにより無効にできます。
本機能を無効にした場合、悪意のあるユーザーによりカスタムソリューション等で悪意があるコードが組み込まれたイントラネット サイトにリダイレクトされる外部参照が行われ、利用者が意図しない情報開示が行われる可能性があります。管理者によって、ユーザーが任意でカスタム ソリューションをインストールすることが許可されていない環境では、このような問題は起きにくいと考えられますので、この機能自体を無効にすることで簡単に対処できます。

また、より安全性の高い方法として、多少の管理コストが発生しますが、SharePoint Web サーバーの hosts ファイルを設定して外部インターネット RSS サイトの名前解決を提供する方法もあります。
外部 RSS フィードを提供するサーバーが固定 IP の場合には、URL ホスト名に IP アドレスを指定することでも対処できます。

方法 1. ローカル イントラネットのセキュリティ チェック機能を無効にする

  1. ファームの任意の SharePoint サーバーに管理者アカウントでログインし、スタートメニューから SharePoint 2013 管理シェルを起動します。

  2. 以下のコマンドを順に実行します。

    $farm = get-spfarm$farm.properties.disableintranetcalls = $false$farm.properties.disableintranetcallsfromapps = $false$farm.Update()

  3. 正常に実行が完了したら、RSS フィードが正常に表示されることを確認します。変更がすぐに反映されない場合は Web フロントエンドサーバーで IISRESET を実施します。

方法 2. hosts ファイルを使用する

hosts ファイルを編集して外部 RSS フィードを提供するホスト名を名前解決できるようにします。

  1. ファームのすべての Web フロントエンドサーバーで以下のディレクトリにある hosts ファイルを編集します。
    C:\Windows\System32\Drivers\etc

    <RSS フィードの IP アドレス> <RSS フィードの URL ホスト名>
    例) 70.37.57.244 sxp.microsoft.com

  2. 変更を保存したら、RSS フィードが正常に表示されることを確認します。変更がすぐに反映されない場合は Web フロントエンドサーバーで IISRESET を実施します。

方法 3. RSS フィードの URL に IP アドレスを利用する

RSS ビューア Web パーツに指定する RSS フィードの URL に IP アドレスを利用します。

例) https://sxp.microsoft.com/feeds/technet/news => https://70.37.57.244/feeds/technet/news

補足情報

この問題が発生すると診断ログに「PreventIntranetCalls」を含む以下のようなエラーが記録されます。
※DNS エラーの内容は、環境により異なる場合があります。

03/31/2014 03:07:43.50 w3wp.exe (0x12E0) 0x084C SharePoint Foundation General 00000 Unexpected Possibly the host name 'sxp.microsoft.com' is invalid and it's could not be found. The exception is System.Net.Sockets.SocketException (0x80004005): これは通常、ホスト名の解決中の一時的なエラーで、ローカル サーバーが権限を持っているサーバーから応答を受信しなかったことを意味します。 場所 System.Net.Dns.InternalGetHostByName(String hostName, Boolean includeIPv6) 場所 System.Net.Dns.GetHostAddresses(String hostNameOrAddress) 場所 Microsoft.SharePoint.Utilities.CommonUtility.IsIntranetAddress(String hostName) 889c829c-47d6-d072-5487-b0ac48af9e1b 03/31/2014 03:07:43.50 w3wp.exe (0x12E0) 0x084C SharePoint Portal Server Web Parts 8imh High RssWebPart: Exception handed to HandleRuntimeException.HandleException System.Net.Sockets.SocketException (0x80004005): これは通常、ホスト名の解決中の一時的なエラーで、ローカル サーバーが権限を持っているサーバーから応答を受信しなかったことを意味します。 場所 System.Net.Dns.InternalGetHostByName(String hostName, Boolean includeIPv6) 場所 System.Net.Dns.GetHostAddresses(String hostNameOrAddress) 場所 Microsoft.SharePoint.Utilities.CommonUtility.IsIntranetAddress(String hostName) 場所 Microsoft.SharePoint.Utilities.SPWebRequest.PreventIntranetCalls(Uri requestUri, SPContext context, String sharePointMarkValue, String appContextLoggingValue) 場所 Microsoft.SharePoint.Utilities.SPWebRequest.SafeCreate(Uri requestUri, SPContext context, Type callingType, String callingInstanceTag) 場所 Microsoft.SharePoint.WebControls.XmlUrlDataSource.FetchData(Str... 889c829c-47d6-d072-5487-b0ac48af9e1b 03/31/2014 03:07:43.50* w3wp.exe (0x12E0) 0x084C SharePoint Portal Server Web Parts 8imh High ...ing requestUrl) 場所 Microsoft.SharePoint.WebControls.BaseXmlDataSource.Execute(String request) 場所 Microsoft.SharePoint.WebControls.BaseXmlDataSource.GetXmlDocument() 場所 Microsoft.SharePoint.WebPartPages.DataFormWebPart.GetHierarchicalXPathNavigator(IHierarchicalDataSource ds) 場所 Microsoft.SharePoint.WebControls.SingleDataSource.GetXPathNavigatorInternal() 場所 Microsoft.SharePoint.WebControls.SingleDataSource.GetXPathNavigator() 場所 Microsoft.SharePoint.WebPartPages.DataFormWebPart.PrepareAndPerformTransform(Boolean bDeferExecuteTransform) 889c829c-47d6-d072-5487-b0ac48af9e1b 03/31/2014 03:07:43.74 w3wp.exe (0x12E0) 0x084C SharePoint Foundation Web Parts 89dd Medium AddWithFile:DfwpXslFilesHashCache=Microsoft.SharePoint.WebPartPages.CloneableHashTable 889c829c-47d6-d072-5487-b0ac48af9e1b