INTEGRITY Документация

Универсальное приложение SAML

На этой странице приведены общие инструкции по настройке SaaS-приложения в Cloudflare Access с использованием протокола аутентификации SAML.

Предварительные требования

1. Получите URL-адреса приложения SaaS

Получите следующие URL-адреса из учетной записи приложения SaaS:

2. Добавьте своё приложение в Access

  1. В Панель управления Cloudflare, перейдите в Zero Trust > Контроль доступа > Приложения.

  2. Выберите Создать новое приложение.

  3. Выберите Приложение SaaS.

  4. Выберите свой Приложение из раскрывающегося меню. Если вашего приложения нет в списке, введите произвольное имя в Приложение поле и выберите текстовое поле, которое появится ниже.

  5. Выберите SAML.

  6. Выберите Добавить приложение.

  7. Введите Entity ID и Assertion Consumer Service URL полученный из аккаунта вашего SaaS-приложения.

  8. Выберите Name ID Format ожидается вашим SaaS-приложением (обычно Электронная почта).

  9. (Необязательно) Настройте любые дополнительные утверждения атрибутов SAML требуется вашим SaaS-приложением.

  10. Скопируйте конечная точка SSO, Entity ID или Issuer Access, а также Открытый ключ.

  1. В разделе Политики доступа, добавьте существующую политику или создать новую политику чтобы управлять тем, кто может подключаться к вашему приложению. Все приложения Access по умолчанию запрещают доступ: пользователь должен соответствовать политике Allow, прежде чем получить доступ.

  2. Настройте, как пользователи будут проходить аутентификацию:

    1. Выберите поставщики идентификации которые вы хотите включить для своего приложения.

    2. (Рекомендуется) Если вы планируете разрешить доступ только через один IdP, включите Применить мгновенную аутентификацию. Конечные пользователи не увидят Страница входа Cloudflare Access. Вместо этого Cloudflare будет перенаправлять пользователей напрямую на событие входа SSO.

    3. (Необязательно) Включите Аутентификация с помощью Cloudflare One Client чтобы разрешить пользователям аутентифицироваться в приложении с использованием Идентификатор сессии Cloudflare One Client.
  3. (Необязательно) Перейдите в Дополнительные настройки чтобы настроить работу с приложением:

    • Настройка App Launcher: Настройте, как это приложение отображается пользователям в App Launcher.
    • Пользовательские страницы блокировки: Выберите, что увидят пользователи при отказе в доступе к приложению.

      • Cloudflare по умолчанию: Перезагрузите страница входа и отображает сообщение о блокировке под логотипом Cloudflare Access. Сообщение по умолчанию: That account does not have access, или вы можете ввести собственное сообщение.
      • Redirect URL: Перенаправление на указанный веб-сайт.
      • Пользовательский шаблон страницы: Отобразите пользовательская страница блокировки размещенный в Cloudflare One.
  4. Выберите Создание.

3. Настройте SSO в своём SaaS-приложении

Далее настройте своё SaaS-приложение так, чтобы вход пользователей выполнялся через Cloudflare Access. Обратитесь к документации своего SaaS-приложения за инструкциями по настройке стороннего поставщика SSO по протоколу SAML. Вам потребуются следующие значения из Cloudflare One:

Вы можете либо ввести эти данные в приложение SaaS вручную, либо загрузить файл метаданных XML. Метаданные доступны по следующему URL-адресу: <SSO endpoint>/saml-metadata.

Проверить ответ SAML

Когда Cloudflare выступает в роли поставщика удостоверений SAML, он подписывает SAML Response и SAML Assertion алгоритмом SHA-256. SaaS-приложение может проверить эту подпись с помощью Открытый ключ который вы загружаете в приложение SaaS.

4. Протестируйте интеграцию

Откройте окно браузера в режиме инкогнито и перейдите по URL-адресу входа в SaaS-приложение. Вы будете перенаправлены на экран входа Cloudflare Access, где вам будет предложено войти через своего провайдера идентификации.

