=Samba et Winbind= Cette article décrit l’installation d’un dépôt subversion accessible en http grâce à l'authentification ldap/AD d'Apache.
La configuration comprend un contrôle d’accès par utilisateur, par groupe et Organization Unit aux différentes dossiers du référentiel.
J’explique également comment installer l’application web trac. Les outils utilisés sont les suivants : subversion, apache 2, trac, samba, Active Directory et winbind. ===Pré-requis=== Un système GNU/Linux Debian avec le minimum d'installé...
Pour que l'authentification active directory fonctionne sur Linux il faut bien entendu joindre la station linux à un domaine active directory.
Pour cela, nous devons d'abord installer et configurer les paquets winbind et samba sur Linux qui vont nous permettre de récupérer les groupes et les utilisateurs sur l'annuaire Active Directory. ===Intégration de la machine Linux au domaine=== Modifier le fichier ''/etc/hosts''
La 3ème ligne correspond au domaine svn La 4ème ligne correspond au domain trac
La 5ème ligne correspond au contrôleur de domaine (DC) Il faut savoir qu'Apache utilise le fichier hosts pour résoudre ses hôtes virtuels et ensuite il fait une requête dns.
127.0.0.1 localhost
127.0.1.1 SVN
172.16.88.25 SVN.iplinternet.local   SVN
172.16.88.25 TRAC.iplinternet.local  TRAC
172.16.0.18 MADOU.iplinternet.local   MADOU
On installe les paquets nécessaire.
apt-get install samba krb5-user libpam-krb5 ntpdate winbind
'''samba :''' qui servira à faire le lien entre des machines Linux et Windows.
'''krb5-user, libpam-krb5 :''' qui sont les bibliothèques liées à Kerberos, le protocole d'authentification utilisé par Active Directory
'''ntpdate :''' qui permet de synchroniser les horlogges machines pour Kerberos (Obligatoire !!!)
'''winbind :''' qui est le composant de samba communiquant avec Active Directory, c'est lui qui va permettre de récupérer les comptes sur AD
===Synchronisation de l'heure locale=== Kerberos nécessite que l'heure locale soit synchronisée avec notre DC (Domain Controller):
ntpdate ip_du_DC
On peu également le faire en dur, pour cela éditez le fichier ''/etc/default/ntpdate'' et vous comprendrez...
Vérifiez ensuite l'heure:
date
===Configuration de Kerberos=== Editez le fichier /etc/krb5.conf:
nano -w /etc/krb5.conf
et n'y placer que le contenu suivant:
[libdefaults]
default_realm = DOMAINEAD.LOCAL
clock_skew = 300
dns_lookup_realm = false
dns_lookup_kdc = true

[realms]
DOMAINEAD.LOCAL = {
kdc = madou
admin_server = madou
default_domain = DOMAINAD.LOCAL
}

[domain_realm]
.domainad.local = DOMAINAD.LOCAL
domainad.local = DOMAINAD.LOCAL
Testons ensuite les paramètres Kerberos en lançant la commande :
kinit Administrateur
...entrez ensuite le mot de passe du compte administrateur du DC.
Si cela ne fonctionne pas, réessayer avec le nom Administrateur@DOMAINAD.LOCAL
Pour ensuite voir les tickets Kerberos en cache:
klist
Pour les détruire (sisi, on peu...):
kdestroy
===Configuration de Samba=== Avant de procéder à cette étape, arrêter temporairement les services winbind et samba:
/etc/init.d/winbind stop && /etc/init.d/samba stop
Puis éditons le fichier ''/etc/samba/smb.conf'':
nano -w /etc/samba/smb.conf
N'y placer ensuite que le contenu suivant:
[global]
workgroup = DOMAINAD
realm = DOMAINAD.LOCAL
security = ADS
encrypt passwords = yes

password server = server.domainad.local

