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

Чтобы включить Google OAuth, вы должны зарегистрировать своё приложение в Google. Google сгенерирует для вас client ID и секретный ключ.

Note

Если пользователи используют одинаковый адрес электронной почты в Google и в других провайдерах аутентификации (например, Grafana.com), вам нужно выполнить дополнительную настройку, чтобы гарантировать правильное сопоставление пользователей. Дополнительную информацию см. в документации Использование одного и того же адреса электронной почты для входа через разных провайдеров идентификации.

Создание ключей Google OAuth

Сначала вам нужно создать Google OAuth Client:

  1. Перейдите на https://console.developers.google.com/apis/credentials.
  2. Создайте новый проект, если у вас его ещё нет.
    1. Введите имя проекта. Поля Organization и Location должны быть установлены в информацию о вашей организации.
    2. В OAuth consent screen выберите тип пользователя External. Нажмите CREATE.
    3. Заполните запрошенную информацию, используя URL вашего экземпляра Grafana Cloud.
    4. Примите значения по умолчанию или настройте параметры экрана согласия.
  3. Нажмите Create Credentials, затем нажмите OAuth Client ID в выпадающем меню
  4. Введите следующее:
    • Application Type: Web application
    • Name: Grafana
    • Authorized JavaScript origins: https://<YOUR_GRAFANA_URL>
    • Authorized redirect URIs: https://<YOUR_GRAFANA_URL>/login/google
    • Замените <YOUR_GRAFANA_URL> на URL вашего экземпляра Grafana.

      Note

      URL, который вы вводите, — это URL домашней страницы вашего экземпляра Grafana, а не URL портала Grafana Cloud.

  5. Нажмите Create
  6. Скопируйте Client ID и Client Secret из модального окна ‘OAuth Client’

Настройка клиента аутентификации Google через интерфейс Grafana

Как администратор Grafana вы можете настроить клиент Google OAuth изнутри Grafana через интерфейс Google. Для этого перейдите на страницу Administration > Authentication > Google и заполните форму. Если у вас есть текущая конфигурация в файле конфигурации Grafana, форма будет предварительно заполнена этими значениями, в противном случае форма будет содержать значения по умолчанию.

После того как вы заполнили форму, нажмите Save. Если сохранение прошло успешно, Grafana применит новые конфигурации.

Если вам нужно сбросить изменения, сделанные в интерфейсе, обратно к значениям по умолчанию, нажмите Reset. После сброса изменений Grafana применит конфигурацию из файла конфигурации Grafana (если есть какая-либо конфигурация) или значения по умолчанию.

Note

Если вы запускаете Grafana в режиме высокой доступности, изменения конфигурации могут примениться не ко всем экземплярам Grafana сразу. Возможно, вам придётся подождать несколько минут, пока конфигурация распространится на все экземпляры Grafana.

Настройка клиента аутентификации Google с помощью провайдера Terraform

terraform
resource "grafana_sso_settings" "google_sso_settings" {
  provider_name = "google"
  oauth2_settings {
    name            = "Google"
    client_id       = "CLIENT_ID"
    client_secret   = "CLIENT_SECRET"
    allow_sign_up   = true
    auto_login      = false
    scopes          = "openid email profile"
    allowed_domains = "mycompany.com mycompany.org"
    hosted_domain   = "mycompany.com"
    use_pkce        = true
  }
}

Полное справочное руководство по использованию ресурса grafana_sso_settings см. в Terraform Registry.

Настройка клиента аутентификации Google с помощью файла конфигурации Grafana

Убедитесь, что у вас есть доступ к файлу конфигурации Grafana.

Включение Google OAuth в Grafana

Укажите Client ID и Secret в файле конфигурации Grafana. Например:

