> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> Руководство по настройке аутентификации через LDAP для ClickHouse

# LDAP

export const CloudNotSupportedBadge = () => {
  return <div className="cloudNotSupportedBadge">
            <div className="cloudNotSupportedIcon">
            <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
                <path strokeWidth="1.5" d="M6.33366 12.6666L12.3739 12.6667C13.6593 12.6667 14.7073 11.6187 14.7073 10.3334C14.7073 9.04804 13.6593 8.00003 12.3739 8.00003C12.3739 8.00003 12.3337 7.66659 12.0003 7.33325M10.667 5.33322C8.00033 2.33325 4.45395 4.78537 4.14195 6.68203C2.55728 6.7627 1.29395 8.06203 1.29395 9.6667C1.29395 11.3234 2.66699 12.6666 4.00033 12.6666" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
                <path strokeWidth="1.5" d="M2.66699 14L12.0003 4.66663" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
            </svg>

        </div>
            Не поддерживается в ClickHouse Cloud
        </div>;
};

<CloudNotSupportedBadge />

<Note>
  Эта страница не применима к [ClickHouse Cloud](https://clickhouse.com/cloud). Описанная здесь возможность недоступна в сервисах ClickHouse Cloud.
  Дополнительные сведения см. в руководстве ClickHouse [Cloud Compatibility](/docs/ru/products/cloud/guides/cloud-compatibility).
</Note>

LDAP-сервер можно использовать для аутентификации пользователей ClickHouse. Для этого есть два подхода:

* Использовать LDAP как внешний аутентификатор для существующих пользователей, определённых в `users.xml` или в локальных путях управления доступом.
* Использовать LDAP как внешний каталог пользователей и разрешить аутентификацию пользователей, не определённых локально, если они существуют на LDAP-сервере.

Для обоих подходов в конфигурации ClickHouse должен быть определён LDAP-сервер с внутренним именем, чтобы на него могли ссылаться другие части конфигурации.

<div id="ldap-server-definition">
  ## Определение сервера LDAP
</div>

Чтобы определить сервер LDAP, необходимо добавить в `config.xml` раздел `ldap_servers`.

**Пример**

```xml theme={null}
<clickhouse>
    <!- ... -->
    <ldap_servers>
        <!- Типичный LDAP-сервер. -->
        <my_ldap_server>
            <host>localhost</host>
            <port>636</port>
            <bind_dn>uid={user_name},ou=users,dc=example,dc=com</bind_dn>
            <verification_cooldown>300</verification_cooldown>
            <follow_referrals>false</follow_referrals>
            <enable_tls>yes</enable_tls>
            <tls_minimum_protocol_version>tls1.2</tls_minimum_protocol_version>
            <tls_require_cert>demand</tls_require_cert>
            <tls_cert_file>/path/to/tls_cert_file</tls_cert_file>
            <tls_key_file>/path/to/tls_key_file</tls_key_file>
            <tls_ca_cert_file>/path/to/tls_ca_cert_file</tls_ca_cert_file>
            <tls_ca_cert_dir>/path/to/tls_ca_cert_dir</tls_ca_cert_dir>
            <tls_cipher_suite>ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:AES256-GCM-SHA384</tls_cipher_suite>
        </my_ldap_server>

        <!- Типичный Active Directory с настроенным определением user DN для последующего сопоставления ролей. -->
        <my_ad_server>
            <host>localhost</host>
            <port>389</port>
            <bind_dn>EXAMPLE\{user_name}</bind_dn>
            <user_dn_detection>
                <base_dn>CN=Users,DC=example,DC=com</base_dn>
                <search_filter>(&amp;(objectClass=user)(sAMAccountName={user_name}))</search_filter>
            </user_dn_detection>
            <enable_tls>no</enable_tls>
        </my_ad_server>
    </ldap_servers>
</clickhouse>
```

Обратите внимание: в разделе `ldap_servers` можно задать несколько LDAP-серверов, используя для них разные имена.

**Параметры**

| Параметр                       | По умолчанию  | Описание                                                                                                                                                                                                                                                                                                                                                                                                             |
| ------------------------------ | ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `host`                         | —             | Имя хоста или IP-адрес LDAP-сервера. Этот параметр обязателен и не может быть пустым.                                                                                                                                                                                                                                                                                                                                |
| `port`                         | `636` / `389` | Порт LDAP-сервера. По умолчанию используется `636`, если `enable_tls` установлен в `yes`, иначе — `389`.                                                                                                                                                                                                                                                                                                             |
| `bind_dn`                      | —             | Шаблон, используемый для формирования DN для bind. Итоговый DN формируется заменой всех подстрок `{user_name}` в шаблоне на фактическое имя пользователя при каждой попытке аутентификации.                                                                                                                                                                                                                          |
| `auth_dn_prefix`               | —             | **Устарело.** Альтернатива `bind_dn`. Не может использоваться вместе с `bind_dn`. Если параметр указан, bind DN формируется как `auth_dn_prefix + {user_name} + auth_dn_suffix`. Например, значение `auth_dn_prefix`, равное `uid=`, и `auth_dn_suffix`, равное `,ou=users,dc=example,dc=com`, эквивалентны значению `bind_dn`, равному `uid={user_name},ou=users,dc=example,dc=com`.                                |
| `auth_dn_suffix`               | —             | **Устарело.** См. `auth_dn_prefix`.                                                                                                                                                                                                                                                                                                                                                                                  |
| `verification_cooldown`        | `0`           | Период времени в секундах после успешной попытки bind, в течение которого пользователь будет считаться успешно прошедшим аутентификацию для всех последующих запросов без обращения к LDAP-серверу. Укажите `0`, чтобы отключить кэширование и принудительно обращаться к LDAP-серверу для каждого запроса аутентификации.                                                                                           |
| `follow_referrals`             | `false`       | Флаг, разрешающий клиентской библиотеке LDAP автоматически переходить по referral, возвращаемым сервером. В основном актуально для сред Microsoft Active Directory, где поиск по поддереву на уровне base DN верхнего уровня (например, `DC=example,DC=com`) может возвращать referral/search reference (например, `DC=DomainDnsZones,...`). Устанавливайте `true` только если вам явно нужен межпартиционный поиск. |
| `enable_tls`                   | `yes`         | Флаг, включающий использование защищенного соединения с LDAP-сервером. Укажите `no` для незашифрованного протокола `ldap://` (не рекомендуется), `yes` для LDAP поверх SSL/TLS `ldaps://` (рекомендуется) или `starttls` для устаревшего протокола StartTLS (незашифрованный протокол `ldap://`, повышаемый до TLS).                                                                                                 |
| `tls_minimum_protocol_version` | `tls1.2`      | Минимальная версия протокола SSL/TLS. Допустимые значения: `ssl2`, `ssl3`, `tls1.0`, `tls1.1`, `tls1.2`.                                                                                                                                                                                                                                                                                                             |
| `tls_require_cert`             | `demand`      | Режим проверки сертификата узла для SSL/TLS. Допустимые значения: `never`, `allow`, `try`, `demand`.                                                                                                                                                                                                                                                                                                                 |
| `tls_cert_file`                | —             | Путь к файлу сертификата.                                                                                                                                                                                                                                                                                                                                                                                            |
| `tls_key_file`                 | —             | Путь к файлу ключа сертификата.                                                                                                                                                                                                                                                                                                                                                                                      |
| `tls_ca_cert_file`             | —             | Путь к файлу CA‑сертификата.                                                                                                                                                                                                                                                                                                                                                                                         |
| `tls_ca_cert_dir`              | —             | Путь к каталогу, содержащему CA‑сертификаты.                                                                                                                                                                                                                                                                                                                                                                         |
| `tls_cipher_suite`             | —             | Разрешенный набор шифров (в нотации OpenSSL).                                                                                                                                                                                                                                                                                                                                                                        |
| `search_limit`                 | `256`         | Максимальное количество записей, которое может быть возвращено LDAP-поиском, выполняемым этим определением сервера (для определения user DN и сопоставления ролей).                                                                                                                                                                                                                                                  |

**Подпараметры `user_dn_detection`**

Раздел с параметрами LDAP-поиска для определения фактического user DN привязанного пользователя. В основном используется в search filter для дальнейшего сопоставления ролей, когда сервером является Active Directory. Полученный user DN будет использоваться при замене подстрок `{user_dn}` везде, где это разрешено. По умолчанию user DN совпадает с bind DN, но после выполнения поиска он будет обновлен до фактически определенного значения user DN.

| Параметр        | По умолчанию | Описание                                                                                                                                                                                                                                                                                                                                |
| --------------- | ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `base_dn`       | —            | Шаблон, используемый для формирования base DN для LDAP-поиска. Итоговый DN формируется заменой всех подстрок `{user_name}` и `{bind_dn}` в шаблоне на фактическое имя пользователя и bind DN во время LDAP-поиска.                                                                                                                      |
| `scope`         | `subtree`    | Область LDAP-поиска. Допустимые значения: `base`, `one_level`, `children`, `subtree`.                                                                                                                                                                                                                                                   |
| `search_filter` | —            | Шаблон, используемый для формирования search filter для LDAP-поиска. Итоговый filter формируется заменой всех подстрок `{user_name}`, `{bind_dn}` и `{base_dn}` в шаблоне на фактическое имя пользователя, bind DN и base DN во время LDAP-поиска. Обратите внимание, что специальные символы должны быть корректно экранированы в XML. |

<div id="ldap-external-authenticator">
  ## Внешний аутентификатор LDAP
</div>

Удалённый LDAP-сервер можно использовать для проверки паролей локально определённых пользователей (пользователей, определённых в `users.xml` или в локальных путях управления доступом). Для этого в определении пользователя укажите имя ранее определённого LDAP-сервера вместо `password` или аналогичных секций.

При каждой попытке входа ClickHouse пытается выполнить "bind" с указанным DN, заданным параметром `bind_dn` в [Определении сервера LDAP](#ldap-server-definition), используя предоставленные учётные данные, и, если это удаётся, пользователь считается аутентифицированным. Этот способ часто называют методом "simple bind".

**Пример**

```xml theme={null}
<clickhouse>
    <!- ... -->
    <users>
        <!- ... -->
        <my_user>
            <!- ... -->
            <ldap>
                <server>my_ldap_server</server>
            </ldap>
        </my_user>
    </users>
</clickhouse>
```

Обратите внимание, что пользователь `my_user` ссылается на `my_ldap_server`. Этот LDAP-сервер должен быть настроен в основном файле `config.xml`, как описано выше.

Когда включена [система управления доступом и учётными записями](/docs/ru/concepts/features/security/access-rights#access-control-usage), управляемая через SQL, пользователей, аутентифицируемых LDAP-серверами, также можно создавать с помощью оператора [CREATE USER](/docs/ru/reference/statements/create/user).

```sql title="Query" theme={null}
CREATE USER my_user IDENTIFIED WITH ldap SERVER 'my_ldap_server';
```

<div id="ldap-external-user-directory">
  ## Внешний каталог пользователей LDAP
</div>

Помимо локально определённых пользователей, в качестве источника пользовательских определений можно использовать удалённый LDAP-сервер. Для этого укажите имя ранее определённого LDAP-сервера (см. [Определение сервера LDAP](#ldap-server-definition)) в разделе `ldap` внутри раздела `users_directories` файла `config.xml`.

При каждой попытке входа ClickHouse пытается найти определение пользователя локально и аутентифицировать его обычным образом. Если пользователь не определён, ClickHouse будет считать, что он существует во внешнем каталоге LDAP, и попытается выполнить "bind" с указанным DN на LDAP-сервере, используя предоставленные учётные данные. В случае успеха пользователь будет считаться существующим и аутентифицированным. Пользователю будут назначены роли из списка, указанного в разделе `roles`. Кроме того, можно выполнить LDAP-"search", а результаты преобразовать в имена ролей и назначить эти роли пользователю, если также настроен раздел `role_mapping`. Для всего этого должна быть включена [система управления доступом и учётными записями](/docs/ru/concepts/features/security/access-rights#access-control-usage), управляемая через SQL, а роли должны создаваться с помощью оператора [CREATE ROLE](/docs/ru/reference/statements/create/role).

**Пример**

Добавляется в `config.xml`.

```xml theme={null}
<clickhouse>
    <!- ... -->
    <user_directories>
        <!- Типичный LDAP-сервер. -->
        <ldap>
            <server>my_ldap_server</server>
            <roles>
                <my_local_role1 />
                <my_local_role2 />
            </roles>
            <role_mapping>
                <base_dn>ou=groups,dc=example,dc=com</base_dn>
                <scope>subtree</scope>
                <search_filter>(&amp;(objectClass=groupOfNames)(member={bind_dn}))</search_filter>
                <attribute>cn</attribute>
                <prefix>clickhouse_</prefix>
            </role_mapping>
        </ldap>

        <!- Типичный Active Directory с сопоставлением ролей на основе определённого DN пользователя. -->
        <ldap>
            <server>my_ad_server</server>
            <role_mapping>
                <base_dn>CN=Users,DC=example,DC=com</base_dn>
                <attribute>CN</attribute>
                <scope>subtree</scope>
                <search_filter>(&amp;(objectClass=group)(member={user_dn}))</search_filter>
                <prefix>clickhouse_</prefix>
            </role_mapping>
        </ldap>
    </user_directories>
</clickhouse>
```

Обратите внимание, что `my_ldap_server`, на который есть ссылка в разделе `ldap` внутри раздела `user_directories`, должен быть ранее определённым сервером LDAP, настроенным в `config.xml` (см. [Определение сервера LDAP](#ldap-server-definition)).

**Параметры**

| Параметр | По умолчанию | Описание                                                                                                                                                                                                                                                                            |
| -------- | ------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `server` | —            | Одно из имён LDAP-серверов, определённых выше в разделе конфигурации `ldap_servers`. Этот параметр обязателен и не может быть пустым.                                                                                                                                               |
| `roles`  | —            | Раздел со списком локально определённых ролей, которые будут назначены каждому пользователю, полученному с LDAP-сервера. Если здесь роли не указаны и не назначаются при сопоставлении ролей (см. ниже), пользователь не сможет выполнять какие-либо действия после аутентификации. |

**Подпараметры `role_mapping`**

Раздел с параметрами LDAP-поиска и правилами сопоставления. Когда пользователь проходит аутентификацию, пока соединение всё ещё привязано к LDAP, выполняется LDAP-поиск с использованием `search_filter` и имени вошедшего пользователя. Для каждой записи, найденной в ходе этого поиска, извлекается значение указанного атрибута. Для каждого значения атрибута с указанным префиксом префикс удаляется, а оставшаяся часть значения становится именем локальной роли, определённой в ClickHouse, которую необходимо заранее создать с помощью оператора [CREATE ROLE](/docs/ru/reference/statements/create/role). Внутри одного и того же раздела `ldap` можно определить несколько разделов `role_mapping`. Все они будут применены.

| Параметр        | По умолчанию | Описание                                                                                                                                                                                                                                                                                                                                                          |
| --------------- | ------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `base_dn`       | —            | Template, используемый для формирования base DN для LDAP-поиска. Итоговый DN формируется заменой всех подстрок `{user_name}`, `{bind_dn}` и `{user_dn}` в шаблоне на фактические имя пользователя, bind DN и user DN при каждом LDAP-поиске.                                                                                                                      |
| `scope`         | `subtree`    | Область LDAP-поиска. Допустимые значения: `base`, `one_level`, `children`, `subtree`.                                                                                                                                                                                                                                                                             |
| `search_filter` | —            | Template, используемый для формирования search filter для LDAP-поиска. Итоговый filter формируется заменой всех подстрок `{user_name}`, `{bind_dn}`, `{user_dn}` и `{base_dn}` в шаблоне на фактические имя пользователя, bind DN, user DN и base DN при каждом LDAP-поиске. Обратите внимание, что специальные символы должны быть корректно экранированы в XML. |
| `attribute`     | `cn`         | Имя атрибута, значения которого будут возвращены в результате LDAP-поиска.                                                                                                                                                                                                                                                                                        |
| `prefix`        | пусто        | Префикс, ожидаемый перед каждой строкой в исходном списке строк, возвращённом LDAP-поиском. Префикс будет удалён из исходных строк, а полученные строки будут интерпретироваться как имена локальных ролей.                                                                                                                                                       |
