9.2. Configuration

9.2.1. Les démons Samba

Samba utilise deux démons distincts, tous deux configurés dans /etc/samba/smb.conf.

nmbd (ports udp 137 & 138) gère le service de noms et les annonces (permettant de constituer le fameux « voisinage réseau »). Lorsqu'un hôte « parle » le NetBIOS, il en informera ses voisins. Par ailleurs, chaque hôte aura un nom NetBIOS, distinct de son nom d'hôte au sens TCP/IP. nmbd permettra de gérer les requètes liées à la résolution de ces noms. Par extension, nmbd pourra aussi être utilisé comme un serveur de noms NetBIOS (serveur WINS).

smbd (port 139/tcp) fournit le service de partage de fichiers aux clients. C'est lui qui permettra l'envoi/la réception de fichiers, le partage d'imprimantes, etc...

On pourra exécuter smbd depuis xinetd : inutile de faire fonctionner en permanence le démon prenant en charge le service de partage. En revanche, il vaut mieux laisser fonctionner sans interruption nmbd, car les sollicitations liés au service de noms windows sont nombreuses[24]. D'ailleurs Ubuntu, avec les scripts SysV livrés, ne permet pas de déléguer le démarrage de nmbd à xinetd.

9.2.2. Démon permanent ou super-serveur xinetd

Pour demander à xinetd de lancer smbd à la demande, on devra créér un fichier de configuration /etc/xinetd.d/samba contenant au moins les éléments suivants :

service netbios-ssn
{
        disable     = no
        socket_type = stream
        protocol    = tcp
        wait        = no
        user        = root
        server      = /usr/sbin/smbd
}

Il faudra ensuite configurer le script SysV de Samba afin de l'empécher de lancer smbd au démarrage. Pour cela on doit modifier la variable RUN_MODE dans le fichier /etc/default/samba et lui affecter la valeur inetd :

root@ubuntu:/etc/samba# more /etc/default/samba 
# Defaults for samba initscript
# sourced by /etc/init.d/samba
# installed at /etc/default/samba by the maintainer scripts
#

...

# How should Samba (smbd) run? Possible values are "daemons"
#       or "inetd".
RUN_MODE="inetd"
root@ubuntu:/etc/samba# 

9.2.3. Choix d'architecture

Samba permet d'utiliser 5 modes de sécurité différents. Il faudra déterminer, lors de la configuration initiale, le mode que l'on désire utiliser en fonction du type de serveur que l'on souhaite mettre en œuvre.

  1. security = user : le client ouvre une session avec le serveur et demandera par la suite accès à des ressources. toutes les informations d'authentification sont conservées sur le serveur. C'est le mode de fonctionnement de choix pour un serveur isolé, et celui qui sera développé ici.

  2. security = share : le client envoie un mot de passe pour avoir accès à une ressource particulière. Ce mode permet de protéger ces ressources par des mots de passe, sans notion d'utilisateur.

  3. security = domain : le serveur fait partie d'un domaine windows, soit en tant que controleur primaire de domaine (PDC) qui maitient la liste des utilisateurs du domaine Windows, soit en tant que controleur secondaire de domaine (BDC) qui permet d'authentifier les utilisateurs, soit comme serveur membre de domaine (DMS) qui fournit des ressources à des usagers authentifiés. On utilisera ce mode lorsque l'on souhaite gérer une authentification commune sur plusieurs serveurs ou fournir un service d'ouverture de sessions ou de politique centralisée.

  4. security = ads : le serveur Samba prendra part à un domaine Active Directory.

  5. security = server : le serveur Samba agira comme un intermédiaire et ira valider les login/mot_de_passe des utilisateurs sur une autre serveur. Attention à l'ambiguïté : le mode security = server signifie que notre machine délèguera l'authentification à un autre serveur et non qu'elle est serveur.

9.2.4. /etc/samba/smb.conf

Le fichier de configuration de Samba, à l'image de celui de MySQL, est divisé en sections. A l'exception de « [global] », les autres sections représentent des shares (partages), c'est à dire des répertoires ou des imprimantes qui seront disponbles sur le réseau.

