====== SOGo ======
[[http://sogo.nu|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 [[http://repo.firewall-services.com/centos/5/|EL5]] et une pour [[http://repo.firewall-services.com/centos/6/|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:
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
Ticket not found
---------------------------------------------------------------
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.
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:
BrowserMatch "SOPE/" downgrade-1.0
PerlOutputFilterHandler Apache::FilterChangeLength
Et voilà, tout devrait maintenant fonctionner. Pour les autres détails, vous pouvez regarder la documentation officielle de SOGo