Indeed AM IDP + Nextcloud (SAML)
Автор Dmitry Bukreev, Last modified by Dmitry Bukreev на 27 августа 2026 04:59 PM

Предусловия:

  • Установленный и настроенный Indeed AM (9.4 и выше)
  • Установленный и настроенный Nextcloud

В примерах используется нестандартный порт 8444 — актуально для случаев, когда порт 443 на сервере Nextcloud уже занят другим сервисом. Если у вас Nextcloud работает на стандартном порту 443, во всех адресах ниже порт указывать не нужно.

Настройка Nextcloud

1. Установка приложения

Приложения → найти и установить SSO & SAML authentication.

2. Разрешить несколько back-end аутентификации

Настройки → Аутентификация SSO и SAML → включить «Разрешить использование нескольких пользовательских back-end (например, LDAP)». Обязательно — иначе при ошибке в настройке SAML можно потерять доступ к Nextcloud целиком.

3. Добавление провайдера аутентификации

Там же — «Добавить нового поставщика удостоверений»:

  • Атрибут для привязки UID — имя SAML-атрибута, по которому Nextcloud матчит/создаёт пользователя (например UID). Значение произвольное, но должно совпадать с именем атрибута, которое реально отправляет IDP.
  • Дополнительное отображаемое имя — название кнопки на странице входа (например IndeedAMSAML).

4. Сертификат и ключ SP

В разделе «Данные поставщика услуг (SP)» указываются X.509-сертификат и закрытый ключ, которыми Nextcloud подписывает свои SAML-запросы. Можно использовать тот же сертификат, что выписан внутренним УЦ для https-подключения самого Nextcloud — отдельный самоподписанный сертификат специально под SAML не обязателен.

Формат ID имени можно оставить «Не указано».

5. Параметры Indeed AM IDP

В разделе «Данные провайдера идентификации (IdP)»:

  • Идентификатор записи IdPurn:indeedid:saml_idp
  • URL провайдера идентификацииhttps://am1.indeed1.local/am/idp/Account/SsoService (вместо am1.indeed1.local — реальное DNS-имя вашего сервера IDP)
  • URL адрес IdP, куда SP будет отправлять запросы SLOhttps://nextcloud.indeed1.local:8444 (здесь указываете URL вашего Nextcloud)
  • Открытый сертификат X.509 IdP — открытый сертификат IDP в PEM-формате целиком (не отпечаток). Получить можно на сервере AM:
cd /opt/am/ssl/saml_certs
openssl pkcs12 -in idp.pfx -clcerts -nokeys -out idp-public.crt -nodes
cat idp-public.crt
rm idp-public.crt

При запросе пароля к .pfx — он указан в idp/app-settings.json, в разделе SAML.Configurations[0].LocalIdentityProviderConfiguration.LocalCertificates[0].Password.

Скопировать весь вывод, включая строки BEGIN CERTIFICATE/END CERTIFICATE, в поле формы.

6. Привязка атрибутов

  • Атрибут для привязки отображаемого имениName
  • Атрибут для привязки emailUID (то же значение, что и в основном поле UID из п. 3; отдельный атрибут именно для email не заводится, см. примечание ниже)

7. Настройки безопасности

  • Блок «Предложены подписи и шифрование» — включить все пункты.

  • Блок «Требуется подпись и шифрование»:
    • Response/LogoutRequest/LogoutResponse подписаны — включить
    • Assertion подписан — оставить выключенным (см. примечание ниже)
    • Шифрование Assertion — включить
    • NameID текущий / NameID зашифрован — оставить выключенными
    • SP проверяет все XML — включить

8. Метаданные

После сохранения настроек на странице провайдера появляется кнопка «Скачать метаданные XML» — можно сразу скачать файл, не открывая URL вручную.

Либо открыть URL метаданных SP напрямую:

https://nextcloud.indeed1.local:8444/apps/user_saml/saml/metadata

Оттуда понадобятся точные адреса ACS и SLS (обычно /apps/user_saml/saml/acs и /apps/user_saml/saml/sls) и Entity ID (адрес самой страницы метаданных) — для настройки IDP далее.

Настройка Indeed Identity Provider

1. Белый список SP

В файле .env в корне инсталляции AM добавить домен Nextcloud в свободную по номеру переменную:

CUSTOM_SP_2=nextcloud.indeed1.local:8444

2. Сертификат SP

Сертификаты для SAML на стороне AM хранятся на хосте по пути /opt/am/ssl/saml_certs/. Туда же копируется сертификат SP Nextcloud (тот же файл, что использовался в п. 4 настройки Nextcloud):

cp <путь_к_сертификату_nextcloud>.crt /opt/am/ssl/saml_certs/nextcloud-saml.crt

cd /opt/am
grep -E 'AM_UID|AM_GID' .env
chown <AM_UID>:<AM_GID> ssl/saml_certs/nextcloud-saml.crt

Внутри контейнера idp эта директория смонтирована по пути /opt/access-manager/idp/certificates/ — именно этот путь указывается в app-settings.json.

