Zammad: 单点登录

创建于 2017-06-20  ·  30评论  ·  资料来源: zammad/zammad

信息:

  • 二手 Zammad 版本:最新
  • 使用的Zammad安装源:rpm
  • 操作系统:CentOS 7
  • 浏览器 + 版本:Firefox 最新

这是一个关于单点登录的问题。 我们在公司中使用 Microsoft Active Directory,并且使用 ldap-sync 登录工作正常。
我想知道 SSO 是否可行。 我已经尝试使用 nginx 设置它,但它不起作用:-(

有没有简单的方法来做到这一点? 也许你们中的一个人已经使用 SSO 设置了 Zammad? 如果有人有如何实施的说明或一些示例,那就太好了。

先感谢您。

authentication documentation feature backlog prioritised by payment verified

最有用的评论

感谢@rlue,单点登录终于进入了develop ! 几周后,它将成为即将发布的 3.2 版本的一部分。 请注意,使用develop分支更新 Zammad 实例当前已损坏。 我们正在为此努力。 但是,您可以在新的 Zammad(测试)系统中测试 SSO。

@MrGeneration您能否在下一个空闲时段扩展文档以涵盖 SSO 配置?

所有30条评论

@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我曾使用omn​​iauth-kerberos进行过实现。

但是,我的实现要求您每次希望访问 Zammad 时都登录(当然使用您的 Kerberos 凭据),而不是使用用户机器已经生成的“kerberos 票证”。 (例如,来自kinit或任何其他“kerberos 票务客户端”)

我希望这适用于使用 kerberos 进行基本登录以避免出现 hacky 情况。 😊

尽管我觉得对于具有“一次性登录/身份验证”的高级配置(例如,使用kinit一次并进行身份验证),然后您 ssh/登录到 zammad/内部网站/ftp 所有服务器而无需再进行身份验证( SPNEGO/GSSAPI) 只能通过完全配置您现在正在做的前端网络服务器(如 Apache)来完成。

screen shot 2018-02-27 at 8 37 57 pm
screen shot 2018-02-27 at 8 48 00 pm

@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 插件填充得很好。

  • 作为@EDVLeer,当我到达/auth/sso我在 apache 日志中看到用户登录(所以它可以工作),但我再次回到登录屏幕。
  • 我尝试了用zammad/app/controllers/sessions_controller.rb ( @pikachuprof hack)@EDVLeer ,要么我把它放在错误的地方,要么后来更改了代码,我们现在必须把它放在其他地方。
  • 我尝试了@pikachuprof hack 不重定向到/如果有cookie,没有运气
  • 我现在没有想法了:D

所以...

  • 我必须在 Zammad 中激活插件或其他东西才能使其工作吗?
  • 它是代码中的错误吗? (可能是的,如果我们必须更改源代码)
  • url /auth/sso在最新版本中仍然有效吗?
  • 或者是否有关于如何使用 Zammad 实施 SSO 的官方文档?

笔记:

Kerberos 的配置

<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>

X509 SSL 证书配置

注意:您必须将 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”端点后,我也被重定向到登录页面。 这是我所做的一切:

  • 在 Debian 9 (stretch) 上安装 Zammad
  • 配置的 ldap 集成(映射samaccountname -> login
  • 确认可以使用 AD 用户名/密码登录
  • 在 AD 中创建的服务帐户(简称zammad
  • 创建映射到zammad服务帐户的密钥表
  • 配置的 kerberos 客户端/领域(在/etc/krb5.conf
  • 使用kinit验证的 kerberos 环境
  • 验证 keytab 是否正常工作(能够从 KDC 获取 TGT)
  • 配置的 Apache2 vhost(如 cohausz 所述)
  • 修改后的sessions_controller.rb (由 pikachuprof 解释)
  • 向 vhost 配置添加了标头规则(如 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属性:

  • ENV REMOTE_USER
  • ENV HTTP_REMOTE_USER
  • 标题X-Forwarded-User

如果您有任何问题,请告诉我。 我很高兴回答他们。

现在关闭。

为了完整性:SSO 文档目前正在进行 QA。
https://github.com/zammad/zammad-documentation/pull/147

此页面是否有帮助?
0 / 5 - 0 等级