Каталог (Active Directory)
Синхронизация с Active Directory по LDAPS — требования, фильтр групп, objectGUID, частота синхронизации и закрытие доступа.
Корпоративный вход отвечает на вопрос «кто это». Каталог отвечает на другой: «разрешает ли организация этому человеку доступ прямо сейчас». Calab раз в 5 минут читает Active Directory по LDAPS и закрывает доступ тем, чья учётная запись отключена, удалена или вышла из разрешённых групп.
Как это работает
- Владелец явно связывает участника пространства с объектом AD по его
objectGUID. Такой участник становится управляемым каталогом. - Каждые 5 минут Calab делает полный снимок каталога и обновляет статусы управляемых участников.
- Если последней полной успешной синхронизации больше 1 часа, управляемые участники теряют доступ («Каталог организации не разрешает доступ. Обратитесь к владельцу.»), пока синхронизация не восстановится. Calab закрывает доступ при неизвестном состоянии, а не открывает.
- Участники без связи с каталогом каталогом не затрагиваются.
Каталог работает независимо от SSO-подключения: связь «учётная запись IdP ↔ аккаунт» делает сотрудник при привязке, связь «объект AD ↔ участник» — владелец. Пароли AD в Calab не попадают.
Требования
| Требование | Подробности |
|---|---|
| Протокол | Только ldaps://, порт 636. Обычный LDAP и StartTLS не поддерживаются |
| Сертификат | Проверяются цепочка и имя хоста. Если оператор задал свой CA для хоста — доверяется только ему |
| Разрешение оператора | Хост контроллера домена должен быть в списке оператора (IDENTITY_DIRECTORY_HOSTS) вместе с допустимыми сетями — см. для операторов. Без этого сохранить настройки нельзя |
| Учётная запись | Отдельная служебная учётная запись только для чтения. Анонимный bind не принимается |
| Объём | До 100 000 учётных записей; полный обход должен уложиться в 120 секунд |
Calab сам строит фильтр — (&(objectCategory=person)(objectClass=user)) в пределах Base DN — и читает только objectGUID, userAccountControl и memberOf. Произвольные фильтры не принимаются, ссылки (referrals) на другие разделы не открываются.
Настройка
Настройки пространства → «Настройка SSO» → «Active Directory» → «Настройки каталога». Нужны права владельца и подтверждённый пароль; при обязательном SSO — ещё и свежий SSO.
| Поле | Пример | Значение |
|---|---|---|
| «Включено» | вкл. | Синхронизация включена |
| «LDAPS URL» | ldaps://dc1.corp.example.com:636 | Адрес контроллера домена, только ldaps:// |
| «Bind DN» | CN=Calab,OU=Services,DC=corp,DC=example,DC=com | Полный DN служебной учётной записи |
| «Пароль read-only bind» | — | Хранится зашифрованным; пустое поле сохраняет прежний |
| «Base DN» | DC=corp,DC=example,DC=com | Корень поиска учётных записей |
| «Разрешённые группы (DN по строкам)» | CN=Calab Users,OU=Groups,DC=corp,DC=example,DC=com | До 100 групп, по одному DN в строке |
После «Сохранить» нажмите «Проверить соединение», затем «Синхронизировать сейчас» (вручную — не чаще раза в минуту). В карточке видно время «Последняя успешная синхронизация» и последняя ошибка.
Фильтр групп
- Список пуст — допущены все учётные записи под Base DN, которые не отключены.
- Список задан — допущен тот, кто состоит хотя бы в одной из групп, в том числе через вложенные группы: контроллер домена проверяет членство по цепочке (правило
LDAP_MATCHING_RULE_IN_CHAIN,1.2.840.113556.1.4.1941). - Группы не назначают ролей в Calab: они только фильтруют допуск.
Связь участника с каталогом
Карточка «Допуск участников»: введите «ID участника» (ID пользователя Calab) и «Object GUID» учётной записи AD и нажмите «Сохранить».
objectGUID — неизменяемый идентификатор объекта AD; он не меняется при переименовании и переносе между OU. Calab принимает его в обычном строковом виде GUID — так, как его показывает Windows:
Get-ADUser -Identity jdoe -Properties ObjectGUID | Select-Object -ExpandProperty ObjectGUID
# 3f2504e0-4f89-11d3-9a0c-0305e82c3301Через API — PUT /api/workspaces/{workspace_id}/identity/directory/members/{user_id} с телом {"objectGuid": "3f2504e0-4f89-11d3-9a0c-0305e82c3301"}.
Статусы
| Статус | Значит | Доступ |
|---|---|---|
DIRECTORY_MEMBER_STATUS_ACTIVE | Учётная запись включена и проходит фильтр групп | Есть (при свежем каталоге) |
DIRECTORY_MEMBER_STATUS_DISABLED | Учётная запись отключена в AD (userAccountControl с флагом ACCOUNTDISABLE) вышла из разрешённых групп или пропала из последнего полного снимка | Закрыт |
DIRECTORY_MEMBER_STATUS_DELETED | Учётной записи нет в двух полных успешных снимках подряд — окончательная отметка об удалении | Закрыт |
DIRECTORY_MEMBER_STATUS_UNMAPPED | Участник ещё не связан с объектом каталога | Каталог не влияет |
При закрытии доступа Calab сразу отзывает подтверждения SSO и OAuth-доступы этого участника в пространстве. Если учётную запись снова включили, человек может войти через SSO заново; прежние OAuth-доступы не возвращаются. Ручные баны и роли участника каталог не трогает: повторное включение не снимает бан и не выдаёт ролей.
Защита от массовых потерь
Сбой сети, неполная выдача страниц или истёкшая аренда синхронизации никогда не трактуются как «все уволены» — снимок просто не публикуется.
Если полный снимок оказался пустым или резко меньше прежнего (пропало больше 20 % и не меньше 2 объектов, или столько же связанных активных участников), Calab помещает его в карантин: прежнее состояние сохраняется, а в карточке появляется ошибка «Directory scan returned far fewer accounts than before; the previous state is kept…». Обычно это значит, что служебная учётная запись потеряла права на чтение. Если сокращение настоящее — сохраните настройки каталога ещё раз: первая синхронизация новой конфигурации не проверяется на сокращение.
Отключение каталога
Выключение каталога или удаление связи не снимает автоматически ограничения с уже закрытых участников. Проверьте каждого и нажмите «Отвязать от каталога» — действие записывается в аудит. После этого участник входит заново.