3 SAML

概述

SAML 2.0 身份验证 可用于登录 Zabbix。

如果仅配置了 SAML 登录,则用户也必须存在于 Zabbix 中,但其 Zabbix 密码不会被使用。 如果身份验证成功,Zabbix 将把本地用户名与 SAML 返回的用户名属性进行匹配。

用户预配

可以为 SAML 用户配置 JIT(即时)用户预配。 在这种情况下,不要求用户已存在于 Zabbix 中。 用户首次登录 Zabbix 时,可以创建该用户账户。

如果启用了 JIT 预配,必须在 Authentication 选项卡中指定一个用于已取消预配用户的用户组。

除了 JIT 预配之外,还可以启用并配置 SCIM(System for Cross-domain Identity Management)预配 - 对通过用户预配创建的这些用户进行持续的用户账户管理。 SCIM 预配需要一个具有超级管理员权限的 Zabbix API token,用于向 Zabbix 进行身份验证。

例如,如果某个用户从一个 SAML 组移动到另一个 SAML 组,该用户在 Zabbix 中也会从一个组移动到另一个组; 如果某个用户从 SAML 组中移除,该用户也会从 Zabbix 中的该组移除,并且如果不属于任何其他组,则会被添加到用于已取消预配用户的用户组中。

如果启用了并配置了 SCIM,SAML 用户会在用户登录 Zabbix 的那一刻进行预配,并根据 SAML 中的更改持续更新。 已存在的 SAML 用户不会被预配,只有已预配的用户才会被更新。 请注意,在用户被预配或更新时,只会向该用户添加有效的媒体。

如果未启用 SCIM,SAML 用户会在用户登录 Zabbix 的那一刻进行预配(并在之后更新)。

如果启用了 SAML 身份验证,用户可以选择本地登录或通过 SAML 单点登录。 如果使用 JIT 预配,则只能使用单点登录。

配置身份提供者

为了与 Zabbix 配合使用,需要按以下方式配置 SAML 身份提供者(onelogin.comauth0.comokta.com 等):

  • Assertion Consumer URL 应设置为 <path_to_zabbix_ui>/index_sso.php?acs
  • Single Logout URL 应设置为 <path_to_zabbix_ui>/index_sso.php?sls

<path_to_zabbix_ui> 示例:https://example.com/zabbix/uihttp://another.example.com/zabbixhttp://<any_public_ip_address>/zabbix

配置 Zabbix

如果您希望在前端中使用 SAML 身份验证,则必须安装 php-openssl。

要使用 SAML 身份验证,应按以下方式配置 Zabbix:

1. 私钥和证书应存储在 ui/conf/certs/ 中,除非在 zabbix.conf.php 中提供了自定义路径。

默认情况下,Zabbix 将在以下位置查找:

  • ui/conf/certs/sp.key - SP 私钥文件
  • ui/conf/certs/sp.crt - SP 证书文件
  • ui/conf/certs/idp.crt - IDP 证书文件

2. 最重要的设置都可以在 Zabbix 前端中配置。不过,也可以在 配置文件 中指定其他设置。

Zabbix 前端中可用的配置参数:

Parameter Description
Enable SAML authentication 勾选复选框以启用 SAML 身份验证。
Enable JIT provisioning 勾选复选框以启用 JIT 用户预配。
IDP entity ID SAML 身份提供者中的唯一实体标识符。
SSO service URL 用户登录时将被重定向到的 URL。
SLO service URL 用户注销时将被重定向到的 URL。如果留空,则不会使用 SLO 服务。
Username attribute 登录 Zabbix 时用作用户名的 SAML 属性。
支持的值列表由身份提供者决定。

示例:
uid
userprincipalname
samaccountname
username
userusername
urn:oid:0.9.2342.19200300.100.1.1
urn:oid:1.3.6.1.4.1.5923.1.1.1.13
urn:oid:0.9.2342.19200300.100.1.44
SP entity ID 唯一的服务提供者标识符(如果不匹配,操作将被拒绝)。
可以指定 URL 或任意字符串。
SP name ID format 在响应中请求特定的 name ID 格式。

