3 SAML

概述

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

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

用户预配

可以为 SAML 用户配置 JIT(just-in-time,实时)用户预配
在这种情况下,不要求用户必须已存在于 Zabbix 中。
当用户首次登录 Zabbix 时,可以创建其用户账户。

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

除了 JIT 预配之外,还可以启用并配置 SCIM(System for Cross-domain Identity Management,跨域身份管理系统)预配——对那些通过用户预配创建的用户进行持续的用户账户管理。
SCIM 预配需要一个 Zabbix API token(具有 Super admin 权限)用于登录 Zabbix 时的身份验证。

例如,如果某个用户从一个 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. 提供 SP 私钥和证书。
必须提供 IdP 证书(粘贴文本或选择文件),才能通过前端激活 SAML。
如果选择了 SignEncrypt 选项,则还必须提供 SP 证书和 SP 私钥。

如果在 zabbix.conf.php 中设置了 $SSO['CERT_STORAGE'] = 'database',则您可以在 SAML 配置期间通过前端粘贴证书文本或上传证书文件——无需在文件系统中提供任何文件。

如果在 zabbix.conf.php 中设置了 $SSO['CERT_STORAGE'] = 'file',则必须使证书在文件系统中可用(默认位于 ui/conf/certs,或 zabbix.conf.php 中配置的路径),并且前端不会将证书存储在数据库中。
请注意,如果未设置 $SSO['CERT_STORAGE'] 或该项被注释掉,则默认使用文件存储。

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

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

证书材料可通过前端以粘贴文本或上传文件的方式导入。
尽管为了方便,在某些环境中允许未加密导入,但强烈建议使用加密的传输(例如,为 Zabbix 前端启用 HTTPS/TLS)。
当 SAML 证书/密钥存储在数据库中时,请为数据库连接启用 TLS/SSL,以保护应用程序与数据库之间的流量。
请加密可能包含 SAML 证书或私钥的数据库备份,并限制对备份文件以及存储 SAML 材料的数据库表的访问。
将数据库用户权限限制为最低必要级别。

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
IdP certificate 用于设置 SAML 单点登录(SSO)服务的服务提供商(SP)证书内容。
SP private key 用于设置 SAML 单点登录(SSO)服务的服务提供商(SP)私钥内容。用于与身份提供商(IdP)进行安全身份验证和数据交换。
SP certificate 用于设置 SAML 单点登录(SSO)服务的服务提供商(SP)证书内容。
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 预配。

请参阅以下示例,了解如何配置 SAML 身份提供商,以实现登录和将用户预配到 Zabbix:

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