cvs co ya7ans

Tags: , ,
No Comments »

fouyou, ce voyage dans le passé…

Il y a 7 ans, je commettais ceci. EasyLDAP était une librairie qui permettait d’implémenter une interaction LDAP en C assez simplement. Mais son but final était plus concret; en effet, en 2001, FreeBSD ne possédait pas de port nss_ldap, son architecture nss était quelque peu aride, et l’un de mes projets dans mon job de l’époque, c’était de trouver le moyen de centraliser l’authentification de nos serveurs FreeBSD, et de préférence, via LDAP.
La sale magouille que j’avais trouvé à l’époque, c’était d’utiliser la variable LD_PRELOAD et de préloader, donc, la librairie eldap dans laquelle j’avais redéfini les fonctions getpwnam, getpwuid, getgrnam etc etc…
Et ça marchait ! :)

Aujourd’hui, FreeBSD et NetBSD sont tous deux capables de loader des plugins nss_ldap et pam_ldap, c’est tout beau tout propre, et il n’y a plus besoin de bidouiller de trucs infames pour centraliser ses utilisateurs.
Sauf sous OpenBSD.
Et c’est la que les vapeurs du passé ressurgissent; deux des domU de zone0 sont des OpenBSD, l’un d’eux plus particulièrement, est destiné à heberger moult shells des membres contributeurs du groupe. jusqu’à présent, nous avions jeté notre dévolu sur cette methode, qui présente le désavantage de devoir tout de même ajouter l’utilisateur au fichier /etc/passwd. Et puis de fil en aiguille, je me rappelle de mon “fameux” EasyLDAP.
D’abord à tatons, je regarde mon code de loin, je fixe les autotrucs permettant sa compilation, et apres quelques ajustements, ce dernier compile. J’ecris sans trop y croire ce bout de code de verification :

#include <stdio.h>

#include <sys/types.h>
#include <pwd.h>

int
main(int argc, char *argv[])
{
        if (getpwnam(argv[1]) != NULL)
                printf("%s exists\\n", argv[1]);
        else
                printf("%s does NOT exists\\n", argv[1]);

        return 0;
}

Je compile puis quelques SEGFAULT / corrections plus loin, je tente ma chance :

[~/src/eldap] LD_PRELOAD=.libs/libeldap.so.1.1 ./testpw pinpin
pinpin exists

Je n’en crois pas mes yeux, ça fonctionne toujours !
Quelques ajustements plus tard, j’arrivais à me connecter via OpenSSH-lpk (clé publique dans une db LDAP, donc) avec un utilisateur absent du fichier /etc/passwd.

J’ai donc entrepris de faire subir à ce vieux code mal indenté, peu sur et emprunt de vapeurs de gin, un bon gros lifting. Le site est de nouveau en ligne, le CVS ne nouveau accessible, et j’ai revampé un peu le codebase. Il est à peu près certain que ce travail n’aura d’interet que le temps qu’OpenBSD n’integre une vraie abstraction dans la libc, mais il est toujours agréable de jouer avec ces notions. Si le cœur vous en dit, vous savez ou me trouver.

nsswitch.conf, LDAP et NetBSD

Tags: ,
1 Comment »

NetBSD possède dans pkgsrc les packages nss_ldap et pam_ldap. J’utilise essentiellement OpenSSH-lpk pour l’authentification par clé des utilisateurs virtuels, de fait je n’utilise pas ou peu pam_ldap.
Reste à faire comprendre au système qu’il doit utiliser une base LDAP pour verifier si un utilisateur est valide ou pas. Ceci se réalise grace au fichier /etc/nsswitch.conf, et plus paticulièrement, aux directives suivantes :

group:          files ldap
passwd:         files ldap

Qui précisent de verifier l’existence d’un utilisateur dans les fichiers plats, puis dans une base LDAP. Cette dernière est pointée par le fichier /usr/pkg/etc/nss_ldap.conf dans lequel je me contente de renseigner les directives :

host 192.168.0.1
base dc=gcu,dc=gcu-squad,dc=org

Les informations n’ayant besoin que d’être lues, un bind anonyme est suffisant.

ldap un jour…

Tags: , ,
No Comments »

Et c’est au tour d’apache. Très très simple :

cd /usr/ports/www/mod_vhost_ldap/
make install clean

Si votre apache n’est pas compilé avec le support LDAP vous vous ferez insulter.
À noter que, contrairement à ce que dit le port :

## WITH_LDAP: Enable LDAP support (mod_auth_ldap) (implies WITH_LDAP_MODULES)

Si je ne place pas explicitement WITH_LDAP=yes et WITH_LDAP_MODULES=yes, je me prend un unresolved symbol au démarrage d’apache.

