这是一个关于单点登录的问题。 我们在公司中使用 Microsoft Active Directory,并且使用 ldap-sync 登录工作正常。
我想知道 SSO 是否可行。 我已经尝试使用 nginx 设置它,但它不起作用:-(
有没有简单的方法来做到这一点? 也许你们中的一个人已经使用 SSO 设置了 Zammad? 如果有人有如何实施的说明或一些示例,那就太好了。
先感谢您。
嗨@jaeger13 ,
这当然是可能的。 但是你必须使用带有 mod_auth_kerb 的 Apache httpd,配置如下:
<LocationMatch "/auth/sso">
SSLRequireSSL
AuthType Kerberos
AuthName "Your Zammad"
KrbMethodNegotiate On
KrbMethodK5Passwd On
KrbAuthRealms YOUR.REALM
KrbLocalUserMapping on
KrbServiceName HTTP/[email protected]
Krb5KeyTab /etc/httpd/zammad.keytab
require valid-user
</LocationMatch>
根据选择的 uid 属性(在上面的示例中为 sAMAccountName),它将开箱即用。
并且您必须将 Apache 配置为反向代理而不是 nginx。
只要 auth 模块在环境变量 REMOTE_USER 或 HTTP_REMOTE_USER 中返回经过身份验证的用户名,就可以使用其他模块,如 auth_mellon 等。
呃,罗伊
嘿@rkaldung ,
感谢您的快速答复。 我会用 Apache 和您的说明进行尝试:-)
虽然我希望有一种方法可以用 nginx 做到这一点:-(
谢谢!
嗨@jaeger13 ,
nginx 有一种方法,但目前没有测试。 @martini你的两分钱吗?
嗨@rkaldung
你能描述一下 NGINX 的方式吗? 这也会让我非常感兴趣。 谢谢。
嗨@scimitar4444
@rkaldung意味着在 Rails 级别上实现,如https://github.com/jgraichen/omniauth-kerberos - 但这需要首先在 Zammad 中实现。 🤖
-马丁
@martini它总是只有一次提交 😜
我一直在尝试使用您的说明使 SSO 正常工作。 但是浏览http://myserver.mydom.local/auth/sso会将我带回登录页面。 . . 我错过了什么吗?
尝试使用 (Stanford) Webauth(和 ldap 用户)会导致相同的错误,在 SSO 中成功登录后,我收到 zammad 提示登录。
使用:Ubuntu 16.04; Zammad 2.2.0; 阿帕奇、MariaDB; (REMOTE_USER 由 webauth 设置)
@rkaldung你知道吗? 新的?
找到了解决方法:
问题:lib/sso/env.rb 中所需的模块在没有来自 PUMA 的所需 request.env 的情况下被调用,因此“REMOTE_USER”不可用。
解决方法:
将 request.env 中的 'REMOTE_USER' 添加到函数 'create_sso' 内的 'zammad/app/controllers/sessions_controller.rb' 中的 ENV
# export required environment variables for sso
ENV['REMOTE_USER'] = request.env['REMOTE_USER']
ENV['HTTP_REMOTE_USER'] = request.env['HTTP_REMOTE_USER']
@martini这可能是新版 PUMA 的问题吗?
编辑:您必须添加相应的规则来设置 httpd.conf 中的 header-field 以使其正常工作:
RequestHeader merge REMOTE_USER %{REMOTE_USER}s
编辑 2018-01-08:
现在一切都可以使用 pikachuprof 的解决方法。 这是 /etc/krb5.conf 配置中的一个错字。
信息:
二手 Zammad 版本:最新
使用的Zammad安装源:rpm
操作系统:CentOS 7
浏览器 + 版本:Firefox 最新
Apache Server Config:
<VirtualHost *:443>
ServerName ***
ServerAdmin ***
DocumentRoot "/opt/zammad/public"
<IfModule !mod_auth_kerb.c>
LoadModule auth_kerb_module /usr/lib64/httpd/modules/mod_auth_kerb.so
</IfModule>
ProxyRequests Off
ProxyPreserveHost On
<Proxy localhost:3000>
Require local
</Proxy>
ProxyPass /assets !
ProxyPass /favicon.ico !
ProxyPass /robots.txt !
ProxyPass /ws ws://localhost:6042/
ProxyPass / http://localhost:3000/
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory "/opt/zammad/public">
Options FollowSymLinks
Require all granted
</Directory>
<Location "/auth/sso">
Order allow,deny
Allow from all
AuthType Kerberos
AuthName "Ticketsystem Kerberos Login"
KrbServiceName HTTP
KrbMethodNegotiate on
KrbMethodK5Passwd on
KrbLocalUserMapping off
KrbSaveCredentials on
Require valid-user
# Environment specific: Path to the keytab and the realm
Krb5Keytab /etc/kerberos.keytab
KrbAuthRealm ***
</Location>
SSLEngine on
SSLCertificateFile /etc/pki/tls/certs/***
SSLCertificateKeyFile /etc/pki/tls/private/***
ErrorLog "logs/***-error_log"
CustomLog "logs/***-access_log" common
</VirtualHost>
当我打开 https:// /auth/sso 和“KrbLocalUserMapping on”时,我的浏览器显示以下错误:内部服务器错误服务器遇到内部错误或配置错误,无法完成您的请求。请通过 admin@ 联系服务器管理员,告知他们此错误发生的时间以及您在此错误之前执行的操作。
服务器错误日志中可能提供有关此错误的更多信息。
如果我设置了“KrbLocalUserMapping off”,我的浏览器将被重定向到 https:// * /#login
我尝试设置“RequestHeader merge REMOTE_USER %{REMOTE_USER}s”但没有任何变化。
希望有人能帮忙!
我们添加了另一个小解决方法:
RewriteEngine On
RewriteCond %{HTTP_COOKIE} !^.*zammad_session.*$
RewriteRule ^/$ https://%{SERVER_NAME}/auth/sso [R,L]
只要没有设置 zammad cookie,Apache-config 中的这些行就会将“/”重定向到“/auth/sso”。 这允许重定向到 SSO 登录页面,而不会创建导致“内部服务器错误”的无限循环。
我似乎无法让它工作。 . . apache 日志显示我的用户名 /auth/sso 然后我的请求被重定向到 / 并且我的用户名消失了。 . . 也许我在编辑 create_sso 函数时犯了一个错误!? 有人可以给我一个提示吗?
@pikachuprof我曾使用omniauth-kerberos进行过实现。
但是,我的实现要求您每次希望访问 Zammad 时都登录(当然使用您的 Kerberos 凭据),而不是使用用户机器已经生成的“kerberos 票证”。 (例如,来自kinit
或任何其他“kerberos 票务客户端”)
我希望这适用于使用 kerberos 进行基本登录以避免出现 hacky 情况。 😊
尽管我觉得对于具有“一次性登录/身份验证”的高级配置(例如,使用kinit
一次并进行身份验证),然后您 ssh/登录到 zammad/内部网站/ftp 所有服务器而无需再进行身份验证( SPNEGO/GSSAPI) 只能通过完全配置您现在正在做的前端网络服务器(如 Apache)来完成。
@muhammadn我们使用基于 Kerberos 的单点登录服务,称为 Stanford Webauth (mod_auth_webauth)。 它允许通过密码登录(在浏览器中)(并设置一个包含用于 SSO 的 Kerberos 令牌的 cookie),但不会将用户密码传输到服务 - 仅传输到我们的“WebKDC”。
在这种设置中,身份验证必须由 Apache 完成 - 但 Zammad 应该使用 REMOTE_USER 变量来允许任何这些“网络服务器身份验证”机制工作(或类似的?),以及提供一种方法来破坏退出“登录循环”而不依赖于检查 cookie,这似乎有点不可靠。
@pikachuprof我已经在https://github.com/muhammadn/zammad/commit/7e8e01bff8226f2d74e80cbc307416db9bf2ac1d推送了我的实现
该实现并不是正式的 zammad 功能,而是供您尝试使用 omniauth-kerberos 库。 您不需要使用 kerberos 支持配置 apache,因为所有内容都将由 Zammad 处理(它是 Rails 级别的实现),并且不需要头文件中的 REMOTE_USER 甚至 mod_auth_webauth。
您只需要正确设置 krb5.conf 即可。
例子:
[logging]
default = FILE:/var/log/krb5.log
[libdefaults]
default_realm = ZAMMAD.COM
kdc_timesync = 1
ccache_type = 4
forwardable = true
proxiable = true
[realms]
ZAMMAD.COM = {
kdc = kdc.zammad.com
admin_server = kdc.zammad.com
default_domain = zammad.com
}
[domain_realm]
.zammad.com = ZAMMAD.COM
zammad.com = ZAMMAD.COM
您可以在https://github.com/muhammadn/zammad/issues 上发布关于此的任何问题,因为它不是官方实现。
但是,请注意,要使用 zammad 登录,您需要将领域设为大写:例如: [email protected]
我们是否有机会使用现有的 kerberos 票证进行身份验证? 我们的用户已经习惯了这样一个舒适的解决方案,在我真正开始使用 SSO 之前,我没有机会切换到 zammad。
对我来说同样的问题。 我设法使用 2 种方法(Kerberos 和 X509 SSL 客户端证书)从 Apache 端(填充REMOTE_USER
)建立 SSO 连接。 我的用户帐户使用 Zammad LDAP 插件填充得很好。
/auth/sso
我在 apache 日志中看到用户登录(所以它可以工作),但我再次回到登录屏幕。zammad/app/controllers/sessions_controller.rb
( @pikachuprof hack)@EDVLeer ,要么我把它放在错误的地方,要么后来更改了代码,我们现在必须把它放在其他地方。所以...
/auth/sso
在最新版本中仍然有效吗?笔记:
<Location "/auth/sso">
Options FollowSymLinks
AuthType Kerberos
AuthName "My Name"
KrbMethodNegotiate On
# 'Off' to force users having a valid kerberos ticket, and not prompting for a login/pass
KrbMethodK5Passwd Off
KrbAuthRealms MY-DOMAIN.FR
Krb5KeyTab /etc/krb5.keytab
KrbLocalUserMapping On
KrbServiceName HTTP
Require valid-user
</Location>
注意:您必须将 CA 公共证书 (.crt) 附加到 Apache 'CA Bundle' 文件 ( SSLCACertificateFile
) 中,以便 Apache 可以检查客户端证书是否正常
# Let this before <Location> to get the certificate at the first connect, and avoid SSL renegotiation
# when we now the real url
SSLVerifyClient require
<Location "/auth/sso">
Options FollowSymLinks
SSLRequireSSL
SSLVerifyDepth 1 # Depend of your config. Can be higher
Require expr %{SSL_CLIENT_I_DN_CN} in {'MY CA NAME'}
SSLOptions +StdEnvVars
# Get the 'firstname.lastname' part of the corporate email, and populate REMOTE_USER
RewriteEngine On
RewriteCond %{SSL:SSL_CLIENT_S_DN_Email} ^(.+)@.+$
RewriteRule .* - [E=REMOTE_USER:%1]
RequestHeader set REMOTE_USER %{REMOTE_USER}e
</Location>
我可以“解决” SSO 问题,我认为这绝对不是完美的方法,但它确实有效。
我的环境是带有 Apache2 2.4 和 Postgres 的最新 zammad 版本 (2.5)。 使用 mod_auth_kerb 配置 SSO 后,我必须执行以下操作。
我配置了 LDAP 来同步我们的员工。 我将 SAMACOUNTNAME 映射到登录名。 例如我的 Windows 用户名 ist schman。 所以我可以用这个用户名(而不是电子邮件)登录。
之后,我编辑了 session_controller.rb 并添加了以下行(第 173 行)
ENV['HTTP_REMOTE_USER']=request.env['HTTP_REMOTE_USER']
所以Zammad 知道HTTP_REMOTE_USER。 之后登录不起作用。 因为 HTTP_REMOTE_USER 的值现在是[email protected]。 为了解决这个问题,我将以下行添加到我的 vHost 配置中。
RequestHeader edit REMOTE_USER "@DOMAIN.AT" ""
重新启动(Apache2 和 Zammad)后,我可以使用http://zammad.domain.at/auth/sso登录 vis SSO
如果有人说德语,我会在我的博客上写一篇小文章。
@schmanat您是如何解决“登录循环”问题的,还是让用户使用“/auth/sso”网址?
现在,用户获得 /auth/sso url。
但这是我想深入研究的下一件事。 上面的一些评论(RewriteRule)没有解决您的回答吗?
是的,确实如此,但它非常不可靠。
感谢大家在这方面所做的工作并记录您所做的工作。 不幸的是,我不知所措。 正如其他人所经历的那样,在点击“auth/sso”端点后,我也被重定向到登录页面。 这是我所做的一切:
samaccountname
-> login
)zammad
)zammad
服务帐户的密钥表/etc/krb5.conf
)kinit
验证的 kerberos 环境sessions_controller.rb
(由 pikachuprof 解释)我也尝试了 schmant 提供的解决方案,但似乎没有任何帮助。
下面是我的 Apache2 日志。 正如您所看到的,用户正在被传递...如何验证环境变量REMOTE_USER
/ HTTP_REMOTE_USER
是否设置正确? 我可以尝试其他任何故障排除步骤吗?
zammad.example.com:443 10.1.4.197 - - [09/Aug/2018:09:39:23 -0500] "GET /auth/sso HTTP/1.1" 401 855 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"
zammad.example.com:443 10.1.4.197 - [email protected] [09/Aug/2018:09:39:23 -0500] "GET /auth/sso HTTP/1.1" 302 969 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"
zammad.example.com:443 10.1.4.197 - - [09/Aug/2018:09:39:23 -0500] "GET / HTTP/1.1" 200 1757 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"
zammad.example.com:443 10.1.4.197 - - [09/Aug/2018:09:39:23 -0500] "POST /api/v1/signshow HTTP/1.1" 200 15874 "https://zammad.example.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"
zammad.example.com:443 10.1.4.197 - - [09/Aug/2018:09:39:24 -0500] "GET /api/v1/translations/lang/en-us?_=1533825563736 HTTP/1.1" 200 720 "https://zammad.example.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"
zammad.example.com:443 10.1.4.197 - - [09/Aug/2018:09:39:24 -0500] "GET /assets/images/fed16b83d2e87ea36cea961d6d8a2101.png HTTP/1.1" 304 210 "https://zammad.example.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"
你好呀,
我和@jeremyj563 有同样的错误。
有没有办法用 SSO 登录?
谢谢你的回复
我也对 SSO 感兴趣。
为 SSO 实施 Azure AD 将是一个选项。
我们也很感兴趣。 我目前正在 Univention 测试应用程序中心测试该应用程序,我感到非常兴奋。
抱歉打扰了您:不适用于 univention,因为 docker compose 使用 nginx。
注意:我们必须警告您以本问题或其他问题中描述的任何方式使用 SSO 实现。 此处提供的更改包含严重的安全漏洞。 此漏洞将为未通过身份验证的用户保留通过 SSO 创建的会话。 这意味着未经身份验证的用户可以接管先前为用户创建的 SSO 会话(在 Zammad 上下文中)。
我们强烈建议在此问题解决之前禁用 SSO。
然而,好消息是我们开始着手正式的 SSO 实施。
感谢@rlue,单点登录终于进入了develop
! 几周后,它将成为即将发布的 3.2 版本的一部分。 请注意,使用develop
分支更新 Zammad 实例当前已损坏。 我们正在为此努力。 但是,您可以在新的 Zammad(测试)系统中测试 SSO。
@MrGeneration您能否在下一个空闲时段扩展文档以涵盖 SSO 配置?
有跟进。 请注意上面的提交。
不幸的是,我们在创建文档时遇到了一些障碍😞 以拉取请求的形式对https://github.com/zammad/zammad-admin-documentation 的贡献将不胜感激。
API 端点是/auth/sso
。 我们希望存在以下其中一项并包含用户的login
属性:
REMOTE_USER
HTTP_REMOTE_USER
X-Forwarded-User
如果您有任何问题,请告诉我。 我很高兴回答他们。
现在关闭。
为了完整性:SSO 文档目前正在进行 QA。
https://github.com/zammad/zammad-documentation/pull/147
最有用的评论
感谢@rlue,单点登录终于进入了
develop
! 几周后,它将成为即将发布的 3.2 版本的一部分。 请注意,使用develop
分支更新 Zammad 实例当前已损坏。 我们正在为此努力。 但是,您可以在新的 Zammad(测试)系统中测试 SSO。@MrGeneration您能否在下一个空闲时段扩展文档以涵盖 SSO 配置?