SambaSamba permet l’échange de fichiers dans un réseau hétérogène, avec des postes clients tournant sous Windows, Mac OS X ou Linux. Le nom « Samba » est dérivé du protocole SMB (Server Message Block), utilisé par Microsoft depuis le début des années 1990 pour le partage de données et d’imprimantes.

Dans cet article, je décris la mise en place d’un partage de fichiers Samba sur un serveur CentOS pour un réseau composé de clients sous Windows et sous Linux. La configuration relativement simple fournie en exemple répond à un besoin assez répandu chez mes clients, avec un partage public ouvert à tous ainsi qu’un partage privé qui nécessite une authentification.

Prérequis

Il faudra ouvrir les ports suivants dans le pare-feu.

  • 137 en UDP
  • 138 en UDP
  • 139 en TCP
  • 445 en TCP

Concrètement, il suffit d’autoriser le service samba dans FirewallD.

$ sudo firewall-cmd --permanent --add-service=samba
$ sudo firewall-cmd --reload
$ sudo firewall-cmd --list-all
internal (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp2s0
  sources: 
  services: samba ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

Installation

Les paquets relatifs à Samba sont tous fournis par les dépôts officiels.

$ sudo yum install samba samba-client

Création de l’arborescence des partages

Dans un premier temps, on va créer les répertoires des partages respectifs.

$ sudo mkdir -pv -m 1777 /srv/samba/{public,confidentiel}
mkdir: created directory ‘/srv/samba’
mkdir: created directory ‘/srv/samba/public’
mkdir: created directory ‘/srv/samba/confidentiel’
$ ls -l /srv/samba/
total 8
drwxrwxrwt. 2 root root 4096 Oct 20 08:21 confidentiel
drwxrwxrwt. 2 root root 4096 Oct 20 08:21 public

InfoOn notera la présence du sticky bit (drwxrwxrwt, valeur octale 1000) sur les répertoires des partages. On évite ainsi la suppression accidentelle des fichiers et des répertoires d’un autre utilisateur, même si l’on possède théoriquement les droits d’écriture dessus.

Modification du contexte SELinux

Si l’on utilise SELinux en mode renforcé, il faut impérativement modifier le contexte SELinux de notre arborescence personnalisée.

$ sudo semanage fcontext -a -t samba_share_t '/srv/samba(/.*)?'
$ sudo restorecon -R -v /srv/samba/

Configuration des partages

La configuration de Samba s’effectue par le biais du fichier /etc/samba/smb.conf. Le paquet samba fournit pas moins de deux fichiers modèles smb.conf et smb.conf.example. Pour commencer, on va renommer smb.conf.

$ cd /etc/samba
$ sudo mv smb.conf smb.conf.orig

Ensuite on va créer notre propre configuration personnalisée comme ceci.

# /etc/samba/smb.conf

[global]
workgroup = WORKGROUP
netbios name = AMANDINE
server string = Serveur de fichiers AMANDINE
dns proxy = yes
domain master = yes
log file = /var/log/samba/log.%m
log level = 0
max log size = 1000
bind interfaces only = yes
interfaces = 192.168.2.0/24 localhost
hosts allow = 192.168.2. 127.
security = user
passdb backend = tdbsam
unix password sync = no
invalid users = root
encrypt passwords = yes
guest account = smbguest
map to guest = bad user
force group = users
create mode = 0660
directory mode = 0770

[Public]
path = /srv/samba/public
comment = Partage Public
public = yes
only guest = yes
read only = no

[Confidentiel]
path = /srv/samba/confidentiel
comment = Partage Confidentiel
read only = no
invalid users = root nobody smbguest

Les options méritent quelques explications.

  • workgroup = WORKGROUP définit le nom du groupe de travail. Les clients Windows doivent tous être membres de ce groupe de travail.
  • netbios name = AMANDINE définit le nom qui apparaîtra dans le Voisinage Réseau de Windows. Théoriquement, on pourrait très bien indiquer deux noms de machine différents pour les protocoles TCP/IP et NetBIOS. En pratique, on essaiera de rester cohérent, et on utilisera le nom d’hôte du serveur (AMANDINE).
  • server string = Serveur de fichiers AMANDINE indique le nom avec lequel le serveur s’identifie.
  • dns proxy = yes active l’utilisation du serveur DNS local pour résoudre les noms d’hôtes Windows.
  • La directive domain master désigne un serveur Samba « maître » pour le domaine local. On utilisera yes sur le serveur principal et no sur les autres serveurs. « Serveur principal » signifie ici quelque chose comme « la machine la plus fiable » ou « le serveur qu’on éteint le moins souvent ».
  • log file = /var/log/samba/log.%m définit la journalisation. Pour chaque client qui utilise Samba, un fichier journal log.client est créé. Quant aux services Samba smbd et nmbd, ils utilisent des événements globaux dans les deux fichiers /var/log/samba/log.smbd et log.nmbd. Ni le nom ni l’emplacement de ces deux fichiers ne peuvent être modifiés.
  • log level = 0 signifie que seuls les messages d’erreur sont journalisés. Pour obtenir une journalisation plus « bavarde », on remplacera la valeur 0 par 1, 2, 3, etc.
  • max log size = 1000 limite la taille maximale du fichier journal à 1000 kilooctets. Lorsqu’un fichier journal dépasse cette taille, Samba le renomme en fichier.old.
  • La directive interfaces définit les interfaces réseau par lesquelles Samba est censé communiquer. On veillera à faire apparaître les partages uniquement dans le réseau local. Ne pas oublier localhost, faute de quoi les outils d’administration comme smbclient ne fonctionneront pas sur le serveur.
  • Les directives hosts allow et hosts deny permettent respectivement d’autoriser et d’interdire l’accès de certaines machines du réseau à Samba.
  • La directive security = user définit le modèle de sécurité de Samba.
  • passdb backend = tdbsam définit la gestion des mots de passe. TDB signifie Trivial Database et désigne un format de stockage binaire. Les mots de passe sont stockés dans le fichier /var/lib/samba/private/passdb.tdb.
  • unix password sync = no désactive la synchronisation des mots de passe Samba avec les mots de passe Linux. Celle-ci est liée à toute une série de restrictions qui risquent de nous compliquer la vie, et il vaut mieux s’en passer.
  • guest account = smbguest désigne l’utilisateur Linux auquel on fait correspondre les utilisateurs invités.
  • map to guest = bad user renvoie vers le compte invité toute tentative de connexion avec un identifiant inexistant.
  • force group = users attribue tous les fichiers et répertoires nouvellement créés au groupe users.
  • Les paramètres create mode = 660 et directory mode = 770 assurent que tous les fichiers (rw-rw----) et répertoires (rwxrwx---) créés par un membre du groupe puissent être lus par tous les autres membres du groupe.
  • Le nom du partage ([Public], [Confidentiel]) ne doit pas dépasser douze caractères.

Créer et gérer les utilisateurs Samba

Créer un utilisateur public smbguest pour Samba.

$ sudo useradd -c "Utilisateur Public Samba" -g users -d /dev/null \
  -s /sbin/nologin smbguest
$ sudo passwd -l smbguest
Locking password for user smbguest.
passwd: Success
$ sudo smbpasswd -a smbguest -d
Added user smbguest.
  • L’utilisateur smbguest ne dispose pas de shell de connexion (-s /sbin/nologin) ni de répertoire d’utilisateur (-d /dev/null).
  • Le mot de passe du compte Linux est verrouillé par passwd -l (lock).
  • L’option -a (add) indique à smbpasswd d’ajouter un utilisateur.
  • Celui-ci sera immédiatement désactivé par l’option -d (disabled).

La prochaine étape consiste à créer un ou plusieurs utilisateurs Samba normaux. Deux cas de figure se présentent ici.

Si l’utilisateur dispose déjà d’un compte système, on va d’abord l’ajouter au groupe système users.

$ sudo usermod -a -G users kikinovak

Ensuite, on va créer l’utilisateur Samba correspondant.

$ sudo smbpasswd -a kikinovak
New SMB password:
Retype new SMB password:
Added user kikinovak.

Les utilisateurs qui ne disposent pas de compte système pourront être créés comme ceci.

$ sudo useradd -c "Jean Mortreux" -s /sbin/nologin -d /dev/null \
  jmortreux
$ sudo passwd -l jmortreux
Locking password for user jmortreux.
passwd: Success
$ sudo usermod -a -G users jmortreux
$ sudo smbpasswd -a jmortreux
New SMB password:
Retype new SMB password:
Added user jmortreux.

La commande pdbedit permet d’afficher la liste des utilisateurs Samba.

$ sudo pdbedit -L
smbguest:1000:Utilisateur Public Samba
kikinovak:1001:Kiki Novak
adebuf:1003:Agnès Debuf
jmortreux:1002:Jean Mortreux

La suppression d’un utilisateur Samba pourra s’effectuer grâce à la commande smbpasswd.

$ sudo smbpasswd -d adebuf
Disabled user adebuf.

Éventuellement, on songera à supprimer son compte Linux correspondant.

$ sudo userdel -r adebuf

Gestion et utilisation

La commande testparm permet de tester la configuration.

$ testparm
Load smb config files from /etc/samba/smb.conf
...
Processing section "[Public]"
Processing section "[Confidentiel]"
Loaded services file OK.
Server role: ROLE_STANDALONE

# Global parameters
[global]
  bind interfaces only = Yes
  domain master = Yes
  guest account = smbguest
  interfaces = 192.168.2.0/24 localhost
  log file = /var/log/samba/log.%m
  map to guest = Bad User
  max log size = 1000
  security = USER
  server string = Serveur de fichiers AMANDINE
  idmap config * : backend = tdb
  create mask = 0660
  directory mask = 0770
  force group = users
  hosts allow = 192.168.2. 127.
  invalid users = root

[Public]
  comment = Partage Public
  guest ok = Yes
  guest only = Yes
  path = /srv/samba/public
  read only = No

[Confidentiel]
  comment = Partage Confidentiel
  invalid users = root nobody smbguest
  path = /srv/samba/confidentiel
  read only = No

L’option -v permet d’afficher la totalité des directives utilisées dans la configuration.

Activer et démarrer Samba.

$ sudo systemctl enable smb nmb --now
$ sudo systemctl status smb nmb

Afficher les partages sur le serveur.

$ smbclient -L localhost -N

  Sharename     Type    Comment
  ---------     ----    -------
  Public        Disk    Partage Public
  Confidentiel  Disk    Partage Confidentiel
  IPC$          IPC     IPC Service (Serveur de fichiers AMANDINE)
Reconnecting with SMB1 for workgroup listing.

  Server           Comment
  ---------        -------

  Workgroup        Master
  ---------        -------
  WORKGROUP        AMANDINE

À partir de là, on pourra se connecter depuis les postes Windows, ce qui fera l’objet de notre prochain article.


La rédaction de cette documentation demande du temps et des quantités significatives de café espresso. Vous appréciez ce blog ? Offrez un café au rédacteur en cliquant sur la tasse.

 


1 commentaire

tuxmika · 26 juin 2022 à 14 h 48 min

Bonjour

Je cherche à comprendre les droits sur les partages

Vous indiquez : sudo mkdir -pv -m 1777 /srv/samba/{public,confidentiel}

Pourquoi ne pas avoir fais un chown -R :users avec un chmod 1770 sur le partage confidentiel et un chown -R nobody:nogroup et un chmod 1777 sur le partage public ?

Cordialement

Les commentaires sont fermés.