Chapitre 918 minIntermédiaire
Partager des fichiers depuis Linux : Samba et NFS
Par Josselyn C., prof de BTS SIO. Mis à jour le .
À la fin de ce chapitre, tu sauras
- choisir entre SMB, NFS et SFTP selon le besoin ;
- créer un partage Samba et calculer l'accès effectif ;
- joindre un serveur Samba au domaine avec winbind ;
- exporter un dossier en NFS sans donner la main au root du client ;
- remplacer le FTP par un SFTP enfermé dans un dossier.
3 exercices corrigés
Samba est le logiciel libre qui fait d'un serveur Linux un serveur de fichiers Windows : il parle le protocole SMB, celui des lecteurs réseau \\serveur\partage, et peut devenir membre d'un domaine Active Directory. NFS est le système de fichiers réseau natif du monde Unix, utilisé entre serveurs Linux et par les hyperviseurs. Ce chapitre compare les deux, monte un partage Samba simple, puis un partage Samba membre du domaine avec winbind, exporte un dossier en NFS pour les sauvegardes, et remplace le vieux FTP par SFTP.
SMB ou NFS : lequel choisir
| Critère | SMB (Samba sous Linux) | NFS (version 4) |
|---|---|---|
| Clients naturels | Windows, macOS, Linux | Linux, Unix, hyperviseurs (Proxmox VE, VMware) |
| Authentification | Par utilisateur : compte Samba ou compte du domaine (Kerberos) | Par machine, en faisant confiance aux UID envoyés par le client ; par utilisateur seulement avec Kerberos (sec=krb5) |
| Droits | Listes de contrôle d'accès façon Windows, ou droits Linux | Droits Linux (et ACL NFSv4) |
| Port | TCP 445 | TCP 2049 |
| Chiffrement | Chiffrement SMB 3 | Seulement avec Kerberos (sec=krb5p) |
| Usage typique | Partages des utilisateurs | Stockage partagé entre serveurs, sauvegardes, banque d'images ISO |
Chez Sorbier, les partages des services sont sur srv-fichiers, le serveur Windows, et le stockage de masse (machines virtuelles, sauvegardes) sur le NAS TrueNAS, qui utilise lui-même Samba et NFS. srv-partages, la petite VM Debian de ce chapitre, a deux usages précis : un partage SMB Etiquettes pour les modèles d'étiquettes de l'entrepôt, et un export NFS qui reçoit les sauvegardes des serveurs Linux. Pour une copie que même un administrateur compromis ne peut pas effacer, ces sauvegardes partent ensuite sur le NAS, protégées par des snapshots ZFS en lecture seule (snapshots ZFS, réplication et Cloud Sync).
Installer Samba
sudo apt install samba
systemctl status smbd --no-pager
smbd --version
# Version 4.22.x-Debian-4.22.x+dfsg-0+deb13u1
| Fichier ou commande | Rôle |
|---|---|
/etc/samba/smb.conf | La configuration : une section [global], puis une section par partage |
testparm | Vérifie smb.conf et affiche la configuration réellement appliquée |
smbd | Le service qui sert les fichiers (port TCP 445) |
nmbd | L'ancien service de noms NetBIOS, inutile sur un réseau avec DNS |
smbpasswd, pdbedit | Les comptes Samba d'un serveur autonome |
smbstatus | Les connexions et les fichiers ouverts |
/var/log/samba/ | Les journaux |
Le protocole SMB 1, obsolète et vulnérable (c'est par lui que s'est propagé le rançongiciel WannaCry en 2017), est désactivé par défaut depuis Samba 4.11 : ne le réactive jamais.
Un partage simple, pour une maquette
Sans domaine, Samba est un serveur autonome : il a ses propres comptes, associés à des comptes Linux. C'est la configuration d'un TP ou d'un petit site sans annuaire. Remplace /etc/samba/smb.conf (garde une copie de l'original) :
[global]
workgroup = SORBIER
server role = standalone server
server min protocol = SMB3_00
server smb encrypt = desired
disable netbios = yes
map to guest = never
log file = /var/log/samba/log.%m
max log size = 1000
[Etiquettes]
path = /srv/samba/etiquettes
valid users = @logistique
read only = no
create mask = 0660
directory mask = 2770
| Directive | Rôle |
|---|---|
server min protocol = SMB3_00 | Refuse SMB 1 et SMB 2 : seuls les clients SMB 3 (Windows 8 et suivants, Linux et macOS récents) se connectent |
server smb encrypt = desired | Chiffre les échanges avec les clients qui le savent, c'est-à-dire tous les clients SMB 3 |
disable netbios = yes | Pas de NetBIOS : les clients trouvent le serveur par le DNS |
map to guest = never | Jamais d'accès invité, même après un mauvais mot de passe |
valid users = @logistique | Seuls les membres du groupe Linux logistique accèdent au partage |
create mask, directory mask | Droits des fichiers et dossiers créés ; le 2 du dossier (bit setgid) fait hériter le groupe logistique |
Prépare le dossier, le groupe et un compte :
sudo groupadd logistique
sudo mkdir -p /srv/samba/etiquettes
sudo chown root:logistique /srv/samba/etiquettes
sudo chmod 2770 /srv/samba/etiquettes
sudo useradd -M -s /usr/sbin/nologin -G logistique ldurand # compte Linux sans shell ni dossier personnel
sudo smbpasswd -a ldurand # mot de passe Samba de ce compte
testparm -s
sudo systemctl restart smbd
sudo systemctl disable --now nmbd
Un compte Samba doit correspondre à un compte Linux, qui porte les droits sur le disque, mais ce compte n'a besoin ni de shell ni de mot de passe Linux. Teste depuis un autre Linux, puis depuis un poste Windows (\\srv-partages\Etiquettes dans l'Explorateur) :
smbclient //srv-partages.ad.sorbier.example/Etiquettes -U ldurand -c 'ls'
L'accès effectif dépend de deux contrôles, comme les permissions de partage et NTFS sous Windows : ce que smb.conf autorise (valid users, read only) et les droits Linux du dossier. Un utilisateur listé dans valid users mais sans droit d'écriture sur le dossier ne peut rien écrire.
Samba membre du domaine, avec winbind
Dans un réseau Active Directory, des comptes Samba locaux seraient une régression : les utilisateurs ont déjà un compte du domaine, avec la politique de mots de passe et les groupes. Samba devient alors membre du domaine : il authentifie les utilisateurs par Kerberos auprès des contrôleurs, et un service, winbind, traduit les comptes et les groupes de l'annuaire en comptes Linux.
1. Les paquets
sudo apt install samba winbind libnss-winbind libpam-winbind krb5-user
2. Kerberos. /etc/krb5.conf :
[libdefaults]
default_realm = AD.SORBIER.EXAMPLE
dns_lookup_realm = false
dns_lookup_kdc = true
3. smb.conf :
[global]
workgroup = SORBIER
realm = AD.SORBIER.EXAMPLE
security = ADS
server min protocol = SMB3_00
server smb encrypt = desired
disable netbios = yes
# Correspondance entre identifiants Windows (SID) et Linux (UID, GID)
idmap config * : backend = tdb
idmap config * : range = 3000-7999
idmap config SORBIER : backend = rid
idmap config SORBIER : range = 10000-999999
template shell = /usr/sbin/nologin
template homedir = /home/%U
winbind refresh tickets = yes
# Droits Windows (ACL) enregistrés dans les attributs étendus du disque
vfs objects = acl_xattr
map acl inherit = yes
[Etiquettes]
path = /srv/samba/etiquettes
read only = no
valid users = @"SORBIER\GG_Logisticiens"
| Directive | Rôle |
|---|---|
security = ADS | Membre d'un domaine Active Directory |
workgroup, realm | Le nom NetBIOS et le royaume Kerberos du domaine |
idmap config SORBIER : backend = rid | UID et GID calculés à partir du numéro relatif (RID) du SID : 10000 + RID. Le même calcul sur deux serveurs donne les mêmes identifiants |
idmap config * : … | La plage des comptes intégrés et des autres domaines |
template shell = /usr/sbin/nologin | Les comptes du domaine accèdent aux partages, mais ne peuvent pas ouvrir de session sur le serveur |
vfs objects = acl_xattr | Les droits posés depuis l'onglet Sécurité de l'Explorateur Windows sont conservés |
valid users = @"SORBIER\GG_Logisticiens" | Seuls les membres du groupe du domaine accèdent au partage |
4. La jonction, avec un compte autorisé et l'OU des serveurs :
testparm -s
sudo net ads join -U adm1-clambert createcomputer="Sorbier/Serveurs"
# Password for [SORBIER\adm1-clambert]:
# Using short domain name -- SORBIER
# Joined 'SRV-PARTAGES' to dns domain 'ad.sorbier.example'
5. Les comptes du domaine dans Linux. Dans /etc/nsswitch.conf, ajoute winbind aux lignes passwd et group :
passwd: files systemd winbind
group: files systemd winbind
sudo systemctl restart winbind smbd
sudo systemctl disable --now nmbd
wbinfo -t # le secret partagé avec le domaine est valide
# checking the trust secret for domain SORBIER via RPC calls succeeded
wbinfo -g | grep -i logisticiens
# SORBIER\gg_logisticiens
getent group 'SORBIER\gg_logisticiens'
# SORBIER\gg_logisticiens:x:11129:SORBIER\ldurand,SORBIER\npetit
Avec le backend rid, le groupe de RID 1129 reçoit le GID 10000 + 1129 = 11129.
6. Les droits du dossier. Donne le dossier au groupe du domaine, puis affine les droits depuis Windows si besoin (onglet Sécurité, avec un compte d'administration) :
sudo chown root:'SORBIER\gg_logisticiens' /srv/samba/etiquettes
sudo chmod 2770 /srv/samba/etiquettes
Depuis un poste du domaine, l'utilisateur ouvre \\srv-partages\Etiquettes sans saisir de mot de passe : Windows présente son ticket Kerberos. Le lecteur peut être connecté par une GPO, comme ceux de srv-fichiers (cours Windows Server).
NFS : partager entre serveurs Linux
Chaque nuit, srv-glpi produit une sauvegarde de sa base et de ses fichiers (chapitre 5). Pour qu'elle ne reste pas sur le serveur sauvegardé, il l'écrit dans un dossier exporté en NFS par srv-partages, qui la copiera ensuite vers le NAS.
Sur le serveur srv-partages :
sudo apt install nfs-kernel-server
sudo groupadd -g 2001 sauvegarde
sudo useradd -u 2001 -g 2001 -M -s /usr/sbin/nologin sauvegarde
sudo mkdir -p /srv/nfs/sauvegardes/glpi
sudo chown -R sauvegarde:sauvegarde /srv/nfs/sauvegardes
sudo chmod 755 /srv/nfs/sauvegardes # dossier parent : traversable, sinon le montage NFSv4 échoue
sudo chmod 750 /srv/nfs/sauvegardes/glpi # le dossier exporté, réservé au compte sauvegarde
Pourquoi deux droits différents ? En NFSv4, le client parcourt les dossiers situés au-dessus de l'export avec les options par défaut : son root y devient nobody, qui doit pouvoir traverser /srv/nfs/sauvegardes. Seul le dossier exporté porte all_squash et le compte sauvegarde.
/etc/exports :
/srv/nfs/sauvegardes/glpi 192.168.10.184(rw,sync,no_subtree_check,all_squash,anonuid=2001,anongid=2001)
sudo exportfs -ra
sudo exportfs -v
# /srv/nfs/sauvegardes/glpi 192.168.10.184(sync,wdelay,hide,no_subtree_check,anonuid=2001,anongid=2001,sec=sys,rw,secure,root_squash,all_squash)
| Option | Rôle |
|---|---|
192.168.10.184(…) | Seule cette adresse peut monter l'export : jamais * |
rw | Lecture et écriture |
sync | Le serveur confirme une écriture seulement quand elle est sur le disque : plus lent, mais aucune sauvegarde à moitié écrite en cas de coupure |
no_subtree_check | Désactive une vérification coûteuse et source d'erreurs ; c'est la valeur recommandée |
root_squash | Par défaut : le root du client devient un compte sans droit sur le serveur |
all_squash,anonuid=2001,anongid=2001 | Tous les accès du client, root compris, deviennent le compte sauvegarde du serveur |
NFS (sans Kerberos) fait confiance à l'UID que le client annonce : un root du client qui serait root sur l'export pourrait tout y faire. root_squash l'empêche, et all_squash va plus loin : quoi que fasse le client, il écrit sous le compte sauvegarde, propriétaire du seul dossier exporté.
Sur le client srv-glpi :
sudo apt install nfs-common
sudo mkdir -p /mnt/sauvegardes
sudo mount -t nfs4 srv-partages.ad.sorbier.example:/srv/nfs/sauvegardes/glpi /mnt/sauvegardes
df -h /mnt/sauvegardes
Pour un montage permanent, une ligne dans /etc/fstab ; _netdev attend le réseau au démarrage, nofail évite qu'une absence de srv-partages bloque le démarrage de srv-glpi :
srv-partages.ad.sorbier.example:/srv/nfs/sauvegardes/glpi /mnt/sauvegardes nfs4 defaults,_netdev,nofail 0 0
sudo systemctl daemon-reload
sudo mount -a
Le pare-feu local de srv-partages n'accepte le port TCP 2049 que de 192.168.10.184 (chapitre 13).
Et le FTP ?
Le FTP envoie identifiants et fichiers en clair, et son mode de fonctionnement (une connexion de contrôle et une connexion de données sur un port négocié) complique le filtrage. Pour échanger des fichiers avec un partenaire, on utilise aujourd'hui SFTP, le transfert de fichiers d'OpenSSH, déjà installé et chiffré.
Pour un transporteur qui dépose ses bordereaux sur srv-partages, sans pouvoir ouvrir de shell ni voir le reste du serveur, ajoute à la fin de /etc/ssh/sshd_config :
Match Group sftp-partenaires
ChrootDirectory /srv/sftp/%u
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
sudo groupadd sftp-partenaires
sudo useradd -M -s /usr/sbin/nologin -G sftp-partenaires transports-rhone
sudo mkdir -p /srv/sftp/transports-rhone/depot
sudo chown root:root /srv/sftp/transports-rhone # la racine du chroot doit appartenir à root
sudo chmod 755 /srv/sftp/transports-rhone
sudo chown transports-rhone:transports-rhone /srv/sftp/transports-rhone/depot
sudo sshd -t && sudo systemctl reload ssh
Le partenaire se connecte avec sftp transports-rhone@… (de préférence avec une clé), arrive dans son dossier comme s'il était la racine du système, et ne peut déposer que dans depot. Si un partenaire exige vraiment du FTP, on le chiffre (FTPS, avec vsftpd et un certificat) : jamais de FTP en clair sur Internet.
Exercices
Exercice 1 sur 3 Pourquoi l'écriture est refusée ? Réussi À revoir
Sur le partage simple de la maquette, ldurand est membre du groupe logistique et figure dans valid users. Il peut lister le partage, mais ne peut pas y créer de fichier. ls -ld /srv/samba/etiquettes affiche drwxr-xr-x 2 root logistique. Explique et corrige.
Voir la réponseMasquer la réponse de l'exercice 1
Samba laisse entrer ldurand (il est dans valid users, et read only = no), mais l'écriture sur le disque est contrôlée par les droits Linux du dossier : drwxr-xr-x donne au groupe logistique la lecture et la traversée (r-x), pas l'écriture. L'accès effectif est le plus restrictif des deux contrôles.
Correction : sudo chmod 2770 /srv/samba/etiquettes. Le groupe obtient rwx, les autres comptes rien, et le bit setgid (2) fait que les fichiers créés appartiennent au groupe logistique, donc restent modifiables par les collègues.
Tu avais trouvé ?
Exercice 2 sur 3 Le root du client Réussi À revoir
Avec l'export /srv/nfs/sauvegardes/glpi 192.168.10.184(rw,sync,no_subtree_check), sans all_squash, le script de sauvegarde de srv-glpi, lancé par root, échoue avec Permission denied en écrivant dans /mnt/sauvegardes. Le dossier exporté appartient à sauvegarde (UID 2001) avec les droits 750. Explique, puis donne deux corrections.
Voir la réponseMasquer la réponse de l'exercice 2
Sans option contraire, l'export applique root_squash : le root de srv-glpi devient sur le serveur l'utilisateur anonyme nobody (UID 65534). Ce compte n'est ni propriétaire du dossier ni membre de son groupe, et les droits 750 ne donnent rien aux autres : l'écriture est refusée. C'est le comportement voulu, qui protège le serveur d'un root client.
- Faire écrire tous les accès sous le compte propriétaire :
all_squash,anonuid=2001,anongid=2001dans l'export, puisexportfs -ra. C'est la solution retenue chez Sorbier. - Lancer la sauvegarde, sur
srv-glpi, avec un compte local qui a le même UID, 2001 : il est alors reconnu comme propriétaire. Cela suppose des UID cohérents entre les machines.
À ne pas faire : no_root_squash, qui donnerait au root de srv-glpi tous les droits sur l'export.
Tu avais trouvé ?
Exercice 3 sur 3 Samba, NFS ou SFTP ? Réussi À revoir
Pour chaque besoin, choisis le protocole et justifie : (a) les comptables, sur leurs postes Windows du domaine, ouvrent un dossier commun ; (b) deux hôtes Proxmox VE stockent leurs images ISO au même endroit ; (c) un cabinet comptable externe dépose chaque mois les fiches de paie ; (d) un serveur Linux écrit chaque nuit ses sauvegardes sur un autre serveur Linux.
Voir la réponseMasquer la réponse de l'exercice 3
- (a) SMB (sur
srv-fichiers, ou Samba membre du domaine) : protocole natif de Windows, authentification transparente par Kerberos, droits par groupe du domaine. - (b) NFS : protocole natif des hyperviseurs Linux, accès par machine, sans compte utilisateur ; export limité aux adresses des deux hôtes.
- (c) SFTP : partenaire externe, échange par Internet, chiffré, avec un compte dédié enfermé dans son dossier (
ChrootDirectory) et une clé. Jamais un partage SMB ou NFS ouvert sur Internet. - (d) NFS (ou SFTP, ou
rsyncpar SSH) : échange entre deux serveurs Linux du même réseau ; export limité à l'adresse du client, avecall_squash. Et une copie supplémentaire hors ligne, car ce partage reste modifiable par le serveur sauvegardé.
Tu avais trouvé ?