Vous êtes sous Debian, vous avez des fichiers et, contre toute attente, vous souhaitez permettre à d’autres machines d’y accéder.
Windows est dans les parages. Peut-être quelques Linux. Éventuellement un macOS. Tout ce petit monde doit consulter les mêmes documents sans que vous déposiez une clé USB sur chaque bureau comme un facteur particulièrement mal payé.
C’est précisément le genre de problème que Samba résout depuis des décennies.
Samba permet à une machine Unix ou Linux de fournir des services compatibles avec le protocole SMB — Server Message Block, utilisé notamment par Windows pour le partage de fichiers et d’imprimantes.
Avec Samba, votre Debian peut se comporter comme un serveur de fichiers SMB parfaitement naturel pour les postes Windows.
Bien configuré, le résultat est remarquablement banal :
\\serveur\documents
Les utilisateurs voient leurs fichiers.
Ils ignorent les UID, les ACL, les démons, les dialectes SMB et les heures que vous avez passées à découvrir pourquoi Bob pouvait ouvrir un document mais pas le modifier.
C’est généralement le signe que l’administrateur a bien travaillé.
Qu’est-ce que Samba ?
Samba est un ensemble de logiciels libres qui implémentent les protocoles et services nécessaires à l’interopérabilité avec les environnements Windows.
Il peut notamment servir à :
- partager des fichiers ;
- partager des imprimantes ;
- authentifier des utilisateurs ;
- intégrer une machine Linux à un domaine Active Directory ;
- fournir certains services de domaine ;
- et même fonctionner comme contrôleur de domaine Active Directory dans une architecture appropriée.
Dans cet article, nous nous concentrons sur le cas le plus simple et le plus fréquent :
transformer une machine Debian en serveur de fichiers SMB autonome.
Pas de contrôleur de domaine.
Pas de forêt Active Directory composée de quatre sites et d’un DNS qui a connu la guerre.
Juste des utilisateurs, des dossiers et des permissions correctement administrées.
SMB et CIFS : une précision historique importante
On rencontre encore très souvent l’expression :
SMB/CIFS
Elle est compréhensible historiquement, mais il vaut mieux comprendre ce qu’elle recouvre.
SMB est la famille du protocole.
CIFS — Common Internet File System désigne essentiellement une évolution historique de SMB associée au dialecte que Samba nomme NT1, c’est-à-dire à l’univers que l’on regroupe aujourd’hui sous SMB1.
CIFS n’est donc pas « le SMB moderne ».
C’est plutôt l’un de ses ancêtres particulièrement bavards.
Les générations principales
| Famille | Époque / usage | Situation actuelle |
|---|---|---|
| SMB1 / CIFS | Windows anciens, équipements historiques | Obsolète et généralement à éviter |
| SMB2 | Introduit avec Windows Vista / Server 2008 | Toujours pris en charge |
| SMB3 | Introduit avec Windows 8 / Server 2012 puis enrichi | Famille moderne |
SMB2 et SMB3 apportent notamment une architecture beaucoup plus efficace que SMB1 et de nombreuses fonctions modernes.
SMB3 ajoute également des capacités comme le chiffrement du trafic dans les versions compatibles.
Ne réactivez pas SMB1 juste parce qu’un vieux périphérique boude
Sur un Samba moderne, la négociation normale permet aux clients et au serveur de choisir automatiquement un dialecte compatible.
Il n’est généralement pas nécessaire d’ajouter :
server min protocol = SMB2
simplement pour « sécuriser Samba » sur une installation Debian actuelle : les versions modernes possèdent déjà une version minimale SMB2 par défaut.
En revanche, évitez de faire ceci :
server min protocol = NT1
uniquement parce qu’un appareil de 2009 refuse de se connecter.
Si votre scanner réclame SMB1, la question pertinente est :
« Comment isoler ou remplacer ce scanner ? »
et non :
« Comment faire revenir tout mon serveur de fichiers en 1998 ? »
Les principaux composants de Samba
Pour un serveur de fichiers autonome, plusieurs programmes peuvent entrer en jeu.
smbd : le cœur du serveur de fichiers
smbd fournit les services SMB aux clients.
Il s’occupe notamment :
- des connexions SMB ;
- de l’authentification dans les modes appropriés ;
- du partage des fichiers ;
- des permissions ;
- des verrous de fichiers ;
- des attributs ;
- et des opérations effectuées par les clients.
Pour notre serveur de fichiers, c’est lui qui fait le vrai travail.
nmbd : le vétéran NetBIOS
nmbd gère principalement des fonctions historiques liées à NetBIOS over TCP/IP :
- résolution de noms NetBIOS ;
- annonces réseau historiques ;
- browsing SMB ancien ;
- WINS lorsqu’il est configuré pour cela.
Il reste fourni sous Debian et peut être utile dans certains réseaux anciens.
Mais un client moderne qui accède directement à :
\\fileserver.example.lan\documents
via DNS et SMB2/SMB3 n’a pas besoin du vieux mécanisme de navigation NetBIOS pour que le partage fonctionne.
nmbd est donc davantage l’archiviste du quartier que le moteur principal du serveur moderne.
winbindd : quand Active Directory entre dans la pièce
winbindd est particulièrement important lorsqu’un serveur Samba doit intégrer des utilisateurs et groupes provenant d’un domaine Windows ou Active Directory.
Il peut notamment participer à la correspondance entre :
- SID Windows ;
- UID Unix ;
- GID Unix ;
- utilisateurs du domaine ;
- groupes du domaine.
Pour notre serveur autonome avec comptes locaux, il n’est pas nécessaire d’en faire le centre de l’article.
Et le service samba-ad-dc ?
Un contrôleur de domaine Samba Active Directory utilise une architecture différente.
Ne prenez donc pas un tutoriel destiné à un simple :
smbd
et ne l’appliquez pas aveuglément à un contrôleur de domaine.
Les deux machines utilisent Samba.
Comme un vélo et un semi-remorque utilisent tous deux des roues.
Le reste mérite tout de même quelques adaptations.
Installation sous Debian
Actualisons d’abord les index APT :
sudo apt update
Puis installons Samba ainsi que le client en ligne de commande qui nous servira pour les tests :
sudo apt install samba smbclient
Le fichier principal de configuration se trouve normalement dans :
/etc/samba/smb.conf
Sauvegarder la configuration avant d’y toucher
Avant la moindre modification :
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.backup
Ce n’est pas spectaculaire.
Ce n’est pas particulièrement technique.
Mais une copie d’un fichier fonctionnel devient étonnamment séduisante environ trente secondes après avoir supprimé par accident une section entière.
Vérifier le service
Pour le serveur de fichiers :
systemctl status smbd
Et si vous utilisez également le service NetBIOS historique :
systemctl status nmbd
On peut aussi afficher les deux :
systemctl status smbd nmbd
La structure de smb.conf
Le fichier utilise des sections.
La section :
[global]
contient les paramètres généraux.
Puis chaque partage possède généralement sa propre section :
[documents]
path = /srv/samba/documents
Le nom entre crochets devient le nom du partage visible sur le réseau.
Ainsi :
[documents]
produit typiquement :
\\serveur\documents
Configuration globale minimale pour un serveur autonome
Pour un serveur local simple avec authentification utilisateur :
[global]
workgroup = WORKGROUP
server role = standalone
security = user
server role = standalone indique que la machine fonctionne comme serveur autonome.
security = user correspond à une authentification basée sur les utilisateurs.
Dans ce mode, les comptes sont authentifiés par Samba puis associés à des identités Unix locales.
WORKGROUP n’est pas un domaine Active Directory
Le paramètre :
workgroup = WORKGROUP
correspond notamment au groupe de travail SMB/NetBIOS utilisé dans les environnements classiques.
Ce n’est pas la même chose qu’un domaine DNS comme :
example.lan
et ce n’est pas non plus une configuration Active Directory complète.
Trois concepts peuvent porter des noms similaires.
Windows estime manifestement que l’administrateur n’avait pas suffisamment de choses à distinguer.
Créer le répertoire à partager
Créons notre espace de données :
sudo mkdir -p /srv/samba/documents
Le répertoire :
/srv/samba
est un choix cohérent pour des données fournies par un service.
Ce n’est pas une obligation absolue, mais cela évite d’héberger le service de fichiers dans :
/home/alice/Bureau/Nouveau dossier (3)
ce qui constitue déjà un progrès architectural significatif.
Créer les utilisateurs Linux
Pour qu’un compte Samba local soit utilisable avec le backend standard, il doit normalement correspondre à un utilisateur Unix connu du système.
Pour un utilisateur Linux classique :
sudo adduser alice
sudo adduser bob
Si ces comptes servent uniquement à Samba et ne doivent pas ouvrir de session shell, on peut créer des comptes adaptés à cet usage.
Par exemple :
sudo useradd -M -s /usr/sbin/nologin alice
sudo useradd -M -s /usr/sbin/nologin bob
-M évite ici la création automatique d’un répertoire personnel.
/usr/sbin/nologin empêche une connexion shell classique.
Samba peut néanmoins utiliser l’identité Unix pour accéder aux fichiers.
Créer un groupe pour le partage
sudo groupadd sambadocs
Puis ajoutons les utilisateurs :
sudo usermod -aG sambadocs alice
sudo usermod -aG sambadocs bob
Attribuons le répertoire au groupe :
sudo chown root:sambadocs /srv/samba/documents
Et appliquons des permissions :
sudo chmod 2770 /srv/samba/documents
Pourquoi 2770 ?
Le :
770
accorde :
- lecture, écriture et traversée au propriétaire ;
- lecture, écriture et traversée au groupe ;
- aucun accès aux autres utilisateurs.
Le bit supplémentaire :
2
active le setgid sur le répertoire.
Les nouveaux fichiers et sous-répertoires ont ainsi tendance à conserver le groupe du répertoire parent, ce qui facilite le travail collaboratif.
Sans cela, un partage d’équipe peut rapidement devenir un musée consacré aux groupes primaires personnels de chacun.
Ajouter les comptes dans Samba
Une fois l’utilisateur Unix créé :
sudo smbpasswd -a alice
Puis :
sudo smbpasswd -a bob
La commande demande un mot de passe SMB.
Celui-ci peut être différent du mot de passe Unix.
Où Samba conserve-t-il ses comptes ?
Sur un serveur autonome moderne utilisant la configuration par défaut, Samba emploie généralement le backend :
tdbsam
Les comptes sont alors stockés dans une base TDB appelée :
passdb.tdb
Le répertoire privé par défaut de Samba sous Debian est :
/var/lib/samba/private
On rencontre donc normalement :
/var/lib/samba/private/passdb.tdb
Cette base est distincte du fichier système Linux shadow, situé dans le répertoire /etc.
Samba a besoin de l’identité Unix pour les permissions du système de fichiers, mais gère ses propres données d’authentification SMB.
Deux bases pour un même prénom.
Parce qu’une seule source d’identité aurait rendu le dépannage beaucoup trop rapide.
Lister les comptes Samba
Une commande très pratique est :
sudo pdbedit -L
Pour davantage de détails sur un utilisateur :
sudo pdbedit -L -v alice
Désactiver et réactiver un compte Samba
Désactivation :
sudo smbpasswd -d alice
Réactivation :
sudo smbpasswd -e alice
Supprimer un compte de la base Samba
sudo smbpasswd -x alice
Cela retire le compte Samba.
Cela ne supprime pas automatiquement l’utilisateur Unix correspondant.
Là encore, Samba et Linux tiennent chacun leur propre registre.
Premier partage : Alice écrit, Bob lit
Ajoutons dans :
/etc/samba/smb.conf
la section :
[documents]
path = /srv/samba/documents
browseable = yes
read only = yes
valid users = alice bob
write list = alice
Cette configuration reprend le principe initial :
- Alice et Bob ont le droit d’ouvrir le partage ;
- le partage est globalement en lecture seule ;
- Alice fait exception grâce à
write listet peut écrire ; - Bob reste en lecture seule.
valid users : qui a le droit d’entrer ?
Le paramètre :
valid users = alice bob
limite le partage aux comptes indiqués.
On peut également utiliser un groupe Unix avec :
valid users = @sambadocs
Le caractère :
@
permet ici de référencer un groupe.
Pour une administration professionnelle, les groupes sont généralement beaucoup plus pratiques que des listes de quinze utilisateurs saisies à la main.
read only et writable
Le paramètre :
read only = yes
rend normalement le partage non modifiable.
Son inverse peut être exprimé par :
writeable = yes
ou son alias courant :
writable = yes
Pour éviter les doubles négations inutiles, il est souvent plus simple de choisir une convention et de s’y tenir.
Par exemple :
read only = yes
ou :
read only = no
plutôt que de transformer chaque partage en exercice de logique propositionnelle.
write list : une exception d’écriture
Avec :
read only = yes
write list = alice
le partage est normalement en lecture seule, sauf pour Alice.
On peut également utiliser un groupe :
write list = @sambawriters
C’est pratique pour créer une politique :
- beaucoup de lecteurs ;
- quelques rédacteurs.
read list : forcer certains utilisateurs en lecture seule
Le mécanisme inverse existe également :
read list = bob
Il permet de forcer Bob en lecture seule, même si le partage est par ailleurs modifiable.
Par exemple :
[projets]
path = /srv/samba/projets
read only = no
valid users = @projets
read list = bob
Tous les utilisateurs autorisés peuvent écrire, sauf Bob.
On ignore ce que Bob a fait.
Mais la configuration conserve manifestement une trace administrative de l’incident.
Si un utilisateur est dans read list et write list
Évitez de créer volontairement ce genre d’ambiguïté.
Mais si un utilisateur se trouve dans les deux listes, Samba donne priorité à write list et lui accorde l’écriture.
Il vaut mieux néanmoins construire des groupes dont les rôles sont compréhensibles plutôt que compter sur ce détail pour concevoir toute votre politique de sécurité.
Le système de fichiers Linux a toujours le dernier mot
Une règle fondamentale :
Samba ne peut pas donner à un utilisateur des droits que le système Linux sous-jacent lui refuse.
Vous pouvez écrire :
write list = alice
autant de fois que vous voulez.
Si Linux ne permet pas à Alice d’écrire dans :
/srv/samba/documents
la création d’un fichier échouera.
Deux couches de permissions
| Couche | Exemples |
|---|---|
| Samba | valid users, read only, write list |
| Linux | UID, GID, chmod, ACL POSIX |
L’accès final doit satisfaire les deux.
C’est très similaire au principe permissions de partage + NTFS sous Windows.
Et tout aussi efficace pour produire la célèbre phrase :
« Pourtant j’ai mis les droits dans Samba. »
Attention à notre exemple Alice/Bob
Dans notre exemple :
chmod 2770 /srv/samba/documents
Alice et Bob appartiennent tous les deux au groupe sambadocs.
Le système Unix leur permet donc techniquement tous les deux d’écrire localement dans le répertoire.
C’est Samba qui bloque l’écriture de Bob lorsqu’il passe par le partage SMB.
Si Bob peut se connecter localement à la machine par un autre moyen, cette restriction Samba ne constitue évidemment pas une interdiction Unix globale.
Pour obtenir également une séparation stricte au niveau du système de fichiers, utilisez des groupes distincts ou des ACL POSIX.
Utiliser des ACL Linux pour une politique plus précise
Installons les outils si nécessaire :
sudo apt install acl
On peut alors accorder explicitement :
sudo setfacl -m u:alice:rwx /srv/samba/documents
sudo setfacl -m u:bob:rx /srv/samba/documents
Et définir des ACL par défaut pour les nouveaux éléments :
sudo setfacl -m d:u:alice:rwx /srv/samba/documents
sudo setfacl -m d:u:bob:rx /srv/samba/documents
Vérification :
getfacl /srv/samba/documents
Les ACL permettent des politiques beaucoup plus précises que les trois blocs traditionnels :
user
group
other
Elles permettent aussi de produire des sorties assez longues pour rappeler que toute flexibilité possède un prix.
Exemple avec groupes
Une approche plus propre pour une équipe consiste à créer :
samba-docs-read
samba-docs-write
Puis à gérer les utilisateurs dans ces groupes.
La configuration Samba peut devenir :
[documents]
path = /srv/samba/documents
browseable = yes
read only = yes
valid users = @samba-docs-read @samba-docs-write
write list = @samba-docs-write
La logique devient lisible immédiatement :
- groupe lecture : accès en lecture ;
- groupe écriture : accès en lecture/écriture.
Les permissions Unix doivent évidemment être configurées de manière cohérente avec cette politique.
L’exemple secret corrigé
Un partage non visible et réservé à un groupe peut ressembler à :
[secret]
path = /srv/samba/secret
browseable = no
read only = yes
valid users = @samba-secret
write list = admin1
read list = admin2
Dans cet exemple :
- seuls les membres du groupe Unix
samba-secretpeuvent entrer ; admin1peut écrire ;admin2reste explicitement en lecture seule ;- le partage n’est pas présenté dans les listes classiques de partage.
admin1 et admin2 doivent évidemment également satisfaire la règle valid users, donc appartenir au groupe concerné.
Évitez root comme compte Samba ordinaire
L’ancien exemple utilisait :
write list = root,admin1
Ce n’est généralement pas une bonne architecture.
Le compte root dispose de privilèges extrêmement élevés sur le système Unix.
Il vaut mieux créer un groupe d’administrateurs du partage et accorder uniquement les droits nécessaires.
Par exemple :
write list = @samba-secret-admins
Le principe du moindre privilège possède un avantage appréciable :
quand un mot de passe fuit, la catastrophe est légèrement moins ambitieuse.
browseable = no ne sécurise pas un partage
Le paramètre :
browseable = no
empêche essentiellement le partage d’apparaître dans certaines opérations d’énumération.
Mais quelqu’un qui connaît son nom peut toujours essayer :
\\serveur\secret
Invisible n’est pas synonyme d’interdit.
La sécurité repose sur :
- l’authentification ;
valid users;- les groupes ;
- les permissions Unix ;
- les ACL ;
- et la sécurité du réseau.
Masquer le nom est une mesure ergonomique.
Pas une fortification.
Les droits de création : create mask et directory mask
Samba permet de contrôler certains bits de permissions des nouveaux fichiers et répertoires.
Par exemple :
[documents]
path = /srv/samba/documents
read only = no
valid users = @sambadocs
create mask = 0660
directory mask = 0770
Ici, les fichiers seront normalement limités à :
rw-rw----
et les répertoires à :
rwxrwx---
Ces paramètres sont utiles, mais ils interagissent avec :
- les permissions Unix ;
- les ACL ;
- les options du système de fichiers ;
- d’autres paramètres Samba.
Un masque n’est donc pas une permission indépendante tombée du ciel.
map to guest : à quoi servait l’exemple original ?
L’exemple initial contenait :
map to guest = Bad User
Ce paramètre est utile lorsqu’on veut réellement proposer des partages invités.
Avec :
map to guest = Bad User
un nom d’utilisateur inexistant peut être transformé en connexion invité.
En revanche, un utilisateur valide qui fournit simplement un mauvais mot de passe n’est pas censé être silencieusement transformé en invité avec ce réglage.
C’est une nuance importante.
Pour des partages authentifiés, inutile d’activer les invités
Si tous vos partages exigent une véritable authentification :
valid users = ...
vous pouvez très bien laisser le comportement invité désactivé.
Il n’est pas nécessaire d’ajouter :
map to guest = Bad User
simplement parce que la ligne existe dans un ancien tutoriel.
Les configurations de sécurité apprécient particulièrement les options dont on connaît la raison d’être.
Créer volontairement un partage invité
Si vous avez réellement besoin d’un partage accessible sans compte Samba, une configuration conceptuelle pourrait inclure :
[global]
security = user
map to guest = Bad User
[public]
path = /srv/samba/public
guest ok = yes
read only = yes
Mais cela signifie bien :
« Je souhaite volontairement offrir un accès sans authentification traditionnelle à cette ressource. »
Ne faites pas cela sur des données sensibles.
Et sachez que certains Windows modernes restreignent fortement les connexions invité non sécurisées.
Ce n’est donc plus la méthode idéale pour éviter de créer trois comptes utilisateurs.
Tester smb.conf avant de toucher au service
Après chaque modification importante :
sudo testparm
Cette commande vérifie la cohérence interne du fichier de configuration.
Une sortie correcte se termine notamment par une validation de la configuration chargée.
Pour une sortie plus compacte :
sudo testparm -s
testparm vérifie la syntaxe et la cohérence Samba. Il ne prouve pas que vos permissions Unix, votre DNS et votre pare-feu sont corrects.
Mais éliminer une erreur de syntaxe avant de chercher un problème réseau constitue déjà une excellente manière de gagner vingt minutes.
Recharger Samba sans tout redémarrer
Après un :
sudo testparm
réussi, vous pouvez demander aux démons Samba de relire leur configuration :
sudo smbcontrol all reload-config
Les nouvelles connexions utiliseront la configuration actualisée.
Les connexions déjà ouvertes peuvent cependant conserver les paramètres de leur session existante.
Il peut donc être nécessaire de déconnecter puis reconnecter un client pour tester certaines modifications.
Et systemctl restart ?
Vous pouvez évidemment faire :
sudo systemctl restart smbd
et, si vous utilisez nmbd :
sudo systemctl restart nmbd
ou :
sudo systemctl restart smbd nmbd
Mais un redémarrage du serveur SMB interrompt les sessions existantes.
Sur une machine de test, ce n’est généralement pas dramatique.
Sur un serveur de fichiers utilisé par cinquante personnes travaillant dans le même tableur Excel, le résultat possède davantage de potentiel narratif.
Tester la liste des partages
Avec smbclient :
smbclient -L localhost -U alice
Le mot de passe est demandé interactivement.
Évitez de l’ajouter directement dans la commande.
Tester directement un partage
smbclient //localhost/documents -U alice
Une fois connecté, on dispose d’une interface rappelant un client FTP :
smb: \> ls
smb: \> get fichier.txt
smb: \> put test.txt
smb: \> quit
Pour Alice, le :
put test.txt
devrait fonctionner si les permissions Unix le permettent.
Pour Bob, notre configuration en lecture seule devrait le refuser.
Voilà un test légèrement plus convaincant que :
« Le dossier apparaît dans l’Explorateur, donc tout fonctionne. »
Tester depuis Windows
Depuis un poste Windows, saisissez :
\\nom-du-serveur\documents
ou avec son nom DNS complet :
\\fileserver.example.lan\documents
Un test direct par adresse IP peut également aider au diagnostic :
\\192.168.1.20\documents
Mais sur un réseau correctement administré, un nom DNS stable est généralement préférable.
Tester le port SMB depuis Windows
PowerShell permet :
Test-NetConnection fileserver.example.lan -Port 445
Si :
TcpTestSucceeded : False
il est inutile de commencer par modifier write list.
Le client n’atteint même pas encore le service SMB.
Quels ports utilise Samba ?
Pour le service SMB moderne, le port essentiel est :
TCP 445
Samba peut également écouter par défaut sur :
TCP 139
pour SMB transporté via NetBIOS.
Et nmbd utilise historiquement notamment les ports UDP :
137
138
Dans une architecture moderne sans dépendance NetBIOS, TCP 445 est la pièce centrale.
Le pare-feu : n’exposez pas SMB à la planète
Autorisez SMB uniquement depuis les réseaux qui en ont réellement besoin.
Un serveur interne pourrait par exemple être accessible depuis :
192.168.10.0/24
sans pour autant accepter TCP 445 depuis toutes les interfaces publiques.
N’exposez pas simplement TCP 445 directement à Internet.
Pour un accès distant, utilisez une architecture conçue pour cela :
- VPN ;
- tunnel sécurisé ;
- solution d’accès distant contrôlée ;
- ou autre mécanisme approprié à votre infrastructure.
Le monde extérieur dispose déjà de suffisamment de scanners automatiques sans que votre serveur de comptabilité leur fournisse une activité supplémentaire.
Vérifier les ports réellement ouverts
Sur Debian :
sudo ss -lntup
Pour rechercher notamment SMB :
sudo ss -lntup | grep -E ':(445|139|137|138)\b'
Vous pourrez ainsi distinguer :
« Le service est configuré. »
de :
« Un processus écoute réellement sur le port attendu. »
nmbd est-il vraiment nécessaire ?
Pour une infrastructure utilisant :
- DNS ;
- SMB2 ou SMB3 ;
- des chemins directs comme
\\serveur\partage;
nmbd n’est pas indispensable au transfert SMB lui-même.
Vous pouvez donc rencontrer des serveurs Samba parfaitement fonctionnels où le besoin principal est simplement :
smbd
Le vieux monde NetBIOS reste utile uniquement si votre environnement en dépend réellement.
Pourquoi le serveur n’apparaît-il pas dans « Réseau » sous Windows ?
Voici une confusion extrêmement fréquente :
« Mon serveur n’apparaît pas dans Réseau, donc Samba ne fonctionne pas. »
Pas nécessairement.
La découverte d’une machine et l’accès SMB à cette machine sont deux problèmes différents.
Essayez :
\\fileserver\documents
Si cela fonctionne, le serveur SMB fonctionne même s’il ne se présente pas spontanément dans la fenêtre « Réseau ».
Découverte Windows moderne avec WSD
Les Windows modernes utilisent notamment Web Services Discovery — WSD pour certaines fonctions de découverte réseau.
Debian propose par exemple :
sudo apt install wsdd2
Puis :
systemctl status wsdd2
wsdd2 peut annoncer le serveur aux clients Windows modernes.
Il ne remplace pas Samba.
Il aide simplement Windows à découvrir plus naturellement qu’un serveur de fichiers existe.
En résumé :
smbd sert les fichiers.
WSD aide Windows à découvrir la machine.
nmbd entretient les anciennes traditions NetBIOS.
Voir les connexions actives avec smbstatus
Une fois les utilisateurs connectés :
sudo smbstatus
Cette commande affiche notamment les connexions Samba en cours.
Pour ne voir que les partages :
sudo smbstatus -S
Pour les verrous :
sudo smbstatus -L
Pour un utilisateur :
sudo smbstatus -u alice
Très utile lorsqu’Alice assure qu’elle a fermé le fichier Excel et que Samba soutient une version juridiquement différente des événements.
Les verrous de fichiers
SMB gère des mécanismes de verrouillage permettant notamment aux applications d’éviter certaines écritures simultanées dangereuses.
C’est particulièrement important pour :
- les documents bureautiques ;
- certaines bases de données ;
- les applications multi-utilisateurs ;
- les fichiers modifiés simultanément.
Ne supprimez pas arbitrairement un verrou uniquement parce qu’un utilisateur veut ouvrir son document immédiatement.
Un verrou peut être le dernier élément empêchant deux personnes de transformer le même fichier en témoignage archéologique.
Consulter les journaux
Avec systemd :
journalctl -u smbd
Pour suivre en direct :
journalctl -u smbd -f
Et pour nmbd :
journalctl -u nmbd
Samba utilise également ses propres mécanismes de journalisation selon la configuration.
Augmenter temporairement le niveau de logs
Lors d’un diagnostic, on peut augmenter le niveau de journalisation.
Mais ne passez pas directement de :
log level = 1
à :
log level = 10
en production simplement parce que « plus de logs = plus d’informations ».
À des niveaux élevés, Samba est parfaitement capable de produire assez de détails pour transformer un diagnostic de cinq minutes en étude doctorale sur les paquets SMB.
Limiter Samba à certaines interfaces
Sur un serveur multi-interface, il peut être utile de limiter l’exposition du service.
On rencontre par exemple :
[global]
interfaces = lo enp1s0
bind interfaces only = yes
Ou avec un réseau :
interfaces = lo 192.168.10.0/24
Cette configuration peut réduire les interfaces sur lesquelles Samba fournit ses services.
Mais elle ne remplace pas un pare-feu.
Une option Samba est une politique applicative.
Le filtrage réseau doit rester un véritable filtrage réseau.
hosts allow et hosts deny
Samba possède également des mécanismes permettant de restreindre les clients selon leur adresse.
Par exemple :
hosts allow = 192.168.10. 127.
hosts deny = 0.0.0.0/0
Ce type de contrôle peut compléter la sécurité.
Mais là encore, ne remplacez pas une politique de pare-feu correctement conçue par quinze lignes dans smb.conf.
La défense en profondeur signifie plusieurs couches cohérentes.
Pas plusieurs couches dont personne ne sait laquelle bloque actuellement Bob.
Chiffrement SMB3
SMB3 permet de chiffrer les données transportées.
Pour un partage sensible, Samba peut exiger le chiffrement :
[confidentiel]
path = /srv/samba/confidentiel
valid users = @confidentiel
read only = no
server smb encrypt = required
Les clients incapables de négocier le niveau de chiffrement requis ne pourront pas utiliser le partage.
Cela peut être particulièrement intéressant lorsque le réseau sous-jacent ne doit pas être considéré comme entièrement digne de confiance.
Chiffrement SMB et chiffrement du disque ne sont pas la même chose
Le chiffrement SMB protège les données pendant leur transport entre client et serveur.
Il ne chiffre pas automatiquement :
/srv/samba/confidentiel
sur le disque physique.
Pour les données au repos, il faut envisager des mécanismes comme :
- LUKS ;
- chiffrement du stockage ;
- fonctionnalités du système de fichiers ;
- ou une solution adaptée à votre architecture.
Une serrure sur le camion ne remplace pas la serrure de l’entrepôt.
Le partage [homes]
Samba possède une section spéciale :
[homes]
Elle permet de publier dynamiquement le répertoire personnel d’un utilisateur authentifié.
Une configuration peut ressembler conceptuellement à :
[homes]
browseable = no
read only = no
Lorsqu’Alice se connecte, Samba peut lui présenter son propre répertoire personnel.
Cette fonctionnalité est pratique dans certains environnements.
Elle doit néanmoins être configurée consciemment : publier automatiquement les homes de tous les utilisateurs n’est pas forcément ce que vous souhaitez sur chaque serveur.
Accès basé sur les groupes : la vraie méthode scalable
Pour quelques utilisateurs :
valid users = alice bob charles
fonctionne.
Pour une entreprise, préférez :
valid users = @finance
ou des groupes dédiés :
valid users = @samba-finance-read @samba-finance-write
write list = @samba-finance-write
Puis gérez l’appartenance avec les outils Unix ou votre annuaire.
La configuration du partage décrit alors les rôles, pas la liste des employés présents lors de sa création en 2022.
Un serveur membre Active Directory : autre niveau
Dans une entreprise possédant Active Directory, il peut être préférable que Samba utilise directement les comptes du domaine plutôt que de recréer :
alice
bob
charles
localement sur chaque serveur.
On entre alors dans une configuration avec notamment :
server role = member server;- Kerberos ;
- DNS ;
- jonction au domaine ;
- Winbind ;
- mapping SID ↔ UID/GID.
Ce n’est pas une extension de trois lignes à notre exemple autonome.
C’est une architecture distincte qui mérite son propre article.
Quelques mauvaises idées fréquentes
Mettre chmod 777 parce que « Samba refuse d’écrire »
chmod -R 777 /srv/samba
fait souvent disparaître le problème.
Il fait également disparaître une partie significative de votre politique de permissions.
Un diagnostic préférable consiste à examiner :
namei -l /srv/samba/documents
ls -ld /srv/samba/documents
getfacl /srv/samba/documents
id alice
Puis à corriger précisément la permission qui pose problème.
Utiliser root pour tout
Si chaque partage possède :
valid users = root
vous n’avez pas créé une politique de sécurité.
Vous avez créé un raccourci pour l’incident futur.
Réactiver SMB1 pour un vieux copieur
Traitez le périphérique hérité comme le problème spécifique qu’il est.
Ne rétrogradez pas toute l’infrastructure pour lui éviter une retraite méritée.
Mettre un partage en browseable = no et le considérer comme secret
Le nom peut être masqué.
Les permissions doivent toujours faire le vrai travail.
Exposer TCP 445 sur Internet
Non.
Votre serveur de fichiers interne n’a pas besoin de recevoir les salutations enthousiastes de tous les scanners automatisés de la planète.
Modifier smb.conf puis redémarrer immédiatement
Faites d’abord :
sudo testparm
Le redémarrage n’est pas un parseur de configuration.
C’est simplement une manière plus spectaculaire de découvrir qu’il manquait un crochet.
Diagnostiquer un partage inaccessible
Un utilisateur annonce :
« Le partage ne marche pas. »
Cette phrase contient à peu près quatre pour cent des informations nécessaires.
1. Le service fonctionne-t-il ?
systemctl status smbd
2. La configuration est-elle valide ?
sudo testparm -s
3. Le partage est-il déclaré ?
smbclient -L localhost -U alice
4. Le chemin Unix existe-t-il ?
ls -ld /srv/samba/documents
5. L’utilisateur Unix existe-t-il ?
id alice
6. Le compte Samba existe-t-il ?
sudo pdbedit -L | grep alice
7. Peut-il entrer dans tous les répertoires parents ?
namei -l /srv/samba/documents
Un répertoire final peut parfaitement être en 770 tout en restant inaccessible parce qu’un parent interdit sa traversée.
8. Quelles sont les ACL ?
getfacl /srv/samba/documents
9. Samba écoute-t-il ?
sudo ss -lntp | grep ':445'
10. Le client atteint-il le serveur ?
Depuis Windows :
Test-NetConnection fileserver -Port 445
11. Que disent les logs ?
journalctl -u smbd -n 100
12. Existe-t-il déjà une connexion avec une autre identité ?
Sur Windows :
net use
Une ancienne connexion SMB utilisant un autre compte peut empêcher une nouvelle authentification au même serveur.
Le problème n’est alors pas Samba.
Windows se souvient simplement d’une relation précédente et refuse de tourner la page.
Le partage fonctionne en local mais pas depuis Windows
Si ceci fonctionne :
smbclient //localhost/documents -U alice
mais pas :
\\fileserver\documents
depuis un poste distant, concentrez l’enquête sur :
- la résolution DNS ;
- le routage ;
- le pare-feu ;
- TCP 445 ;
- les interfaces sur lesquelles Samba écoute ;
- les restrictions réseau.
Ne modifiez pas quinze permissions Unix lorsque le paquet réseau n’arrive même pas à la machine.
Le partage s’ouvre mais l’écriture échoue
Vérifiez deux niveaux.
Niveau Samba
valid users
read only
write list
read list
Niveau Unix
id alice
ls -ld /srv/samba/documents
getfacl /srv/samba/documents
C’est généralement là que l’on découvre que :
write list = alice
était parfait, mais que le répertoire appartenait à :
root:root
avec :
755
Samba avait donné son accord.
Linux avait déjà appelé la sécurité.
Le partage fonctionne par IP mais pas par nom
Si :
\\192.168.1.20\documents
fonctionne, mais :
\\fileserver\documents
échoue, examinez la résolution de noms.
Depuis Windows :
Resolve-DnsName fileserver
ou :
nslookup fileserver
Depuis Linux :
getent hosts fileserver
Le DNS est régulièrement accusé de tous les problèmes réseau.
Cette fois, il pourrait effectivement être coupable.
Le serveur fonctionne mais n’apparaît pas dans Réseau
Encore une fois :
\\fileserver\documents
peut parfaitement fonctionner alors que la découverte graphique ne montre rien.
Examinez alors :
- WSD ;
wsdd2;- le profil réseau Windows ;
- les règles pare-feu de découverte ;
- les mécanismes de résolution du réseau.
Ne réactivez pas SMB1 pour récupérer un joli ordinateur dans la rubrique « Réseau ».
C’est un prix de décoration intérieure légèrement excessif.
Configuration complète raisonnable
Pour un petit serveur autonome, une base peut ressembler à ceci :
[global]
workgroup = WORKGROUP
server role = standalone
security = user
[documents]
path = /srv/samba/documents
browseable = yes
read only = yes
valid users = @samba-docs-read @samba-docs-write
write list = @samba-docs-write
create mask = 0660
directory mask = 0770
[secret]
path = /srv/samba/secret
browseable = no
read only = no
valid users = @samba-secret
server smb encrypt = required
Cette configuration est volontairement lisible.
Elle ne tente pas d’insérer cinquante paramètres de performance copiés depuis un forum de 2011.
Ne « tunez » pas Samba au hasard
Les anciens tutoriels contiennent parfois de longues séries de paramètres comme :
socket options = ...
read raw = yes
write raw = yes
max xmit = ...
Beaucoup correspondaient à des systèmes, noyaux et réseaux très différents de ceux d’aujourd’hui.
Les systèmes modernes possèdent déjà de nombreux mécanismes d’optimisation.
Ne modifiez donc pas un paramètre bas niveau uniquement parce que son nom contient :
TCP_NODELAY
et semble manifestement avoir été inventé pour rendre Internet plus rapide.
Une procédure complète de mise en service
1. Installer Samba
sudo apt update
sudo apt install samba smbclient
2. Sauvegarder la configuration
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.backup
3. Créer les utilisateurs
sudo useradd -M -s /usr/sbin/nologin alice
sudo useradd -M -s /usr/sbin/nologin bob
4. Créer le groupe
sudo groupadd sambadocs
sudo usermod -aG sambadocs alice
sudo usermod -aG sambadocs bob
5. Créer le répertoire
sudo mkdir -p /srv/samba/documents
sudo chown root:sambadocs /srv/samba/documents
sudo chmod 2770 /srv/samba/documents
6. Ajouter les comptes Samba
sudo smbpasswd -a alice
sudo smbpasswd -a bob
7. Ajouter le partage
[documents]
path = /srv/samba/documents
browseable = yes
read only = yes
valid users = alice bob
write list = alice
8. Valider smb.conf
sudo testparm
9. Recharger la configuration
sudo smbcontrol all reload-config
10. Tester localement
smbclient -L localhost -U alice
smbclient //localhost/documents -U alice
11. Vérifier le port
sudo ss -lntp | grep ':445'
12. Tester depuis Windows
\\fileserver\documents
13. Vérifier les connexions
sudo smbstatus
À ce stade, vous avez déjà effectué davantage de vérifications que beaucoup de procédures ayant commencé par :
« On va essayer de redémarrer le serveur pour voir. »
Les commandes indispensables
| Commande | Utilité |
|---|---|
apt install samba |
Installer le serveur Samba |
smbpasswd -a utilisateur |
Ajouter ou définir le mot de passe d’un compte Samba |
smbpasswd -d utilisateur |
Désactiver un compte Samba |
smbpasswd -e utilisateur |
Réactiver un compte Samba |
smbpasswd -x utilisateur |
Supprimer un compte Samba |
pdbedit -L |
Lister les comptes Samba locaux |
testparm |
Vérifier la configuration Samba |
smbcontrol all reload-config |
Demander aux démons de relire smb.conf |
smbclient -L serveur |
Lister les partages proposés |
smbclient //serveur/partage |
Tester directement un partage |
smbstatus |
Voir les connexions et verrous actifs |
journalctl -u smbd |
Consulter les journaux du serveur SMB |
ss -lntp |
Examiner les ports TCP en écoute |
Les paramètres smb.conf à retenir
| Paramètre | Rôle |
|---|---|
path |
Répertoire Unix réellement partagé |
browseable |
Indique si le partage apparaît dans les listes de navigation |
valid users |
Définit qui peut accéder au partage |
read only |
Définit si l’écriture est normalement interdite |
write list |
Accorde l’écriture à certains comptes ou groupes |
read list |
Force certains comptes ou groupes en lecture seule |
guest ok |
Autorise l’accès invité lorsqu’il est correctement configuré |
create mask |
Contrôle certains droits Unix des nouveaux fichiers |
directory mask |
Contrôle certains droits Unix des nouveaux répertoires |
server smb encrypt |
Contrôle ou impose le chiffrement SMB selon la configuration |
Bonnes pratiques
- Utilisez SMB2/SMB3 et laissez SMB1 désactivé sauf nécessité réellement documentée.
- Utilisez des groupes plutôt que des listes interminables d’utilisateurs.
- Ne confondez jamais permissions Samba et permissions Unix.
- Évitez les comptes root pour les accès quotidiens aux partages.
- Utilisez testparm avant chaque rechargement important.
- N’exposez pas TCP 445 directement à Internet.
- Utilisez un pare-feu pour limiter les réseaux autorisés.
- Ne considérez pas browseable = no comme une mesure de sécurité.
- Consultez smbstatus avant d’interrompre un serveur utilisé.
- Utilisez le chiffrement SMB3 lorsque la confidentialité du trafic le justifie.
- Ne modifiez pas vingt paramètres de performance dont vous ne connaissez pas précisément l’effet.
- Gardez une sauvegarde de smb.conf qui fonctionnait.
Résumé : du disque Linux au dossier Windows
Lorsqu’Alice ouvre :
\\fileserver\documents
voici, de manière simplifiée, ce qui se produit :
- le poste client trouve l’adresse du serveur ;
- il contacte le service SMB, généralement sur TCP 445 ;
- client et serveur négocient une version SMB compatible ;
- Samba authentifie Alice ;
- le compte SMB est associé à une identité Unix ;
- Samba vérifie que le partage autorise Alice ;
- Linux vérifie que cette identité possède les droits nécessaires sur les fichiers ;
- le contenu de
/srv/samba/documentsest exposé au client ; - les lectures, écritures et verrous sont traduits entre les deux mondes.
Pour Alice :
\\fileserver\documents\rapport.xlsx
Pour Debian :
/srv/samba/documents/rapport.xlsx
Entre les deux :
SMB, authentification, UID, GID, ACL, verrouillage, protocoles réseau et une quantité respectable de code dont l’unique objectif est de faire croire à deux systèmes d’exploitation très différents qu’ils se sont toujours parfaitement entendus.
Conclusion : Samba n’est pas mystérieux, il possède simplement plusieurs couches
Samba acquiert rapidement une réputation de configuration ésotérique parce qu’un problème visible dans Windows peut en réalité provenir :
- du compte Samba ;
- du compte Unix ;
- du groupe ;
- des permissions POSIX ;
- des ACL ;
- de
smb.conf; - du DNS ;
- du pare-feu ;
- de la découverte réseau ;
- ou d’une ancienne session SMB déjà ouverte côté Windows.
Mais une fois ces couches séparées mentalement, le fonctionnement devient beaucoup plus logique.
Pour un serveur autonome simple :
1. créez les identités Unix ;
2. créez les comptes Samba ;
3. configurez les permissions du système de fichiers ;
4. déclarez le partage dans smb.conf ;
5. vérifiez avec testparm ;
6. testez avec smbclient ;
7. ouvrez uniquement les accès réseau nécessaires.
Samba est un outil extrêmement puissant.
Il peut transformer un Debian parfaitement ordinaire en serveur de fichiers utilisable naturellement par Windows, Linux et de nombreux autres systèmes.
Il demande simplement que vous lui expliquiez précisément :
qui peut entrer, où se trouvent les fichiers et ce que chaque personne a le droit d’en faire.
Une exigence finalement assez raisonnable.
La véritable crise de nerfs commence généralement lorsqu’on répond :
« Tout le monde devrait avoir les droits. J’ai mis chmod 777. »
À cet instant, Samba n’est plus le problème.
Il est simplement le témoin.