idmap uid = 10000-20000
idmap gid = 10000-20000
winbind enum groups = yes
winbind enum users = yes
winbind use default domain = yes
Ce sera la configuration minimum pour samba...à titre d'exemple je vous donne la mienne qui est juste un peu plus garnie:
[global]
	workgroup = IPL_INTERNET
	realm = IPLINTERNET.LOCAL
	security = ADS
	encrypt passwords = true

	password server = madou.iplinternet.local

	idmap uid = 10000-20000
	idmap gid = 10000-20000
	winbind enum users = yes
	winbind enum groups = yes
	winbind use default domain = yes

	map to guest = Bad user
	
	template homedir = /home/%D/%U
	template shell = /bin/bash
	obey pam restrictions = yes
	os level = 2
	domain logons = no
	local master = no
	domain master = no
	
	server string = %h server
	wins support = no
	dns proxy = no
	
	log file = /var/log/samba/log.%m
	max log size = 1000
	syslog = 0
	panic action = /usr/share/samba/panic-action %d

[develop]
	path = /mnt/hdd2/dev
	read only = no
	writeable = yes
	browseable = no
	create mask = 0022
	directory mask = 0022
	valid users = @developpers
	comment = Tous_mes_projets
Ensuite, redémarrez les services Samba et Winbind en testant d'abord les paramètres samba:
testparm
OK
/etc/init.d/winbind start && /etc/init.d/samba start
A titre d'exemple je vous donne également la configuration du fichier /etc/nsswitch.conf:
passwd:     compat winbind
group:      compat winbind
shadow:     compat
hosts:      files dns mdns4_minimal [NOTFOUND=return] dns mdns4 winbind
networks:   files
protocols:  db files
services:   db files
ethers:     db files
rpc:        db files
netgroup:   nis
A titre d'exemple je vous donne également la configuration du fichier /etc/pam.d/common-account:
account sufficient	pam_winbind.so
account	required	pam_unix.so
A titre d'exemple je vous donne également la configuration du fichier /etc/pam.d/common-auth:
auth	sufficient	pam_winbind.so
auth	required	pam_unix.so use_first_pass 
A titre d'exemple je vous donne également la configuration du fichier /etc/pam.d/common-session:
session required	pam_mkhomedir.so skel=/etc/skel umask=0077
session sufficient	pam_winbind.so
session	required	pam_unix.so
===Rejoindre le domaine=== Rejoindre le domaine Microsoft se fait avec la commande suivante:
net ads join -U Administrateur
si cela ne fonctionne pas réessayer avec:
net rpc join -U Administrateur
En réponse du contrôleur de domaine ---> Joined domain DOMAINAD.LOCAL. Le compte Administrateur doit avoir les droits pour ajouter une station au domaine active directory ! ===Erreurs éventuelles=== Si vous obtenez le message suivant:
The workgroup in smb.conf does not match the short domain name obtained from the server.
Using the name [AUTRE_DOMAINE] from the server.
You should set "workgroup = AUTRE_DOMAINE" in smb.conf.
Alors modifiez votre fichier ''/etc/samba/smb.conf'' comme dit, puis redémarrez ensuite le service Samba et Winbind et recommencer.
Si vous avez l'erreur suivante:
ads_connect : No logon servers
C'est que le service winbind n'est pas démarré ou installé. ===Tests=== Effectuer des tests afin de voir si tout s'est déroulé correctement: Testez la connexion au domaine:
net ads testjoin
ou
net rpc testjoin
...devrait retourner Join is OK. On redémarre une dernière fois Winbind et Samba:
/etc/init.d/winbind restart && /etc/init.d/samba restart
Afficher la liste des utilisateurs sur Active Directory:
wbinfo -u
La liste des groupes:
wbinfo -g
Si cela ne fonctionne pas, vérifiez le fichier smb.conf et redémarrer les services samba et winbind.
Vous devrez redémarrer Winbind à chaque modification du fichier smb.conf. ''A ce stade, votre machine devrait avoir rejoint le domaine Active Directory.'' =Configuration de Subversion et Trac pour Active Directory= Un fois la station Linux jointe au domaine, nous pouvons continuer avec l'installation de Subversion (SVN) et Trac.
Subversion va être installé avec le gestionnaire de paquet Debian apt et on installera Trac par les sources pour ainsi avoir la dernière version qui est la 0.11.5 à l'heure où j'écris ces lignes. ===Création de l'utilisateur, du groupe et de la OU=== La première étape est d'abord créer une OU (Organization Unit) que l'on appelera ''svn'' dans active directory, dans cette OU on créé un groupe ''Altair'' (du nom du projet) et dans ce groupe on créera un utilisateur que l'on appelera ''raphaelsvn'', ''oliviersvn'' et ''josesvn''.
===Installation de subversion=== La seconde étape est d’installer et de configurer subversion, lancez simplement la commande suivante :
aptitude install apache2 subversion subversion-tools
Une fois installé, on peut directement créer notre premier dépôt subversion. (On suppose qu'il y a déjà un utilisateur ''raphael'') enregistré sur le système.
J’ai choisit de le créer dans ''/home/raphael/svn/projet/altair'', lancez les commandes suivantes :
mkdir -p /home/raphael/svn/projet/
cd /home/raphael/svn/projet/
svnadmin create altair
Nous avons désormais un dépôt subversion vide qui ne contient aucune donnée. :-((
Ce dépôt n’est actuellement accessible malheureusement qu’en local. Nous allons donc y remédier en configurant le meilleur serveur web de tous les temps...Apache afin de le rendre accessible en http via le protocole dav_svn :
aptitude install libapache2-svn
On active le module dav_svn:
a2enmod dav_svn
/etc/init.d/apache2 reload
On active le module authnz_ldap:
a2enmod authnz_ldap
/etc/init.d/apache2 reload
On active le module ldap:
a2enmod ldap
/etc/init.d/apache2 reload
===Configuration du VirtualHost pour l'authentification Active Directory=== Désormais le protocole ldap et dav_svn sont installés, il reste juste à configurer notre virtualhost.
Editez le fichier de votre VirtualHost du SVN et y rajoutez-y ceci :

        # Chargement du module subversion
        DAV svn

        # On indique le chemin complet vers le dépôt subversion
        SVNPath /home/raphael/svn/projet/altair/

        # Ici on demande une identification avec Active Directory
	SVNPathAuthz off  
	SVNListParentPath on
	Allow from all
	AuthType Basic  
	AuthBasicProvider ldap  
	AuthzLDAPAuthoritative off  
	AuthName "Projet Altair : Authentification requise"  
	AuthLDAPBindDN "testsvn@iplinternet.local"  
	AuthLDAPBindPassword azerty   
	AuthLDAPURL "ldap://madou.iplinternet.local:3268/DC=iplinternet,DC=local?sAMAccountName?sub?(objectClass=user)" NONE
	Require ldap-group cn=Altair,ou=svn,dc=iplinternet,dc=local	

        # On indique ici le fichier de configuration des permissions d'accès au dépôt subversion
        AuthzSVNAccessFile /var/www/private/altairperm

Explication du module ldap:
Ici les utilisateurs du groupe ''Professeurs'' et de l'organization unit ''Profs'' auront accès, les autres non.
''testsvn@iplinternet.local'' et son mot de passe ''azerty'' est l'utilisateur qui a des droits en lecture sur AD qui permettra au module ldap d'aller récupérer les comptes qui aurons accès ou pas à svn. ===Création du fichier pour les permissions d'accès=== Créer le fichier de configuration des permissions d’accès pour le projet Altair:
mkdir /var/www/private
touch /var/www/private/altairperm
chown www-data: /var/www/private/altairperm
Voici le contenu du fichier :
[groups]
altair = raphaelsvn, oliviersvn, josesvn

[/]
anonymous = r
raphaelsvn = rw

[/trunk]
@altair = rw

[/branches]
oliviersvn = r
josesvn = r

[/tags]
oliviersvn = r
josesvn = r
Explications : la première ligne permet de définir des groupes. J’ai un groupe dev qui contient trois utilisateurs : raphael, olivier et jose.
Ensuite pour chacune des parties du dépôt je crée des règles d’accès en lecture ou en lecture/écriture.
Anonymous peut lire tout le dépôt.
Le dossier /trunk est accessible en lecture/écriture par le groupe dev.
Par contre il n’y a que l’utilisateur ''raphael'' qui puisse écrire dans les dossiers tags et branches.
Modifications des droits du dépôts:
Pour qu’Apache ait le droit d’accéder aux fichiers du dépôt, il faut modifier les droits des fichiers du dépôt créé. Je voulais que l’utilisateur raphael puisse continuer d’accéder à ses fichiers, je n’ai donc modifié que le groupe :
chown -R raphael:www-data /home/raphael/svn/
chmod -R 775 /home/raphael/svn
On test la configuration d'apache avant de le relancer:
apache2ctl configtest
/etc/init.d/apache2 reload
On effectue un premier test en créant les 3 branches principales d’un dépôt subversion :
svn mkdir http://ip_du_serveur/altair/svn/trunk -m "Création des répertoires d'archivage Subversion."  --username=raphael
svn mkdir http://ip_du_serveur/altair/svn/branches -m "Création des répertoires d'archivage Subversion."  --username=raphael
svn mkdir http://ip_du_serveur/altair/svn/tags -m "Création des répertoires d'archivage Subversion."  --username=raphael
ou si cela ne marche pas, faites comme ceci:
svn mkdir file:///home/raphael/svn/projet/altair/trunk -m "Création des répertoires d'archivage Subversion."  --username=raphael
svn mkdir file:///home/raphael/svn/projet/altair/branches -m "Création des répertoires d'archivage Subversion."  --username=raphael
svn mkdir file:///home/raphael/svn/projet/altair/tags -m "Création des répertoires d'archivage Subversion."  --username=raphael
On pourra faire simplement des tests avec Tortoise sur Windows. =Installation de Trac= L'installation du mode python pour apache (qui est nécessaire pour le lancement de Trac) se fait simplement avec Debian :
aptitude install libapache2-mod-python
On va ensuite télécharger les sources de Trac et les installer manuelement:
cd /usr/share
wget http://ftp.edgewall.com/pub/trac/Trac-0.11.5.tar.gz
tar -zxf Trac-0.11.5.tar.gz
cd Trac-0.11.5
python ./setup.py install
cd ../
mv Trac-0.11.5 trac
===Création du projet Trac=== Je place mes différents projets dans /home/raphael/trac.
Lancer les commandes suivantes afin de créer le projet trac :
mkdir /home/raphael/trac
cd /home/raphael/trac
trac-admin altair initenv
Et répondre aux quelques questions posées : * Project Name [My Project]> Altaïr * Database connection string [sqlite:db/trac.db]> valider en appuyant sur entrée * Path to repository [/var/svn/test]> /home/raphael/svn/projet/altair * Templates directory [/usr/share/trac/templates]> valider en appuyant sur entrée ===Modifications des droits des fichiers=== Pour rendre accessibles les fichiers par Apache, il faut comme pour le dépôt subversion modifier les droits :
cd /home/raphael/trac
chown -R raphael:www-data altair
chmod -R 775 altair
===Connexion à Trac avec le module LDAP=== Pour se connecter au trac, comme pour les utilisateurs subversion, on utilise le module authnz_ldap d'apache:

	SetHandler mod_python
	PythonInterpreter main_interpreter
	PythonHandler trac.web.modpython_frontend
	PythonOption TracEnv /home/raphael/trac/altair/
	PythonOption TracUriRoot /
	Order allow,deny
	Allow from all
	AuthType Basic  
	AuthBasicProvider ldap  
	AuthzLDAPAuthoritative off  
	AuthName "Projet Altair : Authentification requise"  
	AuthLDAPBindDN "testsvn@iplinternet.local"  
	AuthLDAPBindPassword azerty   
	AuthLDAPURL "ldap://madou.iplinternet.local:3268/DC=iplinternet,DC=local?sAMAccountName?sub?(objectClass=user)" NONE
	Require ldap-group cn=Altair,ou=svn,dc=iplinternet,dc=local	

===Finalisation=== Et pour finir, un peu de sécurité au niveau des fichiers contenants les permissions :
cd /var/www/private
chown www-data:www-data *
chmod 660 *
===Exemple de VirtualHost en production=== Pour créer vos vhosts il suffit de désactiver le vhosts par défaut d'apache:
a2dissite default
/etc/init.d/apache2 reload
et ensuite de créer deux fichiers dans ''/etc/apache2/sites-available'':
touch /etc/apache2/sites-available/trac
touch /etc/apache2/sites-available/svn
Puis de les activer:
a2ensite trac
/etc/init.d/apache2 reload
a2ensite svn
/etc/init.d/apache2 reload
Je vous ait mi mes 2 VirtualHost à titre d'exemple (trac et svn):
## Trac Config
NameVirtualHost *:80


	ServerAdmin webmaster@localhost
	ServerName trac.iplinternet.local
        ServerAlias altair.iplinternet.local
	
	DocumentRoot /home/raphael/trac/altair/
	
	
		Options All -Indexes
		AllowOverride All
		Order allow,deny
		Allow from all
	
	
	
		SetHandler mod_python
		PythonInterpreter main_interpreter
		PythonHandler trac.web.modpython_frontend
		PythonOption TracEnv /home/raphael/trac/altair/
		PythonOption TracUriRoot /
		Order allow,deny
		Allow from all
		AuthType Basic  
		AuthBasicProvider ldap  
		AuthzLDAPAuthoritative off  
		AuthName "Trac : Professeurs Projet Altair Authentification requise"  
		AuthLDAPBindDN "testsvn@iplinternet.local"  
		AuthLDAPBindPassword azerty   
		AuthLDAPURL "ldap://madou.iplinternet.local:3268/DC=iplinternet,DC=local?sAMAccountName?sub?(objectClass=user)" NONE
		Require ldap-group cn=Altair,ou=svn,dc=iplinternet,dc=local	
	
	
	LogLevel warn

	ErrorLog /var/log/apache2/error.log
	CustomLog /var/log/apache2/access.log combined
	

Pour SVN:
## SVN config

	ServerAdmin webmaster@localhost
	ServerName svn.iplinternet.local
	
	DocumentRoot /home/raphael/svn/projet/altair/
	
	
		Options All -Indexes
		AllowOverride All
		Order allow,deny
		Allow from all
	
	
	
		Order allow,deny
		Allow from all

                # Chargement du module subversion
                DAV svn

                # On indique le chemin complet vers le dépôt subversion
                SVNPath /home/raphael/svn/projet/altair/

                # Ici on demande une identification avec Active Directory
		SVNPathAuthz off  
		SVNListParentPath on
		AuthType Basic  
		AuthBasicProvider ldap  
		AuthzLDAPAuthoritative off  
		AuthName "SVN : Professeurs Projet Altair Authentification requise"  
		AuthLDAPBindDN "testsvn@iplinternet.local"  
		AuthLDAPBindPassword azerty   
		AuthLDAPURL "ldap://madou.iplinternet.local:3268/DC=iplinternet,DC=local?sAMAccountName?sub?(objectClass=user)" NONE
		Require ldap-group cn=Altair,ou=svn,dc=iplinternet,dc=local	

                # On indique ici le fichier de configuration des permissions d'accès aux dossiers du projet... si nécessaire
                # AuthzSVNAccessFile /var/www/private/altairperm
	
	
	LogLevel warn

	ErrorLog /var/log/apache2/error.log
	CustomLog /var/log/apache2/access.log combined
	

Vous pouvez maintenant commencer à travailler sur svn a l'adresse http://svn.iplinternet.local (sur Windows, en général, les développeurs utilisent les logiciels Tortoise ou Eclipse (gratuits) pour travailler sur Subversion) ou sur trac à l'adresse http://trac.iplinternet.local On peu tout à fait désactiver l'authentification apache pour trac et laisser l'authentification pour svn, comme ça, les anonyme aurons accès en lecture seule au projet. That's all Folks...