3. app-settings.json

В idp/app-settings.json, в раздел Authentication.LoginFormats:

{
  "ServiceProvider": "https://nextcloud.indeed1.local:8444/apps/user_saml/saml/metadata",
  "InLoginFormat": "Name",
  "OutLoginFormat": "PrincipalName"
}

В раздел Authentication.CustomAttributes:

{
  "ServiceProvider": "https://nextcloud.indeed1.local:8444/apps/user_saml/saml/metadata",
  "Attributes": [
    { "Name": "UID", "UserNameFormat": "PrincipalName" },
    { "Name": "Name", "UserNameFormat": "Name" }
  ]
}

В раздел SAML.Configurations[0].PartnerServiceProviderConfigurations:

{
  "Name": "https://nextcloud.indeed1.local:8444/apps/user_saml/saml/metadata",
  "Description": "Nextcloud",
  "WantAuthnRequestSigned": true,
  "SignSamlResponse": true,
  "SignAssertion": false,
  "EncryptAssertion": true,
  "AssertionConsumerServiceUrl": "https://nextcloud.indeed1.local:8444/apps/user_saml/saml/acs",
  "SingleLogoutServiceUrl": "https://nextcloud.indeed1.local:8444/apps/user_saml/saml/sls",
  "ValidAssertionConsumerServiceUrls": [
    "https://nextcloud.indeed1.local:8444/apps/user_saml/saml/acs"
  ],
  "PartnerCertificates": [
    { "FileName": "/opt/access-manager/idp/certificates/nextcloud-saml.crt" }
  ]
}

Проверка синтаксиса JSON:

cat idp/app-settings.json | python3 -m json.tool > /dev/null && echo "JSON OK" || echo "JSON BROKEN"

4. Применение изменений

cd /opt/am
docker compose down -v
docker compose up -d

5. Приложение в Management Console

Для регистрации Nextcloud в качестве приложения выполните следующие шаги в Консоли Администратора:

  • Войдите в Консоль Администратора Indeed AM (https://<server_fqdn>/am/mc)
  • Перейдите в раздел ПриложенияСоздать приложение, введите название приложения и нажмите Создать

  • Перейдите на вкладку с приложением Nextcloud - IDP и пропишите в Entity ID: https://nextcloud.indeed1.local:8444/apps/user_saml/saml/metadata

  • Перейдите в Политики → выберите нужную политику → ПриложенияДобавить приложение → выберите созданное приложение → Добавить

Проверка

При нажатии на кнопку с названием провайдера на странице входа Nextcloud происходит перенаправление на Indeed AM IDP. После успешной аутентификации пользователь возвращается в Nextcloud и входит под учётной записью, сопоставленной по атрибуту UID.

Логика сопоставления пользователя: Nextcloud ищет/создаёт пользователя по значению атрибута, указанного в поле «Атрибут для привязки UID» на стороне SP.

Примечание про подпись Assertion

В связке Indeed AM IDP (реализация на .NET) и Nextcloud (user_saml, движок php-saml) обнаружена несовместимость при одновременном включении подписи и шифрования <saml:Assertion> (SignAssertion: true + EncryptAssertion: true) — проверка внутренней подписи Assertion на стороне Nextcloud нестабильно завершается ошибкой Signature validation failed, несмотря на корректный сертификат и валидный XML.

Рабочее решение — оставить SignAssertion: false при включённом EncryptAssertion: true. Целостность ответа при этом обеспечивается подписью всего конверта <samlp:Response> (SignSamlResponse: true), которая ставится уже после шифрования Assertion и не подвержена этой проблеме. Такая схема сохраняет шифрование содержимого ответа и подтверждение подлинности источника, лишь без дополнительной подписи на уровне Assertion.

Примечание про атрибут email

Основной обязательный атрибут — UID (поле «Атрибут для привязки UID» в разделе «Основные»): без него аутентификация завершится ошибкой NoUserFoundException — Nextcloud не сможет определить, какому пользователю соответствует ответ. Значение UID не обязано выглядеть как email — подойдёт любое непустое уникальное значение. В этой инструкции в качестве UID используется UPN (UserNameFormat: "PrincipalName"), потому что это поле у пользователя домена заполнено всегда.

Атрибуты в разделе «Привязка атрибутов» («Атрибут для привязки отображаемого имени» и «Атрибут для привязки email») необязательны — влияют только на заполнение соответствующих полей в профиле пользователя Nextcloud и никак не участвуют в поиске/создании учётной записи. Их можно оставить пустыми, вход при этом продолжит работать, просто поля имени и email в профиле останутся незаполненными.

Если хочется, чтобы поле email в профиле было заполнено реальным корпоративным адресом, а не UPN — можно завести на стороне IDP отдельный атрибут с UserNameFormat: "Email" (берёт значение из поля mail в AD) и указать его в поле «Атрибут для привязки email» в форме Nextcloud.

(0 голос(а))
Эта статья полезна
Эта статья бесполезна