#sharepoint #iis-7 #sharepoint-2010
#sharepoint #iis-7 #sharepoint-2010
Вопрос:
После обновления некоторых наших внешних веб-сайтов, работающих в SharePoint 2007, до 2010, мы запустили проверку ссылок, чтобы найти проблемы. Мы заметили, что в журнале отображаются запросы к файлу с именем spsdisco.aspx. Действительно, при проверке источника наших веб-страниц SharePoint добавляет на страницу следующий элемент link HEAD
:
<link href="_vti_bin/spsdisco.aspx" rel="alternate" type="text/xml" />
Это файл обнаружения веб-службы, в котором перечислены имена и местоположения всех конечных точек веб-службы SharePoint. Что еще хуже, этот файл начинает отображаться в индексах поиска. В лучшем случае это вызывает смущение; в худшем случае это потенциальная уязвимость (это внешние веб-сайты). Поскольку это виртуальный файл, он отображается на каждом сайте и дочернем сайте, поэтому ручной подход к «скрытию» каждого из них сложен и неуклюж.
Кажется, я не могу найти никакой фактической документации по этому поводу — несколько ссылок на его обновление для включения пользовательской веб-службы, но не более того. Как мы могли бы подойти к надежному, нисходящему подходу к отключению доступа к этим страницам? Я думаю, мы можем найти способ подавить LINK
элемент на странице, но это просто скрывает проблему.
Есть ли в SharePoint место (сайт или центральный администратор), чтобы отключить это? Не могли бы вы просто добавить некоторую фильтрацию запросов в IIS, чтобы запретить доступ к SPSdisco.aspx и файлам ASMX?
Обновление: По предложению Kev я разместил перекрестную публикацию на sharepoint.stackexchange.com.
Обновление 2: Видите, я не отказался от этого вопроса. Наконец-то у нас появилось время ознакомиться с некоторыми рекомендациями MS и создать развертываемое решение SharePoint для решения проблемы.
Комментарии:
1. Странно — я также могу получить доступ к файлу DISCO через «_vti_bin spdisco.aspx» (вместо «spSdisco.aspx»)
Ответ №1:
В качестве быстрого исправления я бы добавил правило фильтрации запросов для запрета доступа к SPSDisco.aspx
.
Но, возможно, вам захочется спросить на новом сайте SharePoint Stack Exchange о более надежном исправлении:
Комментарии:
1. Спасибо, я принял ваше предложение. Я обновил OP ссылкой на мой вопрос на другом сайте.
Ответ №2:
Вот решение, к которому мы пришли. Частично это было основано на рекомендациях нашего представителя Microsoft, поэтому вы можете считать это неофициальным, «официальным» подходом.
Во-первых, нам нужно запретить SharePoint рекламировать файл disco всему миру (то есть Google). Просто удалите следующую строку на своих основных страницах:
<SharePoint:SoapDiscoveryLink runat="server"/>
Это приведет к подавлению <link href="/_vti_bin/spsdisco.aspx" rel="alternate" type="text/xml">
ссылки в заголовке ваших страниц.
Далее, мы хотим убедиться, что неавторизованные пользователи не имеют доступа к веб-службам, описанным в файле disco, или к чему-либо еще в _vti_bin
, если уж на то пошло. Если ваш сайт работает только внутри вашего брандмауэра (например, в интрасети), то это не так важно. Но если у вас есть анонимные конечные точки, к которым можно получить доступ извне, вы хотите, чтобы они были заблокированы.
Это отличное приложение для HttpModule. Мы создадим систему, которая перехватывает любой запрос, содержащийся _vti_bin
в пути, и, если текущий пользователь не авторизован, вернет 404 NOT FOUND
код состояния. Я решил вернуть значение 404, а не 401 UNAUTHORIZED
потому что я не просто хочу заблокировать эти пути, я хочу скрыть тот факт, что на этих путях вообще что-либо существует.
Наш HttpModule выглядит следующим образом:
using System;
using System.Web;
namespace Custom.SharePoint.HttpModule.SpSecureVtiBin {
public class SpSecureVtiBinModule : IHttpModule {
#region IHttpModule Members
public void Dispose() { }
public void Init( HttpApplication context ) {
context.AuthorizeRequest = new EventHandler( context_AuthorizeRequest );
}
protected virtual void context_AuthorizeRequest( object sender, EventArgs e ) {
HttpApplication app = (HttpApplication)sender;
string requestedPath = app.Request.Path;
if ( requestedPath.ToLowerInvariant().Contains( "_vti_bin" ) ) {
if ( !app.Request.IsAuthenticated ) {
app.Response.StatusCode = 404;
app.Response.StatusDescription = "Not Found";
app.Response.Write( "404 NOT FOUND" );
app.Response.End();
}
}
}
#endregion
}
}
Достаточно просто. Чтобы использовать HttpModule, он должен быть зарегистрирован в файле web.config сайта с записью в разделе configurationsystem.webServermodules
:
<add name="SpSecureVtiBinModule" type="Custom.SharePoint.HttpModule.SpSecureVtiBin.SpSecureVtiBinModule, Custom.SharePoint.HttpModule.SpSecureVtiBin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=[your_public_key_token]" />
Конечно, мы не хотим изменять файл web.config приложения SharePoint вручную. Мы создадим SPFeatureReceiver для выполнения задания:
using System.Collections.ObjectModel;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Administration;
namespace Custom.SharePoint.HttpModule.SpSecureVtiBin {
public class ModuleFeatureReceiver : SPFeatureReceiver {
private static string _owner = "SpSecureVtiBinModule";
public override void FeatureActivated( SPFeatureReceiverProperties properties ) {
SPWebApplication app = (SPWebApplication)properties.Feature.Parent;
app.WebConfigModifications.Add( GetModificationForSystemWebServer() );
app.WebService.ApplyWebConfigModifications();
app.Update();
}
public override void FeatureDeactivating( SPFeatureReceiverProperties properties ) {
SPWebApplication app = (SPWebApplication)properties.Feature.Parent;
Collection<SPWebConfigModification> mods = app.WebConfigModifications;
int modCount = mods.Count;
bool modRemoved = false;
for ( int i = modCount - 1; i >= 0; i-- ) {
SPWebConfigModification mod = mods[i];
if ( mod.Owner.Equals( _owner ) || mod.Owner.Equals( "CHK.SharePoint.HttpModule.SpSecureVtiBin.SpSecureVtiBinModule" ) ) {
app.WebConfigModifications.Remove( mod );
modRemoved = true;
}
}
if ( modRemoved ) {
app.WebService.ApplyWebConfigModifications();
app.Update();
}
}
private SPWebConfigModification GetModificationForSystemWebServer() {
return new SPWebConfigModification {
Name = "add[@name='SpSecureVtiBinModule']",
Owner = _owner,
Path = "configuration/system.webServer/modules",
Value = @"<add name=""SpSecureVtiBinModule"" type=""Custom.SharePoint.HttpModule.SpSecureVtiBin.SpSecureVtiBinModule, Custom.SharePoint.HttpModule.SpSecureVtiBin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=[your_public_key_token]"" />",
Sequence = 0
};
}
}
}
Теперь все, что осталось, это упаковать HttpModule. Вам нужно будет определить функцию в пакете и сослаться на класс SPFeatureReceiver. Это приведет к добавлению записи web.config при активации функции и удалению записи при деактивации функции. Укажите функцию для WebApplication
и цель развертывания сборки для GlobalAssemblyCache
.