Zammad: Single Sign On

Criado em 20 jun. 2017  ·  30Comentários  ·  Fonte: zammad/zammad

Infos:

  • Versão Zammad usada: mais recente
  • Fonte de instalação Zammad usada: rpm
  • Sistema operacional: CentOS 7
  • Navegador + versão: Firefox mais recente

Esta é uma pergunta sobre o Single Sign On. Estamos usando um Microsoft Active Directory em nossa empresa e o login funciona bem com ldap-sync.
Estou me perguntando se o SSO seria possível. Já tentei configurá-lo usando o nginx, mas simplesmente não funcionou :-(

Existe uma maneira fácil de fazer isso? Talvez um de vocês já tenha configurado o Zammad com SSO? Seria bom se alguém tivesse uma instrução ou alguns exemplos de como implementá-la.

Agradeço antecipadamente.

authentication documentation feature backlog prioritised by payment verified

Comentários muito úteis

O logon único finalmente atingiu develop graças a @rlue ! Ele fará parte do próximo lançamento 3.2 em algumas semanas. Observe que a atualização das instâncias do Zammad usando o branch develop está interrompida no momento. Estamos trabalhando nisso. No entanto, você pode testar o SSO em um novo sistema Zammad (teste).

@MrGeneration, você pode estender a documentação para cobrir a configuração de SSO em seu próximo intervalo de tempo livre?

Todos 30 comentários

Olá @ jaeger13 ,

Claro que isso é possível. Mas você tem que usar Apache httpd com mod_auth_kerb, com uma configuração como esta:

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

Dependendo do atributo uid escolhido (ist sAMAccountName no exemplo acima), ele funcionará imediatamente.

E você tem que configurar o Apache como o proxy reverso em vez de nginx.

Contanto que o módulo auth retorne o nome de usuário autenticado na variável de ambiente REMOTE_USER ou HTTP_REMOTE_USER, é possível usar outros módulos como auth_mellon etc.

hth, Roy

Ei @rkaldung ,

obrigado pela sua resposta rápida. Vou tentar com o Apache e suas instruções :-)
Embora eu desejasse que houvesse uma maneira de fazer isso com o nginx :-(

Obrigado!

Olá @ jaeger13 ,

Existe uma maneira com o nginx, mas sem testes no momento. @martini Seus dois centavos nisso?

Oi @rkaldung

Você pode descrever a maneira como o NGINX? Isso também me interessaria muito. Obrigado.

Olá @ scimitar4444

@rkaldung significa uma implementação no nível de trilhos como https://github.com/jgraichen/omniauth-kerberos - mas isso precisa ser implementado no Zammad primeiro. 🤖

-Martin

@martini É sempre só um commit 😜

Tenho tentado fazer o SSO funcionar usando suas instruções. No entanto, navegar em http: //myserver.mydom.local/auth/sso está me levando de volta à página de login. . . estou esquecendo de algo ?

Tentar usar o (Stanford) Webauth (e o usuário ldap) resulta no mesmo erro, após o login bem-sucedido no SSO, recebo o prompt zammad para fazer o login.
Usando: Ubuntu 16.04; Zammad 2.2.0; Apache, MariaDB; (REMOTE_USER é definido por webauth)

@rkaldung você sabe sth. novo?

Encontrou uma solução alternativa:

Problema: o módulo necessário em lib / sso / env.rb é chamado sem o request.env necessário do PUMA, portanto, 'REMOTE_USER' não está disponível.

Gambiarra:
Adicione 'REMOTE_USER' de request.env para ENV em 'zammad / app / controllers / sessions_controller.rb' dentro da função 'create_sso'

   # export required environment variables for sso
   ENV['REMOTE_USER'] = request.env['REMOTE_USER']
   ENV['HTTP_REMOTE_USER'] = request.env['HTTP_REMOTE_USER']

@martini pode ser um problema com uma versão mais recente do PUMA?

EDITAR: Você deve adicionar uma regra correspondente para definir o campo de cabeçalho em httpd.conf para fazê-lo funcionar:

RequestHeader merge REMOTE_USER %{REMOTE_USER}s

Editar 08-01-2018:
Tudo funciona agora com a solução alternativa do pikachuprof. Foi um erro de digitação no Config /etc/krb5.conf.

Infos:
Versão Zammad usada: mais recente
Fonte de instalação Zammad usada: rpm
Sistema operacional: CentOS 7
Navegador + versão: Firefox mais recente

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>

Quando abro https: // / auth / sso e "KrbLocalUserMapping on", meu navegador mostra o seguinte erro:Erro do Servidor InternoO servidor encontrou um erro interno ou configuração incorreta e não foi capaz de concluir sua solicitação.Entre em contato com o administrador do servidor em admin @ para informá-los sobre a hora em que esse erro ocorreu e as ações que você executou antes desse erro.
Mais informações sobre esse erro podem estar disponíveis no log de erros do servidor.

Se eu definir "KrbLocalUserMapping off", meu navegador é redirecionado para https: // * / # login

Tento definir "RequestHeader merge REMOTE_USER% {REMOTE_USER} s" mas nada muda.

Espero que alguém possa ajudar!

Adicionamos outra pequena solução alternativa:

RewriteEngine   On
RewriteCond     %{HTTP_COOKIE} !^.*zammad_session.*$
RewriteRule     ^/$ https://%{SERVER_NAME}/auth/sso [R,L]

Essas linhas no Apache-config redirecionam '/' para '/ auth / sso' apenas enquanto nenhum cookie zammad estiver definido. Isso permite o redirecionamento para a página de login do SSO sem criar um loop infinito, resultando em 'Erro interno do servidor'.

Não consigo fazer funcionar. . . Os logs do apache mostram meu nome de usuário para / auth / sso, então minha solicitação é redirecionada para / e meu nome de usuário desaparece. . . talvez eu tenha cometido um erro ao editar a função create_sso !? Alguém pode me dar uma dica ?

@pikachuprof Eu trabalhei em uma implementação usando omniauth-kerberos .

No entanto, minha implementação requer que você faça o login toda vez que desejar acessar o Zammad (usando suas credenciais Kerberos, é claro) em vez de usar o "tíquete kerberos" que já é gerado pela máquina do usuário. (por exemplo, de kinit ou qualquer outro "cliente de ingressos Kerberos")

Espero que isso seja adequado para login básico usando Kerberos para evitar situações de hacky. 😊

Embora eu ache que para configurações avançadas com 'login / autenticação única' (por exemplo, usando kinit uma vez e autentique) e então você ssh / login para zammad / sites internos / ftp todos os servidores sem autenticar mais ( SPNEGO / GSSAPI) só pode ser feito configurando totalmente o servidor web frontend (como o Apache) que você está fazendo agora.

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

@muhammadn , usamos um serviço de logon único baseado em Kerberos chamado Stanford Webauth (mod_auth_webauth). Ele permite o login via senha (no navegador) (e define um cookie contendo um Kerberos-Token para SSO), mas não transfere senhas de usuário para o serviço - apenas para o nosso 'WebKDC'.

A autenticação deve ser feita pelo Apache nesta configuração, é claro - mas Zammad deve usar a variável REMOTE_USER para permitir que qualquer um desses mecanismos "webserver-auth" funcione (ou sth. Semelhante?), Bem como fornecer um método para quebrar fora do "loop de login" sem depender da verificação de um cookie, o que parece um pouco não confiável.

@pikachuprof Eu empurrei minha implementação em https://github.com/muhammadn/zammad/commit/7e8e01bff8226f2d74e80cbc307416db9bf2ac1d

Essa implementação não é oficialmente um recurso zammad, mas apenas para você experimentar usando a biblioteca omniauth-kerberos. Você não precisará configurar o apache com suporte a Kerberos, pois tudo será controlado por Zammad (é uma implementação em nível de trilhos) e não precisará de REMOTE_USER no cabeçalho ou mesmo de mod_auth_webauth.

Tudo que você precisa é ter seu krb5.conf configurado corretamente.

exemplo:

[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

Você pode postar quaisquer questões sobre isso em https://github.com/muhammadn/zammad/issues, uma vez que não é uma implementação oficial.

No entanto, observe que para fazer o login com zammad você precisa ter o reino em maiúsculas: por exemplo: [email protected]

Alguma chance de podermos usar tíquetes Kerberos existentes para autenticação? Nossos usuários estão acostumados a uma solução confortável e não tenho chance de mudar para o zammad até que o SSO funcione de verdade.

O mesmo problema para mim. Consegui fazer uma conexão SSO do lado do Apache (que preenche REMOTE_USER ) com 2 métodos (Kerberos e certificado de cliente SSL X509). E minhas contas de usuários são bem preenchidas, com o plugin Zammad LDAP.

  • Como @EDVLeer, quando alcanço /auth/sso vejo o login do usuário no log do apache (então funciona), mas volto na tela de login novamente.
  • Eu tentei o hack de escrever em zammad/app/controllers/sessions_controller.rb ( @pikachuprof hack), mas como @EDVLeer , ou coloquei em um lugar errado, ou o código mudou posteriormente e devemos colocá-lo em outro lugar agora.
  • Eu tentei o hack @pikachuprof de não redirecionar para / se houver um cookie, sem sorte
  • Agora estou sem ideias: D

Assim...

  • devo ativar um plugin ou algo no Zammad para que funcione?
  • É um bug no código? (Talvez sim, se tivermos que alterar o código-fonte)
  • O url /auth/sso ainda é válido nos últimos lançamentos?
  • Ou existe um documento oficial sobre como implementar o SSO com Zammad?

Notas:

Configuração para 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>

Configuração para certificado SSL X509

Nota: você deve anexar seu certificado público CA (.crt) em seu arquivo Apache 'CA Bundle' ( SSLCACertificateFile ) para que o Apache possa verificar se os certificados dos clientes estão OK

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

Eu poderia "resolver" o problema do SSO, acho que definitivamente não é a maneira perfeita, mas funciona.

Meu ambiente é a versão mais recente do zammad (2.5) com Apache2 2.4 com Postgres. Após a configuração do SSO com mod_auth_kerb, tenho que fazer o seguinte.

Eu configurei o LDAP para sincronizar nossos funcionários. Mapeei SAMACOUNTNAME para o nome de login. Por exemplo, meu nome de usuário do Windows ist schman. Então eu poderia fazer o login com este nome de usuário (não com o e-mail).

Depois disso, editei o sessions_controller.rb e adicionei a seguinte linha (na linha 173)

ENV['HTTP_REMOTE_USER']=request.env['HTTP_REMOTE_USER']

então Zammad conhece o HTTP_REMOTE_USER. Depois disso, o login não funciona. Porque o valor de HTTP_REMOTE_USER agora é [email protected]. Para corrigir isso, adiciono a seguinte linha à configuração do vHost.

RequestHeader edit REMOTE_USER "@DOMAIN.AT" ""

Após reiniciar (Apache2 e Zammad), pude fazer login no SSO com http://zammad.domain.at/auth/sso

Se alguém fala alemão, eu escrevo um post no meu blog .

@schmanat como você resolveu o "loop de login" ou deixou o usuário usar a URL "/ auth / sso"?

Por enquanto, os usuários obtêm o url / auth / sso.

Mas esta é a próxima coisa que eu gostaria de aprofundar. Não funcionou a alternativa de sua resposta a alguns comentários acima (RewriteRule)?

Sim, é verdade, mas não é muito confiável.

Obrigado a todos por seu trabalho nisso e por documentar o que você fez. Infelizmente, estou perdido. Como outros já experimentaram, eu também estou sendo redirecionado para a página de login depois de acessar o endpoint "auth / sso". Aqui está tudo o que fiz:

  • Zammad instalado no Debian 9 (trecho)
  • integração ldap configurada (mapeado samaccountname -> login )
  • confirmado como capaz de fazer login com nome de usuário / senha AD
  • criou uma conta de serviço no AD (simplesmente chamada de zammad )
  • criado keytab mapeado para zammad conta de serviço
  • cliente / reino kerberos configurado (em /etc/krb5.conf )
  • ambiente kerberos verificado com kinit
  • verificado se o keytab está funcionando (capaz de obter o TGT do KDC)
  • vhost Apache2 configurado (conforme explicado por cohausz)
  • modificado sessions_controller.rb (conforme explicado por pikachuprof)
  • adicionada regra de cabeçalho à configuração do vhost (conforme explicado por pikachuprof)

Também tentei as soluções oferecidas por schmant, mas nada parece ajudar.

Abaixo estão meus logs do Apache2. Como você pode ver, o usuário está sendo passado ... Como posso verificar se as variáveis ​​de ambiente REMOTE_USER / HTTP_REMOTE_USER estão sendo definidas corretamente? Posso tentar outras etapas de solução de problemas?

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" 

Olá,

tenho o mesmo erro que @ jeremyj563.

Existe alguma solução para fazer o login com SSO?

Obrigado pela resposta

Também estou interessado no SSO.

Seria uma opção de implementar o Azure AD para SSO.

Também estamos muito interessados. Atualmente estou testando o aplicativo no Univention Test App Center e estou muito animado.

Desculpe por chatear você: não funcionará no univention, pois o docker compose usa o nginx.

ATENÇÃO : Devemos alertá-lo para usar a implementação do SSO de qualquer forma descrita neste ou em outros problemas. As alterações fornecidas aqui contêm uma vulnerabilidade de segurança séria. Esta vulnerabilidade irá persistir sessões criadas via SSO para usuários não autenticados. Isso significa que é possível que usuários não autenticados assumam a sessão SSO criada anteriormente para um usuário (no contexto Zammad).

É altamente recomendável desabilitar o SSO até que esse problema seja resolvido.

No entanto, a boa notícia é que começamos a trabalhar na implementação oficial do SSO.

O logon único finalmente atingiu develop graças a @rlue ! Ele fará parte do próximo lançamento 3.2 em algumas semanas. Observe que a atualização das instâncias do Zammad usando o branch develop está interrompida no momento. Estamos trabalhando nisso. No entanto, você pode testar o SSO em um novo sistema Zammad (teste).

@MrGeneration, você pode estender a documentação para cobrir a configuração de SSO em seu próximo intervalo de tempo livre?

Houve um acompanhamento. Por favor, observe o commit acima.

Infelizmente, enfrentamos alguns obstáculos ao criar a documentação 😞 Uma contribuição na forma de um Pull Request para https://github.com/zammad/zammad-admin-documentation seria muito apreciada.
O endpoint da API é /auth/sso . Esperamos que um dos seguintes esteja presente e contenha o atributo login de um usuário:

  • ENV REMOTE_USER
  • ENV HTTP_REMOTE_USER
  • Cabeçalho X-Forwarded-User

Deixe-me saber se você tiver alguma dúvida. Fico feliz em respondê-los.

Fechando agora.

Para completar: a documentação do SSO está atualmente em controle de qualidade.
https://github.com/zammad/zammad-documentation/pull/147

Esta página foi útil?
0 / 5 - 0 avaliações