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