|
Предусловия:
- Установленный и настроенный 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)»:
- Идентификатор записи IdP —
urn:indeedid:saml_idp
- URL провайдера идентификации —
https://am1.indeed1.local/am/idp/Account/SsoService (вместо am1.indeed1.local — реальное DNS-имя вашего сервера IDP)
- URL адрес IdP, куда SP будет отправлять запросы SLO —
https://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
- Атрибут для привязки email —
UID (то же значение, что и в основном поле 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.
|