Bash
[auth.google]
enabled = true
allow_sign_up = true
auto_login = false
client_id = CLIENT_ID
client_secret = CLIENT_SECRET
scopes = openid email profile
auth_url = https://accounts.google.com/o/oauth2/v2/auth
token_url = https://oauth2.googleapis.com/token
api_url = https://openidconnect.googleapis.com/v1/userinfo
allowed_domains = mycompany.com mycompany.org
hosted_domain = mycompany.com
use_pkce = true

Возможно, вам придётся установить параметр root_url в [server], чтобы callback URL был корректным. Например, если вы обслуживаете Grafana за прокси.

Перезапустите серверную часть Grafana. Теперь вы должны увидеть кнопку входа Google на странице входа. Теперь вы можете войти или зарегистрироваться с помощью своих учётных записей Google. Параметр allowed_domains необязателен, а домены разделялись пробелом.

Вы можете разрешить пользователям регистрироваться через аутентификацию Google, установив параметр allow_sign_up в true. Когда этот параметр установлен в true, любой пользователь, успешно прошедший аутентификацию через Google, будет автоматически зарегистрирован.

Вы можете указать домен, который будет передан как параметр запроса hd, принимаемый API аутентификации OAuth 2.0 от Google. См. документацию Google по OAuth.

Note

Начиная с Grafana 10.3.0, параметр hd, полученный из ID-токена Google, также используется для определения размещённого домена пользователя. Параметр конфигурации Google Oauth allowed_domains используется для ограничения доступа пользователями из определённого домена. Если параметр конфигурации allowed_domains задан, параметр hd из ID-токена Google должен совпадать с параметром конфигурации allowed_domains. Если параметр hd из ID-токена Google не совпадает с параметром конфигурации allowed_domains, пользователю отказывается в доступе.

Когда учётная запись не принадлежит рабочему пространству Google, утверждение hd будет недоступно.

Эта валидация включена по умолчанию. Чтобы отключить эту валидацию, установите параметр конфигурации validate_hd в false. Параметр конфигурации allowed_domains будет использовать утверждение email для проверки домена.

PKCE

RFC 7636 от IETF вводит “proof key for code exchange” (PKCE), который обеспечивает дополнительную защиту от некоторых форм атак перехвата кода авторизации. PKCE будет требоваться в OAuth 2.1.

Note

Вы можете отключить PKCE в Grafana, установив use_pkce в false в разделе[auth.google].

Настройка refresh-токена

Когда пользователь входит в систему с помощью провайдера OAuth, Grafana проверяет, что access-токен не истёк. Когда access-токен истекает, Grafana использует предоставленный refresh-токен (если он есть) для получения нового access-токена.

Grafana использует refresh-токен для получения нового access-токена без необходимости для пользователя входить в систему снова. Если refresh-токен не существует, Grafana выполняет выход пользователя из системы после истечения access-токена.

По умолчанию Grafana включает параметр access_type=offline в запрос авторизации, чтобы запросить refresh-токен.

Получение refresh-токена и проверка истечения access-токена включены по умолчанию для провайдера Google начиная с Grafana v10.1.0. Если вы хотите отключить проверку истечения access-токена, установите значение конфигурации use_refresh_token в false.

Note

Переключатель функции accessTokenExpirationCheck был удалён в Grafana v10.3.0, и вместо него для настройки получения refresh-токена и проверки истечения access-токена будет использоваться значение конфигурации use_refresh_token.

Настройка валидации ID-токена JWT

По умолчанию Grafana извлекает информацию о пользователе из ID-токенов, не проверяя их криптографические подписи. Для повышения безопасности вы можете включить валидацию подписи JWT, чтобы гарантировать, что ID-токены подлинны и не были подделаны.

Чтобы включить валидацию ID-токена JWT:

  1. Установите validate_id_token в true в разделе [auth.google] файла конфигурации Grafana.

  2. Настройте jwk_set_url с URL конечной точки JSON Web Key Set (JWKS) Google. Эта конечная точка предоставляет публичные ключи, используемые для проверки подписей JWT.

    Для Google конечная точка JWKS: https://www.googleapis.com/oauth2/v3/certs

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

