Настройка аутентификации LDAP

Интеграция LDAP в Grafana позволяет вашим пользователям Grafana входить с использованием своих учётных данных LDAP. Вы также можете задать сопоставления между членством в группах LDAP и ролями пользователей в организациях Grafana.

Обратитесь к разделу Управление доступом на основе ролей, чтобы понять, как можно контролировать доступ с помощью разрешений на основе ролей.

Поддерживаемые серверы LDAP

Под капотом Grafana использует стороннюю библиотеку LDAP, которая поддерживает базовую функциональность LDAP v3. Это означает, что вы должны иметь возможность настроить интеграцию LDAP, используя любой совместимый сервер LDAPv3, например OpenLDAP или Active Directory среди других.

Включение LDAP

Чтобы использовать интеграцию LDAP, вам сначала нужно включить LDAP в основном файле конфигурации, а также указать путь к специфичному для LDAP файлу конфигурации (по умолчанию: /etc/grafana/ldap.toml).

После включения LDAP поведением по умолчанию является автоматическое создание пользователей Grafana при успешной аутентификации LDAP. Если вы предпочитаете, чтобы только существующие пользователи Grafana могли входить в систему, вы можете изменить allow_sign_up на false в разделе [auth.ldap].

ini
[auth.ldap]
# Set to `true` to enable LDAP integration (default: `false`)
enabled = true

# Path to the LDAP specific configuration file (default: `/etc/grafana/ldap.toml`)
config_file = /etc/grafana/ldap.toml

# Allow sign-up should be `true` (default) to allow Grafana to create users on successful LDAP authentication.
# If set to `false` only already existing Grafana users will be able to login.
allow_sign_up = true

Отключение синхронизации ролей организации

Если вы используете LDAP для аутентификации пользователей, но не используете сопоставление ролей и предпочитаете назначать организации и роли вручную, вы можете использовать параметр конфигурации skip_org_role_sync.

ini
[auth.ldap]
# Set to `true` to enable LDAP integration (default: `false`)
enabled = true

# Path to the LDAP specific configuration file (default: `/etc/grafana/ldap.toml`)
config_file = /etc/grafana/ldap.toml

# Allow sign-up should be `true` (default) to allow Grafana to create users on successful LDAP authentication.
# If set to `false` only already existing Grafana users will be able to login.
allow_sign_up = true

# Prevent synchronizing ldap users organization roles
skip_org_role_sync = true

Конфигурация LDAP в Grafana

В зависимости от того, какой сервер LDAP вы используете и как он настроен, ваша конфигурация LDAP в Grafana может различаться. Дополнительную информацию см. в разделе примеры конфигурации.

Пример специфичного для LDAP файла конфигурации (ldap.toml):

Bash
[[servers]]
# Ldap server host (specify multiple hosts space separated)
host = "ldap.my_secure_remote_server.org"
# Default port is 389 or 636 if use_ssl = true
port = 636
# Set to true if LDAP server should use an encrypted TLS connection (either with STARTTLS or LDAPS)
use_ssl = true
# If set to true, use LDAP with STARTTLS instead of LDAPS
start_tls = false
# The value of an accepted TLS cipher. By default, this value is empty. Example value: ["TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384"])
# For a complete list of supported ciphers and TLS versions, refer to: https://go.dev/src/crypto/tls/cipher_suites.go
# Starting with Grafana v11.0 only ciphers with ECDHE support are accepted for TLS 1.2 connections.
tls_ciphers = []
# This is the minimum TLS version allowed. By default, this value is empty. Accepted values are: TLS1.1 (only for Grafana v10.4 or earlier), TLS1.2, TLS1.3.
min_tls_version = ""
# set to true if you want to skip SSL cert validation
ssl_skip_verify = false
# set to the path to your root CA certificate or leave unset to use system defaults
# root_ca_cert = "/path/to/certificate.crt"
# Authentication against LDAP servers requiring client certificates
# client_cert = "/path/to/client.crt"
# client_key = "/path/to/client.key"

# Search user bind dn
bind_dn = "cn=admin,dc=grafana,dc=org"
# Search user bind password
# If the password contains # or ; you have to wrap it with triple quotes. Ex """#password;"""
bind_password = "grafana"
# We recommend using variable expansion for the bind_password, for more info https://grafana.com/docs/grafana/latest/setup-grafana/configure-grafana/#variable-expansion
# bind_password = '$__env{LDAP_BIND_PASSWORD}'

# Timeout in seconds. Applies to each host specified in the 'host' entry (space separated).
timeout = 10

# User search filter, for example "(cn=%s)" or "(sAMAccountName=%s)" or "(uid=%s)"
# Allow login from email or username, example "(|(sAMAccountName=%s)(userPrincipalName=%s))"
search_filter = "(cn=%s)"

# An array of base dns to search through
search_base_dns = ["dc=grafana,dc=org"]

