Préambule
Notre projet est basé sur deux machines virtuelles installées sur VirtualBox:
- Un Serveur 2000 ou 2003 de Windows.
- Un Client Linux ( Ubuntu 10.4 LTS).
Notre Serveur 2000 sera le contrôleur de domaine (DC) qui utilise Kerberos pour crypter les mots de passe. Il permettra à un client Linux de pouvoir ouvrir n'importe quelle session utilisateur si celui-ci est présent dans l'annuaire du DC.
Nota Bene:
Certains paramètres de fichier de configuration, présents par défaut, n'ont pas tous été affichés et ce volontairement.
Seuls ceux qui sont explicites ou qui ont été modifiés seront présentés.
1. Les outils nécessaires
- Un Serveur 2000 Windows.
- Un Client Linux Ubuntu 10.4 LTS
- Un Serveur Kerberos (serveur 2000)
- Un client Kerberos (krb5-user sous linux)
- Un Serveur NTP (serveur 2000)
- Un Serveur DHCP (serveur 2000)
- Installation de paquets : samba et winbind.
- Une multitude de fichiers à configurer sur le client Linux représentés ci -dessous:
/etc
| /hosts
| |
| /resolv.conf
| |
| /default
| | -ntpdate
| |
| /samba
| | -smb.conf
| |
| /krb5.conf
| |
| /nsswitch.conf
| |
| /pam.d
| | -common-account
| | -common-auth
| | -common-password
| | -common-session
| | -sudo
2. Réalisation du projet
2.1 Serveur 2000
A l'installation de Windows, il sera le DC du domaine et réagira aussi en tant que serveur Kerberos. Il servira de serveur NTP que l'on indiquera au client Linux pour que ce dernier synchronise son heure. Il sera aussi le serveur DHCP, (nous mettons à disposition un lien décrivant la configuration du serveur DHCP dans notre bibliographie).
- Ip du serveur: 192.168.1.254
- nom du Domaine: test.com
- nom du DC: SERVER2000
- nom NetBios: server2000
- FQDN: server2000.test.com (=nom de domaine complet du DC)
2.2 Client Linux
2.2.1 Configuration du fichier "hosts" et "resolv.conf"
==> root@ubuntu10:/# vim /etc/hosts
Ce fichier contient une liste d'association de "nom de machine - adresse IP" permettant ainsi la résolution de nom DNS pour notre réseau local si par exemple aucun serveur DNS n'est présent. Il est typiquement utilisé pour renseigner des noms de machines locales. Nous y indiquons: le nom de notre machine local linux et celui du serveur 2000.
127.0.0.1 ubuntu10.test.com localhost ubuntu10
192.168.1.254 server2000.test.com
==> root@ubuntu10:/# vim /etc/resolv.conf
Ce fichier se fait automatiquement, mais il faut le vérifier pour être sûr qu'il contacte bien le serveur 2000 et son domaine, si des requêtes DNS plus globale sont nécessaires.
nameserver 192.168.1.254
domain test
search test
Vérification
A ce stade on doit pouvoir pinger le server 2000 avec son nom DNS:
==> root@ubuntu10:/# ping server2000.test.com
PING bytes from server2000.test.com (192.168.1.254) 56(84) bytes of data.
64 bytes from server2000.test.com (192.168.1.254) : icmp_seq=1 ttl=128 time=0.371 ms
64 bytes from server2000.test.com (192.168.1.254) : icmp_seq=2 ttl=128 time=0.385 ms
2.2.2 Configuration du client NTP
NTP (Network Time Protocole) est un protocole pour synchroniser l’heure des machines entre elles. Comme le serveur 2000 utilise Kerberos, et que ce dernier nécessite un réglage optimal de l’heure : moins de 5 minutes d’écart entre le client linux et le contrôleur de domaine, il est alors impératif que nos 2 machines se synchronisent sur la même heure car la validité d'un ticket Kerberos dépend de l'heure.
Il existe deux manières pour le faire (le 3ième point automatise la tâche):
- 1°/ Soit on configure manuellement les 2 machines à la même heure mais au fil du temps elles vont se désynchroniser, ce qui n'est pas un bon choix.
- 2°/ Soit on configure Linux, en temps que client NTP grâce au fichier /etc/default/ntpdate où on lui demande de contacter le serveur 2000 lorsque on tape la commande "ntpdate":
==> root@ubuntu10:/# vim /etc/default/ntpdate
# The settings in this file are used by the program ntpdate-debian, but not#
# by the upstream program ntpdate.
# Set to "yes" to take the server list from /etc/ntp.conf, from package ntp,
# # so you only have to keep it in one place.
NTPDATE_USE_NTP_CONF=yes
# List of NTP servers to use (Separate multiple servers with spaces.)#
# Not used if NTPDATE_USE_NTP_CONF is yes.
NTPSERVERS="server2000.test.com"
# Additional options to pass to ntpdate
# NTPOPTIONS="-u"
==> root@ubuntu10:/# ntpdate server2000.test.com
- 3°/ Pour ne pas à devoir effectuer constamment cette commande ci-dessus, il est possible d'automatiser cette tâche, tous les jours ou toutes les semaines par exemple via cette commande:
==> root@ubuntu10:/# crontab -e
Ici, on demande d'effectuer la commande "ntpdate-debian" (celle-ci, ira chercher le serveur à contacter dans le fichier /etc/default/ntpdate) tous les Mardi à 18h:
# m h dom mon dow command
00 18 * * 2 /usr/sbin/ntpdate-debian
m = minute / h= heure / dom = jour du mois / mon = mois / dow = jour de la semaine
2.2.3 Configuration du client Kerberos
Kerberos est utilisé par Microsoft pour fournir une authentification solide pour des applications client/serveur en utilisant la cryptographie, une version Open source est disponible pour linux sous le nom de "krb5".
Ce protocole est assez complexe à présenter mais un lien est disponible dans notre bibliographie fournissant une très bonne explication et ce avec schémas. Nous pouvons tout de même dire, que Kerberos , ne fait jamais circuler le mot de passe de l'utilisateur sur le réseau grâce à un système de ticket qui est émis par le service TGS (Ticket-Granting Service). Ensuite, ce ticket sera authentifié par le serveur Kerberos appelé KDC ( Key Distribution Center).
==> root@ubuntu10:/# aptitude install krb5-user
On installe le paquet pour être client kerberos.
==> root@ubuntu10:/# vim /etc/krb5.conf
Configuration du client Kerberos en respectant la casse:
[libdefaults]
default_realm = TEST.COM
ticket_lifetime = 24000
# The following krb5.conf variables are only for MIT Kerberos.
krb4_config = /etc/krb.conf
krb4_realms = /etc/krb.realms
kdc_timesync = 1
ccache_type = 4
forwardable = true
proxiable = true
[realms]
TEST.COM = {
kdc = SERVER2000.test.com
admin_server = SERVER2000.test.com
default_domain = TEST.COM
}
[domain_realm]
.test.com = TEST.COM
test.com = TEST.COM
[login]
krb4_convert = true
krb4_get_tickets = false
- default_realm = le nom du Royaume Kerberos où il doit opérer.
- ticket_lifetime = durée de vie du ticket
- kdc = le nom du serveur Kerberos.
- admin_server = le DC du domaine
Vérification Kerberos
Les commandes qui suivent permettent de vérifier si le fonctionnement client/serveur Kerberos est opérationnel:
==> root@ubuntu10:/# kinit administrateur
On fait une demande de ticket d'un utilisateur présent dans l'annuaire du serveur 2000 et un mot de passe nous est demandé. Nous avons choisi l'user "administrateur" car celui-ci est d'office présent:
Password for administrateur@TEST.COM:
==> root@ubuntu10:/# klist
Cette commande nous permet de voir, ceux à qui, un ticket a été attribué.
Ainsi, que l'émission du ticket par TGT et son expiration indiquant l'importance que Kerberos octroyé à une synchronisation de l'heure:
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: administrateur@TEST.COM
Valid starting Expires Service principal
05/10/10 21:59:46 05/11/10 04:39:46 krbtgt/TEST.COM@TEST.COM
2.2.4 Configuration de Samba et installation de Winbind
==> root@ubuntu10:/# aptitude install winbind
On installe le paquet winbind. Winbind est un service qui va nous permettre de récupérer les informations sur les utilisateurs et groupes présent dans l'annuaire du serveur 2000.
==> root@ubuntu10:/# aptitude install samba
On installe le paquet du serveur Samba.
==> root@ubuntu10:/# vim /etc/samba/smb.conf
On configure le serveur Samba afin qu'il puisse communiquer avec notre serveur 2000 via "winbind" et être aussi compatible avec le système Kerberos:
[global]
security = ADS
realm = TEST.COM
password server = SERVER2000.test.com
workgroup = TEST
netbios name = ubuntu10
winbind separator = +
idmap uid = 10000-20000
idmap gid = 10000-20000
winbind enum users = yes
winbind enum groups = yes
template homedir = /home/%D/%U
template shell = /bin/bash
client use spnego = yes
winbind use default domain = yes
- ADS = permet à Samba d'utiliser Kerberos pour accepter des tickets.
- realm = Royaume Kerberos.
- password server = serveur Kerberos à contacter.
- workgroup = domaine samba.
- idmap = user et group présent dans l'annuaire du serveur 2000 qui auront leur ID compris entre 10000 et 20000 (voir plus loin à la sortie de la commande "getent").
- winbind seperator = séparateur utilisé lors de requête "winbind" (voir plus loin avec "wbinfo -u").
- template homedir = lors d'ouverture de session utilisateur, leur répertoire se place dans %D=nom du domaine et %U=user, c'est à dire le path: "/home/TEST/nom_user".
==> root@ubuntu10:/# mkdir /home/TEST
On crée ce répertoire et grâce à l'instruction "template homedir = /home/%D/%U" , les utilisateurs qui ouvrirons une session sur cette machine ("ubuntu10") aurons leur répertoire dans /TEST où %D=le domaine et %U=l'utilisateur qui se connecte.
Il est important, par la suite, de donner les droits en écriture dessus à l'aide de la commande "chmod 777".
Notons que "/TEST" correspond a ce qui est indiquer lors de la création d'utilisateurs dans l'annuaire du serveur 2000 (voir plus loin).
==> root@ubuntu10:/# /etc/init.d/ winbind start
Démarrage du service winbind.
==> root@ubuntu10:/# /etc/init.d/ smbd start
==> root@ubuntu10:/# /etc/init.d/ nmbd start
Démarrage des services Samba.
==> root@ubuntu10:/# testparm
Cette commande permet de vérifier qu'il n'y aucune erreur dans smb.conf .
Elle doit nous renvoyer "loaded services file ok".
Load smb config files from /etc/samba/smb.conf
rlimit_max: rlimit_max (1024) below minimum Windows limit (16384)
Loaded services file OK.
winbind separator = +' might cause problems with group membership.
Server role: ROLE_DOMAIN_MEMBER
Press enter to see a dump of your service definitions
==> root@ubuntu10:/# net join -U administrateur -S server2000.test.com
Cette commande va nous permettre d'intégrer Samba au domaine du serveur 2000 et permettre de faire apparaitre notre machine "ubuntu10" dans l'annuaire de ce dernier.
Après avoir introduit le mot de passe de l'administrateur du domaine "test.com", on peut voir que la machine "ubuntu10" à bien rejoint le domaine "test.com".
Cela est très important car le fonctionnement d'un serveur Windows autorise d'ouvrir des sessions d'utilisateurs que sur des machines connus.
Enter administrateur's password:
Using short domain name -- TEST
Joined 'UBUNTU10' to realm 'test.com'
[2010/05/10 22:19:58, 0] utils/net_ads.c:1080(net_update_dns_internal)
Vérification Samba et Winbind
Notre machine linux nomée "ubuntu10" est maintenant présent dans l'annuaire
Cliquer sur l'image pour l'agrandir
==> root@ubuntu10:/# wbinfo -u
Cette commande "winbind" permet de récupérer les utilisateurs présents dans l'annuaire du serveur 2000. On peut voir "UBUNTU10+iepscf " où "iepscf " est le user crée lors de l'installation et "+" est le séparateur "winbind" précisé dans smb.conf :
UBUNTU10+iepscf
administrateur
invité
tsinternetuser
iusr_server2000
iwam_server2000
ils_anonymous_user
jaouad
giuseppe
==>root@ubuntu10:/# wbinfo -g
Cette commande "winbind" permet de récupérer les groupes présents dans l'annuaire du serveur 2000.
..............................
administrateur du schéma
éditeur de certificats
invités du domaine
dnsadmins full
...............................
Une explication plus complète, sur le rôle de NSS/PAM et leur fichier, a été préalablement abordé dans un projet antérieur, qui est celui de OpenLdap, que l'on peut lire via ce lien : http://actuel.wikidot.com/projets:heterogeneserveurldapgroupe2
2.2.5 NSS
Maintenant que notre machine est visible, il faut indiquer à celle-ci où aller chercher les informations sur les utilisateurs.
Ce sera le rôle de NSS:
==> root@ubuntu10:/# vim /etc/nsswitch.conf
On indique dans ce fichier de réunir les informations via "winbind" :
# /etc/nsswitch.conf #
passwd: compat winbind
group: compat winbind
shadow: compat
hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4
networks: files
protocols: db files
services: db files
ethers: db files
rpc: db files
netgroup: nis
==> root@ubuntu10:/# getent passwd
On test si NSS couplé à "winbind" nous renvoie bien les informations.
On remarque que les uid des utilisateurs présent dans l'annuaire 2000 commencent à 10000 comme préciser dans smb.conf :
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh ........................................
iepscf:x:1000:1000:iepscf::/home/iepscf:/bin/bash
administrateur:*:10000:10013::/home/TEST/administrateur:/bin/bash
jaouad:*:10001:10013:jaouad ahdadi :/home/TEST/jaouad:/bin/bash
giuseppe:*:10002:10013:giuseppe baldacchino:/home/TEST/giuseppe:/bin/bash
ils_anonymous_user:*:10004:10013:ILS Anonymous
Account:/home/TEST/ils_anonymous_user:/bin/bash
invité:*:10005:10013::/home/TEST/invité:/bin/bash
iusr_server2000:*:10006:10013:Compte Invité Internet:/home/TEST/iusr_server2000:/bin/bash
iwam_server2000:*:10007:10013:Démarrer le compte de l'invité Internet:/home/TEST/iwam_server2000:/bin/bash
tsinternetuser:*:10010:10013:TsInternetUser:/home/TEST/tsinternetuser:/bin/bash
UBUNTU10+iepscf:*:1000:10014:iepscf:/home/UBUNTU10/iepscf:/bin/bash
2.2.5 PAM
PAM va indiquer comment effectuer l'authentification et qui il doit utiliser pour le faire.
Il y a 5 fichiers où il faudra commenter, ajouter ou vérifier certains paramètres:
………………………….1°/ ==> root@ubuntu10:/# vim /etc/pam.d/common-account
# /etc/pam.d/common-account - authorization settings common to all services#
#account [success=2 new_authtok_reqd=done default=ignore] pam_unix.so
#account [success=1 new_authtok_reqd=done default=ignore] pam_winbind.so
account sufficient pam_winbind.so
account sufficient pam_unix.so
………………………….2°/ ==> root@ubuntu10:/# vim /etc/pam.d/common-auth
# /etc/pam.d/common-auth - authentication settings common to all services#
#auth [success=2 default=ignore] pam_unix.so nullok_secure
#auth [success=1 default=ignore] pam_winbind.so krb5_auth krb5_ccache_type=FILE cached_login try_first_pass
auth sufficient pam_winbind.so
auth sufficient pam_unix.so
………………………….3°/ ==> root@ubuntu10:/# vim /etc/pam.d/common-password
# /etc/pam.d/common-password - password-related modules common to all services#
#
#password [success=2 default=ignore] pam_unix.so obscure sha512
#password [success=1 default=ignore] pam_winbind.so use_authtok try_first_pass
password required pam_unix.so nullok obscure md5
………………………….4°/ ==> root@ubuntu10:/# vim /etc/pam.d/common-session
# /etc/pam.d/common-session - session-related modules common to all services#
#session [default=1] pam_permit.so
session required pam_unix.so
session required pam_mkhomedir.so unmask=0022 skel=/etc/skel
………………………….5°/ ==> root@ubuntu10:/# vim /etc/pam.d/sudo
#%PAM-1.0
@include common-auth
@include common-
auth sufficient pam_winbind.so
auth required pam_unix.so use_first_pass
3. Ajout dans l'annuaire
On ajoute l'utilisateur "uccle" et ensuite le mot de passe.
"TEST\" est le répertoire du user à l'ouverture de session, et c'est en se basant sur ces informations que l'on à crée le répertoire "/home/TEST" sur la machine Linux correspondant à %D et %U.
Cliquer sur l'image pour l'agrandir
4. Connexion sur Linux
On indique l'utilisateur "uccle" et ensuite, sont mot de passe:
Cliquer sur l'image pour l'agrandir
La session de l'utilisateur "uccle" est ouverte et on peut voir qu'il s'est bien crée dans "/home/TEST":
5. Bibliographie
http://www.laboratoire-microsoft.org/articles/network/conf_dhcp_win2k3/1/ (configuration DHCP sur AD)
http://irp.nain-t.net/doku.php/320kerberos:05_le_but (Explication du fonctionnement Kerberos)
http://doc.ubuntu-fr.org/tutoriel/comment_ajouter_machine_ubuntu_dans_domaine_active_directory
http://doc.ubuntu-fr.org/tutoriel/comment_integrer_machine_ubuntu_domaine_nt_samba
http://www.coagul.org/article.php3?id_article=178
http://www.gtrgrenoble.fr/projets/2007/sfu-samba/Samba-kerberos.html
http://www.supinfo-projects.com/fr/2006/integration_linux_ad/3/
http://www.linuxmail.info/troubleshooting-active-directory-centos-5/ (dépannage Kerberos)
http://lfs.traduc.org/view/blfs-5.1-fr/postlfs/mitkrb.html
http://ditwww.epfl.ch/SIC/SA/SPIP/Publications/spip.php?article843