Насколько безопасна проверка подлинности WCF wsHttpBinding для Windows? - PullRequest
2 голосов
/ 25 мая 2010

Я создал WCF и использовал wsHttpBinding и MTOM в качестве транспорта сообщений с аутентификацией как «Windows».

Теперь мой сервис не является текущим SECURE, это обычный HTTP, работающий на настраиваемом порту.

Безопасна ли проверка подлинности Windows wsHttpBinding для WCF? Кто-нибудь может увидеть пароль или угадать через трассировку сети?

Информация об окружающей среде:

  1. Размещено в Интернете
  2. Нет Active Directory, отдельный сервер
  3. Подключение из моего офиса с именем пользователя и паролем администратора сервера
  4. На стороне клиента пароль не упоминается в конфигурационном файле, он вводится во время выполнения. Он работает правильно, потому что ввод неправильных учетных данных также приводит к некоторому исключению безопасности.
  5. Начиная с .NET 4.0, на настраиваемом порту 89, в настоящее время я установил следующую конфигурацию в app.config моей настраиваемой службы Windows. Я размещаю свой WCF внутри настраиваемой службы Windows, установленной как локальная служба. Я включил олицетворение для каждого метода.

Вот app.config

  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="metaAndErrors">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
          <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
          <serviceAuthorization impersonateCallerForAllOperations="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service name="CustomServiceHost.CustomService"
               behaviorConfiguration="metaAndErrors"
               >
            <endpoint address="" binding="wsHttpBinding"
                  bindingConfiguration="wsHttpLargeBinding"
                  contract="CustomServiceHost.ICustomService"/>
        <endpoint address="mex" binding="mexHttpBinding"
                  contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:89/CustomService" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <bindings>
      <wsHttpBinding>
        <binding
          name="wsHttpLargeBinding" messageEncoding="Mtom"
          maxReceivedMessageSize="2147483647">
          <readerQuotas maxArrayLength="512000"/>
        </binding>
      </wsHttpBinding>
    </bindings>
  </system.serviceModel>

Ниже приведена конфигурация клиента во время выполнения,

        WSHttpBinding binding = new WSHttpBinding();

        binding.Security.Message.ClientCredentialType 
            = MessageCredentialType.Windows;
        binding.Security.Mode = SecurityMode.Message;

        binding.MessageEncoding = WSMessageEncoding.Mtom;

        binding.ReaderQuotas.MaxArrayLength = 512000;

        CustomServiceClient cc = new CustomServiceClient(
            binding,
            new EndpointAddress(string.Format(
                "http://{0}:89/CustomService", 
                host.ServerHost))
            );

        cc.ClientCredentials.Windows.AllowedImpersonationLevel 
            = System.Security.Principal.TokenImpersonationLevel.Impersonation; 
        cc.ClientCredentials.Windows.ClientCredential 
            = new NetworkCredential(host.Username, host.Password);

Спасибо, - Акаш

Ответы [ 2 ]

5 голосов
/ 16 июня 2010

Относительно вашего вопроса о паролях: для аутентификации Windows используется Kerberos или NTLM, и ни один из протоколов не передает пароли в виде открытого текста.

Эта информация написана здесь: http://msdn.microsoft.com/en-us/library/ff647076.aspx

Вы должны использовать встроенную проверку подлинности Windows вместо базовой проверки подлинности, поскольку это позволяет избежать передачи учетных данных пользователя по сети.

Это означает, что вам не нужен SSL для защиты ваших паролей, но если у вас есть другая информация, которая является конфиденциальной (в ваших служебных вызовах), вам следует подумать об использовании шифрования (например, SSL). Я не пробовал это, но это должно помочь вам начать:

http://www.codeproject.com/KB/WCF/WCFSSL.aspx

Другим вариантом будет шифрование сообщений (защита сообщений вместо безопасности транспорта). Вот еще одна ссылка, с которой стоит начать:

http://msdn.microsoft.com/en-us/library/ms733137.aspx

3 голосов
/ 14 июня 2010

Прежде всего я не смог найти под <binding> дочерний элемент

<security mode="Message">
    <message clientCredentialType="Windows" />
</security>

Вы должны вставить его в web.config (или App.config). Он будет соответствовать используемому в настоящее время режиму защиты сообщений на стороне клиента.

