CH 29 Gestion Des Clients Réseau

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 36

Ch 29: Gestion des clients réseau

A.Configuration d’un serveur DHCP ( En Anglais )


D’après Linux Servers Paul Cobbaut
B. Configuration d’un serveur/client NIS
C. Configuration d’un serveur LDAP
D.Authentification avec PAM

A. Configuration d’un serveur DHCP

. introduction to dhcp
Dynamic Host Configuration Protocol (or short dhcp) is a standard tcp/ip protocol that
distributes ip configurations to clients. dhcp is defined in rfc 2131 (before that it was defined
as an update to bootp in rfc 1531/1541.

The alternative to dhcp is manually entering the ip configuration on each client computer.
1. four broadcasts
dhcp works with layer 2 broadcasts. A dhcp client that starts, will send a dhcp discover
on the network. All dhcp servers (that have a lease available) will respond with a dhcp
offer. The client will choose one of those offers and will send a dhcp request containing
the chosen offer. The dhcp server usually responds with a dhcp ack(knowledge).

In wireshark it looks like this.

When this procedure is finished, then the client is allowed to use that ip-configuration until
the end of its lease time.
.2. picturing dhcp

Here we have a small network with two dhcp servers named DHCP-SRV1 and DHCP-
SRV2 and two clients (SunWS1 and Mac42). All computers are connected by a hub or switch
(pictured in the middle). All four computers have a cable to the hub (cables not pictured).

1. The client SunWS1 sends a dhcp discover on the network. All computers receive this
broadcast.

2. Both dhcp servers answer with a dhcp offer. DHCP-SRV1 is a dedicated dhcp server
and is faster in sending a dhcp offer than DHCP-SRV2 (who happens to also be a file server).

3. The client chooses the offer from DHCP-SRV1 and sends a dhcp request on the network.

4. DHCP-SRV1 answers with a dhcp ack (short for acknowledge).

All four broadcasts (or five when you count both offers) can be layer 2 ethernet broadcast
to mac address ff:ff:ff:ff:ff:ff and a layer 3 ip broadcast to 255.255.255.255.

The same story can be read in rfc 2131.


.3. installing a dhcp server

dhcp server for Debian/Mint

debian5:~# aptitude install dhcp3-server


Reading package lists... Done

Building dependency tree

Reading state information... Done


Reading extended state information
Initializing package states... Done
Reading task descriptions... Done

The following NEW packages will be installed:


dhcp3-server

You get a configuration file with many examples.

debian5:~# ls -l /etc/dhcp3/dhcpd.conf

-rw-r--r-- 1 root root 3551 2011-04-10 21:23 /etc/dhcp3/dhcpd.conf

.4. dhcp server for RHEL/CentOS

Installing is easy with yum.

[root@rhel71 ~]# yum install dhcp

Loaded plugins: product-id, subscription-manager


Resolving Dependencies

--> Running transaction check

---> Package dhcp.x86_64 12:4.2.5-36.el7 will be installed

--> Finished Dependency Resolution Dependencies Resolved

================================================================================

Package Arch Version Repository Size

================================================================================

Installing:

dhcp x86_64 12:4.2.5-36.el7 rhel-7-server-rpms 510 k

Transaction Summary

================================================================================

Install 1 Package

Total download size: 510 k


Installed size: 1.4 M
Is this ok [y/d/N]: y
Downloading packages:
dhcp-4.2.5-36.el7.x86_64.rpm | 510 kB 00:01
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : 12:dhcp-4.2.5-36.el7.x86_64 1/1
Verifying : 12:dhcp-4.2.5-36.el7.x86_64 1/1

Installed:

dhcp.x86_64 12:4.2.5-36.el7

Complete!
[root@rhel71 ~]#

After installing we get a /etc/dhcp/dhcpd.conf that points us to an example file named


dhcpd.conf.sample.
[root@rhel71 ~]# cat /etc/dhcp/dhcpd.conf

# DHCP Server Configuration file.

# see /usr/share/doc/dhcp*/dhcpd.conf.example

# see dhcpd.conf(5) man page

[root@rhel71 ~]#

So we copy the sample and adjust it for our real situation. We name the copy /etc/dhcp/
dhcpd.conf.

[root@rhel71 ~]# cp /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example /etc/dhcp/dhcp\


d.conf

[root@rhel71 ~]# vi /etc/dhcp/dhcpd.conf


[root@rhel71 ~]# cat /etc/dhcp/dhcpd.conf
option domain-name "linux-training.be";
option domain-name-servers 10.42.42.42;

default-lease-time 600;

max-lease-time 7200;
log-facility local7;

subnet 10.42.0.0 netmask 255.255.0.0 {

range 10.42.200.11 10.42.200.120;

option routers 10.42.200.1;

[root@rhel71 ~]#

The 'routers' option is valid for the subnet alone, whereas the 'domain-name' option is global
(for all subnets).

Time to start the server. Remember to use systemctl start dhcpd on RHEL7/CentOS7 and
service dhcpd start on previous versions of RHEL/CentOS.

[root@rhel71 ~]# systemctl start dhcpd

[root@rhel71 ~]#

5. client reservations
You can reserve an ip configuration for a client using the mac address.

host pc42 {

hardware ethernet 11:22:33:44:55:66;

fixed-address 192.168.42.42;

You can add individual options to this reservation.

host pc42 {

hardware ethernet 11:22:33:44:55:66;

fixed-address 192.168.42.42;

option domain-name "linux-training.be";


option routers 192.168.42.1;

.6. example config files

Below you see several sections of /etc/dhcp/dhcpd.conf on a Debian 6 server.

# NetSec Antwerp Network


subnet 192.168.1.0 netmask 255.255.255.0 {

range 192.168.1.20 192.168.1.199;

option domain-name-servers ns1.netsec.local;


option domain-name "netsec.local";

option routers 192.168.1.1;

option broadcast-address 192.168.1.255;

default-lease-time 7200;

max-lease-time 7200;

Above the general configuration for the network, with a pool of 180 addresses.

Below two client reservations:


#

# laptops

host mac {

hardware ethernet 00:26:bb:xx:xx:xx; fixed-


address mac.netsec.local;

host vmac {

hardware ethernet 8c:7b:9d:xx:xx:xx; fixed-


address vmac.netsec.local;

7. older example config files


For dhcpd.conf on Fedora with dynamic updates for a DNS domain.

[root@fedora14 ~]# cat /etc/dhcp/dhcpd.conf


authoritative;

include "/etc/rndc.key"; log-

facility local6;

server-identifier fedora14;

ddns-domainname "office.linux-training.be";
ddns-update-style interim;
ddns-updates on;

update-static-leases on;

option domain-name "office.linux-training.be";


option domain-name-servers 192.168.42.100;
option ip-forwarding off;

default-lease-time 1800;

max-lease-time 3600;

zone office.linux-training.be {
primary 192.168.42.100;

subnet 192.168.4.0 netmask 255.255.255.0 {

range 192.168.4.24 192.168.4.40;

Allowing any updates in the zone database (part of the named.conf configuration)

zone "office.linux-training.be" {
type master;

file "/var/named/db.office.linux-training.be"; allow-


transfer { any; };

allow-update { any; };

};

Allowing secure key updates in the zone database (part of the named.conf configuration)

zone "office.linux-training.be" {
type master;

file "/var/named/db.office.linux-training.be"; allow-


transfer { any; };

allow-update { key mykey; };

};

Sample key file contents:

[root@fedora14 ~]# cat /etc/rndc.key


key "rndc-key" {

algorithm hmac-md5;

secret "4Ykd58uIeUr3Ve6ad1qTfQ==";

};

Generate your own keys with dnssec-keygen.

How to include a key in a config file:


include "/etc/bind/rndc.key";

Also make sure that bind can write to your db.zone file (using chmod/chown). For Ubuntu
this can be in /etc/bind, for Fedora in /var/named.
8. advanced dhcp
8.1. 80/20 rule

DHCP servers should not be a single point of failure. Let us discuss redundant dhcp server
setups.

8.2. relay agent

To avoid having to place a dhcp server on every segment, we can use dhcp relay agents.

8.3. rogue dhcp servers

Rogue dhcp servers are a problem without a solution. For example accidental connection of
a (believed to be simple) hub/switch to a network with an internal dhcp server.

8.4. dhcp and ddns

DHCP can dynamically update DNS when it configures a client computer. DDNS can be
used with or without secure keys.

When set up properly records can be added automaticall to the zone file:

root@fedora14~# tail -2 /var/named/db.office.linux-training.be


ubu1010srv A 192.168.42.151

TXT "00dfbb15e144a273c3cf2d6ae933885782"
introduction to dhcp

9. Practice: dhcp
1. Make sure you have a unique fixed ip address for your DNS and DHCP server (easier
on the same machine).

2. Install DHCP and browse the explanation in the default configuration file /etc/dhcp/
dhcpd.conf or /etc/dhcp3/dhcpd.conf.

3. Decide on a valid scope and activate it.

4. Test with a client that your DHCP server works.

5. Use wireshark to capture the four broadcasts when a client receives an ip (for the first
time).

6. Use wireshark to capture a DHCPNAK and a DHCPrelease.

7. Reserve a configuration for a particular client (using mac address).

8. Configure your DHCP/DNS server(s) with a proper hostname and domainname (/etc/
hosts, /etc/hostname, /etc/sysconfig/network on Fedora/RHEL, /etc/resolv.conf ...). You
may need to disable NetworkManager on *buntu-desktops.

9. Make sure your DNS server still works, and is master over (at least) one domain.

There are several ways to do steps 10-11-12. Google is your friend in exploring DDNS with
keys, with key-files or without keys.

10. Configure your DNS server to allow dynamic updates from your DHCP server.

11. Configure your DHCP server to send dynamic updates to your DNS server.

12. Test the working of Dynamic DNS.


B .Configuration d’un serveur/client NIS - Document 1

Qu’est-ce que NIS ?

NIS est un protocole client serveur qui permet de centraliser les informations sur un

réseau UNIX.

Notre serveur NIS stocke et distribue les informations administratives du réseau,

comme l’ensemble des comptes utilisateurs, des groupes, machines.

Pour ce tutoriel il nous faudra:

• Une machine pour notre serveur NIS.

• Une machine client pour effectuer nos tests.

Installation du serveur NIS (serveur maître)

apt-get update

apt-get upgrade

apt-get install nis

Ensuite on choisi notre nom de domaine ici « nis-sio »

Après l’installation on modifie le fichier : hosts

nano /etc/hosts
127.0.0.1 localhost

10.0.230.16 srvnis.nis-sio NIS

Ensuite on définie notre serveur en tant que maître en rajoutant la ligne :

nano /etc/default/nis

NISSERVER=master

On redémarre la machine.

Ensuite on construit notre base de données :

/usr/lib/yp/ypinit -m

Après on créé un utilisateur pour tester le bon fonctionnement de notre serveur.

groupadd -g 2000 test

useradd -G test alex

passwd alex

notre utilisateur se nomme alex et appartient au groupe test

On met à jour les tables du serveur NIS avec la commande & on démarre nis :

cd /var/yp; make
service nis start

Configuration du client

apt-get install nis

on indique notre domaine « nis-sio »

Puis,on indique le nom du serveur NIS dans le fichier /etc/yp.conf en rajoutant la ligne :

nano /etc/yp.conf

domain nis-sio server srvnis.nis-sio

Ensuite on indique les fichiers que nous voulons synchroniser avec le serveur en y

rajoutant nis derrière les fichiers concernés.


nano /etc/nsswitch.conf

passwd: compat nis

group: compat nis

shadow: compat nis

hosts: files dns nis

Dans le fichier /etc/hosts on précise notre serveur :

nano /etc/hosts

127.0.0.1

10.0.230.16 srvnis.nis-sio NIS


On démarre nis

service nis start

On teste notre serveur nis sur notre client :

ypwhich qui retourne le FQDN de notre serveur

ypdomainname qui retourne le nom du domaine NIS


$ypwhich

NIS.nis-sio

$ypdomainname

nis-sio

On se connecte avec l’utilisateur que nous avons créé

Login : alex

Password : XXXX

On est enfin connecter à notre via notre serveur NIS

C. Configuration d’un serveur LDAP

Configuration d’un serveur LDAP


1) Installez un annuaire LDAP
Vous allez apprendre à installer et à gérer un annuaire LDAP.

Mais c’est quoi un annuaire LDAP ?


LDAP signifie Lightweight Directory Access Protocol. C’est le standard de fait pour
accéder à un annuaire. Un annuaire est une base de données qui va contenir des
informations sur des personnes, des machines, des groupes ou toute autre catégorie
que vous pourriez imaginer.

Un annuaire se distingue d’une base de données relationnelle par le fait qu’il a une
structure hiérarchique et qu’il est très rapide pour chercher et lire des éléments mais
plus lent pour les modifier.
Les annuaires sont couramment employés pour stocker les données d’authentification
(login et mot de passe) ou pour obtenir des informations sur des personnes (email,
téléphone, etc.) ou des objets (localisation, marque, modèle, etc.). Toutes les
applications de votre entreprise (site web, e-mail, comptes système des ordinateurs,
etc.) peuvent par exemple utiliser ce service d’annuaire pour valider les identifiants de
connexion.

Voyons plus précisément la structure d’un annuaire LDAP

Découvrez le fonctionnement de LDAP


Tout d’abord, un annuaire LDAP est un organisation hiérarchique d’entrées. Cette
organisation constitue un arbre appelé DIT (Directory Information Tree) dont une des
entrées est la racine.

Exemple d'un DIT de racine "dc=mon-entreprise,dc=com"


Chaque entrée peut contenir des attributs auxquels on assigne des valeurs. Chaque
entrée appartient au moins à une classe d’objet qui définit les attributs de l’entrée.

Par exemple, la classe d’objet “Employés” pourrait définir qu’un “élément” appartenant à
cette classe doit contenir les attributs obligatoires :

•nom de famille
• prénom
et peut contenir les attributs facultatifs :

•e-mail
• téléphone
• date de naissance
Chacun des attributs de cet élément aura une valeur. Par exemple, “nom de
famille=Dupond”.

De nombreux attributs et classes d’objets sont pré-définis mais il est possible de définir
les vôtres si besoin. L’ensemble des classes d’objets et attributs utilisés est défini dans
le schéma. Certains attributs sont particulièrement courants et intéressants à connaître

Attributs Fonction

dc (domain une partie d’un nom DNS. Pour une entreprise dont le nom de domaine
component) serait “mon-entreprise.com”, il est courant d’appeler la racine du DIT
“dc=mon-entreprise,dc=com”

cn (common le nom commun. Pour une personne, c’est en général le prénom + le nom
name) de famille

gn (given name) le prénom

sn (surname) le nom de famille

o (organization pour une entreprise ce serait le nom de l’entreprise ou de la filiale


name)

ou (organisational l’unité d’organisation. Pour une entreprise, ce serait le département


unit) (commercial, comptabilité, etc.)
Un attribut particulier est le dn (distinguished name), c’est à dire le nom distinct. C’est
un attribut qui identifie de manière unique un élément dans le DIT. Il reprend les noms
de tous les éléments depuis la racine jusqu’à l’élément et indique ainsi un “chemin”
unique pour trouver l’élément.

Par exemple, le dn de “Marie Dupond” qui travaille chez “mon-entreprise.com” pourrait


être “cn=Marie Dupond,ou=Personnes,dc=mon-entreprise,dc=com”. On appelle RDN,
pour Relative Distinguished Name, la partie “finale” propre à Marie. Ici le RDN serait
“cn=Marie Dupon”. Lui, ne garantit pas l'unicité dans le DIT.

Vous avez maintenant quelques bases sur LDAP. Pour une présentation plus détaillée,
je vous recommande de suivre le cours “Présentation du concept d’annuaire LDAP”. Je
vous propose de passer à la pratique et d’installer l’annuaire OpenLDAP sur votre
serveur Ubuntu.

Installez OpenLDAP
OpenLDAP est un des annuaires les plus répandus. Pour l’installer, vous devrez
installer le paquet slapd . Installez également le paquet ldap-utils qui contient les
utilitaires clients pour pouvoir interroger ou modifier votre annuaire.
$ sudo apt-get install slapd ldap-utils
À l’installation de slapd, on vous demandera d’entrer le mot de passe de
l’administrateur de votre annuaire. Pas besoin de le rentrer car vous allez refaire cette
opération dans un instant.
Voilà, vous avez installé votre annuaire. Vous allez maintenant utiliser l’outil de
configuration debconf de Debian pour définir la configuration de base de votre annuaire
:
$ sudo dpkg-reconfigure slapd
Indiquez :

• No pour la première question afin de pouvoir utiliser l’outil de configuration


• pour nom DNS : mon-entreprise.com
• pour nom d’organisation : mon-entreprise
• le mot de passe administrateur x2
• choisissez le format de base par défaut : mdb
• No pour savoir si la base doit être supprimée quand slapd est purgé
• Yes pour déplacer l’ancienne base de données
Comme votre DNS est mon-entreprise.com, la racine de votre DIT a été configurée à
“dc=mon-entreprise,dc=com”, vous pouvez utiliser la commande ldapsearch suivante
pour visualiser votre DIT :
$ sudo ldapsearch -Q -L -Y EXTERNAL -H ldapi:/// -b dc=mon-entreprise,dc=com
version: 1

#
# LDAPv3
# base <dc=mon-entreprise,dc=com> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# mon-entreprise.com
dn: dc=mon-entreprise,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: mon-entreprise
dc: mon-entreprise

# admin, mon-entreprise.com
dn: cn=admin,dc=mon-entreprise,dc=com
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator

# search result

# numResponses: 3
# numEntries: 2
La commande ldapsearch sert, comme son nom l’indique à chercher dans un
annuaire LDAP. Voici le détail des options utilisées :

- active le mode silencieux pour l’authentification SASL


Q

- indique le mode SASL choisi pour l’authentification. Normalement, EXTERNAL


Y implique une authentification par certificat client mais dans ce cas là ça signifie que
l’authentification se fera par l’UID et le GID du compte système. C’est pour ça que vous
devez lancer la commande avec “sudo”. L’utilisateur root a des passe-droits pour accéder
à la base locale LDAP

- indique d’afficher le résultat au format LDIF. On aurait pu indiquer -LLL pour avoir la
L même chose sans toutes les lignes commentées.

- indique l’URI qu’on veut utiliser pour se connecter. Ici ldapi:/// dit de se connecter à
H la socket Unix en local (la communication passe par un fichier local plutôt que par le
réseau).

- indique le noeud à partir duquel vous voulez faire votre recherche. Ici dc=mon-
b entreprise,dc=com est la racine donc vous recherchez dans tout le DIT. À la suite du
noeud, vous auriez pu indiquer des filtres pour votre recherche mais sans filtre vous avez
l’affichage le plus complet.
Je vais maintenant vous parler un peu du format LDIF utilisé pour afficher la réponse
de cette commande.

Comprenez le format LDIF


LDIF signifie “LDAP Directory Interchange Format”. C’est un format créé pour décrire
les ajouts ou les modifications à réaliser dans un annuaire LDAP. Le format d’une
entrée dans un fichier LDIF est toujours de la forme suivante :
dn: <Le dn que vous voulez changer>
changetype: <add, replace ou delete. Cette ligne est optionnelle>
<attribut ou objectclass>: valeu
Dans la sortie de la commande précédente, vous voyez que votre DIT contient en tout
et pour tout 2 entrées :

• La première est la racine. On la reconnaît au fait qu’elle appartient à la classe


d’objet dcObject . Vous voyez qu’elle appartient aussi à 2 autres classes
d’objet. Chacune décrit une série d’attributs que l’entrée peut ou doit contenir.
Vous avez ensuite deux attributs : o et dc , deux types que vous connaissez
déjà.
• La deuxième est le compte administrateur LDAP, comme l’indique
l’attribut description . Il appartient notamment à la classe
d’objet simpleSecurityObject qui représente les comptes d’authentification.
Dans la partie suivante, vous utiliserez le format LDIF pour compléter votre DIT et créer
votre premier utilisateur.

En résumé
• LDAP est LE standard en terme d’accès à un service d’annuaire
• Un annuaire est une base de données hiérarchique optimisée pour la recherche
et la lecture d’informations
• Un annuaire LDAP prend la forme d’un arbre, appelé Directory Information
Tree, dans lequel on trouve des entrées identifiées de manière uniques par
un Distinguished Name
• Chaque entrée appartient à une ou plusieurs classe d’objet et peut posséder
des attributs
• Le format LDIF permet de décrire des changements à appliquer à un annuaire
LDAP

2) Gérez votre annuaire LDAP

Dans le chapitre précédent, vous avez vu que votre annuaire avait une structure
particulièrement basique puisqu’il ne comporte que deux entrées. Vous avez également
découvert qu’il était possible de décrire les changements à appliquer à un annuaire par
le format LDIF.
Savez-vous que votre annuaire contient un deuxième DIT ? En effet, dans les
anciennes versions de slapd, la configuration se faisait en modifiant des fichiers
dans /etc/ldap/ et imposait de redémarrer le serveur pour être prises en compte.
Cette méthode est toujours possible mais il est maintenant recommandé d’utiliser la
nouvelle méthode dite de “configuration à chaud” (en anglais OLC pour On-Line
Configuration) qui permet de ne pas avoir à redémarrer le serveur pour actualiser.

Découvrez la configuration à chaud de slapd


Maintenant, la configuration est gérée sous forme d’un DIT dont le suffixe
est cn=config et le service reste disponible pendant l’application des changements.
Vous pouvez voir les entrées de cet arbre par la commande :
$ sudo ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b cn=config dn
dn: cn=config

dn: cn=module{0},cn=config

dn: cn=schema,cn=config

dn: cn={0}core,cn=schema,cn=config

dn: cn={1}cosine,cn=schema,cn=config

dn: cn={2}nis,cn=schema,cn=config

dn: cn={3}inetorgperson,cn=schema,cn=config

dn: olcBackend={0}mdb,cn=config

dn: olcDatabase={-1}frontend,cn=config

dn: olcDatabase={0}config,cn=config

dn: olcDatabase={1}mdb,cn=config
Cette configuration contient donc des informations sur les modules, le schéma, les
classes d’objets intégrées par défaut. La configuration propre à votre DIT dc=mon-
entreprise,dc=com se trouve dans olcDatabase={1}mdb,cn=config .

Comme cette configuration est stockée sous forme de DIT, vous pouvez la modifier au
moyen de fichiers LDIF. Pour tester ça, je vous propose de modifier la quantité de logs
générée par slapd. Par défaut, slapd ne génère aucun log et vous aimeriez peut-être
avoir plus d’informations sur l’activité de votre serveur. L’attribut qui gère ça est
directement un attribut de cn=config appelé olcLogLevel .
$ sudo ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -s base -b cn=config
olcLogLevel
dn: cn=config
olcLogLevel: none
Ici j’ai rajouté l’option -s base pour indiquer le scope , c’est à dire l’étendue de
la
recherche. base effectue la recherche uniquement au niveau du DN indiqué alors que
par défaut le scope est subtree pour rechercher sur toutes les entrées inférieures
également.

Étendue de la recherche en fonction de la valeur du paramètre "scope"


Vous allez faire passer le niveau de logs à stats . Ça génèrera peut-être trop de
messages pour un système en production mais ce sera parfait pour vos tests. Pour
cela, enregistrez un fichier logLevel.ldif contenant :
dn: cn=config
changeType: modify
replace: olcLogLevel
olcLogLevel: stats
Reprenons ensemble en détails cette commande :

dn: cn=config le DN à modifier

changetype: modify le type de modification de l’objet à effectuer

replace: olcLogLevel l’attribut à modifier

olcLogLevel: stats la nouvelle valeur de l’attribut


Vous pouvez appliquer ce changement par la commande :
$ sudo ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f logLevel.ldif
Les options sont les mêmes que pour ldapsearch sauf le -f qui indique le fichier
LDIF à appliquer.

À partir de maintenant, votre serveur slapd va générer des logs mais ils seront renvoyés
vers le fichier général /var/log/syslog . Pour indiquer au daemon rsyslog qui gère les
logs d’avoir un fichier de log séparé, créez le fichier /etc/rsyslog.d/10-
slapd.conf contenant :

# Logs du serveur OpenLDAP slapd


local4.* /var/log/slapd.conf
Puis redémarrez rsyslog par la commande :
$ sudo systemctl restart rsyslog
Bravo, vous avez réalisé votre première modification grâce à un fichier LDIF. La
prochaine étape consiste à faire évoluer votre annuaire vers la structure suivante :

Structure du DIT à créer


Ajoutez de nouveau noeuds pour compléter votre DIT
Pour ajouter de nouveaux noeuds et un premier utilisateur à votre arbre, vous allez
utiliser un fichier LDIF. Créez donc le fichier structure.ldif contenant :
dn: ou=Personnes,dc=mon-entreprise,dc=com
objectclass: organizationalUnit
ou: Personnes
description: Employes de l entreprise

dn: ou=Machines,dc=mon-entreprise,dc=com
objectclass: organizationalUnit
ou: Machines
description: Ordinateurs de l entreprise

dn: cn=Marie Dupond,ou=Personnes,dc=mon-entreprise,dc=com


objectClass: inetOrgPerson
givenName: Marie
sn: Dupond
cn: Marie Dupond
uid: mdupond
userPassword: mdupond
La structure du fichier est la même mais comme vous rajoutez plusieurs entrées, vous
devez sauter une ligne entre chaque DN. Ce fichier rajoute d’abord deux ou : une pour
inventorier les employés et une pour inventorier les ordinateurs de l’entreprise. Il rajoute
ensuite une personne avec la classe d’objet inetOrgPerson . Vous avez déjà vu les
autres attributs, à l’exception du le mot de passe à la fin (qui sera chiffré par slapd) et
de l’ uid qui correspond au login ou à un uid numérique suivant l’usage qui est fait de
ce champ.

Vous devez bien garder en tête que l’ordre des entrées est important. Vous ne pouvez
pas ajouter Marie au groupe Personnes tant que ce groupe n’a pas été créé.
Vous remarquerez aussi que dans ce fichier, vous n’utilisez pas
l’attribut changetype pour préciser qu’il s’agit d’un ajout car vous allez utiliser la
commande ldapadd qui précise ça par elle-même :
$ sudo ldapadd -x -W -D “cn=admin,dc=mon-entreprise,dc=com” -H
ldap://localhost -f structure.ldif
Pourquoi ne pas utiliser les mêmes options de connexion que pour la commande
Idamodify que j’ai utilisé précédemment ?
Par défaut l’utilisateur root système a les droits de modification sur le
DIT cn=config mais pas sur votre DIT. Sauf à changer ces droits, vous devez donc
passer par le compte administrateur de votre DIT. Voici le détail des options :

• -x : indique une authentification simple par mot de passe


• -W : affiche une invite interactive pour taper le mot de passe du compte
• -D : pour indiquer le DN du compte à connecter
• -H : indique toujours la méthode de connexion choisie mais cette fois-
ci ldap://localhost initie une connexion par le réseau sur le port TCP 389.
La connexion d’un utilisateur à un annuaire LDAP s’appelle un “bind”
Félicitations, vous avez créé votre première base LDAP et vous pourrez utiliser votre
nouvel utilisateur pour vous authentifier sur votre site web dans les prochains chapitres.

Je termine simplement ce chapitre en vous montrant une autre utilisation possible des
fichiers LDIF : la sauvegarde à chaud de votre annuaire dans un fichier texte.

Sauvegardez votre annuaire sous forme de fichier LDIF


C’est un moyen très pratique de réaliser des sauvegardes de votre annuaire. Pour cela,
vous devez utiliser la commande slapcat :
$ sudo slapcat -b dc=mon-entreprise,dc=com -l mon_backup.ldif
Pour restaurer vos données en cas de besoin, éteignez slapd :
$ sudo systemctl stop slapd
Puis restaurez votre base à partir du fichier de sauvegarde par la commande :
$ slapadd -c -b dc=mon-entreprise,dc=com -F /etc/ldap/slapd.d -l
mon_backup.ldif
L’option -c indique de continuer en cas d’erreur (vous voulez ajouter une entrée déjà
présente par exemple), l’option -F indique le répertoire de configuration et l’option -
l le fichier LDIF à utiliser pour la restauration.

Pour une sauvegarde complète, il vous faudra également sauvegarder la configuration


de votre annuaire en sauvegardant le contenu du répertoire /etc/ldap/ .

Ce chapitre constitue une introduction à LDAP. Pour pouvoir utiliser votre annuaire
dans un environnement de production, il resterait à renforcer la sécurité en utilisant des
connexions chiffrées par TLS et passer en revue les ACL qui définissent les droits
d’accès à votre annuaire.
Dans ce cours, vous avez utilisé uniquement la ligne de commande pour gérer votre
annuaire. C’est très utile pour comprendre le fonctionnement d’un annuaire LDAP ou
pour débugger un annuaire mais pour une gestion au quotidien, vous préférerez peut-
être utiliser une solution graphique telle que LAM ou phpldapAdmin.
Dans la partie suivante, vous explorerez l’univers du web en installant un serveur LAMP
(Linux-Apache-MySQL-PHP).

En résumé
• slapd permet de modifier la configuration à chaud par la méthode dite OLC
• par la méthode OLC la configuration est stockée sous forme d’un DIT de
base cn=config
• le format LDIF peut être utilisé pour ajouter de nouvelles unités d’organisation
( ou ), des utilisateurs ou tout autre type d’entrées
• le format LDIF peut également être utilisé pour réaliser des sauvegardes de votre
annuaire

D. Authentification avec PAM

Gestion des clients réseau Authentification avec PAM


Pluggable Authentication Modules (PAM)
Pluggable Authentication Modules (modules d’authentification enfichables, en abrégé
PAM) est un mécanisme permettant d’intégrer différents schémas d’authentification de
bas niveau dans une API de haut niveau, permettant de ce fait de rendre indépendants
du schéma les logiciels réclamant une authentification.

PAM est une création de Sun Microsystems et est supporté en 2006 sur les architectures
Solaris, Linux, FreeBSD, NetBSD, AIX et HP-UX.
L’administrateur système peut alors définir une stratégie d’authentification sans devoir
recompiler des programmes d’authentification. PAM permet de contrôler la manière
dont les modules sont enfichés dans les programmes en modifiant un fichier de
configuration.

Les programmes qui donnent aux utilisateurs un accès à des privilèges doivent être
capables de les authentifier. Lorsque vous vous connectez sur le système, vous indiquez
votre nom et votre mot de passe. Le processus de connexion vérifie que vous êtes bien
la personne que vous prétendez être. Il existe d’autres formes d’authentification que
l’utilisation des mots de passe, qui peuvent d’ailleurs êtres stockés sous différentes
formes.

PAM s’interface entre l’utilisateur et le service demandé. Cette couche intermédiaire


permet de manipuler de manière cohérente les politiques d’authentification en appelant
des modules qui sont des librairies (fichiers .so)

Les modules PAM sont des bibliothèques dynamiques (par ex. pam_unix.so) fournissant
les six primitives d’authentification définies dans la norme, regroupées dans quatre
types :

• Le mécanisme account fournit une seule primitive : il vérifie si le compte


demandé est disponible (si le compte n’est pas arrivé à expiration, si l’utilisateur
est autorisé à se connecter à cette heure de la journée, etc.).
• Le mécanisme auth fournit deux primitives ; il assure l’authentification réelle,
éventuellement en demandant et en vérifiant un mot de passe, et il définit des «
certificats d’identité » tels que l’appartenance à un groupe ou des « tickets »
kerberos.
• Le mécanisme password fournit une seule primitive : il permet de mettre à jour le
jeton d’authentification (en général un mot de passe), soit parce qu’il a expiré,
soit parce que l’utilisateur souhaite le modifier.
• Le mécanisme session fournit deux primitives : mise en place et fermeture de la
session. Il est activé une fois qu’un utilisateur a été autorisé afin de lui permettre
d’utiliser son compte. Il lui fournit certaines ressources et certains services, par
exemple en montant son répertoire personnel, en rendant sa boîte aux lettres
disponible, en lançant un agent ssh, etc.
Source : https://fr.wikipedia.org/wiki/Pluggable_Authentication_Modules

1. Fichiers de configuration des applications PAM


Les fichiers de configuration des différentes applications peut être observé :

ls -l /etc/pam.d/
total 100
-rw-r--r--. 1 root root 192 2 aoû 19:12 chfn
-rw-r--r--. 1 root root 192 2 aoû 19:12 chsh
-rw-r--r--. 1 root root 232 18 aoû 2015 config-util
-rw-r--r--. 1 root root 293 31 mar 17:09 crond
lrwxrwxrwx. 1 root root 19 9 jun 19:29 fingerprint-auth ->
fingerprint-auth-ac
-rw-r--r--. 1 root root 702 9 jun 19:29 fingerprint-auth-ac
-rw-r--r--. 1 root root 796 2 aoû 19:12 login
-rw-r--r--. 1 root root 154 18 aoû 2015 other
-rw-r--r--. 1 root root 188 10 jun 2014 passwd
lrwxrwxrwx. 1 root root 16 9 jun 19:29 password-auth -> password-
auth-ac
-rw-r--r--. 1 root root 974 9 jun 19:29 password-auth-ac
-rw-r--r--. 1 root root 155 23 jun 20:12 polkit-1
lrwxrwxrwx. 1 root root 12 9 jun 19:29 postlogin -> postlogin-ac
-rw-r--r--. 1 root root 330 9 jun 19:29 postlogin-ac
-rw-r--r--. 1 root root 144 10 jun 2014 ppp
-rw-r--r--. 1 root root 681 2 aoû 19:12 remote
-rw-r--r--. 1 root root 143 2 aoû 19:12 runuser
-rw-r--r--. 1 root root 138 2 aoû 19:12 runuser-l
lrwxrwxrwx. 1 root root 17 9 jun 19:29 smartcard-auth -> smartcard-
auth-ac
-rw-r--r--. 1 root root 752 9 jun 19:29 smartcard-auth-ac
lrwxrwxrwx. 1 root root 25 9 jun 19:27 smtp ->
/etc/alternatives/mta-pam
-rw-r--r--. 1 root root 76 10 jun 2014 smtp.postfix
-rw-r--r--. 1 root root 904 21 mar 2016 sshd
-rw-r--r--. 1 root root 540 2 aoû 19:12 su
-rw-r--r--. 1 root root 202 31 mar 19:09 sudo
-rw-r--r--. 1 root root 187 31 mar 19:09 sudo-i
-rw-r--r--. 1 root root 137 2 aoû 19:12 su-l
lrwxrwxrwx. 1 root root 14 9 jun 19:29 system-auth -> system-auth-ac
-rw-r--r--. 1 root root 974 9 jun 19:29 system-auth-ac
-rw-r--r--. 1 root root 129 15 sep 16:28 systemd-user
-rw-r--r--. 1 root root 84 6 mar 2015 vlock

Syntaxe d’un fichier de configuration

service type stratégie module arguments


Par exemple :
cat /etc/pam.d/login
#%PAM-1.0
auth [user_unknown=ignore success=ok ignore=ignore default=bad]
pam_securetty.so
auth substack system-auth
auth include postlogin
account required pam_nologin.so
account include system-auth
password include system-auth
# pam_selinux.so close should be the first session rule
session required pam_selinux.so close
session required pam_loginuid.so
session optional pam_console.so
# pam_selinux.so open should only be followed by sessions to be
executed in the user context
session required pam_selinux.so open
session required pam_namespace.so
session optional pam_keyinit.so force revoke
session include system-auth
session include postlogin
-session optional pam_ck_connector.so
cat /etc/pam.d/passwd
#%PAM-1.0
auth include system-auth
account include system-auth
password substack system-auth
-password optional pam_gnome_keyring.so use_authtok
password substack postlogin
cat /etc/pam.d/system-auth
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth required pam_env.so
auth sufficient pam_unix.so nullok try_first_pass
auth requisite pam_succeed_if.so uid >= 1000 quiet_success
auth required pam_deny.so

account required pam_unix.so


account sufficient pam_localuser.so
account sufficient pam_succeed_if.so uid < 1000 quiet
account required pam_permit.so

password requisite pam_pwquality.so try_first_pass


local_users_only retry=3 authtok_type=
password sufficient pam_unix.so sha512 shadow nullok
try_first_pass use_authtok
password required pam_deny.so

session optional pam_keyinit.so revoke


session required pam_limits.so
-session optional pam_systemd.so
session [success=1 default=ignore] pam_succeed_if.so service in
crond quiet use_uid
session required pam_unix.so

Typiquement chaque ligne correspond à un contexte par exemple password prend en


charge le changement de mot de passe, applique la
stratégie requisite, sufficient puis required avec plusieurs modules et leurs
paramètres.

2. Stratégies

Chaque ligne dispose d’une stratégie définie ou renvoit à un ensemble d’autres


(include).

• required : Tous les modules utilisant ce contrôle doivent passer avec succès
pour que la vérification soit accordée. Le cas échéant l’utilisateur n’est averti qu’à
la fin du traitement de la pile.
• requisite : Comme required sauf que l’utilisateur est averti immédiatement.
• optionnal : L’échec ou le succès de ce module importe peu et ne peut faire
échouer la vérification.
• sufficient : S’il réussit et qu’il n’y a pas de required en échec, le traitement
s’arrête là. Le reste de la pile n’est alors pas traité.

3. Configuration des modules

Les modules se configurent dans /etc/security/ :

# ls -l /etc/security/
total 52
-rw-r--r--. 1 root root 4620 18 aoû 2015 access.conf
-rw-r--r--. 1 root root 82 18 aoû 2015 chroot.conf
drwxr-xr-x. 2 root root 6 18 aoû 2015 console.apps
-rw-r--r--. 1 root root 604 18 aoû 2015 console.handlers
-rw-r--r--. 1 root root 939 18 aoû 2015 console.perms
drwxr-xr-x. 2 root root 6 18 aoû 2015 console.perms.d
-rw-r--r--. 1 root root 3635 18 aoû 2015 group.conf
-rw-r--r--. 1 root root 2422 18 aoû 2015 limits.conf
drwxr-xr-x. 2 root root 26 9 jun 19:26 limits.d
-rw-r--r--. 1 root root 1440 18 aoû 2015 namespace.conf
drwxr-xr-x. 2 root root 6 18 aoû 2015 namespace.d
-rwxr-xr-x. 1 root root 1019 18 aoû 2015 namespace.init
-rw-------. 1 root root 0 18 aoû 2015 opasswd
-rw-r--r--. 1 root root 2972 18 aoû 2015 pam_env.conf
-rw-r--r--. 1 root root 1718 6 déc 2011 pwquality.conf
-rw-r--r--. 1 root root 419 18 aoû 2015 sepermit.conf
-rw-r--r--. 1 root root 2179 18 aoû 2015 time.conf

Comme par exemple le fichier /etc/security/pwquality.conf :

cat /etc/security/pwquality.conf
# Configuration for systemwide password quality limits
# Defaults:
#
# Number of characters in the new password that must not be present in
the
# old password.
# difok = 5
#
# Minimum acceptable size for the new password (plus one if
# credits are not disabled which is the default). (See pam_cracklib
manual.)
# Cannot be set to lower value than 6.
# minlen = 9
#
# The maximum credit for having digits in the new password. If less
than 0
# it is the minimum number of digits in the new password.
# dcredit = 1
#
# The maximum credit for having uppercase characters in the new
password.
# If less than 0 it is the minimum number of uppercase characters in
the new
# password.
# ucredit = 1
#
# The maximum credit for having lowercase characters in the new
password.
# If less than 0 it is the minimum number of lowercase characters in
the new
# password.
# lcredit = 1
#
# The maximum credit for having other characters in the new password.
# If less than 0 it is the minimum number of other characters in the
new
# password.
# ocredit = 1
#
# The minimum number of required classes of characters for the new
# password (digits, uppercase, lowercase, others).
# minclass = 0
#
# The maximum number of allowed consecutive same characters in the new
password.
# The check is disabled if the value is 0.
# maxrepeat = 0
#
# The maximum number of allowed consecutive characters of the same
class in the
# new password.
# The check is disabled if the value is 0.
# maxclassrepeat = 0
#
# Whether to check for the words from the passwd entry GECOS string of
the user.
# The check is enabled if the value is not 0.
# gecoscheck = 0
#
# Path to the cracklib dictionaries. Default is to use the cracklib
default.
# dictpath =

Pour de l’aide :

man pam_pwquality

4. Exercice avec check_user

L’objectif est de créer une application qui simule une connexion utilisateur :

Normalement, PAM Check_user est récupéré depuis le dossier examples des sources de
PAM.
Instructions d’installation sous Centos

Prérequis
Installez les librairies PAM :

sudo yum install -y pam-devel

Installez les utilitaires de compilation:

sudo yum groupinstall -y 'Development Tools'

Récupérez les sources


Installez Git:

sudo yum -y install git

Clonez ce dépôt

git clone https://github.com/humboldtux/check_user.git /tmp/check_user

Compilation
cd /tmp/check_user
gcc -o check_user -lpam -lpam_misc -ldl check_user.c

Un binaire check_user a été créé dans le dossier courant. Vous pouvez vérifier qu’il
supporte bien PAM:

ldd check_user
Vous pouvez ensuite copier le binaire dans un dossier de votre $PATH:

sudo mv check_user /usr/sbin/

Puis vérifier que le binaire est bien accessible:

command -v check_user

Nettoyage
cd
rm -rf /tmp/check_user
Sans fichier de configuration
# check_user user
Not Authenticated

Une application non définie voit son sort réglé par /etc/pam.d/other :

# cat /etc/pam.d/other
#%PAM-1.0
auth required pam_deny.so
account required pam_deny.so
password required pam_deny.so
session required pam_deny.so

Création d’un fichier de configuration PAM pour checkuser


Création du fichier /etc/pam.d/check_user :

auth required pam_unix.so


account required pam_unix.so

5. Test de stratégies avec le module rps

Documentation rps

Instructions d’installation sous Centos 6.X+

Prérequis

• Avoir installé les prérequis de la page https://github.com/humboldtux/check_user

Récupérez les sources


Clonez le dépôt

cd
git clone https://github.com/humboldtux/pam_rps /tmp/pam_rps

Compilation
cd /tmp/pam_rps/src/
gcc -fPIC -c pam_rps.c
gcc -shared -o pam_rps.so pam_rps.o -lpam

Installation
Un module pam_rps a été créé dans le dossier courant.

Vous pouvez copier dans le dossier des modules PAM de votre système :

sudo mv pam_rps.so /lib64/security/

Ainsi que la page de manuel :

gzip pam_rps.8.in -c | sudo tee /usr/share/man/man8/pam_rps.8.gz


man pam_rps

Ménage
cd
rm -rf /tmp/pam_rps

Stratégie sufficient
cat /etc/pam.d/check_user
auth sufficient pam_rps.so
auth required pam_unix.so
account required pam_unix.so
check_user user

Stratégie requisite
# cat /etc/pam.d/check_user
#auth sufficient pam_rps.so
auth requisite pam_rps.so
auth required pam_unix.so
account required pam_unix.so
check_user user

Autoriser un service
# cat /etc/pam.d/check_user
auth sufficient pam_permit.so
auth required pam_unix.so
account required pam_unix.so
Interdire un service
# cat /etc/pam.d/check_user
auth sufficient pam_deny.so
auth required pam_unix.so
account required pam_unix.so

Configuration de modules

• /etc/security/time.conf
• /etc/security/access.conf
• /etc/security/limits.conf
• /etc/security/pwquality.conf

You might also like