# group_search_filter = "(&(objectClass=posixGroup)(memberUid=%s))"
# group_search_filter_user_attribute = "distinguishedName"
# group_search_base_dns = ["ou=groups,dc=grafana,dc=org"]

# Specify names of the LDAP attributes your LDAP uses
[servers.attributes]
member_of = "memberOf"
email =  "email"

Note

Всякий раз, когда вы изменяете файл ldap.toml, вы должны перезапустить Grafana, чтобы изменение(я) вступило в силу.

Использование пользовательского интерфейса Grafana

Вы можете настроить LDAP через пользовательский интерфейс Grafana, перейдя в Administration > Authentication > LDAP. Дополнительную информацию см. в документации Пользовательский интерфейс LDAP.

Использование переменных среды

Вы можете интерполировать переменные в конфигурации TOML из переменных среды. Например, вы можете вынести свой bind_password таким образом:

Bash
bind_password = "${LDAP_ADMIN_PASSWORD}"

Bind и bind password

По умолчанию конфигурация ожидает, что вы укажете bind DN и bind password. Это должен быть пользователь только для чтения, который может выполнять поиск в LDAP. Когда DN пользователя найден, выполняется второй bind с именем пользователя и паролем, предоставленными пользователем (в обычной форме входа Grafana).

Bash
bind_dn = "cn=admin,dc=grafana,dc=org"
bind_password = "grafana"

Пример единственной привязки

Если вы можете предоставить одно выражение bind, которое соответствует всем возможным пользователям, вы можете пропустить второй bind и привязываться напрямую к DN пользователя. Это позволяет вам не указывать bind_password в файле конфигурации.

Bash
bind_dn = "cn=%s,o=users,dc=grafana,dc=org"

В этом случае вы пропускаете указание bind_password и вместо этого предоставляете значение bind_dn с %s где-либо. Оно будет заменено на имя пользователя, введённое на странице входа Grafana. Настройки фильтра поиска и баз поиска всё ещё нужны для выполнения поиска в LDAP для получения другой информации LDAP (например, групп LDAP и email).

Схема POSIX

Если ваш сервер LDAP не поддерживает атрибут memberOf, добавьте следующие параметры:

Bash
## Group search filter, to retrieve the groups of which the user is a member (only set if memberOf attribute is not available)
group_search_filter = "(&(objectClass=posixGroup)(memberUid=%s))"
## An array of the base DNs to search through for groups. Typically uses ou=groups
group_search_base_dns = ["ou=groups,dc=grafana,dc=org"]
## the %s in the search filter will be replaced with the attribute defined below
group_search_filter_user_attribute = "uid"

Сопоставления групп

В [[servers.group_mappings]] вы можете сопоставить группу LDAP с организацией и ролью Grafana. Они будут синхронизироваться при каждом входе пользователя в систему, при этом LDAP является авторитетным источником.

Первое сопоставление группы, которому соответствует пользователь LDAP, будет использоваться для синхронизации. Если у вас есть пользователи LDAP, которые подходят под несколько сопоставлений, будет использовано самое верхнее сопоставление в конфигурации TOML.

Пример специфичного для LDAP файла конфигурации (ldap.toml):

Bash
[[servers]]
# other settings omitted for clarity

[[servers.group_mappings]]
group_dn = "cn=superadmins,dc=grafana,dc=org"
org_role = "Admin"
grafana_admin = true

[[servers.group_mappings]]
group_dn = "cn=admins,dc=grafana,dc=org"
org_role = "Admin"

[[servers.group_mappings]]
group_dn = "cn=users,dc=grafana,dc=org"
org_role = "Editor"

[[servers.group_mappings]]
group_dn = "*"
org_role = "Viewer"
Параметр Обязательно Описание По умолчанию
group_dn Да LDAP distinguished name (DN) группы LDAP. Если вы хотите сопоставить все (или ни одной группы LDAP), то можно использовать подстановочный знак ("*")
org_role Да Назначить пользователям group_dn роль организации Admin, Editor или Viewer. Имя роли организации учитывает регистр.
org_id Нет ID базы данных организации Grafana. Установка этого позволяет назначить несколько group_dn на одну и ту же org_role при условии, что org_id отличается 1 (default org id)
grafana_admin Нет Когда true, делает пользователя group_dn администратором сервера Grafana. Администратор сервера Grafana имеет административный доступ ко всем организациям и пользователям. false

Note

Закомментирование сопоставления группы требует также закомментирования заголовка этой группы, иначе валидация завершится неудачей как для пустого сопоставления.

Пример:

Bash
[[servers]]
# other settings omitted for clarity

[[servers.group_mappings]]
group_dn = "cn=superadmins,dc=grafana,dc=org"
org_role = "Admin"
grafana_admin = true

# [[servers.group_mappings]]
# group_dn = "cn=admins,dc=grafana,dc=org"
# org_role = "Admin"

[[servers.group_mappings]]
group_dn = "cn=users,dc=grafana,dc=org"
org_role = "Editor"

Вложенное/рекурсивное членство в группах