Les paramètres suivent le schéma clef = valeur. lorsque valeur est de type booléen, on pourra utiliser sans disctinction true, yes ou 1 et false, no ou 0.

Après chaque modification de la configuration, on pourra utiliser l'outil testparm afin de la valider, avant de redémarrer le service avec invoke-rc.d.

root@ubuntu:~# testparm
Load smb config files from /etc/samba/smb.conf
Processing section "[homes]"
Processing section "[public]"
Global parameter guest account found in service section!
Loaded services file OK.
Server role: ROLE_STANDALONE
Press enter to see a dump of your service definitions

[global]
        workgroup = FEISTYGROUP
        server string = %h server (Samba sous Feisty)
        obey pam restrictions = Yes
        passdb backend = tdbsam
        pam password change = Yes
        passwd program = /usr/bin/passwd %u
        passwd chat = *Enter\snew\sUNIX\spassword:* %n\n *Retype\snew\sUNIX\s...
        unix password sync = Yes
        syslog = 0
        log file = /var/log/samba/log.%m
        max log size = 1000
        load printers = No
        dns proxy = No
        panic action = /usr/share/samba/panic-action %d
        invalid users = root

[homes]
        comment = Home Directories
        valid users = %S
        read only = No
        create mask = 0600
        directory mask = 0700
        browseable = No

[public]
        comment = Espace public
        path = /home/public
        read only = No
        guest only = Yes
        guest ok = Yes

root@ubuntu:~# 

Samba possède toutefois une particularité concernant la gestion de son fichier de configuration. A l'instar de crond, Samba vérifie toutes les minutes si son fichier de configuration a étré modifié. Si c'est le cas, il le relit et applique immédiatement les modification. Samba est intelligent et ne « s'auto-détruit » pas en appliquant un fichier de configuration invalide. Mais afin d'éviter les mauvaises surprises, on pourra effectuer les modifications de configuration en plusieurs temps :

  1. copie du fichier de configuration original

  2. edition de la copie

  3. vérification dela copie avec testparm

  4. correction de erreurs éventuelles et retour au point 3s

  5. déplacement de la copie vers l'original

Cela peut sembler fastidieux. Mais c'est un automatisme à acquerir au même titre que la sauvegarde d'un fichier avant modification (Section 2.1, « Modifier un fichier de configuration »).

root@ubuntu:~# cd /etc/samba/
root@ubuntu:/etc/samba# cp smb.conf smb.conf.new
root@ubuntu:/etc/samba# vi smb.conf.new
...edition du fichier...
root@ubuntu:/etc/samba# testparm smb.conf.new
Load smb config files from smb.conf.new
params.c:Parameter() - Ignoring badly formed line in configuration file: blabla
Processing section "[homes]"
Processing section "[administration]"
Processing section "[public]"
Global parameter guest account found in service section!
Processing section "[printers]"
Processing section "[print$]"
Loaded services file OK.
Server role: ROLE_STANDALONE
Press enter to see a dump of your service definitions
^C
root@ubuntu:/etc/samba# vi smb.conf.new
...correction du fichier...
root@ubuntu:/etc/samba# vi smb.conf.new
root@ubuntu:/etc/samba# testparm smb.conf.new 
Load smb config files from smb.conf.new
Processing section "[homes]"
Processing section "[administration]"
Processing section "[public]"
Global parameter guest account found in service section!
Processing section "[printers]"
Processing section "[print$]"
Loaded services file OK.
Server role: ROLE_STANDALONE
Press enter to see a dump of your service definitions
^C
root@ubuntu:/etc/samba# mv smb.conf.new smb.conf
root@ubuntu:/etc/samba# 

9.2.4.1. Configuration générale « [global] »

