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.
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#
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.
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.
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.
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.
security = ads : le serveur Samba prendra part à un domaine Active Directory.
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.
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 :
copie du fichier de configuration original
edition de la copie
vérification dela copie avec testparm
correction de erreurs éventuelles et retour au point 3s
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#
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 « † ».
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 »).
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).
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/*~
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.
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]
.
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.
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:~#
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
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
Variable | Correspondance |
---|---|
%U | Nom d'utilisateur demandé pour la session. |
%u | Nom d'utilisateur unix réèl pour la session. |
%G | Groupe primaire de %U. |
%g | Groupe primaire de %u. |
%H | Répertoire personnel de %u. |
%G | Groupe principal de %U. |
%h | Nom d'hôte TCP/IP du serveur Samba. |
%m | Nom NetBIOS de la machine cliente. |
%M | Nom DNS de la machine cliente. |
%S | Nom de la ressource courante |
%P | Racine sur le disque de la ressource courante |
%T | Date et heure courantes |
%$VAR | Variable d'environnement VAR |