Пользователи с вложенным/рекурсивным членством в группах должны иметь сервер LDAP, который поддерживает LDAP_MATCHING_RULE_IN_CHAIN, и настроить group_search_filter таким образом, чтобы он возвращал группы, членом которых является указанное имя пользователя.

Чтобы настроить group_search_filter:

  • Вы можете установить group_search_base_dns, чтобы указать, где определены соответствующие группы.
  • Если вы не используете group_search_base_dns, то используется ранее определённый search_base_dns.

Пример Active Directory:

Группы Active Directory хранят Distinguished Names (DN) участников, поэтому ваш фильтр должен знать DN пользователя, основываясь только на указанном имени пользователя. Несколько шаблонов DN ищутся путём объединения фильтров с помощью оператора OR в LDAP. Два примера:

Bash
group_search_filter = "(member:1.2.840.113556.1.4.1941:=%s)"
group_search_base_dns = ["DC=mycorp,DC=mytld"]
group_search_filter_user_attribute = "dn"
Bash
group_search_filter = "(member:1.2.840.113556.1.4.1941:=CN=%s,[user container/OU])"
group_search_filter = "(|(member:1.2.840.113556.1.4.1941:=CN=%s,[user container/OU])(member:1.2.840.113556.1.4.1941:=CN=%s,[another user container/OU]))"
group_search_filter_user_attribute = "cn"

Дополнительную информацию о поиске в AD см. в документации Синтаксис фильтра поиска от Microsoft.

Для устранения неполадок изменение member_of в [servers.attributes] на “dn” покажет вам более точное членство в группах, когда включена отладка.

Примеры конфигурации

Следующие примеры описывают различные параметры конфигурации LDAP.

OpenLDAP

OpenLDAP — это служба каталогов с открытым исходным кодом.

Специфичный для LDAP файл конфигурации (ldap.toml):

Bash
[[servers]]
host = "127.0.0.1"
port = 389
use_ssl = false
start_tls = false
ssl_skip_verify = false
bind_dn = "cn=admin,dc=grafana,dc=org"
bind_password = "grafana"
search_filter = "(cn=%s)"
search_base_dns = ["dc=grafana,dc=org"]

[servers.attributes]
member_of = "memberOf"
email =  "email"

# [[servers.group_mappings]] omitted for clarity

Несколько серверов LDAP

Grafana действительно поддерживает получение информации с нескольких серверов LDAP.

Специфичный для LDAP файл конфигурации (ldap.toml):

Bash
# --- First LDAP Server ---

[[servers]]
host = "10.0.0.1"
port = 389
use_ssl = false
start_tls = false
ssl_skip_verify = false
bind_dn = "cn=admin,dc=grafana,dc=org"
bind_password = "grafana"
search_filter = "(cn=%s)"
search_base_dns = ["ou=users,dc=grafana,dc=org"]

[servers.attributes]
member_of = "memberOf"
email =  "email"

[[servers.group_mappings]]
group_dn = "cn=admins,ou=groups,dc=grafana,dc=org"
org_role = "Admin"
grafana_admin = true

# --- Second LDAP Server ---

[[servers]]
host = "10.0.0.2"
port = 389
use_ssl = false
start_tls = false
ssl_skip_verify = false

bind_dn = "cn=admin,dc=grafana,dc=org"
bind_password = "grafana"
search_filter = "(cn=%s)"
search_base_dns = ["ou=users,dc=grafana,dc=org"]

[servers.attributes]
member_of = "memberOf"
email =  "email"

[[servers.group_mappings]]
group_dn = "cn=editors,ou=groups,dc=grafana,dc=org"
org_role = "Editor"

[[servers.group_mappings]]
group_dn = "*"
org_role = "Viewer"

Active Directory

Active Directory — это служба каталогов, которая обычно используется в средах Windows.

Предполагая следующую конфигурацию сервера Active Directory:

  • IP-адрес: 10.0.0.1
  • Домен: CORP
  • DNS-имя: corp.local

Специфичный для LDAP файл конфигурации (ldap.toml):

Bash
[[servers]]
host = "10.0.0.1"
port = 3269
use_ssl = true
start_tls = false
ssl_skip_verify = true
bind_dn = "CORP\\%s"
search_filter = "(sAMAccountName=%s)"
search_base_dns = ["dc=corp,dc=local"]

[servers.attributes]
member_of = "memberOf"
email =  "mail"

# [[servers.group_mappings]] omitted for clarity

Требования к портам

В предыдущем примере SSL включён и настроен зашифрованный порт. Если ваш Active Directory не поддерживает SSL, используйте вместо этого enable_ssl = false и port = 389.

Изучите свою конфигурацию и документацию Active Directory, чтобы найти правильные настройки. Дополнительную информацию о Active Directory и требованиях к портам см. в документации Microsoft.

Устранение неполадок

Чтобы устранить неполадки и получить больше информации в логах, включите отладочное логирование LDAP в файле grafana.ini или custom.ini:

Bash
[log]
filters = ldap:debug