атрибуты SAML

атрибуты SAML обозначают характеристики идентичности пользователя, которыми Cloudflare Access делится с вашим SAML SaaS приложением после успешной аутентификации. По умолчанию Cloudflare Access передает приложению SaaS следующие атрибуты (если они доступны):

В Access for SaaS можно добавлять дополнительные атрибуты SAML или настраивать SAML statement, отправляемый в SaaS-приложение. Это позволяет интегрировать SaaS-приложения с особыми требованиями к атрибутам SAML.

утверждения атрибутов SAML

Чтобы отправлять дополнительные атрибуты SAML в ваше SaaS-приложение, настройте следующие поля для каждого атрибута:

Преобразования атрибутов JSONata

В Расширенные настройки > Преобразование, вы можете ввести JSONata скрипт, который изменяет копию User Registry identity. Это полезно для задания значений по умолчанию, исключения адресов электронной почты или проверки соответствия имён пользователей произвольным критериям. Access отправит изменённую идентификационную информацию пользователя в приложение SaaS в виде атрибутов SAML.

Это соответствует saml_attribute_transform_jsonata поле в API приложений Access.

Например, следующий скрипт JSONata объединяет имена групп в список и добавляет eduPersonPrincipalName поле, которое сопоставляется с электронной почтой пользователя.

$merge([$, {"groups": groups.name, 'eduPersonPrincipalName': email}])

Ниже приведен пример идентификации пользователя до применения преобразования JSONata:

{
  "account_id": "699d98642c564d2e855e9661899b7252",
  "amr": [
    "pwd"
  ],
  "auth_status": "NONE",
  "common_name": "",
  "device_id": "c1744f8b-faa1-48a4-9e5c-02ac921467fa",
  "device_sessions": {
    "49e653db-991e-11ee-af26-2243bf8c3428": {
      "last_authenticated": 1703004275
    }
  },
  "devicePosture": {
    "8534a230-e85e-4183-8964-a4b7dcf72986": {
      "rule_name": "Warp",
      "success": true,
      "type": "warp"
    }
  },
  "email": "[email protected]",
  "gateway_account_id": "bTSquyUGwLQjYJn8cI8S1h6M6wU",
  "geo": {
    "country": "US"
  },
  "groups": [
    {
      "id": "12fdf91a-fb23-41b3-995a-de2f72c61d0e",
      "name": "IdentityProtection-RiskyUser-RiskLevel-low"
    },
    {
      "id": "12348f47-8234-4860-a03f-c2a1513f267b",
      "name": "Global Administrator"
    },
    {
      "id": "11235980-87d7-4917-b0aa-74c01914c40e",
      "name": "Application Administrator"
    }
  ],
  "iat": 1659474397,
  "id": "OidHvkPt-I-13IBSnd77UJ8cHgsrUpjs3W6_4t6ES7M",
  "idp": {
    "id": "b08e8c0c-a75d-4b3f-8e7b-cd427b7c7b47",
    "type": "azureAD"
  }
}

Результат после применения примера скрипта JSONata:

{
  "account_id": "699d98642c564d2e855e9661899b7252",
  "amr": [
    "pwd"
  ],
  "auth_status": "NONE",
  "common_name": "",
  "device_id": "c1744f8b-faa1-48a4-9e5c-02ac921467fa",
  "device_sessions": {
    "49e653db-991e-11ee-af26-2243bf8c3428": {
      "last_authenticated": 1703004275
    }
  },
  "devicePosture": {
    "8534a230-e85e-4183-8964-a4b7dcf72986": {
      "rule_name": "Warp",
      "success": true,
      "type": "warp"
    }
  },
  "email": "[email protected]",
  "gateway_account_id": "bTSquyUGwLQjYJn8cI8S1h6M6wU",
  "geo": {
    "country": "US"
  },
  "groups": [
    "IdentityProtection-RiskyUser-RiskLevel-low",
    "Global Administrator",
    "Application Administrator"
  ],
  "iat": 1659474397,
  "id": "OidHvkPt-I-13IBSnd77UJ8cHgsrUpjs3W6_4t6ES7M",
  "idp": {
    "id": "b08e8c0c-a75d-4b3f-8e7b-cd427b7c7b47",
    "type": "azureAD"
  },
  "eduPersonPrincipalName": "[email protected]"
}