ini
[auth.google]
enabled = true
validate_id_token = true
jwk_set_url = https://www.googleapis.com/oauth2/v3/certs
client_id = <client id>
client_secret = <client secret>
scopes = openid email profile

Note

Когда валидация JWT включена, Grafana кэширует ключи JWKS для повышения производительности. Кэш учитывает заголовок Cache-Control из ответа конечной точки JWKS. Если срок истечения кэша не указан, ключи кэшируются на 5 минут по умолчанию.

Caution

Если validate_id_token установлен в true, вы должны настроить jwk_set_url. Аутентификация завершится неудачей, если JWK Set URL не предоставлен или если подпись ID-токена не может быть проверена.

Настройка автоматического входа

Установите параметр auto_login в true, чтобы пытаться войти автоматически, пропуская экран входа. Этот параметр игнорируется, если несколько провайдеров аутентификации настроены на использование автоматического входа.

auto_login = true

Настройка синхронизации команд

Note

Доступно в Grafana Enterprise и Grafana Cloud.

С синхронизацией команд вы можете легко добавлять пользователей в команды, используя их группы Google. Чтобы настроить синхронизацию команд для Google OAuth, обратитесь к следующему примеру.

Чтобы настроить синхронизацию команд для Google OAuth:

  1. Включите Google Cloud Identity API на дашборде вашей организации.

  2. Добавьте область https://www.googleapis.com/auth/cloud-identity.groups.readonly в вашу конфигурацию Grafana [auth.google]:

    Пример:

    ini
    [auth.google]
    # ..
    scopes = openid email profile https://www.googleapis.com/auth/cloud-identity.groups.readonly
  3. Настройте синхронизацию команд на вкладке External group sync вашей команды Grafana. Внешний group ID для группы Google — это адрес электронной почты группы, например dev@grafana.com.

Чтобы узнать больше о синхронизации команд, см. Настройка синхронизации команд.

Настройка разрешённых групп

Чтобы ограничить доступ аутентифицированных пользователей, которые являются членами одной или нескольких групп, установите allowed_groups в список групп, разделённых запятыми или пробелами.

Группы Google указываются по ключу email группы. Например, developers@google.com.

Note

Добавьте область https://www.googleapis.com/auth/cloud-identity.groups.readonly в вашу конфигурацию областей Grafana [auth.google], чтобы получать группы.

Настройка сопоставления ролей

Если только не включён параметр skip_org_role_sync, роль пользователя будет установлена в роль, сопоставленную из Google при входе пользователя. Если сопоставление не задано, используется роль экземпляра по умолчанию.

Роль пользователя извлекается с помощью выражения JMESPath из параметра конфигурации role_attribute_path. Чтобы сопоставить роль администратора сервера, используйте параметр конфигурации allow_assign_grafana_admin.

Если допустимая роль не найдена, пользователю назначается роль, указанная параметром auto_assign_org_role. Вы можете отключить это назначение роли по умолчанию, установив role_attribute_strict = true. Этот параметр запрещает доступ пользователю, если не возвращена роль или возвращена недопустимая роль после вычисления выражений role_attribute_path и org_mapping.

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

Note

По умолчанию параметр skip_org_role_sync включён. Параметр skip_org_role_sync по умолчанию имеет значение false в Grafana v10.3.0 и более поздних версиях.

Примеры сопоставления ролей

В этом разделе приведены примеры выражений JMESPath, используемых для сопоставления ролей.

Пример сопоставления ролей организации

Интеграция Google использует группы внешних пользователей в конфигурации org_mapping для сопоставления организаций и ролей на основе их членства в группах Google.

В этом примере пользователю предоставлена роль Viewer в организации org_foo и роль Editor в организациях org_bar и org_baz.

Внешний пользователь является частью следующих групп Google: group-1 и group-2.

Конфигурация:

