Аутентификация с помощью SAML-совместимой федерации удостоверений

Это общая инструкция о настройке аутентификации в облаке через SAML-совместимую федерацию удостоверений. Используйте эту инструкцию, если для вашей федерации удостоверений нет специальной инструкции.

Чтобы настроить аутентификацию:

  1. Создайте федерацию в облаке.
  2. Добавьте сертификаты в федерацию.
  3. Получите ссылку для входа в консоль.
  4. Настройте аутентификацию на своем сервере.
  5. Добавьте пользователей в облако.
  6. Протестируйте аутентификацию.

Перед началом

Для того, чтобы воспользоваться инструкциями в этом разделе, вам понадобятся:

  1. Роль admin или resource-manager.clouds.owner в облаке, для которого вы хотите настроить SAML-аутентификацию.

  2. Действующий сертификат, который используется для подписи SAML-сообщений на сервере поставщика удостоверений (IdP). Если у вас нет действующего SSL-сертификата, получите новый.

    Имя субъекта в сертификате должно содержать FQDN сервера поставщика удостоверений, например fs.contoso.com, чтобы страница аутентификации не могла быть заблокирована браузером.

Создайте федерацию в облаке

Чтобы создать федерацию в IAM:

  1. Откройте страницу каталога в консоли управления.

  2. В меню слева выберите вкладку Федерации.

  3. Нажмите Создать федерацию.

  4. Задайте имя федерации. Имя должно быть уникальным в каталоге.

  5. При необходимости добавьте описание.

  6. В поле Время жизни cookie укажите время, в течении которого браузер не должен требовать у пользователя повторной аутентификации.

  7. В поле IdP Issuer укажите идентификатор IdP-сервера, на котором должна происходить аутентификация. Этот же идентификатор сервер IdP указывает в ответе сервису IAM после того, как пользователь проходит аутентификацию.

  8. В поле Ссылка на страницу для входа в IdP укажите адрес страницы, на которую браузер должен перенаправить пользователя для аутентификации.

  9. Включите опцию Автоматически создавать пользователей, чтобы аутентифицированный пользователь автоматически добавлялся в облако. Эта опция упрощает процесс заведения пользователей, но созданному таким образом пользователю по умолчанию назначается только роль resource-manager.clouds.member: он не сможет выполнять никаких операций с ресурсами в этом облаке. Исключение — те ресурсы, на которые назначены роли системной группе allUsers или allAuthenticatedUsers.

    Если эту опцию не включать, то пользователь, которого не добавили в облако, не сможет войти в консоль управления, даже если пройдет аутентификацию на вашем сервере. В этом случае вы можете управлять белым списком пользователей, которым разрешено пользоваться Яндекс.Облаком.

    Предупреждение

    Ручное добавление федеративных пользователей сейчас не поддерживается.

Укажите сертификаты для федерации

Когда поставщик удостоверений (IdP) сообщает Яндекс.Облаку, что пользователь прошел аутентификацию, он подписывает сообщение своим сертификатом. Чтобы Яндекс.Облако могло проверить этот сертификат, добавьте его в созданную федерацию в IAM.

Совет

Чтобы аутентификация не прерывалась в тот момент, когда у очередного сертификата закончился срок действия, рекомендуется добавлять в федерацию несколько сертификатов — текущий и те, которые будут использоваться после текущего. Если один сертификат окажется недействительным, Яндекс.Облако попробует проверить подпись другим сертификатом.

Чтобы добавить сертификат в федерацию:

  1. Откройте страницу каталога в консоли управления.
  2. В меню слева выберите вкладку Федерации.
  3. Нажмите на имя федерации, которой вы хотите добавить сертификат.
  4. Нажмите на кнопку Добавить сертификат внизу страницы.
  5. Выберите способ добавления сертификата:
    • Чтобы добавить сертификат в виде файла, нажмите Выбрать файл и укажите путь к нему.
    • Чтобы вставить скопированное содержимое сертификата, выберите способ Текст и вставьте содержимое.

Когда вы настроите аутентификацию с помощью федерации, пользователи смогут войти в консоль управления по ссылке, в которой содержится идентификатор федерации. Эту же ссылку необходимо будет указать при настройке сервера аутентификации.

Получите и сохраните эту ссылку:

  1. Получите идентификатор федерации:

    1. Откройте страницу каталога в консоли управления.
    2. В меню слева выберите вкладку Федерации.
    3. Скопируйте идентификатор федерации, для которой вы настраиваете доступ.
  2. Сформируйте ссылку с помощью полученного идентификатора:

    https://console.cloud.yandex.ru/federations/<ID федерации>

Настройте аутентификацию на своем сервере

После того, как вы создали федерацию и получили получили ссылку для входа в консоль управления, настройте сервер поставщика удостоверений. После каждого успешного прохождения аутентификации сервер должен отправлять консоли управления соответствующее SAML-сообщение.

Пример SAML-сообщения:

<samlp:Response ID="_bcdf7b6b-ea42-4191-8d5e-ebd4274acec6" Version="2.0" IssueInstant="2019-07-30T13:24:25.488Z"
 Destination="https://console.cloud.yandex.ru/federations/bfbrotp6l1b2avhe1spu" Consent="urn:oasis:names:tc:SAML:2.0:consent:unspecified"
  InResponseTo="19fb953133b313a86a001f2d387160e47f3e7aa0" xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol">
  <Issuer xmlns="urn:oasis:names:tc:SAML:2.0:assertion">http://example.org/auth</Issuer>
  <samlp:Status>
    <samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success" />
  </samlp:Status>
  <Assertion ID="_90cd8dcc-6105-4300-9ae4-f2c8c5aeb1e5" IssueInstant="2019-07-30T13:24:25.488Z"
   Version="2.0" xmlns="urn:oasis:names:tc:SAML:2.0:assertion">
    <Issuer>http://example.org/auth</Issuer>
    <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
      <ds:SignedInfo>
        <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
        <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" />
        <ds:Reference URI="#_90cd8dcc-6105-4300-9ae4-f2c8c5aeb1e5">
          <ds:Transforms>
            <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
            <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
          </ds:Transforms>
          <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" />
          <ds:DigestValue>phUQR...</ds:DigestValue>
        </ds:Reference>
      </ds:SignedInfo>
      <ds:SignatureValue>VACd7O...</ds:SignatureValue>
      <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
        <ds:X509Data>
          <ds:X509Certificate>MIIC7j...</ds:X509Certificate>
        </ds:X509Data>
      </KeyInfo>
    </ds:Signature>
    <Subject>
      <NameID>user@example.org</NameID>
      <SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
        <SubjectConfirmationData InResponseTo="19fb953133b313a86a001f2d387160e47f3e7aa0" NotOnOrAfter="2019-07-30T13:29:25.488Z" Recipient="https://console.cloud.yandex.ru/federations/bfbrotp6l1b2avhe1spu" />
      </SubjectConfirmation>
    </Subject>
    <Conditions NotBefore="2019-07-30T13:24:25.482Z" NotOnOrAfter="2019-07-30T14:24:25.482Z">
      <AudienceRestriction>
        <Audience>https://console.cloud.yandex.ru/federations/bfbrotp6l1b2avhe1spu</Audience>
      </AudienceRestriction>
    </Conditions>
    <AttributeStatement>
      <Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress">
        <AttributeValue>user@example.org</AttributeValue>
      </Attribute>
      <Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname">
        <AttributeValue>First Name</AttributeValue>
      </Attribute>
      <Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname">
        <AttributeValue>Last Name</AttributeValue>
      </Attribute>
    </AttributeStatement>
  </Assertion>
</samlp:Response>

При формировании сообщения:

  • В элементах Response и SubjectConfirmationData в атрибуте InResponseTo укажите идентификатор из SAML-запроса на аутентификацию, который отправило Яндекс.Облако.

  • Укажите полученную ссылку для входа в консоль в следующих элементах:

    • в Response в атрибуте Destination;
    • в SubjectConfimirationData в атрибуте Recipient;
    • в Audience.
  • Укажите уникальный идентификатор пользователя в элементе NameID. Рекомендуется использовать User Principal Name (UPN) или адрес электронной почты.

  • Укажите ссылку на страницу IdP в элементе Issuer. На эту страницу перенаправлялся пользователь для прохождения аутентификации).

  • Укажите подписанное сообщение в элементе SignatureValue и сертификат, которым оно было подписано в элементе KeyInfo.

  • Учтите, что Яндекс.Облако проверяет, что ответ был получен в промежуток времени, указываемый в атрибутах элемента Conditions или SubjectConfimirationsData.

  • Чтобы пользователь мог обратиться в техподдержку Яндекс.Облака из консоли управления, передайте его адрес электронной почты и имя в элементе AttributeStatement. Почта, имя и фамилия передаются в отдельных элементах Attribute. Вы также можете передать имя и фамилию вместе, например так:

    <Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name">
      <AttributeValue>John Doe</AttributeValue>
    </Attribute>
    

    В атрибуте Name можно указать короткое название атрибута, например:

    <Attribute Name="name">
      <AttributeValue>John Doe</AttributeValue>
    </Attribute>
    

Добавьте пользователей в облако

Предупреждение

Ручное добавление федеративных пользователей сейчас не поддерживается.

Протестируйте аутентификацию

Теперь, когда вы закончили настройку сервера, проверьте аутентификацию:

  1. Откройте браузер в гостевом режиме или режиме инкогнито для чистой симуляции нового пользователя.
  2. Перейдите по ссылке для входа в консоль управления, которую вы получили ранее. Браузер должен перенаправить вас на страницу аутентификации.
  3. Введите ваши аутентификационные данные. По умолчанию необходимо ввести UPN и пароль. Затем нажмите кнопку Sign in.
  4. После успешной аутентификации сервер перенаправит вас обратно по ссылке для входа в консоль, а после этого — на главную страницу консоли управления. В правом верхнем углу вы сможете увидеть, что вошли в консоль от имени федеративного пользователя.

Что дальше