Аутентификация с помощью 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.

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

Если у вас еще нет интерфейса командной строки Яндекс.Облака, установите и инициализируйте его.

По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра --folder-name или --folder-id.

  1. Посмотрите описание команды создания федерации:

    $ yc iam federation create --help
    
  2. Создайте федерацию:

    $ yc iam federation create --name my-federation \
      --auto-create-account-on-login \
      --cookie-max-age 12h \
      --issuer "https://accounts.google.com/o/saml2?idpid=C03xolm0y" \
      --sso-binding POST \
      --sso-url "https://accounts.google.com/o/saml2/idp?idpid=C03xolm0y"
    

    Где:

    • name — имя федерации. Имя должно быть уникальным в каталоге.

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

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

    • cookie-max-age — время, в течении которого браузер не должен требовать у пользователя повторной аутентификации.

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

    • sso-url — URL-адрес страницы, на которую браузер должен перенаправить пользователя для аутентификации.

    • sso-binding — укажите тип привязки для Single Sign-on. Большинство поставщиков поддерживают тип привязки POST.

  1. Получите идентификатор каталога, в котором вы будете создавать федерацию.

  2. Создайте файл с телом запроса, например body.json:

    {
      "folderId": "<ID каталога>",
      "name": "my-federation",
      "autocreateUsers": true,
      "cookieMaxAge":"43200s",
      "issuer": "https://accounts.google.com/o/saml2?idpid=C03xolm0y",
      "ssoUrl": "https://accounts.google.com/o/saml2/idp?idpid=C03xolm0y",
      "ssoBinding": "POST"
    }
    

    Где:

    • folderId — идентификатор каталога.

    • name — имя федерации. Имя должно быть уникальным в каталоге.

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

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

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

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

    • ssoUrl — URL-адрес страницы, на которую браузер должен перенаправить пользователя для аутентификации.

    • ssoBinding — укажите тип привязки для Single Sign-on. Большинство поставщиков поддерживают тип привязки POST.

  3. Создайте федерацию с помощью метода create:

    $ curl -X POST \
      -H "Content-Type: application/json" \
      -H "Authorization: Bearer <IAM-токен>" \
      -d '@body.json' \
      https://iam.api.cloud.yandex.net/iam/v1/saml/federations
    {
     "done": true,
     "metadata": {
      "@type": "type.googleapis.com/yandex.cloud.iam.v1.saml.CreateFederationMetadata",
      "federationId": "ajeobmje4dgj0belagb9"
     },
     ...
    

    В ответе, в свойстве federationId, будет указан идентификатор созданной федерации, сохраните его. Этот идентификатор понадобится на следующих шагах.

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

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

Совет

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

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

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

Если у вас еще нет интерфейса командной строки Яндекс.Облака, установите и инициализируйте его.

По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра --folder-name или --folder-id.

  1. Посмотрите описание команды добавления сертификата:

    $ yc iam certificate create --help
    
  2. Добавьте сертификат для федерации, указав путь к файлу сертификата:

    $ yc iam certificate create --federation-name my-federation \
      --name "my-certificate" \
      --certificate-file test.pem
    

Чтобы добавить сертификат, воспользуйтесь методом create для ресурса Certificate:

  1. Сформируйте тело запроса, указав содержимое сертификата в свойстве data:

    {
      "federationId": "<ID федерации>",
      "name": "my-certificate",
      "data": "MII...=="
    }
    
  2. Отправьте запрос на добавление сертификата:

    $ export IAM_TOKEN=CggaATEVAgA...
    $ curl -X POST \
        -H "Content-Type: application/json" \
        -H "Authorization: Bearer ${IAM_TOKEN}" \
        -d '@body.json' \
        "https://iam.api.cloud.yandex.net/iam/v1/saml/certificates"
    

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

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

  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. Выберите Добавить федеративных пользователей.
  4. Выберите федерацию, из которой необходимо добавить пользователей.
  5. Перечислите Name ID пользователей, разделяя их переносами строк.

Если у вас еще нет интерфейса командной строки Яндекс.Облака, установите и инициализируйте его.

По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра --folder-name или --folder-id.

  1. Посмотрите описание команды добавления пользователей:

    $ yc iam federation add-user-accounts --help
    
  2. Добавьте пользователей, перечислив их Name ID через запятую:

    $ yc iam federation add-user-accounts --name my-federation \
      --name-ids=alice@example.com,bob@example.com,charlie@example.com
    

Чтобы добавить пользователей федерации в облако:

  1. Сформируйте файл с телом запроса, например body.json. В теле запроса укажите массив Name ID пользователей, которых необходимо добавить:

    {
      "nameIds": [
        "alice@example.com",
        "bob@example.com",
        "charlie@example.com"
      ]
    }
    
  2. Отправьте запрос, указав в параметрах идентификатор федерации:

    $ curl -X POST \
      -H "Content-Type: application/json" \
      -H "Authorization: Bearer <IAM-токен>" \
      -d '@body.json' \
      https://iam.api.cloud.yandex.net/iam/v1/saml/federations/<ID федерации>:addUserAccounts
    

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

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

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

Что дальше