ini
org_mapping = group-1:org_foo:Viewer group-2:org_bar:Editor *:org_baz:Editor
Сопоставление ролей с использованием информации о пользователе из токена OAuth

В этом примере пользователю с электронной почтой admin@company.com предоставлена роль Admin. Всем остальным пользователям предоставляется роль Viewer.

ini
role_attribute_path = email=='admin@company.com' && 'Admin' || 'Viewer'
skip_org_role_sync = false
Сопоставление ролей с использованием групп

В этом примере пользователю из группы Google ’example-group@google.com’ предоставлена роль Editor. Всем остальным пользователям предоставляется роль Viewer.

ini
role_attribute_path = contains(groups[*], 'example-group@google.com') && 'Editor' || 'Viewer'
skip_org_role_sync = false

Note

Добавьте область https://www.googleapis.com/auth/cloud-identity.groups.readonly в вашу конфигурацию областей Grafana [auth.google], чтобы получать группы.

Сопоставление роли администратора сервера

В этом примере пользователю с электронной почтой admin@company.com предоставлена роль организации Admin, а также роль администратора сервера Grafana. Всем остальным пользователям предоставляется роль Viewer.

ini
allow_assign_grafana_admin = true
skip_org_role_sync = false
role_attribute_path = email=='admin@company.com' && 'GrafanaAdmin' || 'Viewer'
Сопоставление одной роли всем пользователям

В этом примере всем пользователям назначается роль Viewer независимо от информации о пользователе, полученной от провайдера идентификации.

ini
role_attribute_path = "'Viewer'"
skip_org_role_sync = false

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

Следующая таблица описывает различные параметры конфигурации Google OAuth. Вы можете применять эти параметры как переменные среды, как и любую другую конфигурацию в Grafana. Дополнительную информацию см. в разделе Переопределение конфигурации с помощью переменных среды.

