Conception et mise en oeuvre d'un Service d'Archivage
Authentification ADS : serveur Samba, membre d'un domaine Active Directory
L'idée est de partager une ressource sur un serveur Samba
en s'authentificant sur un annuaire Active Directory (security = ADS dans Samba).
Les utlisateurs ne sont pas pas enregistrés dans la base locale : nous
allons utiliser winbind pour réaliser le mappage.
Prérequis :
- La distribution Linux est une Fedora Core 2.
- Le serveur Samba (sous FC2) à pour nom 'ARCHIVAGE'.
- L'Active Directory est fonctionnel et est au coeur du domaine CAMPUS.ENST-BRETAGNE.FR,
'LEPDC' est le PDC (Primary Domain Controller) sur Windows 2000 Server.
Installation de Samba
Téléchargement des sources :
www.samba.org.
Pour installer Samba à partir des sources :
Avant tout, un fois dans le répertoire des sources de
samba (après avoir decompressé l'archive bien sûr), affectons
la variable $SAMBA_SOURCE qui pourra nous servir par la suite :
[root@localhost source]# export SAMBA_SOURCE=`pwd`
Procédons à l'installation :
[root@localhost source]# ./configure --prefix=/usr/local/samba --with-winbind
[root@localhost source]# make
[root@localhost source]# make install
Affectons la variable $SAMBA_HOME du chemin d'installation
de samba :
[root@localhost root]# export SAMBA_HOME=/usr/local/samba
Création d'un fichier "service" pour lancer Samba et
Winbind au démarrage (par exemple /etc/init.d/smb) :
#!/bin/sh
#
# chkconfig: - 91 35
# description: Starts and stops the Samba smbd and nmbd daemons \
# used to provide SMB network services.
#
# pidfile: /usr/local/samba/var/locks/smbd.pid
# pidfile: /usr/local/samba/var/locks/nmbd.pid
# pidfile: /usr/local/samba/var/locks/winbind.pid
# config: /usr/local/samba/lib/smb.conf
# Source function library.
if [ -f /etc/init.d/functions ] ; then
. /etc/init.d/functions
elif [ -f /etc/rc.d/init.d/functions ] ; then
. /etc/rc.d/init.d/functions
else
exit 0
fi
# Avoid using root's TMPDIR
unset TMPDIR
# Source networking configuration.
. /etc/sysconfig/network
if [ -f /etc/sysconfig/samba ]; then
. /etc/sysconfig/samba
fi
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
# Check that smb.conf exists.
[ -f /usr/local/samba/lib/smb.conf ] || exit 0
# Check that we can write to it... so non-root users stop here
[ -w /usr/local/samba/lib/smb.conf ] || exit 0
RETVAL=0
export SMBDOPTIONS=-D
export NMBDOPTIONS=-D
export WINBINDOPTIONS=-B
start() {
KIND="SMB"
echo -n $"Starting $KIND services: "
daemon /usr/local/samba/sbin/smbd $SMBDOPTIONS
RETVAL=$?
echo
KIND="NMB"
echo -n $"Starting $KIND services: "
daemon /usr/local/samba/sbin/nmbd $NMBDOPTIONS
RETVAL2=$?
echo
KIND="Winbind"
echo -n $"Starting $KIND services: "
daemon /usr/local/samba/sbin/winbindd "$WINBINDOPTIONS"
RETVAL3=$?
echo
[ $RETVAL -eq 0 -a $RETVAL2 -eq 0 -a $RETVAL3 -eq 0 ] \
&& touch /usr/local/samba/var/locks/subsys/smb \
&& touch /usr/local/samba/var/locks/subsys/winbindd || RETVAL=1
return $RETVAL
}
stop() {
KIND="SMB"
echo -n $"Shutting down $KIND services: "
killproc /usr/local/samba/sbin/smbd -TERM
RETVAL=$?
[ $RETVAL -eq 0 ] && rm -f /usr/local/var/locks/smbd.pid
echo
KIND="NMB"
echo -n $"Shutting down $KIND services: "
killproc /usr/local/samba/sbin/nmbd -TERM
RETVAL2=$?
[ $RETVAL2 -eq 0 ] && rm -f /usr/local/var/locks/nmbd.pid
echo
KIND="Winbind"
echo -n $"Shutting down $KIND services: "
killproc /usr/local/samba/sbin/winbindd -TERM
RETVAL3=$?
[ $RETVAL -eq 0 -a $RETVAL2 -eq 0 -a $RETVAL3 -eq 0 ] \
&& rm -f /usr/local/samba/var/locks/subsys/smb \
&& rm -f /usr/local/samba/var/locks/winbindd.pid \
&& rm -f /usr/local/samba/var/locks/subsys/winbindd
echo ""
return $RETVAL
}
restart() {
stop
start
}
reload() {
echo -n $"Reloading smb.conf file: "
killproc /usr/local/samba/sbin/smbd -HUP
RETVAL=$?
echo
return $RETVAL
}
rhstatus() {
status /usr/local/samba/sbin/smbd
status /usr/local/samba/sbin/nmbd
status /usr/local/samba/sbin/winbindd
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
reload)
reload
;;
status)
rhstatus
;;
condrestart)
[ -f /usr/local/var/locks/subsys/smb ] && restart || :
;;
*)
echo $"Usage: $0 {start|stop|restart|reload|status|condrestart}"
exit 1
esac
exit $?
Kerberos
Nous allons installer le package (rpm) krb5-workstation se
trouvant sur le CD1 de Fedora Core 2. Ensuite, nous mettons à jour toutes
les dépendances avec l'utilitaire yum. Le service kerberos
est une condition sine qua non au bon fonctionnement de l'architecture
à mettre en place.
[root@localhost root]# rpm -ivh krb5-workstation-1.3.6-4
Puis, pour mettre à jour les dépendances :
[root@localhost root]# yum install krb5-workstation
Le fichier /etc/krb5.conf :
[libdefaults]
default_realm = CAMPUS.ENST-BRETAGNE.FR
[realms]
CAMPUS.ENST-BRETAGNE.FR =
{
kdc = X.Y.Z.T
}
- kdc = X.Y.Z.T : Adresse IP du contrôleur de domaine
(KDC).
Test de la communication en demandant un ticket :
[root@localhost root]# kinit alenorcy@CAMPUS.ENST-BRETAGNE.FR
Password for alenorcy@CAMPUS.ENST-BRETAGNE.FR:
"alenorcy" est un utilisateur enregistré dans l'annuaire
Active Directory.
Authentification avec Winbind
Occupons-nous de configurer la librairie libnss_winbind issue
de la compilation des sources de samba :
[root@localhost root]# cp $SAMBA_SOURCE/nsswitch/libnss_winbind.so /lib
[root@localhost root]# ln -s /lib/libnss_winbind.so /liblibnss_winbind.so.2
Paramétrage avec l'utilitaire authconfig :
Figure 1 : Configuration de l'authentification
Figure 2 : Paramétrage Winbind
Après avoir validé ces paramètres, plusieurs
fichiers vont être modifiés, comme par exemples :
- /etc/nsswitch.conf
- /etc/samba/smb.conf (attention ! L'original se trouve sous
/usr/local/samba/lib/smb.conf !)
- /etc/pam.d/system-auth
- /etc/krb5.conf (attention ! Certaines informations sont
dupliquées...)
- ...
Le fichier /etc/nsswitch.conf ressemble désormais à
ceci :
passwd: files winbind
shadow: files winbind
group: files winbind
hosts: files dns
bootparams: files
ethers: files
netmasks: files
networks: files
protocols: files winbind
rpc: files
services: files winbind
automount: files winbind
aliases: files
netgroup: files winbind
Le fichier /etc/krb5.conf devient (la duplication des infos
n'est apparemment pas gênante) :
[libdefaults]
default_realm = CAMPUS.ENST-BRETAGNE.FR
dns_lookup_realm = false
dns_lookup_kdc = false
[realms]
CAMPUS.ENST-BRETAGNE.FR = {
kdc = X.Y.Z.T
admin_server = X.Y.Z.T
}
CAMPUS.ENST-BRETAGNE.FR = {
kdc = X.Y.Z.T
admin_server = X.Y.Z.T
}
Enfin, le fichier /etc/pam.d/system-auth devient :
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth required /lib/security/$ISA/pam_env.so
auth sufficient /lib/security/$ISA/pam_unix.so likeauth nullok
auth sufficient /lib/security/$ISA/pam_winbind.so use_first_pass
auth required /lib/security/$ISA/pam_deny.so
account sufficient /lib/security/$ISA/pam_succeed_if.so uid < 100
account required /lib/security/$ISA/pam_unix.so
account [default=bad success=ok user_unknown=ignore] /lib/security/$ISA/pam_winbind.so
password requisite /lib/security/$ISA/pam_cracklib.so retry=3
password sufficient /lib/security/$ISA/pam_unix.so nullok use_authtok md5 shadow
password sufficient /lib/security/$ISA/pam_winbind.so use_authtok
password required /lib/security/$ISA/pam_deny.so
session required /lib/security/$ISA/pam_limits.so
session required /lib/security/$ISA/pam_unix.so
Plusieurs autres fichiers ont également été
modifés (pour plus d'infos voir le man).
Paramétrage "à la main" (sans authconfig)
On peut se passer de l'utilitaire authconfig en modifiant, "à
la main", seulement les fichiers nécessaires. Il s'avèrerait (à
vérifier...), qu'on ne soit pas obligé de paramétrer PAM,
donc de modifier le fichier /etc/pam.d/system-auth, ce que fait authconfig.
En effet, dans notre cas (nous ne voulont pas faire que de l'authentification),
Il suffirait seulement de modifier le fichier /etc/nsswitch ainsi :
passwd: files winbind
shadow: files
group: files winbind
hosts: files dns
bootparams: files
ethers: files
netmasks: files
networks: files
protocols: files
rpc: files
services: files
automount: files
aliases: files
netgroup: files
Les autres fichiers gardent leur configuration d'origine (par
exemple /etc/krb5.conf reste comme nous l'avions écrit). Le paragraphe
suivant explique comment rediger un fichier smb.conf bien paramétrer
avec winbind (normalement en ayant utilisé authconfig, ce fichier est
correct mais pas à sa place : il faut le placer sous /usr/local/samba/lib/)
Configuration et Intégration de Samba comme membre du domaine
Réalisons une configuration minimale pour samba. Le
but est de partager un répertoire et de ne le laisser accessible qu'à
un seul utilisateur (ici : CAMPUS+alenorcy). Cet utilisateur est enregistré
dans l'annuaire Active Directory mais pas dans la base de données locale
de la machine Linux (/etc/passwd). Le fichier $SAMBA_HOME/lib/smb.conf est le
suivant :
[global]
workgroup = CAMPUS
server string = Serveur samba!
realm = CAMPUS.ENST-BRETAGNE.FR
security = ads
encrypt passwords = yes
password server = X.Y.Z.T
log file = /var/log/samba/smbd.log
max log size = 50
winbind uid = 10000-20000
winbind gid = 10000-20000
winbind separator = +
[partage]
comment=Répertoire partagé
path=/usr/local/samba
valid users = CAMPUS+alenorcy
browseable = true
writable = true
Démarrons winbind avec la commande suivante :
[root@localhost root]# service smb start
Démarrage des services SMB : [ OK ]
Démarrage des services NMB : [ OK ]
Démarrage des services Winbind : [ OK ]
Intégrons le serveur Samba dans le domaine comme serveur
membre :
[root@localhost root]# net join -S LEPDC -U user%password
...
Joined ‘ARCHIVAGE' to realm ‘CAMPUS.ENST-BRETAGNE.FR'
Vérifions notre configuration en tentant d'afficher
tous les utilisateurs du domaine :
[root@archivage root]# $SAMBA_HOME/bin/wbinfo -u
Puis tous les groupes :
[root@archivage root]# $SAMBA_HOME/bin/wbinfo -g
On peut également utiliser les commandes Unix :
[root@archivage root]# getent passwd
Et :
[root@archivage root]# getent group
L'utilisateur CAMPUS\alenorcy (notation "à la" Windows)
peut désormais accéder à sa ressource (\usr\local\samba)
à partir d'une machine aussi bien Windows que Linux.
Quelques liens
MAJ le 20/06/2005