Майк Лехманн

Обеспечение безопасности Web-сервисов
(Securing Web Services)

Источник: журнал Oracle Magazine, no.1, 2005, http://www.oracle.com/technology/oramag/oracle/05-jan/o15web.html

Обеспечение безопасности: от транспортных протоколов к сообщениям

Когда я выступаю с презентациями по Web-сервисам, аудитория обязательно задает вопросы об обеспечении безопасности. Наиболее типичный вопрос таков: "Как вы обеспечиваете безопасность Web-сервисов?", за которым часто следует скептическое замечание: “Безопасность Web-сервисов нельзя обеспечить".

Но, вспомните, большинство Web-сервисов в настоящее время основано на тех же самых основных технологиях, на которых основана сама Паутина (Web), а именно HTTP. Как результат, все те технологии, которые обеспечивают безопасность Web-приложений—базисная аутентификация (basic authentication) и SSL, они наиболее часто применимы, — в той же мере работают и c Web-сервисами. Эти технологии были чрезвычайно эффективны на протяжении ряда лет при использованиями со всевозможными онлайновыми бизнес-транзакциями, и они точно также работают и с Web-сервисами.

Однако, главная проблема, с которой сталкиваются организации при попытке разработать подход обеспечения безопасности в среде Web, заключается в том, что такие типовые решения, как SSL, не совсем походят, так как они обеспечивают безопасность на уровне транспортного протокола, а не на уровне SOAP-сообщения, пересылаемого по этому протоколу. Более того, во многих интеграционных проектах, которые базируются на использовании сообщений, необходимы несколько промежуточных этапов, прежде чем сообщения прибудут в пункт назначения (target end point), и при обеспечении безопасности только на уровне транспортного протокола они остаются незащищенными в каждом промежуточном пункте назначения.

Чтобы получить более детальный контроль над безопасностью и избежать проблем с ней на промежуточных этапах, организации, применяющие интеграцию на основе использования SOAP-сообщений, как правило, предпочитают обеспечение безопасности на уровне сообщений, а не на уровне транспортного протокола. А это означает, обеспечение безопасности собственно сообщений независимо от транспортного уровня. Несколько вопросов становятся очевидными при таком подходе. Во-первых, функциональность SSL, стандартно предоставляемая большинству Web-сервисов, заменяется тем, что я называю обеспечение безопасности сообщения (message security), необходимым для любых клиента и сервера, чтобы взаимодействовать с безопасным сообщением. Во-вторых, информация, связанная с обеспечением безопасности, передается в самом сообщении. В-третьих, если промежуточный или конечный пункты назначения (intermediary or end point) не обладает корректной инфраструктурой безопасности и не вызывает доверия, сообщение останется защищенным, безопасным и нечитаемым, и может быть передано дальше к следующему пункту назначению.

Обеспечение безопасности Web-сервисов: WS-Security

Так как же обеспечить безопасность именно на уровне сообщения, а не транспорта? Ответ заключается в использовании WS-Security, стандарта комитета OASIS, опубликованного как общепризнанная отраслью рекомендация в апреле 2004. WS-Security определяет механизм добавления трех уровней обеспечения безопасностей SOAP-сообщений.

Токены аутентификации (Authentication Tokens): токены аутентификации WS-Security позволяют клиентам послать стандартизованным образом ‘имя пользователя’ (username) и ‘пароль’ (password) или сертификаты X.509 с целью аутентификации внутри заголовков (headers) SOAP-сообщений. Хотя токены SAML и Kerberos достаточно широко используются, профиль WS-Security для этих токенов еще не выпущен.

Шифрование XML (XML Encryption): В WS-Security используется стандарт XML Encryption консорциума W3C, что обеспечивает шифрование тела (или его частей) SOAP-сообщения для гарантии его конфиденциальности. Как правило, поддерживаются различные алгоритмы шифрования — в Oracle Application Server 10g Release 10.1.3 поддерживаются алгоритмы 3DES, AES-128 и AES-256.