示例:
urn:oasis:names:tc:SAML:2.0:nameid-format:persistent
urn:oasis:names:tc:SAML:2.0:nameid-format:unspecified
urn:oasis:names:tc:SAML:2.0:nameid-format:transient
Sign 勾选复选框以选择应启用 SAML 签名的实体:
Messages
Assertions
AuthN requests
Logout requests
Logout responses
Encrypt 勾选复选框以选择应启用 SAML 加密的实体:
Name ID
Assertions
Case-sensitive login 取消勾选复选框可禁用用户名的大小写敏感登录(默认启用)。
禁用大小写敏感登录后,例如,即使 Zabbix 用户为 "Admin" 或 "ADMIN",也可以使用 "admin" 登录。
请注意,如果禁用了大小写敏感登录,并且存在多个用户名相似的 Zabbix 用户(例如,Admin 和 admin),则这些用户的登录将始终被拒绝,并显示以下错误消息:"Authentication failed: supplied credentials are not unique."
Configure JIT provisioning 勾选此复选框以显示与 JIT 用户预配相关的选项。
Group name attribute 指定用于 JIT 用户预配的组名属性。
User name attribute 指定用于 JIT 用户预配的用户名属性。
User last name attribute 指定用于 JIT 用户预配的用户姓氏属性。
User group mapping 将 SAML 用户组模式映射到 Zabbix 用户组和用户角色。
这对于确定预配用户在 Zabbix 中将获得哪个用户组/角色是必需的。
单击 Add 以添加映射。
SAML group pattern 字段支持通配符。组名必须与现有组匹配。
如果某个 SAML 用户匹配多个 Zabbix 用户组,则该用户将成为所有这些组的成员。
如果某个用户匹配多个 Zabbix 用户角色,则该用户将获得其中最高的权限级别。
Media type mapping 将用户的 SAML 媒体属性(例如电子邮件)映射到 Zabbix 用户媒介,用于发送通知。
Enable SCIM provisioning 勾选此复选框以启用 SCIM 2.0 预配。

有关为 Zabbix 配置用于登录和用户预配的 SAML 身份提供者示例,请参见:

SCIM 配置说明

对于 SCIM 配置,需要在身份提供商一侧指定 Zabbix 前端 的路径,并在其后附加 api_scim.php,即:

https://<path-to-zabbix-ui>/api_scim.php

在 Zabbix 中使用的用户属性(用户名、用户名字、用户姓氏和媒介属性)需要添加为自定义属性,并且如有必要,外部命名空间应与用户架构相同:urn:ietf:params:scim:schemas:core:2.0:User

高级设置

可以在 Zabbix 前端配置文件(zabbix.conf.php)中配置其他 SAML 参数:

  • $SSO['SP_KEY'] = '<SP 私钥文件路径>';
  • $SSO['SP_CERT'] = '<SP 证书文件路径>';
  • $SSO['IDP_CERT'] = '<IDP 证书文件路径>';
  • $SSO['SETTINGS']

$SSO['SETTINGS'] 数组必须遵循 SAML PHP Toolkit 库(随 Zabbix 提供)所要求的相同结构。 有关可用配置选项的完整说明,请参阅官方库文档

只有以下选项可以作为 $SSO['SETTINGS'] 的一部分进行设置:

  • strict
  • baseurl
  • compress
  • contactPerson
  • organization
  • sp(仅限此列表中指定的选项)
    • attributeConsumingService
    • x509certNew
  • idp(仅限此列表中指定的选项)
    • singleLogoutService(仅一个选项)
      • responseUrl
    • certFingerprint
    • certFingerprintAlgorithm
    • x509certMulti
  • security(仅限此列表中指定的选项)
    • signMetadata
    • wantNameId
    • requestedAuthnContext
    • requestedAuthnContextComparison
    • wantXMLValidation
    • relaxDestinationValidation
    • destinationStrictlyMatches
    • rejectUnsolicitedResponsesWithInResponseTo
    • signatureAlgorithm
    • digestAlgorithm
    • lowercaseUrlencoding

所有其他选项都将从数据库中获取,且不能被覆盖。 debug 选项将被忽略。

此外,如果 Zabbix UI 位于 proxy 或负载均衡器之后,则可以使用自定义 use_proxy_headers 选项:

  • false(默认)- 忽略该选项;
  • true - 使用 X-Forwarded-* HTTP 标头来构建基础 URL。

如果使用负载均衡器连接到 Zabbix 实例,且负载均衡器使用 TLS/SSL 而 Zabbix 不使用,则必须按如下方式指定 'baseurl'、'strict' 和 'use_proxy_headers' 参数:

$SSO['SETTINGS'] = [
    'strict' => false,
    'baseurl' => 'https://zabbix.example.com/zabbix/',
    'use_proxy_headers' => true
];

配置示例:

$SSO['SETTINGS'] = [
    'security' => [
        'signatureAlgorithm' => 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha384'
        'digestAlgorithm' => 'http://www.w3.org/2001/04/xmldsig-more#sha384',
        // ...
    ],
    // ...
];
使用 Kerberos/ADFS 的前端配置

Zabbix 前端配置文件(zabbix.conf.php)可用于配置使用 Kerberos 身份验证和 ADFS 的 SSO:

$SSO['SETTINGS'] = [
    'security' => [
        'requestedAuthnContext' => [
            'urn:oasis:names:tc:SAML:2.0:ac:classes:Kerberos',
        ],
        'requestedAuthnContextComparison' => 'exact'
    ]
]; 

在这种情况下,在 SAML 配置的 SP name ID 字段中设置:

urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified