Aller au contenu
Réussir mon BTS SIO

Tape une notion, une commande ou le nom d'une épreuve.

Par exemple

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èreSMB (Samba sous Linux)NFS (version 4)
Clients naturelsWindows, macOS, LinuxLinux, Unix, hyperviseurs (Proxmox VE, VMware)
AuthentificationPar 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)
DroitsListes de contrôle d'accès façon Windows, ou droits LinuxDroits Linux (et ACL NFSv4)
PortTCP 445TCP 2049
ChiffrementChiffrement SMB 3Seulement avec Kerberos (sec=krb5p)
Usage typiquePartages des utilisateursStockage 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

bash
sudo apt install samba
systemctl status smbd --no-pager
smbd --version
# Version 4.22.x-Debian-4.22.x+dfsg-0+deb13u1
Fichier ou commandeRôle
/etc/samba/smb.confLa configuration : une section [global], puis une section par partage
testparmVérifie smb.conf et affiche la configuration réellement appliquée
smbdLe service qui sert les fichiers (port TCP 445)
nmbdL'ancien service de noms NetBIOS, inutile sur un réseau avec DNS
smbpasswd, pdbeditLes comptes Samba d'un serveur autonome
smbstatusLes 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) :

ini
[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
DirectiveRôle
server min protocol = SMB3_00Refuse SMB 1 et SMB 2 : seuls les clients SMB 3 (Windows 8 et suivants, Linux et macOS récents) se connectent
server smb encrypt = desiredChiffre les échanges avec les clients qui le savent, c'est-à-dire tous les clients SMB 3
disable netbios = yesPas de NetBIOS : les clients trouvent le serveur par le DNS
map to guest = neverJamais d'accès invité, même après un mauvais mot de passe
valid users = @logistiqueSeuls les membres du groupe Linux logistique accèdent au partage
create mask, directory maskDroits 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 :

bash
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) :

bash
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

bash
sudo apt install samba winbind libnss-winbind libpam-winbind krb5-user

2. Kerberos. /etc/krb5.conf :

ini
[libdefaults]
    default_realm = AD.SORBIER.EXAMPLE
    dns_lookup_realm = false
    dns_lookup_kdc = true

3. smb.conf :

ini
[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"
DirectiveRôle
security = ADSMembre d'un domaine Active Directory
workgroup, realmLe nom NetBIOS et le royaume Kerberos du domaine
idmap config SORBIER : backend = ridUID 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/nologinLes comptes du domaine accèdent aux partages, mais ne peuvent pas ouvrir de session sur le serveur
vfs objects = acl_xattrLes 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 :

bash
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 :

text
passwd:         files systemd winbind
group:          files systemd winbind
bash
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) :

bash
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 :

bash
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 :

text
/srv/nfs/sauvegardes/glpi  192.168.10.184(rw,sync,no_subtree_check,all_squash,anonuid=2001,anongid=2001)
bash
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)
OptionRôle
192.168.10.184(…)Seule cette adresse peut monter l'export : jamais *
rwLecture et écriture
syncLe serveur confirme une écriture seulement quand elle est sur le disque : plus lent, mais aucune sauvegarde à moitié écrite en cas de coupure
no_subtree_checkDésactive une vérification coûteuse et source d'erreurs ; c'est la valeur recommandée
root_squashPar défaut : le root du client devient un compte sans droit sur le serveur
all_squash,anonuid=2001,anongid=2001Tous 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 :

bash
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 :

text
srv-partages.ad.sorbier.example:/srv/nfs/sauvegardes/glpi  /mnt/sauvegardes  nfs4  defaults,_netdev,nofail  0  0
bash
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 :

text
Match Group sftp-partenaires
    ChrootDirectory /srv/sftp/%u
    ForceCommand internal-sftp
    AllowTcpForwarding no
    X11Forwarding no
bash
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.

  1. Faire écrire tous les accès sous le compte propriétaire : all_squash,anonuid=2001,anongid=2001 dans l'export, puis exportfs -ra. C'est la solution retenue chez Sorbier.
  2. 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 rsync par SSH) : échange entre deux serveurs Linux du même réseau ; export limité à l'adresse du client, avec all_squash. Et une copie supplémentaire hors ligne, car ce partage reste modifiable par le serveur sauvegardé.

Tu avais trouvé ?

Chapitre terminé !

Fais les 3 exercices avant de passer à la suite : c'est en t'entraînant que tout se fixe.

chapitres
–
de série
–
du cours
–
Chapitre suivant : Reverse proxy et répartition de charge : Nginx, HAProxy et keepalivedRevoir le sommaire du cours