Цифровые подписи в XML-документах (XML Digital Signatures): Использование стандарта XML Digital Signature консорциума W3C в WS-Security позволяет снабжать SOAP-сообщения цифровыми подписями для гарантии целостности сообщения. Как правило, эта подпись вычисляется на основе содержания самого сообщения: если сообщение изменено по дороге, цифровая подпись становится неверной. Oracle Application Server поддерживает алгоритмы DSA-SHA1, HMAC-SHA1, RSA-SHA1 и RSA-MD5.

Конфигурирование Web-сервисов на стороне сервера

Когда разработчики рассматривают три компонента WS-Security, естественно, они задают вопрос: как программным образом реализовать аутентификацию, шифрование и цифровые подписи в приложениях?

Способ, который предлагают большинство поставщиков, например, Oracle, для реализации WS-Security - это декларативный механизм, который применяется как к новым, так и к уже существующим Web-сервисам. В продукте Oracle JDeveloper 10g Release 10.1.3, например, вы просто щелкаете (right-click) на кнопку (node) ) Web service, выбираете Secure Web Service, и далее идете, ведомые простым визардом. Рисунок 1 – это снимок экрана, представляющий как этот базовый набор средств для WS-Security выглядит в Oracle JDeveloper.

Рисунок 1: Обеспечение безопасности Web-сервиса в Oracle JDeveloper 10g Release 10.1.3

Чтобы показать простой пример WS-Security в действии, я воспользуюсь атрибутами аутентификации (authentication properties), представленными на Рисунке 1 — имя пользователя (username), токен аутентификации пароля (password authentication token) и более ничего — и применю их к Web-сервису HRService с методом getEmpSalary.

После того, как я щелкну по кнопке OK в визарде обеспечения безопасности, сгенерируется файл специфичных для Oracle дескрипторов oracle-webservices.xml на Листинге 1 (показанный с определениями namespace, убранными для минимизации занятого места). Отметим, что возможности WS-Security времени выполнения (runtime) обеспечиваются элементом <runtime> и требованием к серверу аутентифицировать по имени пользователя (username) и паролю (password), определенных в элементе <verify-username-token>.

  Листинг 1: Конфигурация на сервере для WS-Security в oracle-webservices.xml.

<oracle-webservices>
  <webservice-description name="HRService">
    <port-component name="HRServicePort">
      <runtime enabled="security">
        <security>
          <inbound>
            <verify-username-token password-type="Plain Text"
                                   require-nonce="false"
                                   require-created="false"/>
          </inbound>
        </security>
      </runtime>
      <operations>
        <operation name="getEmpSalary"
                   input="{http://server.omag.com}getEmpSalaryElement"/>
      </operations>
    </port-component>
  </webservice-description>
</oracle-webservices>

Как только эта конфигурация развернута в типовом для Web-сервисах файле ear (normal Web service ear file), это файл конфигурации wsmgmt .xml для управления на функционирующем (runtime side) Oracle Application Server, модифицируется этой информацией. Я проиллюстрировал этот процесс с помощью диаграммы в своей последней статье об управлении Web-сервисами. После развертывания Web-сервис готов для тестирования токеном WS-Security с именем пользователя и паролем (WS-Security username password token).

Конфигурирование Web-сервисов на стороне клиента

Следующий шаг заключается в том, как определить, каким образом этот токен WS-Security с именем пользователя и паролем, “вставить” в SOAP-сообщения со стороны клиента Web- сервиса. Как правило, в наборе инструментов для Web-сервисов для этого предлагается либо API, либо декларативный механизм.

Обеспечение безопасности Web-сервисов на уровне безопасности сообщений

Из-за использования декларативного механизма реализации WS-Security, поддерживаемой в Oracle Application Server, важно уяснить, что как на стороне сервера, где расположен файл конфигурации, определяющий характеристики WS-Security, так и на стороне клиента необходимо “зеркало”, копия этой информации, чтобы во время выполнения на стороне клиента Web-сервисов можно было определить соответствующие установки обеспечения безопасности для их применения к выходящим (outbound requests) и входящим (inbound response) сообщениям.

