Двухфакторная авторизация в веб с Indeed IDP

CGP поддерживает настройку второго фактора для входа через веб-интерфейс или CommuniGate Desktop клиент. Решение позволяет добавлять какие-либо аунтентификаторы, вроде Google Authenticator, Indeed Key и т.д.

Но что, если нам необходимо интегрировать решение с корпоративным сервером Indeed AM, ключи которого управляются централизованно?

Реализовать это можно через связку: плагин OpenID Connect login (на стороне CGP) + модуль Indeed IDP (на стороне Indeed AM, соответственно). Реализацию данной связки я и опишу по этапам.

В этом варианте настройки авторизация будет происходить так:

1. Indeed IDP запрашивает пароль пользователя (AD)
2. Indeed IDP запрашивает подтверждение Indeed Key
3. Происходит редирект в пользовательский веб-интерфейс CGP.

Устанавливаем и настраиваем плагин OpenID Connect login

1. Качаем плагин “OpenID” со страницы CGP: https://communigatepro.ru/plugins#autorization

2. Через веб-интерфейс администратора CGP устанавливаем плагин (в разделе Users → Plugins) и пока оставляем в состоянии disabled.

3. У нас ещё нет настроенного модуля Indeed IDP, но мы уже можем прописать настройки заранее. Сделаем это.

Authorization Endpoint

https://indeedam.domain.ru/am/idp/connect/authorize

Token Verification Endpoint

https://indeedam.domain.ru/am/idp/connect/token

Client ID

Произвольный, к примеру:

communigate

Client Secret

Придумываем какой-либо секретный код, который потребуется указать затем в конфиге Indeed IDP.

Support domain aliases

Полезной настройкой также будет: Support domain aliases, если мы захотим логиниться в Indeed с помощью учётной записи, логин которой не принадлежит основным доменам CGP, а принадлежит только алиасам. Пример такого случая: мы логинился в IDP через пользователя AD, используя primary email, но в CGP нет такого основного домена (только алиас). В этом случае, если не отметить опцию Support domain aliases - получим в CGP ошибку, вроде unknown local domain после авторизации.

4. Повторяем пункты 1-3 для каждого сервера CGP, если у нас их несколько.

Пример настроенного плагина.

Устанавливаем и настраиваем модуль Indeed IDP

1. На серверах Indeed AM запускаем установку модуля из дистртибутива:

Indeed AM 8.2.12\Indeed AM IDP\8.2.10\IndeedAM.IDP-v8.2.10-en-us-x64.msi

:!: Если у нас есть работающий сервер Indeed AM с установленным сертификатом, отказываемся в конце установки от предложения сгенерировать новый серверный сертификат для IDP.

2. После установки модуля IDP необходимо выдать права пулу IIS для чтения закрытого ключа сертификата, под которым работают SSL-привязки сайта Indeed AM.

Открываем оснастку управления сертификатами, находим нужный сертификат, далее открываем управление закрытыми ключами и добавляем учётку пула вручную указывая следующую учетную запись (мы не обнаружим её в списках учётных записей):

IIS AppPool\IndeedAM.IDP

Корректная настройка прав на закрытый ключ выглядит примерно так:

3. Теперь идем в оснастку управления IIS → Default Web Site → AM → IDP и настраиваем корректные методы проверки подлинности для сайта IDP.

В нем должна быть включена анонимная проверка подлинности и отключены остальные.

Пример корректной настройки:

4. Время переходить к настройкам модуля IDP. Они находятся в следующем файле:

C:\inetpub\wwwroot\am\idp\app-settings.json

Указываем ссылку на Indeed AM Core, секция:

  "AuthenticationServer": {
    "Url": "https://indeedam.domain.ru/am/core/",
    "IsIgnoreCertErrors": false
  },

Если мы хотим последовательно входить по Windows Password + Indeed Key, вычищаем всё лишнее и оставляем ТОЛЬКО такие провайдеры в одном методе (если сделать в разных - при попытке войти будет предоставлен ВЫБОР - какой провайдер использовать, т.е. лишь один фактор). Вся секция AuthenticationMethods с нужными ID провайдеров:

    "AuthenticationMethods": [
	  {
    "Name": "IndeedKey",
    "Providers": [
	  "CF189AF5-01C5-469D-A859-A8F2F41ED153",
          "DEEF0CB8-AD2F-4B89-964A-B6C7ECA80C68"
    ]
		}
    ],