Более того, немного странно, что вы не размещаете службу WCF на сервере IIS. Использование настраиваемой службы Windows, установленной в качестве локальной службы, на самом деле не лучший выбор для успешного решения. Это ваша окончательная конфигурация или вы планируете разместить ее в конце под IIS? Если это открытый вопрос, я мог бы опубликовать вам несколько ссылок, где описаны преимущества и недостатки различных способов хостинга. Существуют ли некоторые важные требования, чтобы служба WCF работала под учетной записью LocalSystem? Не могли бы вы вкратце описать, что делает сервис WCF? У меня есть проблема, чтобы дать вам рекомендацию сделать слишком много ограничений на стороне сервера, что может сделать основную работу WCF невозможной. С другой стороны, чтобы иметь минимальные привилегии prinzip, чтобы получить более безопасное решение.

Это еще не окончательный ответ, только первые замечания.

ОБНОВЛЕНО : Привет! Теперь у меня есть время закончить мой ответ. Прежде всего я хочу подтвердить, что, как и Стефан Эгли (см. Другой ответ), я уверен, что пароли не будут отправлены в виде открытого текста. Я только не уверен, как именно работает аутентификация Windows, если у вас нет Active Directory. Вероятно, это работает как аутентификация NTLM с учетными записями локального сервера. Небольшая проблема заключается только в том, что если вы используете этот NTLM, вы не можете быть уверены на стороне клиента, что вы действительно работаете со своим сервером WCF. В таких случаях очень полезно использование сертификата.

Одним из способов, который предложил также Стефан Эгли в своем ответе, является SSL. Он не только выполняет шифрование данных, но и аутентифицирует сервер с помощью SSL-сертификата. Если вы выберете способ перехода в режим сообщений на TransportWithMessageCredential.

Если клиентский компьютер, с которого вы выполняли удаленное администрирование, не является бесплатным неуправляемым клиентом и вы можете установить на него некоторые компоненты, я настоятельно рекомендую вам использовать аутентификацию на основе сертификатов и шифрование данных (см. http://www.codeproject.com/KB/WCF/9StepsWCF.aspx) и установите соответствующие сертификаты как на стороне сервера, так и на стороне клиента. Этот способ является наиболее безопасным, и после внедрения вы получите аутентификацию и шифрование как клиента, так и сервера.

В разделе http://www.codeproject.com/KB/WCF/9StepsWCF.aspx вы найдете пошаговую информацию о том, как создавать и использовать сертификаты клиента и сервера в WCF. Хочу только отметить, что утилиту MakeCert.exe из Windows SDK можно использовать не только для создания самозаверяющих сертификатов, но и для создания небольшой PKI. Вот пример:

С

MakeCert.exe -pe -ss MY -a sha1 -cy authority -len 4096 -e 12/31/2020 -r 
             -n "CN=My Company Root Authority,O=My Company,C=DE" MyCompany.cer

вы создаете «самоподписанный» -Сертификат «root» и сохраняете его, если в хранилище сертификатов MY (персональный) сертификатов (альтернатива переключателю -sv, вы можете сохранить закрытый ключ в файле PVK). Вы также экспортируете его в MyCompany.cer (но без закрытого ключа), чтобы упростить его установку на клиентских и серверных компьютерах в Trust Root. Затем вы можете создать два других сертификата: один для сервера и другой для аутентификации клиента, используя корневой сертификат для подписи этих двух сертификатов. Вы можете делать абсолютно то же самое, что и в случае наличия сервера сертификатов (службы сертификатов), например http://www.codeproject.com/KB/WCF/wcf_certificates.aspx

См. Например http://blogs.microsoft.co.il/blogs/applisec/archive/2008/04/08/creating-x-509-certificates-using-makecert-exe.aspx для дополнительных примеров.

Другие ссылки важны http://msdn.microsoft.com/en-us/library/cc949011.aspx, "Статьи с инструкциями" от http://msdn.microsoft.com/en-us/library/ff648902.aspx и http://msdn.microsoft.com/en-us/library/ff650794.aspx может быть полезным для вас. Статья http://msdn.microsoft.com/en-us/library/ms789011.aspx, как сделать некоторые вещи в коде клиента (как вы делаете сейчас).

...