Для того, чтобы сконфигурировать эту информацию, Oracle JDeveloper предоставляет копию (mirror image) визарда, показанного на Рисунке 1 для Web-сервиса на стороне клиента. Основное отличие между двумя этими визардами заключается в том, что клиентский визард обеспечивает возможность поставки имени пользователя и пароля, а серверный визард - нет. На Листинге 2 представлена сгенерированная на стороне клиента конфигурация. С другой стороны, так как многие разработчики ленятся вводить такую информацию в конфигурационные файлы (хотя это полезно для тестирования), в Oracle Application Server предлагается простой API на стороне клиента, чтобы программно устанавливать токены имени пользователя и пароля на клиентской стороне Web-сервисов.

Когда я выполнял сгенерированный файл на стороне клиента, было сгенерировано представленное на Листинге 3 сообщение, содержащее — помимо запроса зарплаты служащего — и токен с именем пользователя и паролем, внесенным в его заголовок и ссылки WS-Security на поддерживающие стандартные схемы со стандартными префиксом wsse пространства имен WS-Security.

Вывод

Следующие шаги

Прочитайте предыдущие статьи М. Лехманна

Скачайте

  • Oracle Application Server 10g Release 10.1.3 Developer Preview
  • Oracle JDeveloper 10g Release 10.1.3

    Узнайте больше о Web-сервисах

  • Так же как и со многими другими стандартами WS-*, с WS-Security часто возникают опасения о взаимодействии (interoperability) в разнородной среде. В моем примере я выбрал простейший сценарий, но в реальной жизни с более сложными токенами аутентификации, шифрованием и цифровыми подписями эта проблема быстро становится очень сложной.

    Наша отрасль хорошо представляет эту проблему и нейтральные (относительно поставщиков) форумы, такие как Web Services Interoperability Organization (WS-I) уже начали работать над этим с участием основных поставщиков, включая Oracle, чтобы гарантировать взаимодействие, совместную работу реализаций WS-Security от Oracle, IBM, Microsoft, Sun и BEA.

    Что из этого появится? Профайл или набор рекомендованных лучших практик о том, как использовать WS-Security, называемый Basic Security Profile. Он будет дополняться другим ключевым профайлом, опубликованным комитетом WS-I, который называется Basic Profile 1.1 и фокусируется на лучших практиках с SOAP, UDDI и WSDL.

    В следующей статье я рассмотрю сертификаты X.509, цифровые подписи и шифрование с WS-Security.

    Майк Лехманн (mike.lehmann@oracle.com) -- главный менеджер по продуктам в подразделении по Oracle Application Server Containers for J2EE.

     Листинг 2: Конфигурация клиента для WS-Security

    <port-info>
    <runtime>
      <security>
        <outbound>
          <username-token name="scott" password="tiger" password-type="Plain Text" add-nonce="false" add-created="false"/>
        </outbound>
      </security>
    </runtime>
    <operations>
    <operation name='getEmpSalary'>
    </operation>
    </operations>
    </port-info>
    

     Листинг 3: SOAP-сообщение от сервиса HRService с токеном, содержащим имя пользователя

    <env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns0="http://server.omag.com">
       <env:Header>
          <wsse:Security xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" env:mustUnderstand="1">
             <wsse:UsernameToken xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" wsu:Id="5sRcKP03F1qLikSW1CVmTg22" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
                <wsse:Username>scott</wsse:Username>
                <wsse:Password>tiger</wsse:Password>
             </wsse:UsernameToken>
          </wsse:Security>
       </env:Header>
       <env:Body>
          <ns0:getEmpSalaryElement>
             <String_1>7902</String_1>
          </ns0:getEmpSalaryElement>
       </env:Body>
    </env:Envelope>
    
    E-mail this page