Table des matières

SOGo

SOGo supporte l'authentification CAS, il est donc possible de s'authentifier dessus à travers LemonLDAP::NG.

Activer le serveur CAS sur LemonLDAP::NG

La première chose à faire est d'activer le service CAS depuis l'interface de gestion de LemonLDAP::NG (issuerDBCASActivation)

CASifier votre serveur IMAP

Cette partie dépend du serveur IMAP que vous utilisez. Pour dovecot par exemple, il faut s'assurer d'utiliser le driver pam

passdb {
  driver = pam
}

Il faut ensuite avoir installé pam_cas (vous pouvez trouver une version pour EL5 et une pour EL6 dans notre dépôt de RPMS). La configuration de pam_cas est assez simple, et se passe dans /etc/pam_cas.conf

Exemple:

pam_cas.conf
host auth.domain.tld
uriValidate /cas/proxyValidate
trusted_ca /etc/pki/tls/certs/cacert.pem

Vous pouvez tester que pam_cas peut valider le certificat de votre serveur CAS avec la commande castest. Si tout est OK, vous devriez obtenir un message comme ceci:

configFile = /etc/pam_cas.conf
---------------------------------------------------------------
                    Parameters from test : 

host = auth.doain.tld
port = 443
uri = /cas/proxyValidate
ssl = on
trusted_ca = /etc/pki/tls/certs/cacert.pem
debug = localtest
no proxy
service = https://foo.fr
ticket = PT-1-xxx


---------------------------------------------------------------

We use SSL as configured
We connect to host auth.domain.tld
---- request :
GET /cas/proxyValidate?ticket=PT-1-xxx&service=https://foo.fr HTTP/1.1
Connection: close
Host: auth.domain.tld


---- response :
HTTP/1.1 200 OK
Date: Sat, 21 Sep 2013 16:35:49 GMT
Server: Apache
Content-Length: 184
Vary: User-Agent
Connection: close
Content-Type: application/xml

<cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'>
        <cas:authenticationFailure code="INVALID_TICKET">
                Ticket not found
        </cas:authenticationFailure>
</cas:serviceResponse>

---------------------------------------------------------------

invalid ticket : bad CAS ticket
Si vous obtenez un message d'erreur concernant la vérification du certificat, ça ne sert à rien d'aller plus loin. pam_cas doit pouvoir valider le certificat de votre serveur CAS. Il faut que le paramètre trusted_ca pointe sur la CA qui a signé le certificat utilisé par votre serveur LemonLDAP::NG

Il faut ensuite indiquer à la pile pam qu'une authentification par le module cas est suffisant (/etc/pam.d/dovecot):

auth    sufficient      pam_cas.so -simap://localhost -f/etc/pam_cas.conf
auth       required     pam_nologin.so
auth       include      system-auth
account    include      system-auth
session    include      system-auth

Configurer SOGo

La configuration de SOGo est assez simple, il suffit d'ajouter trois directives dans votre fichier (en général /etc/sogo/sogo.conf ou /var/lib/sogo/GNUstep/Defaults/.GNUstepDefaults):

        SOGoAuthenticationType = cas;
        SOGoCASServiceURL = "https://auth.domain.tld/cas/";
        SOGoCASLogoutEnabled = YES;

Et redémarrez SOGo en suivant

Ajustement configuration apache

Il reste un dernier détail à régler. Il y a un bug dans la gestion des entêtes HTTP dans SOPE (utilisé par SOGo), pour contourner ce problème, on va ajouter un filtre en perl qui ajoutera l'entête Content-Length aux réponses envoyées par LemonLDAP::NG à SOGo.

FilterChangeLength.pm
package Apache::FilterChangeLength;
 
use strict;
use warnings FATAL => 'all';
 
use Apache2::RequestRec ();
 
use APR::Table ();
use APR::Bucket ();
use APR::Brigade ();
 
use base qw(Apache2::Filter);
 
use Apache2::Const -compile => qw(OK);
use APR::Const     -compile => ':common';
 
sub handler {
    my ($filter, $bb) = @_;
    my $ctx = $filter->ctx;
    my $data = exists $ctx->{data} ? $ctx->{data} : '';
    $ctx->{invoked}++;
    my ($bdata, $seen_eos) = flatten_bb($bb);
    $data .= $bdata if $bdata;
 
    if ($seen_eos) {
        my $len = length $data;
        $filter->r->headers_out->set('Content-Length', $len);
        $filter->print($data) if $data;
    }
    else {
        # store context for all but the last invocation
        $ctx->{data} = $data;
        $filter->ctx($ctx);
    }
 
    return Apache2::Const::OK;
}
sub flatten_bb {
    my ($bb) = shift;
    my $seen_eos = 0;
 
    my @data;
    for (my $b = $bb->first; $b; $b = $bb->next($b)) {
        $seen_eos++, last if $b->is_eos;
        $b->read(my $bdata);
        push @data, $bdata;
    }
    return (join('', @data), $seen_eos);
}
 
1;

Placez le fichier ci-dessus dans un répertoire contenu dans @INC (par exemple /usr/lib/perl5/site_perl/Apache ou /usr/share/perl5/site_perl/Apache), puis, éditez la configuration du vhost du portail LemonLDAP::NG (dans cet exemple, auth.domain.tld) pour y ajouter une directive de ce style:

    <Location /cas>
        BrowserMatch "SOPE/" downgrade-1.0
        PerlOutputFilterHandler Apache::FilterChangeLength
    </Location

Et voilà, tout devrait maintenant fonctionner. Pour les autres détails, vous pouvez regarder la documentation officielle de SOGo