Cette section contient les paramètres généraux de configuration pour Samba (nmbd et smbd). On ne détaillera ici que les plus importants. On pourra toujours se reférer à (l'excellente et volumineuse) documentation sur le site de Samba (http://www.samba.org). Certains paramètres globaux peuvent être surchargés dans une section spécifique à un partage. Ils seront accompagnés du symbole «  ».

Paramètres généraux
  • security = user : c'est le mode de fonctionnement choisi par défaut. Le serveur configuré ici sera autonome pour la gestion des comptes.

  • workgroup permet de spécifier le groupe de travail du serveur. Par defaut, Samba utilisera la valeur WORKGROUP.

  • netbios name quand il est spécifié permet de faire apparaître la machine sous un nom NetBIOS spécifique. Par défaut, Samba annoncera « %h »: le nom d'hôte de la machine..

  • server string : affecte une description à notre serveur qui sera vue sur le réseau. Par exemple, la valeur %h server (Samba sous Feisty) sera vue sur le réseau comme sur la figure ci-dessous. %h sera remplacé par le nom d'hôte TCP/IP (la substitution de variables est décrite dans la Section 9.2.4.6, « Substitution de variables »).

    Figure 9.1. Vue du serveur dans le « Voisinage réseau »

    Vue du serveur dans le Voisinage réseau


  • log file permet d'indiquer à Samba le chemin du fichier de log. Habituellement, Samba crée des logs individuels pour chaque machine cliente en mettant la valeur /var/log/samba/log.%m dans ce paramètre.

  • encrypt passwords : demande à Samba d'utiliser des mots de passe chiffrés dans ses négotiations avec les clients. Par defaut la valeur est à true et sauf si l'on à des clients très anciens sur le réseau (NT4, Windows 95, ...) il est recommandé de la laisser telle qu'elle.

  • passdb backend permet de choisir la méthode de conservation des données utilisateur. On privilégiera l'utilisation de tdbsam, plus efficace que smbpasswd. L'autre possibilité, ldap, nécessite le déploiement d'un serveur LDAP et n'est pas couverte ici.

  • load printers indique à Samba de charger ou non les imprimantes système afin de les partager (voir Section 9.2.4.3, « Partage d'imprimante « [printers] » » pour le partage des imprimantes).

Contrôles d'accès

D'autres paramètres permettent de cadrer l'utilisation du serveur : restriction du service à des hôtes ou utilisateurs, masquage de fichiers, gestion des droits...

  • interfaces : liste les interfaces sur lesquelles les démons accepteront les paquets. Il faut noter que nmbd recevra toujours les paquets de toutes les interfaces mais fera le tri ensuite en fonction de l'IP source. Il est donc assez facile d'envoyer un paquet avec une IP source spoofée pour le faire accepter à nmbd. On pourra spécifier plusieurs paramètres séparés par des espaces. Ces paramètres pourront être des noms d'interface (eth1), éventuellement génériques (eth*). On peut aussi spécifier une adresse IP. Dans ce cas le service sera bindé (associé) à l'interface ayant cette adresse. Pour que ce paramètre soit pris en compte par Samba, on devra ajouter bind interfaces only = true dans le fichier de configuration. Cette possibilité de configuration est particulièrement utile lorsque les clients arrivent sur le serveur via OpenVPN (voir Chapitre 11, Déploiement et guide des opérations OpenVPN) : on peut alors demander à Samba de n'accepter que les connexions arrivant par ce tunnel :

    # interfaces autorisées : tun* (tunnels) et eth0 (LAN) mais pas eth1 (WAN)
    interfaces = tun* eth0
    bind interfaces only = yes
  • hosts allow † (ou allow hosts) donne la liste des machines autorisées à utiliser le service. On pourra utiliser des adresses IP, des adresses partielles, des adresses avec masque et des noms d'hôte. On peut aussi exclure des machines de l'ensemble avec le mot clef EXCEPT.

  • hosts deny † (ou deny hosts) donne la liste des machines qui n'ont pas le droit d'utiliser le service. Pour représenter tout l'espace adressable, on pourra utiliser ALL ou 0.0.0.0/0.

    Cette configuration autorise l'accès à toues les machines de 192.168.17.0 à 192.168.18.127 sauf 192.168.18.1
    hosts allow = 192.168.17. 192.168.18.0/255.255.255.128 EXCEPT 192.168.18.1
    hosts deny = ALL
  • admin users † permet de spécifier la liste des utilisateurs qui pourront agir en tant que root, c'est à dire pouvant écrire (et donc effacer) dans n'importe quel fichier via un partage Samba. On évitera d'utiliser cette option si possible, et on privilégiera une gestion plus fine des droits (voir Section 9.2.4.4, « Partages spécifiques « [...] » »). On peut spécifier un ou plusieurs utilisateurs séprarés par des espaces (ou des virgules) ainsi que des groupes en les préfixant par « + ». Attention, cette option définit les droits de l'utilisateur une fois loggué. Il faudra donc aussi ajouter ces utilisateurs dans valid users le cas échéant afin qu'ils puissent d'abord se connecter à la ressource.

  • invalid users † en revanche permet de faire la liste des utilisateurs qui n'auront aucun accès aux services Samba (ou au partage en question). On spécifie ici aussi une liste d'utilisateurs et de groupes séparés par des espaces ou des virgules. On pourra y mettre la liste des utilisateurs « système », mais on lui préfèrera généralement valid users.

  • valid users † permet de lister les utilisateurs pouvant accéder au service. Les utilisateurs non-listés (ou n'appartenant pas à un groupe listé) ne pourront accéder au service. Si un utilisateur est listé dans valid users et invalid users, il n'aura pas accès au service.

  • hide dot files † permet de masquer les fichiers commençant par un « . ». Cela n'empèche pas d'y accéder, mais les supprime juste de l'affichage. Cette option est très utile dans les répertoires personnels, souvent envahis de fichiers et répertoires de préférences applicatives, traditionnellement préfixés par un point.

  • hide special files † contrôle l'affichage des fichiers spéciaux (sockets, devices, fifos). Il sont affichés par défaut, on pourra donc supprimer cet affichage en affectant no à cette valeur.

  • hide unreadable † permet de masquer les fichiers que l'utilisateur ne peut pas lire.

  • create mask † permet de changer les droits unix qui seront affectés à la création d'un fichier. La valeur par défaut est 744. On pourra utiliser une valeur plus raisonnable de 0600.

  • directory mask † permet de changer les droits unix qui seront affectés à la création d'un répertoire. La valeur par défaut est 755. On pourra là aussi utiliser une valeur de 0700 un peu plus restrictive.

  • hide files † permet de masquer les fichiers correspondant au patrons passés en paramètre. Ces patrons (façon globs du shell) devront être séparés par des « / ».

    # on affiche pas les fichiers "point" (.*), le bureau (Desktop), 
    # la poubelle (.Trash, déja couvert par .* !) et les backup emacs (*~)
    hide files = /.*/Desktop/.Trash/*~
Ressources

Samba propose quelques options pour limiter la consommation de ressources, voire desactiver certains services.

  • max connections limite le nombre maximum de connexions simultanées sur une ressource (partage, imprimante) Samba. Par défaut il n'y a aucune limite.

  • max smbd processes limite le nombre maximum de process smbd simultanés. Par défaut, il n'y a aucune limite. Ce paramètre permet, dans une certaine mesure, de se prémunir contre des clients bogués ou des dénis de service. On notera que normalement Samba démarre un process smbd par client (via xinetd ou directement en dæmon). Chaque processus pourra gérer plusieurs connexion simultanées avec ce client.

  • available † permet de couper l'accès à une ressource. L'interêt est de pouvoir empécher les utilisateurs d'accéder à une ressource sans avoir à commenter une grande partie du fichier de configuration.

9.2.4.2. Répertoires personnels « [homes] »

La section [homes] permet de configurer l'accès de tous les utilisateurs à leur répertoire personnel sans avoir à créer un partage pour chacun d'entre eux. Les paramètres par défaut de Samba sous la Ubuntu On pourra mettre la directive browsable à no afin de masquer le partage [homes].

9.2.4.3. Partage d'imprimante « [printers] »

La section [printers] dans la configuration par défaut permet de mettre à disposition les imprimantes locales à travers le réseau. Le client Windows devra installer dans ce cas son propre driver correspondant à l'imprimante utilisée via le partage réseau.

Samba offre aussi la possibilité de mettre le driver à disposition des clients et afin de leur permettre de l'installer automatiquement. On se reportera à Printing and Name Resolution pour plus de détails sur les opérations d'impression.

9.2.4.4. Partages spécifiques « [...] »

Samba permet bien sûr de partager n'importe quel répertoire du filesystem serveur. On devra créér un share pour chacune des arborescences que l'on souhaite mettre à disposition. La création d'un tel partage est très simple, il suffit d'ajouter une section [nomdupartage] dans le fichier de configuration. On spécifiera pour chacun des partages le paramètre path indiquant le répertoire physique partagé.

[isos]
  comment = Images ISOs
  path = /var/spare/isos/
  writeable = no

On pourra utiliser des paramètres dans ces définitions qui permettront de restreindre l'utilisation de la ressource.

  • writeable permet de définir si la ressource est accéssible en lecture seule (no) ou en lecture écriture (yes). Dans ce dernier cas, les utilisateurs autorisés à utiliser le partage pourront modifier son contenu. On peut, selon ses goûts, utliser read only au lieu de writeable.

  • public permet d'indiquer à Samba que la ressource est publique, et qu'il n'est pas nécessaire d'être un utilisateur authentifié pour y avoir accès.

Ces paramètres étant définis, on pourra créér des exceptions. Par exemple, il est possible de spécifier la liste des utilisateurs ayant l'autorisation d'ecrire sur une ressource writeable no (la valeur par défaut) en les ajoutant à write list.

De la même manière, on pourra spécifier la liste des utilisateurs ne pouvant accéder qu'en lecture à une ressource writeable yes en les ajoutant dans read list

Il faut donc bien comprendre que nous maitrisons l'accès à notre ressource en spécifiant le mode de mise à disposition (writeable) et la liste des utilisateurs autorisés (valid users) ou refusés (invalid users). Ce n'est qu'ensuite que nous pourrons créér des exceptions dans notre schéma avec read list et write list

Imaginons par exemple que nous désirions créér un partage « documentation » accessible en lecture à tous les membres d'un club (ces membres font tous partie du groupe unix club) mais que les rédacteurs (groupe unix redac) et le secrétaire du club puissent y avoir accès en écriture. On pourra réaliser cela avec la petite section de configuration suivante :

[documentation]
  comment = Documentation pour le club
  path = /home/doc/
  writeable = no
le groupe « redac » et l'utilisateur « secretaire » font partie du groupe « club »
  valid users = +club
  write list = +redac secretaire

Lorsque l'on met à disposition une ressource partagée entre plusieurs utilisateurs, il va falloir gérer la problématique des droits. En effet, un si utilisateur ayant les droits d'écriture crée un fichier sur une ressource partagée, il faut que les autres utilisateurs ayant droit d'écriture puissent le faire. Or le fichier est créé sur le serveur Linux sera assorti de droits unix standards, et, bien évidemment, Samba n'outrepasse jamais les droits Unix [25].

Ce problème a deux solutions. La première consiste à forcer un masque avec les directives create mask et directory mask (voir la section intitulée « Contrôles d'accès »). L'inconvénient dans ce cas est la création des fichiers avec des droits forcément laxistes : en effet, un fichier créé appartiendra à son créateur (et au groupe principal du créateur généralement homonyme). Donc pour permettre à un autre utilisateur d'y accéder, il faudra avoir au moins un masque en 666. Toute considération satanique mise à part, ce mode pose un réèl problème : n'importe qui ayant accès au filesystem de la machine pourra accéder en lecture+écriture au fichier.

On préfèrera donc la deuxième solution qui met en œuvre deux nouvelles directives : force user et force group. Elles permettent d'effectuer toutes les opérations liées au filesystem sous l'identité d'un utilisateur et d'un groupe particliuers.

L'idée est donc de créér un utilisateur « virtuel » pour chaque ressource partagée à plusieurs de forcer les opérations sur ce username, comme dans l'exemple précédent, repris et amélioré ci-dessous.

Pour notre exemple, on commencera par créér l'utilisateur doc, et on bloquera immédiatement son compte (inutile de se connecter sous cet identifiant).

root@ubuntu:~# adduser doc
Adding user `doc' ...
Adding new group `doc' (1005) ...
Adding new user `doc' (1003) with group `doc' ...
Creating home directory `/home/doc' ...
Copying files from `/etc/skel' ...
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully
Changing the user information for doc
Enter the new value, or press ENTER for the default
        Full Name []: Documentaliste Virtuel
        Room Number []: 
        Work Phone []: 
        Home Phone []: 
        Other []: 
Is the information correct? [y/N] y
root@ubuntu:~# passwd -l doc
Password changed.
root@ubuntu:~# rm ~doc/.*
rm: cannot remove `.' or `..'
rm: cannot remove `.' or `..'
root@ubuntu:~# 

On reprendre ensuite la section [documentation] afin de lui apporter les modifications nécessaires.

[documentation]
  comment = Documentation pour le club
  path = /home/doc/
  writeable = no
le groupe « redac » et l'utilisateur « secretaire » font partie du groupe « club »
  valid users = +club
  write list = +redac secretaire
  force user = doc
  force group = doc
il est conseillé de faire apparaître les directives mask dans la section « [global] »  
  create mask = 0600
  directory mask = 0700

On pourra ensuite créer un fichier sur la ressource depuis un poste de travail et vérifier qu'il possède bien les droits prévus.

root@ubuntu:~# ls -la /home/doc/
total 24
drwxr-xr-x 2 doc  doc  4096 2007-06-29 18:54 .
drwxr-xr-x 8 root root 4096 2007-06-29 18:37 ..
-rw------ 1 doc  doc     6 2007-06-29 18:54 fichier_test.txt
root@ubuntu:~# 

9.2.4.5. Partages public « [...] »

Samba permet d'accéder à des partages dans avoir à fournir une authentification valide grâce à guest ok ou son synonyme public. On pourra ici aussi mettre ce partage en lecture seule ou en lecture écriture, voire spécifier des groupes autorisés à écrire. Si on permet l'écriture, on utilisera si possible un utilisateur virtuel (voir la section précédente) afin de simplifier la gestion des droits.

[public]
   comment = Secteur public
   path = /home/public
   public = yes
   read only = yes
   write list = +redac
   force user = public

9.2.4.6. Substitution de variables

Dans tout le fichier de configuration, on pourra utiliser des variables de substitution. Ces variables sont interprétées à la volée par Samba. Dans la configuration par défaut, cette fonctionnalité est utilisée pour générer un fichier de log pour chaque machine, ou encore pour générer server string.

On pourra aussi, par exemple, changer certains paramètres en fonction de ces variables. Imaginons qu'un kiosque public de consultation (nom NetBIOS : KIOSK) soit dans nos locaux, et que nous ne voulons pas que les membres du groupe redac puissent écrire sur le share [public] défini plus haut depuis ce poste, on pourra modifier la section précédente pour qu'elle devienne

[public]
   comment = Secteur public
   path = /home/public
   public = yes
   read only = yes
   write list = +redac
   force user = public
   
   include = /etc/samba/smb.%m.conf

On demande ici à Samba de lire un fichier de configuration dépendant de la machine qui utilise le service. On pourra créer un fichier /etc/samba/smb.KIOSK.conf avec une nouvelle directive de configuration write list vide qui écrasera l'ancienne :

write list = 

Tableau 9.1. Samba : principales variables de substitution

VariableCorrespondance
%UNom d'utilisateur demandé pour la session.
%uNom d'utilisateur unix réèl pour la session.
%GGroupe primaire de %U.
%gGroupe primaire de %u.
%HRépertoire personnel de %u.
%GGroupe principal de %U.
%hNom d'hôte TCP/IP du serveur Samba.
%mNom NetBIOS de la machine cliente.
%MNom DNS de la machine cliente.
%SNom de la ressource courante
%PRacine sur le disque de la ressource courante
%TDate et heure courantes
%$VARVariable d'environnement VAR




[24] On pourra faire un tcpdump "ether broadcast and port (137 or 138)" pour s'en convaincre...

[25] De même, des droits Unix laxistes ne peuvent permettre d'outrepasser des contrôles d'accès Samba