Рекомендации по безопасности при использовании WCF
В следующих разделах приводятся рекомендации по созданию надежных приложений с помощью Windows Communication Foundation (WCF). Дополнительные сведения о безопасности см. в разделах Вопросы безопасности, Вопросы безопасности для данных и Вопросы безопасности при использовании метаданных.
Идентифицируйте службы, проходящие проверку подлинности Windows, с помощью различных SPN.
Службы могут идентифицироваться с помощью имен участника-пользователя (UPN) или имен субъекта-службы (SPN). Службы, выполняемые от имени учетных записей компьютера (например, сетевые службы), имеют идентификатор SPN, который совпадает с идентификатором компьютера, на котором они выполняются. Службы, выполняемые от имени учетных записей пользователя, имеют идентификатор UPN, совпадающий с идентификатором пользователя, от имени которого они выполняются, при этом средство setspn
может использоваться для назначения SPN учетной записи пользователя. Настройка службы, делающая возможной идентификацию службы через SPN, и настройка подключающихся к службе клиентов на использование этого SPN, затрудняют определенные атаки. Это правило действует для привязок, использующих согласование Kerberos или SSPI. Несмотря на это, клиенты должны указывать SPN в случае, если SSPI возвращается к NTLM.
Проверяйте удостоверения службы в WSDL
WS-SecurityPolicy позволяет службам публиковать информацию о своих удостоверениях в метаданных. Когда идентификационные данные извлекаются через svcutil
или с помощью других методов, таких как WsdlImporter, эти данные преобразуются в параметры удостоверения для адресов конечных точек служб WCF. Клиенты, которые не подтверждают правильность и допустимость данных удостоверений службы, эффективно выполняют обход проверки подлинности службы. Вредоносная служба может использовать такие клиенты для перенаправления учетных данных и реализации других атак типа "злоумышленник в середине", изменяя заявленное в WSDL удостоверение.
Используйте сертификаты X509 вместо протокола NTLM
WCF предоставляет два механизма проверки подлинности одноранговых элементов: сертификаты X509 (используемые одноранговым каналом) и проверку подлинности Windows, при которой согласование SSPI понижается с протокола Kerberos до протокола NTLM. Проверка подлинности на основании сертификатов с использованием размеров ключа от 1024 битов имеет преимущества по сравнению с проверкой подлинности по протоколу NTLM по следующим причинам:
возможность взаимной проверки подлинности,
использование усиленных алгоритмов шифрования и
затруднение использования перенаправленных учетных данных сертификата X509.
Всегда отменяйте изменения после олицетворения
При использовании интерфейсов API, которые разрешают олицетворение клиента, не забудьте вернуться к исходной идентификации. Например, при работе с WindowsIdentity и WindowsImpersonationContext воспользуйтесь инструкцией C# using
или инструкцией Visual Basic Using
, как показано в следующем примере кода. Класс WindowsImpersonationContext реализует интерфейс IDisposable, следовательно, среда CLR автоматически возвращается к исходной идентификации после того, как код выводится из блока using
.
WindowsIdentity identity = ServiceSecurityContext.Current.WindowsIdentity;
using (identity.Impersonate())
{
// Run code under the caller's identity.
}
Dim identity = ServiceSecurityContext.Current.WindowsIdentity
Using identity.Impersonate()
' Run code under the caller's identity.
End Using
Используйте олицетворение только при необходимости
Метод Impersonate класса WindowsIdentity позволяет осуществлять строгий контроль над использованием олицетворения. В этом заключается отличие от использования свойства ImpersonationOperationBehaviorAttribute, которое позволяет использовать олицетворение в рамках всей операции. По возможности контролируйте область применения олицетворения с помощью более точного метода Impersonate.
Получайте метаданные из надежных источников
Убедитесь в надежности источника метаданных и в том, что метаданные не были злонамеренно искажены. Метаданные, полученные по протоколу HTTP, передаются открытым текстом и могут быть подделаны. Если в службе используются свойства HttpsGetEnabled и HttpsGetUrl, для загрузки данных по протоколу HTTPS используйте URL-адрес, предоставленный разработчиком службы.
Публикуйте метаданные с использованием безопасности
Для предотвращения злонамеренного искажения метаданных, опубликованных службой, обеспечьте защиту конечной точки обмена метаданными с помощью безопасности на уровне транспорта или сообщений. Дополнительные сведения см. в разделе Публикация конечных точек метаданных и Практическое руководство. Публикация метаданных для службы с использованием кода.
Разрешите использование локального издателя
Если для данной привязки указаны адрес издателя и привязка, локальный издатель не применяется в конечных точках, использующих эту привязку. Клиенты, которые предполагают всегда использовать локальный издатель, должны убедиться, что они не используют такую привязку или что привязка изменена таким образом, что адрес издателя пуст.
Квоты на размер маркеров SAML
Когда маркеры Security Assertion Markup Language (SAML) сериализуются в сообщениях, то, независимо от того, выдаются ли они службой маркеров безопасности (STS) или предоставляются клиентами для служб как часть проверки подлинности, квота на максимальный размер сообщения должна быть достаточно большой, чтобы вместить маркер SAML и другие части сообщения. Как правило, по умолчанию квоты на размер сообщения являются достаточными. Впрочем, если большой размер токена SAML объясняется содержанием в нем сотни утверждений, может потребоваться увеличение квот для выделения места сериализованному токену. Дополнительные сведения о квотах см. в разделе Вопросы безопасности для данных.
Задайте параметру SecurityBindingElement.IncludeTimestamp значение True в пользовательских привязках
При создании пользовательской привязки следует задать параметру IncludeTimestamp значение true
. В противном случае, если параметр IncludeTimestamp имеет значение false
, а клиент использует асимметричный маркер на основе ключа, например, сертификат Х509, сообщение не будет подписано.