2022 Zabbix中国峰会
2022 Zabbix中国峰会

3 SAML

概览

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

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

用户供应

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

如果启用了JIT供应,必须在认证选项卡中指定一个用于未激活用户的用户组。

除了JIT供应外,还可以启用和配置SCIM(跨域身份管理系统)配备 - 用于对用户供应创建的用户进行持续的用户账户管理。SCIM供应需要一个Zabbix API令牌(具有超级管理员权限)用于Zabbix的身份验证。

例如,如果用户从一个SAML组移到另一个组,用户在Zabbix中也将从一个组移到另一个组; 如果用户从SAML组中移除,用户在Zabbix中也将从该组中移除,并且如果不属于任何其他组,则添加到未激活用户组中。

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

如果未启用SCIM,SAML用户将在用户首次登录Zabbix时进行配备(并稍后进行更新)。

如果启用了SAML身份验证,用户将能够选择本地登录或通过SAML单点登录。如果使用了JIT供应,则只能使用单点登录。

设置身份提供者

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

  • 声明用户URL 应设置为 <path_to_zabbix_ui>/index_sso.php?acs
  • 单点退出URL 应设置为 <path_to_zabbix_ui>/index_sso.php?sls

<path_to_zabbix_ui> 示例:https://example.com/zabbix/ui, http://another.example.com/zabbix, http://<any_public_ip_address>/zabbix

设置Zabbix

如果要在前端使用SAML身份验证,需要安装php-openssl。

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

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前端中可用的配置参数:

参数 描述
启用SAML身份验证 选择此复选框以启用SAML身份验证。
启用JIT供应 选择此复选框以启用JIT用户供应。
IDP实体ID SAML身份提供者中的唯一实体标识符。
SSO服务URL 用户登录时将重定向到的URL。
SLO服务URL 用户退出时将重定向到的URL。如果留空,则不使用SLO服务。
用户名属性 在登录到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实体ID 服务提供者的唯一标识符(如果不匹配,则操作将被拒绝)。
可以指定URL或任意数据字符串。
SP名称ID格式 定义应使用哪种名称标识符格式。

示例:
urn:oasis:names:tc:SAML:2.0:nameid-format:persistent
urn:oasis:names:tc:SAML:2.0:nameid-format:transient
urn:oasis:names:tc:SAML:2.0:nameid-format:kerberos
urn:oasis:names:tc:SAML:2.0:nameid-format:entity
签名 选择要启用SAML签名的实体:
消息
声明
认证请求
注销请求
注销响应
加密 选择要启用SAML加密的实体:
名称ID
声明
区分大小写的登录 选择此复选框以启用用户名的区分大小写登录(默认情况下禁用)。
例如,禁用区分大小写的登录,即使Zabbix用户是'Admin',也可以使用'ADMIN'用户登录。
注意,如果Zabbix数据库中存在类似用户名(例如Admin、admin),禁用区分大小写的登录将拒绝登录。
配置JIT供应 选择此复选框以显示与JIT用户供应相关的选项。
组名属性 JIT用户供应的组名属性。
用户名属性 JIT用户供应的用户名属性。
用户姓氏属性 JIT用户供应的用户姓氏属性。
用户组映射 将SAML用户组模式映射到Zabbix用户组和用户角色。
这是确定在Zabbix中分配给配备用户的用户组/角色的必要步骤。
单击 添加 添加映射。
SAML组模式 字段支持通配符。组名必须与现有组匹配。
如果SAML用户匹配多个Zabbix用户组,则用户将成为所有这些组的成员。
如果用户匹配多个Zabbix用户角色,则用户将获得其中权限级别最高的角色。
媒体类型映射 将用户的SAML媒体属性(例如电子邮件)映射到用于发送通知的Zabbix用户媒体。
启用SCIM供应 选择此复选框以启用SCIM 2.0供应。

查看以下示例,了解如何配置用于登录和用户供应到Zabbix的SAML身份提供者:

SCIM供应注意事项

对于SCIM供应,请在身份提供者端指定到 Zabbix 前端的路径,并将 api_scim.php 添加到路径末尾,例如:

https://<your-zabbix-url>/zabbix/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']

Zabbix 使用 OneLogin 的 SAML PHP Toolkit 库(版本 3.4.1)。$SSO['SETTINGS'] 部分的结构应与库中使用的结构类似。有关配置选项的描述,请参阅官方库的 文档

只能设置以下选项作为 $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 处于代理或负载均衡器之后,可以使用自定义的 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',
               // ...
           ],
           // ...
       ];