Ajoutez maintenant dans votre httpd.conf (dans cet ordre) :

LoadModule ldap_module libexec/apache2/mod_ldap.so
LoadModule vhost_ldap_module libexec/apache2/mod_vhost_ldap.so

puis

VhostLDAPEnabled on
VhostLDAPUrl "ldap://127.0.0.1/ou=votre,dc=basedn"
VhostLdapBindDN "cn=utilisateur,ou=qui,dc=binde"
VhostLDAPBindPassword "mot de passe convivial"

Copiez le schéma fourni /usr/local/share/doc/mod_vhost_ldap/mod_vhost_ldap.schema dans /usr/local/etc/openldap/schema/ et ajoutez

include /usr/local/etc/openldap/schema/mod_vhost_ldap.schema

dans votre slapd.conf

Evidemment, redémarrez slapd et httpd.

Il ne vous reste plus qu’à provisionner avec votre editeur LDAP favori. Les attributs sont triviaux, par exemple :

# jard.in, apache, jardin
dn: apacheServerName=jard.in,ou=apache,dc=jardin
objectClass: top
objectClass: apacheConfig
apacheServerName: jard.in
apacheDocumentRoot: /home/www

Je regrette toutefois que l’auteur n’ait pas prévu des champs relatifs aux logfiles, j’ai du utiliser une vieille bidouille à base de LogFormat :

LogFormat "%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog /var/log/httpd-access-vhosts.log combined

Pour faire passer sur le fichier httpd-access-vhosts.log le script split-logfile fourni avec apache2 qui sépare ce type de log fonction du vhost. Par très classe.

cache-cache

Tags: , , ,
1 Comment »

Suite de mes aventures dans le monde merveilleux de la haute dispo grace à OpenLDAP.
Conseil du jour: bind sdb ldap, c’est une tuerie (/usr/ports/dns/bind9-sdb-ldap).
Hint dépatouillé par monseigneur spoty: ne pas oublier de créer un etc/hosts dans le chroot de bind, le cas écheant il stalle comme une grosse merde avant de contacter le serveur LDAP.
Un peu de conf :

voici une zone classique servie par un fichier plat:

zone "imil.net" {
type master;
file "zone/imil.net";
};

voici un zone servie par LDAP

zone "imil.net" {
type master;
database "ldap ldap://127.0.0.1/ou=bind,dc=imil,dc=net 172800";
};

la déjà, tu kiffes, mais regarde ca :

# bind, imil.net
dn: ou=bind,dc=imil,dc=net
objectClass: top
objectClass: organizationalUnit
ou: bind
# @, bind, imil.net
dn: relativeDomainName=@,ou=bind,dc=imil,dc=net
objectClass: dNSZone
relativeDomainName: @
zoneName: imil.net
dNSTTL: 3600
dNSClass: IN
nSRecord: ns1.imil.net.
nSRecord: ns2.gcu.info.
mXRecord: 5 mail.imil.net.
mXRecord: 10 mx-cache.imil.net.
sOARecord: ns1.imil.net. root.imil. 2005101204 3600 1800 604800 8640 0
# mail, bind, imil.net
dn: relativeDomainName=mail,ou=bind,dc=imil,dc=net
objectClass: dNSZone
relativeDomainName: mail
zoneName: imil.net
dNSTTL: 86400
dNSClass: IN
aRecord: 123.123.123.123

Alors pardon mais, woua.

chula, chupala

Tags: , , , , , ,
No Comments »

note: cette nouvelle est sujette à modifications en fonction de mon avancement dans la mise en place et la configuration de ma plateforme

Quelques liens glânés de-ci de-la pour monter une plate-forme mail couillue :

. SMTP Auth avec sendmail et FreeBSD
. SMTP Auth, la doc officielle de sendmail.org
. Un overview de l’integration SASL par l’ami asyd
. l’excellent projet MiniVisp de l’ami Hug
. FABULEUSE doc sur l’interfacage sendmail / LDAP
. Sendmail + Auth + TLS
. Utilisation de STARTTLS avec sendmail et l’accessdb
. la liste des parametres compris par confLDAP_DEFAULT_SPEC (binddn, password…)
. à la fin de ce tuto vous trouverez de bons exemples de virtuser LDAP
. FreeBSD fast and secure mail server using sendmail and imap-uw (eeeet si)
.
Secure Email Using Cyrus IMAP, Sendmail, and SASLv2
. Le classique mais toujours efficace OpenLDAP QuickStart Guide
. Le NSS / PAM LDAP HOWTO pour FreeBSD 5.x
. saslauthd + LDAP
. Des astuces pour rendre sendmail plus agressif
. les migration tools de padl.com
. OpenLDAP TLS HOWTO
. Installer le milter DomainKey
. Encore une doc sur domainkey