Дополнительные примеры использования преобразований JSONata приведены ниже.

Удалить атрибут groups

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

Выражение JSONata
$ ~> |$|{}, ['groups']|

Результат после применения преобразования JSONata:

{
  "account_id": "699d98642c564d2e855e9661899b7252",
  "amr": [
    "pwd"
  ],
  "auth_status": "NONE",
  "common_name": "",
  "device_id": "c1744f8b-faa1-48a4-9e5c-02ac921467fa",
  "device_sessions": {
    "49e653db-991e-11ee-af26-2243bf8c3428": {
      "last_authenticated": 1703004275
    }
  },
  "devicePosture": {
    "8534a230-e85e-4183-8964-a4b7dcf72986": {
      "rule_name": "Warp",
      "success": true,
      "type": "warp"
    }
  },
  "email": "[email protected]",
  "gateway_account_id": "bTSquyUGwLQjYJn8cI8S1h6M6wU",
  "geo": {
    "country": "US"
  },
  "iat": 1659474397,
  "id": "OidHvkPt-I-13IBSnd77UJ8cHgsrUpjs3W6_4t6ES7M",
  "idp": {
    "id": "b08e8c0c-a75d-4b3f-8e7b-cd427b7c7b47",
    "type": "azureAD"
  }
}

Переименуйте поле groups и удалите ID группы

Следующий скрипт JSONata изменяет groups.name поле из name к group_name и удаляет groups.id поле:

Выражение JSONata
{
  "account_id": account_id,
  "amr": amr,
  "auth_status": auth_status,
  "common_name": common_name,
  "devicePosture": devicePosture,
  "device_id": device_id,
  "device_sessions": device_sessions,
  "email": email,
  "gateway_account_id": gateway_account_id,
  "geo": geo,
	"groups": $map($.groups, function($group) {
    {"group_name": $group.name}}),
  "iat": iat,
  "id": id,
  "idp": idp
}

Результат после применения преобразования JSONata:

{
  "account_id": "699d98642c564d2e855e9661899b7252",
  "amr": [
    "pwd"
  ],
  "auth_status": "NONE",
  "common_name": "",
  "devicePosture": {
    "8534a230-e85e-4183-8964-a4b7dcf72986": {
      "rule_name": "Warp",
      "success": true,
      "type": "warp"
    }
  },
  "device_id": "c1744f8b-faa1-48a4-9e5c-02ac921467fa",
  "device_sessions": {
    "49e653db-991e-11ee-af26-2210bf8c3428": {
      "last_authenticated": 1703004275
    }
  },
  "email": "[email protected]",
  "gateway_account_id": "bTSquyUGwLQjYJn8cI8S1h6M6wU",
  "geo": {
    "country": "US"
  },
  "groups": [
    {
      "group_name": "IdentityProtection-RiskyUser-RiskLevel-low"
    },
    {
      "group_name": "Global Administrator"
    },
    {
      "group_name": "Application Administrator"
    }
  ],
  "iat": 1659474397,
  "id": "OidHvkPt-I-13IBSnd77UJ8cHgsrUpjs3W6_4t6ES7M",
  "idp": {
    "id": "b08e8c0c-a75d-4b3f-8e7b-cd427b7c7b47",
    "type": "azureAD"
  }
}

Фильтруйте группы по имени

Следующий скрипт JSONata оставляет только те группы, которые соответствуют регулярному выражению.

Выражение JSONata
$merge([$, { "groups": $filter(groups, function($v) { $contains($v.name, /Administrator/) }) }])

Результат после применения преобразования JSONata:

{
  "account_id": "699d98642c564d2e855e9661899b7252",
  "amr": [
    "pwd"
  ],
  "auth_status": "NONE",
  "common_name": "",
  "device_id": "c1744f8b-faa1-48a4-9e5c-02ac921467fa",
  "device_sessions": {
    "49e653db-991e-11ee-af26-2243bf8c3428": {
      "last_authenticated": 1703004275
    }
  },
  "devicePosture": {
    "8534a230-e85e-4183-8964-a4b7dcf72986": {
      "rule_name": "Warp",
      "success": true,
      "type": "warp"
    }
  },
  "email": "[email protected]",
  "gateway_account_id": "bTSquyUGwLQjYJn8cI8S1h6M6wU",
  "geo": {
    "country": "US"
  },
  "groups": [
    {
      "id": "12348f47-8234-4860-a03f-c2a1513f267b",
      "name": "Global Administrator"
    },
    {
      "id": "11235980-87d7-4917-b0aa-74c01914c40e",
      "name": "Application Administrator"
    }
  ],
  "iat": 1659474397,
  "id": "OidHvkPt-I-13IBSnd77UJ8cHgsrUpjs3W6_4t6ES7M",
  "idp": {
    "id": "b08e8c0c-a75d-4b3f-8e7b-cd427b7c7b47",
    "type": "azureAD"
  }
}

Преобразование NameID

По умолчанию Access отправляет адрес электронной почты пользователя в качестве SAML NameID. Некоторым приложениям SaaS требуется другое значение, например ID сотрудника, измененный адрес электронной почты или имя пользователя из устаревшей системы.

Вы можете настроить NameID задав name_id_transform_jsonata поле у приложения SaaS через API приложений Access. Это поле принимает JSONata выражение, которое вычисляется на основе личности пользователя и должно возвращать одно строковое значение. Результат заменяет значение по умолчанию NameID в утверждении SAML.

Например, чтобы изменить email пользователя, добавив в него +sandbox суффикс (полезно при подключении нескольких экземпляров одного и того же SaaS-приложения):

Настройте преобразование NameID через API
curl --request PUT \
https://api.cloudflare.com/client/v4/accounts/{account_id}/access/apps/{app_id} \
--header "Authorization: Bearer {api_token}" \
--header "Content-Type: application/json" \
--data '{
  "saas_app": {
    "auth_type": "saml",
    "name_id_transform_jsonata": "$substringBefore(email, '\''@'\'') & '\''+sandbox@'\'' & $substringAfter(email, '\''@'\'')"
  }
}'

Если у пользователя указан адрес электронной почты [email protected], это выражение формирует NameID [email protected].

Использовать ID сотрудника в качестве NameID

Чтобы отправить атрибут, отличный от email, например ID сотрудника, укажите имя атрибута непосредственно в выражении JSONata. Этот атрибут должен присутствовать в данных пользователя, полученных от IdP.

Задайте employee_id в качестве NameID
curl --request PUT \
https://api.cloudflare.com/client/v4/accounts/{account_id}/access/apps/{app_id} \
--header "Authorization: Bearer {api_token}" \
--header "Content-Type: application/json" \
--data '{
  "saas_app": {
    "auth_type": "saml",
    "name_id_transform_jsonata": "employee_id"
  }
}'

Если личность пользователя содержит "employee_id": "efgh5678", NameID отправленное в SAML-утверждении, будет efgh5678.

Удалить преобразование NameID

Чтобы вернуться к поведению по умолчанию (отправка email-адреса пользователя в качестве NameID), установите для поля значение пустой строки:

Удалить преобразование NameID
curl --request PUT \
https://api.cloudflare.com/client/v4/accounts/{account_id}/access/apps/{app_id} \
--header "Authorization: Bearer {api_token}" \
--header "Content-Type: application/json" \
--data '{
  "saas_app": {
    "auth_type": "saml",
    "name_id_transform_jsonata": ""
  }
}'