Параметр Обязательно Поддерживается в Cloud Описание По умолчанию
enabled Нет Да Включает аутентификацию Google. false
name Нет Да Имя, которое ссылается на аутентификацию Google из пользовательского интерфейса Grafana. Google
icon Нет Да Значок, используемый для аутентификации Google в пользовательском интерфейсе Grafana. google
client_id Да Да Client ID приложения.
client_secret Да Да Client secret приложения.
auth_url Да Да Конечная точка авторизации провайдера Google OAuth. https://accounts.google.com/o/oauth2/v2/auth
token_url Да Да Конечная точка, используемая для получения access-токена OAuth2. https://oauth2.googleapis.com/token
token_exchange_timeout Нет Да Тайм-аут в секундах для запроса обмена токена OAuth. Если установлено 0 или не задано, по умолчанию 15 секунд. 15
api_url Да Да Конечная точка, используемая для получения информации о пользователе, совместимой с OpenID UserInfo. https://openidconnect.googleapis.com/v1/userinfo
auth_style Нет Да Имя OAuth2 AuthStyle, которое будет использоваться при запросе ID-токена у провайдера OAuth2. Оно определяет, как client_id и client_secret отправляются провайдеру Oauth2. Доступные значения: AutoDetect, InParams и InHeader. AutoDetect
scopes Нет Да Список областей OAuth2, разделённых запятыми или пробелами. openid email profile
allow_sign_up Нет Да Управляет созданием пользователей Grafana через вход Google. Только существующие пользователи Grafana могут войти с Google, если установлено false. true
auto_login Нет Да Установите true, чтобы позволить пользователям обойти экран входа и войти автоматически. Этот параметр игнорируется, если вы настроили несколько провайдеров аутентификации на использование автоматического входа. false
login_prompt Нет Да Указывает тип взаимодействия с пользователем при входе в Google. Доступные значения: login, consent и select_account.
hosted_domain Нет Да Указывает домен для ограничения доступа пользователями из этого домена. Это значение добавляется к запросу авторизации с помощью параметра hd.
validate_hd Нет Да Установите false, чтобы отключить валидацию параметра hd из ID-токена Google. Дополнительную информацию см. в разделе Включение Google OAuth в Grafana. true
role_attribute_strict Нет Да Установите true, чтобы запретить вход пользователя, если роль организации Grafana не может быть извлечена с помощью role_attribute_path или org_mapping. Дополнительную информацию о сопоставлении ролей пользователей см. в разделе Настройка сопоставления ролей. false
org_attribute_path Нет Нет Выражение JMESPath, используемое для поиска роли организации Grafana. Grafana сначала вычислит выражение, используя ID-токен OAuth2. Если значение не возвращено, выражение будет вычислено с использованием информации о пользователе, полученной от конечной точки UserInfo. Результат вычисления будет сопоставлен с ролями организации на основе org_mapping. Дополнительную информацию о сопоставлении организации с ролью см. в разделе Пример сопоставления ролей организации.
org_mapping Нет Нет Список сопоставлений <ExternalOrgName>:<OrgIdOrName>:<Role>, разделённых запятыми или пробелами. Значение может быть *, что означает “Все пользователи”. Роль необязательна и может иметь следующие значения: None, Viewer, Editor или Admin. Дополнительную информацию о сопоставлении внешней организации с ролью см. в разделе Пример сопоставления ролей организации.
allow_assign_grafana_admin Нет Нет Установите true, чтобы автоматически синхронизировать роль администратора сервера Grafana. Когда включено, если роль приложения пользователя Google — GrafanaAdmin, Grafana предоставляет пользователю привилегии администратора сервера и роль администратора организации. Если отключено, пользователь получит только роль администратора организации. Подробности о сопоставлении ролей пользователей см. в разделе Сопоставление ролей. false
skip_org_role_sync Нет Да Установите true, чтобы прекратить автоматическую синхронизацию ролей пользователей. Это позволит вам вручную задавать роли организации для своих пользователей изнутри Grafana. false
allowed_groups Нет Да Список групп, разделённых запятыми или пробелами. Пользователь должен быть членом как минимум одной группы, чтобы войти. Если вы настроите allowed_groups, вы также должны настроить Google, чтобы включить утверждение groups, следуя разделу Настройка разрешённых групп.
allowed_organizations Нет Да Список идентификаторов тенантов Azure, разделённых запятыми или пробелами. Пользователь должен быть членом как минимум одного тенанта, чтобы войти.
allowed_domains Нет Да Список доменов, разделённых запятыми или пробелами. Пользователь должен принадлежать как минимум к одному домену, чтобы войти.
tls_skip_verify_insecure Нет Нет Если установлено true, клиент принимает любой сертификат, представленный сервером, и любое имя хоста в этом сертификате. Используйте это только для тестирования, поскольку этот режим делает SSL/TLS уязвимым для атак типа “человек посередине”. false
tls_client_cert Нет Нет Путь к сертификату.
tls_client_key Нет Нет Путь к ключу.
tls_client_ca Нет Нет Путь к списку доверенных центров сертификации.
use_pkce Нет Да Установите true, чтобы использовать Proof Key for Code Exchange (PKCE). Grafana использует метод запроса S256 на основе SHA256 и верификатор кода размером 128 байт (в кодировке base64url). true
use_refresh_token Нет Да Включает использование refresh-токенов и проверку истечения access-токена. Когда включено, Grafana автоматически добавляет параметры promp=consent и access_type=offline к запросу авторизации. true
validate_id_token Нет Да Если включено, Grafana будет проверять подпись JWT ID-токенов, используя конечную точку JWKS. Это повышает безопасность, гарантируя, что токены подлинны и не были подделаны. false
jwk_set_url Нет Да URL конечной точки JSON Web Key Set (JWKS), используемой для проверки подписей ID-токенов JWT. Требуется, когда включена валидация ID-токена. Для Google используйте https://www.googleapis.com/oauth2/v3/certs.
signout_redirect_url Нет Да URL для перенаправления после выхода пользователя из системы.