Voici la partie relative de mon /etc/make.conf

SENDMAIL_CFLAGS=-I/usr/local/include -DSASL=2 -DLDAPMAP -DSTARTTLS
SENDMAIL_LDFLAGS=-L/usr/local/lib
SENDMAIL_LDADD=-lsasl2 -lldap -llber

Et les parties reliées de mon sendmail.mc

define(`confLDAP_DEFAULT_SPEC', ` -h localhost -b dc=imil,dc=net')
FEATURE(ldap_routing)
LDAPROUTE_DOMAIN(`mail.imil.net')

[...]

TRUST_AUTH_MECH(`GSSAPI DIGEST-MD5 LOGIN')
define(`confDEF_AUTH_INFO', `GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN')
define(`confAUTH_MECHANISMS', `GSSAPI DIGEST-MD5 LOGIN')
dnl p: uniquement TLS pour l'authentification type Login
dnl A: Use the AUTH= parameter for the MAIL FROM command only when authentication succeeded.
define(`confAUTH_OPTIONS', `A p')

[...]

define(`confCACERT_PATH', `/etc/mail/ssl')dnl
define(`confCACERT', `/etc/mail/ssl/cacert.pem')dnl
define(`confSERVER_CERT', `/etc/mail/ssl/sendmail.pem')dnl
define(`confSERVER_KEY', `/etc/mail/ssl/sendmail.pem')dnl
define(`confCLIENT_CERT', `/etc/mail/ssl/sendmail.pem')dnl
define(`confCLIENT_KEY', `/etc/mail/ssl/sendmail.pem')dnl

Quelques trucs :

Dans le saslauthd.conf, ne pas oublier :

ldap_search_base: dc=domaine,dc=com
ldap_filter: uid=%u
# pour activer TLS
ldap_start_tls: yes

Pour bénéficier de toutes les propriétés nécessaires, s’assurer d’avoir les includes suivants dans son slapd.conf :

include /usr/local/etc/openldap/schema/core.schema
include /usr/local/etc/openldap/schema/cosine.schema
include /usr/local/etc/openldap/schema/inetorgperson.schema
include /usr/local/etc/openldap/schema/nis.schema
include /usr/local/etc/openldap/schema/misc.schema

Le module ldap_routing de sendmail communique par defaut en LDAPv2, il faut ajouter l’option “-w 3″ à votre confLDAP_DEFAULT_SPEC pour le faire communiquer en LDAPv3.

Mon /etc/ldap.conf, linké à /usr/local/etc/ldap.conf et à /usr/local/etc/nss_ldap.conf

host 127.0.0.1
base dc=imil,dc=net
uri ldap://127.0.0.1/
ldap_version 3
binddn cn=user,dc=imil,dc=net
bindpw unpass
port 389
pam_password clear
# activer le TLS
ssl start_tls

J’utilise dovecot pour l’acces pop / imap, j’ai eu l’agréable surprise de voir qu’il créait seul les mailboxes des utilisateurs à leur premier login, de fait, en settant “/repertoire_en_777/utilisateur” comme homedir dans l’entrée LDAP de l’utilisateur, on se retrouve avec un systeme de provisionning automatique du meilleur gout.

Addon

Après avoir migré l’ensemble des services en TLS, j’ai constaté que dovecot ne permettait malheureusement pas de réaliser l’authentification LDAP sur TLS. Sur les conseils de mon ami Eric, j’ai pondu un rapide patch qui rend ce fonctionnement possible après avoir ajouté :

start_tls = 1

dans le dovecot-ldap.conf

Add-on

Au sujet de domainkey et DKIM, ne pas oublier d’ajouter l’option -i /path/vers/les/hosts/locaux (man dkim-milter), le cas échéant seuls les les mails en provenance de 127.0.0.1 seront signés.

Pour finir, la seule application “standalone” (comprendre, qui n’a pas besoin d’apache / php et tous leurs amis) convenable pour manipuler une database LDAP reste “gq”. J’aurais imaginé que les choses avaient un peu évolué depuis 5 ans mais finalement non.

Add-on

N’oubliez pas de placer la directive :

define(`confLDAP_CLUSTER', `nom-convivial')

Et de renseigner le champs “sendmailMTACluster” dans toutes vos entrées LDAP.

le cas échéant les queries LDAP sont tout simplement ignorées.

De plus, il est inutile de protéger l’accès au subtree ou=sendmail, la doc OpenLDAP nous montre comment libérer ce scope :

access to dn.subtree="ou=sendmail,dc=dotpure,dc=net" by * read

WP Theme & Icons based on GlossyBlue by N.Design Studio
Banner from www.trynthlas.com
Entries RSS Comments RSS Log in