Указываем URL Indeed Log Server, вся секция:

 "LogServer": {
    "AppId": "ea",
    "Component": "server",
    "EventCache": {
      "Directory": "./EventCache",
      "SendingIntervalSec": 600
    },
    "Server": {
      "Url": "https://indeedam.domain.ru/ls/api/",
      "Certificate": {
        "Thumbprint": "",
        "FilePath": "",
        "FilePassword": ""
      }
    },
    "DetailsSettings": {
      "CatalogObjectField": "Name",
      "ComputerField": "Ip"
    }
   },

Правим URL и отпечаток сертификата на нужные в секции SAML:

 "SAML": {
    "$schema": "https://www.componentspace.com/schemas/saml-config-schema-v1.0.json",
    "Configurations": [
      {
        "LocalIdentityProviderConfiguration": {
          "Name": "urn:indeedid:saml_idp",
          "SingleSignOnServiceUrl": "https://indeedam.domain.ru/am/idp/Account/SsoService",
          "LocalCertificates": [
            {
              "Thumbprint": "e057b052c98d11f12216e7fda990adca09b387db"
            }
          ]
        },

В секции OIDC меняем отпечаток сертификата на нужный:

 "OIDC": {
    "IDP": {
      "CertificateThumbprint": "e057b052c98d11f12216e7fda990adca09b387db"
    },

Добавляем НОВОГО клиента в секцию Clients. ClientId должен соответствовать ID клиента, который мы указали выше в настройках плагина CGP. ClientSecret мы тоже указывали в настройках плагина.

RedirectUris и PostLogoutRedirectUris были выяснены опытным путём, их тоже нужно указать. Вся секция нового клиента выглядит так:

	  {
		"ClientId": "communigate",
		"ClientSecret": "Secret!!1",
		"DisplayName": "CommuniGate Pro",
		"Permissions": [
			"ept:authorization",
			"ept:device",
			"ept:introspection",
			"ept:logout",
			"ept:revocation",
			"ept:token",

			"gt:authorization_code",
			"gt:client_credentials",
			"gt:urn:ietf:params:oauth:grant-type:device_code",
			"gt:implicit",
			"gt:password",
			"gt:refresh_token",
			
			"rst:code",
			"rst:code id_token",
			"rst:code id_token token",
			"rst:code token",
			"rst:id_token",
			"rst:id_token token",
			"rst:none",
			"rst:token",
			
			"scp:address",
			"scp:email",
			"scp:phone",
			"scp:profile",
			"scp:roles",
			"scp:openid"

			
		],
		"RedirectUris": [
			"https://cgp.domain.ru/sys/login-sso-oidc-verify.wcgp"
		],
		"PostLogoutRedirectUris": [
			"https://cgp.domain.ru/"
		]
	  } 

:!: После установки настроек перезапустим IIS (Служба веб-публикаций).

Настройки консоли Indeed AM

Теперь проверим - какие у нас настройки в консоли управления Indeed. Логинимся в неё:

https://indeedam.domain.ru/am/mc/

Сначала убедимся в том, что у нас включены Indeed Key и Windows Password в глобальных настройках (пункт меню Конфигурация), а также любые другие настройки, которым могут быть нам интересны.

Теперь в разделе политики создадим новую политику для модуля IDP.

:!: Чтобы приложение IDP вообще появилось и работало - нам необходимы установленные лицензии на модуль Identity Provider.

Также добавим в Область действия модуля IDP пользователей или группы, которые будем использовать при логине.

В свойствах поставщика учётных данных IDP внутри политики включим нужные нам провайдеры.

Проверка авторизации в CGP

Теперь включаем плагин OpenID Connect login на каждом сервере CGP.

Далее заходим в веб-интерфейс CGP и нажимаем Вход через OpenID Connect.

Если всё настроено корректно Indeed последовательно запросит UserName (логин Windows, либо email пользователя), пароль и push-подтверждение Indeed Key, а затем откроет веб-интерфейс пользователя CGP.

:!: Email домен и пользователь, который мы используем при входе через Indeed IDP должен быть известен CGP, т.е. должен существовать основной домен, либо алиас домена + пользователь в этом домене.