Samba : un serveur gratuit de type LAN Manager pour UNIX.

Samba est un ensemble de programmes qui permet d'offrir ou/et d'utiliser des ressources partagées via le jeu de commandes SMB (Server Message Block) issu de NetBIOS (Network Basic Input/Output System). En clair, Samba permet à une machine UNIX de parler Microsoft.
Samba sait offrir et accéder à tous les services offerts par NetBIOS, à savoir :

Share : Partage d'arborescences de fichiers.
Printer : Partage d'imprimantes.
Popup : Envoi de petits messages sur le réseau.
SAMBA gère l'authentification (workgroup, login UNIX, pas de login) et remplace avantageusement les couches logicielles NFS. La gestion de domaine est maintenant disponible depuis la version 2.0.0.

L'ensemble Samba est distribué sous la licence publique GNU (GPL). Une copie de cette licence est inclue dans l'archive de Samba. Vous êtes encouragé à distribuer des copies de la suite Samba, mais veuillez la conserver intacte.

Principe de fonctionnement

Techniquement, SMB (mis au point par Microsoft, Intel et IBM) est une implémentation de LAN Manager sur TCP/IP permettant de partager différentes ressources telles que de l'espace disques, des imprimantes, des ports séries, etc...
SMB fonctionne sur le principe d'échange client-serveur, c'est à dire que le client fait des demandes et le serveur envoie des réponses.
La seule exception à ce mode d'échange est lorsque le client a demandé des verrous opportunistes (oplocks) et que le serveur doit rompre un oplock accordé parce qu'un autre client a demandé l'ouverture d'un fichier dans un mode incompatible avec l'oplock. Dans ce cas, le serveur envoie un message non sollicité au client pour lui signaler la rupture d'oplock.

Les rôles de client et de serveur n'étant pas mutuellement exclusifs, une machine peut à la fois être client et serveur.

Les clients se relient aux serveurs en utilisant NetBIOS au dessus TCP/IP (selon les RFC 1001/1002). Une fois qu'ils ont établi une connexion, les clients peuvent alors envoyer des commandes SMB au serveur qui leur permettent d'accéder aux ressources partagées.

Comme l'indique le tableau suivant, LanManager est actuellement très répandu sous différentes formes et dont les fonctionnalités sont plus ou moins riches :

Variante SMB
Nom du protocole
PC Network Program 1.0 (PC LAN 1.0) Core Protocol
Microsoft Networks 1.03 Core Plus Protocol
Microsoft Networks 3.0 DOS LAN Manager
LANMAN 1.0 LAN Manager 1.0
DOS LM1.2X002 LAN Manager 2.0
LM1.2X002 LAN Manager 2.0
DOS LANMAN2.1 LAN Manager 2.1
LANMAN2.1 LAN Manager 2.1
Windows for Workgroups 3.1a LAN Manager 2.1 ?
NT LM 0.12 NT LAN Manager 1.0 ?
Samba NT LAN Manager 1.0 ?
CIFS 1.0 NT LAN Manager 1.0

Le dialecte utilisé entre le poste client et le serveur est négocié dans la phase d'établissement de la session. Si les deux machines n'ont aucun dialectes communs, alors "Core Protocole" compris par toutes les machines impliquées dans le partage de ressources Lan Manager sera utilisé.

NetBIOS : Network Basic Input/Output System

Pour des raisons historiques, NetBIOS, est un protocole incontournable dans les réseaux d'entreprise, qui, malgré ses nombreuses imperfections, est simple à mettre en oeuvre. Introduit par IBM, utilisé par Microsoft, il a été le premiere protocole de réseau local utilisé pour le partage de fichiers entre les micro-ordinateur.

NetBIOS existe en natif sur des trames 802.2 (LLC type 2), ou encapsulé dans des trames de diffusions TCP/IP (cas de samba) ou IPX.
Ce prototole est associé à une interface logicielle sur micro-ordinateur qui détourne les appels système pour les rediriger vers le réseau.
Toute application peut ainsi utiliser de manière transparente de port série ou imprimante, qu'ils fonctionnent normalement ou qu'ils soient reroutés vers le réseau dans des message NetBIOS.

Le fonctionnement de ce protocole est atypique : chaque station est identifié par un nom et a la responsabilité de maintenir une table de corresspondance "nom/adresse MAC" des autres stations du réseau qui dialoguent avec elle. Il n'y a pas de couche réseau assurant un adressage de niveau 3, c'est à dire de bout en bout. La conséquence est que NetBIOS n'est pas un protocole routable : il faut donc soit passer par des ponts (ou activer la fonction pont des routeurs) si NetBIOS est utilisé en natif, soit activer la diffusion des broadcasts TCP/IP ou IPX dans le cas d'une encapsulation.

Notion de domaine

Un domaine LAN Manager est un ensemble de postes de travail (workstations), de serveurs situés sur un même réseau ou sur des sous-réseaux différents. Son but est de regrouper les utilisateurs d'un même service/département/laboratoire dans une entité logique et non physique, afin de faciliter la gestion de leurs ressources communes (répertoires, imprimantes, applications, etc...) et pour une meilleure sécurité. Tout domaine LAN Manager est désigné par un nom unique connu de toutes les machines de ce domaine.
Toutes les informations sur les utilisateurs de ce domaine sont répertoriées dans une base de données du serveur primaire et sont ensuite répliquées sur les autres serveurs du domaine appelés habituellement serveur backup.

Serveur Primaire (PDC)

Egalement appelé contrôleur primaire du domaine (Primary Domain Controller ou PDC), ce serveur assure la gestion de la base de données des utilisateurs que les autres membres du domaine consultent et mettent à jour.
Le serveur primaire est un serveur qui a remporté l'élection du local master browser.

Serveur Backup (BDC)

Dans un domaine, il peut y avoir des serveurs backup (Backup Domain Controller ou BDC). Le rôle d'un tel serveur est de maintenir une copie de la base de données maintenue par le serveur primaire. En cas de panne du serveur primaire, le serveru backup prendra en charge les fonctions de ce dernier et deviendra donc le nouveau serveur primaire.
Les serveurs backup sont des serveurs qui ont participés à l'élection du local master browser mais qui ne l'ont pas remportée.

Serveur membre

Un serveur membre est un serveur partageant des ressources mais ne participant pas à l'élection du local master browser. Cependant, au même titre que les autres serveurs, il consulte et enrichi la liste des utilisateurs maintenue par le serveur primaire.

Ressource IPC partagées

En permettant l'interprocess communication à distance LAN Manager peut être le support d'applications réparties. La ressources partagée IPC$ (le $ indique que la ressource partagée est cachée et donc non visible par les utilisateurs) est nécessaire pour la communication entre les processus du serveur et les applications du client. La connexion à la ressource IPC$ est automatique.

Nom de partage (sharename)

Chaque ressource partagée sur un serveur LAN Manager possède un nom unique permettant de l'identifier sans ambiguïté sur ce serveur. Cependant, ce nom n'est pas forcément unique à travers le réseau local (ex : IPC$). Attention, aux limitations de certains clients quand à la longueur du nom de partage (Microsoft Windows For Workgroup est limité à 8 caractéres).

Nom Réseau

Pour se connecter à une ressource partagée sur un serveur déterminée du réseau, l'utilisateur d'un poste de travail doit indiquer le nom du serveur suivi de celui de la ressource partagée selon une syntaxe appropriée. La combinaison de ces deux noms constitue le nom réseau de la ressource partagée, c'est une sorte d'adresse réseau permettant d'identifier de façon unique la ressource.
Ex (sous DOS) : Net use d: \\serveur\ressource

Compilation de samba

Note : la description suivante pour la compilation de samba n'est valide que depuis la version 2.0.0 (utilisation de configure)

Conditions nécessaires :

Si vous disposez de ces trois conditions, l'installation de samba peut démarrer: L'archive Samba est maintenant décompactée, nous pouvons passer à la compilation : Normalement, vous disposez maintenant des binaires de samba. Le plus important reste à faire : La configuration de samba

Configuration du serveur Samba : smb.conf

La configuration de Samba est contrôlée par un seul fichier, smb.conf, se trouvant dans /usr/local/samba/lib. Ce fichier indique quelles ressources systèmes vous désirez partager avec le monde extérieur et quelles restrictions vous voulez mettre dessus.

Ce fichier est constitué de différentes rubriques appelés sections contenant chacune une liste de paramètres (principe identique aux fichiers .ini de MS-Windows 3.x). Une telle organisation simplifie à la fois la lisibilité du fichier et son exploitation.

Chaque section commence par le nom de la section entre crochets. La section se poursuit jusqu'à ce que la section suivante apparaisse ou que le fichier se termine. Le nom de la section est le nom du service et les paramètres de cette section définissent les attributs de ce service. Chaque ligne contenue dans une section attribue la valeur d'un paramètre, avec la syntaxe suivante : Paramètre = valeur. Les lignes de commentaires commencent par un point virgule (;) ou par un dièse (#).

Il existe 3 sections particulières :

La section [global] définit les paramètres communs du serveur pour le partage de toutes les ressources.
La section [homes] permet à un utilisateur distant d'accéder à son répertoire personnel (home) sur la machine unix. C'est à dire que si un utilisateur Windows essaye de se connecter à ce répertoire depuis sa machine, il sera connecté sur son répertoire personnel. Notez que pour cela, il doit posséder un compte sur l'hôte Unix
La section [printers] définit les paramètres communs du serveur pour le partage des imprimantes.
Pour connaitre les différents paramétres de smb.conf, veuillez lire le manuel de smb.conf (man smb.conf).
Pour exemple d'un fichier de configuration, voici le smb.conf commenté de mon linux.

A chaque fois que vous modifiez le fichier smb.conf, utilisez l'utilitaire testparm (programme faisant partie de Samba) qui permet de vérifier votre fichier (tapez testparm smb.conf).
Testparm est un programe qui vérifie la cohérence syntaxique d'un fichier de configuration pour smbd. S'il indique qu'il n'y a pas d'erreur, vous pouvez alors utiliser le fichier de configuration. Veuillez noter que ceci n'est pas une garantie que les services spécifiés dans le fichier de configuration seront disponibles ou fonctionneront comme prévu.

Le fichier de configuration et tous les fichiers qu'il inclut, sont automatiquement rechargés chaque minute, s'ils changent. Vous pouvez forcer une relecture de ces fichiers en envoyant un signal SIGHUP au serveur (kill -HUP). La relecture du fichier de configuration n'affectera pas les connexions déjà établis.

Partage de répertoires

Avant de déclarer un répertoire partageable, l'adminitrateur doit prendre un certain nombre de précautions : le dit répertoire doit exister sous Unix, appartenir à un système de fichier monté et ne doit pas contenir des fichiers confidentiels ou sensibles (ainsi les répertoires /etc, /dev, /bin, /sbin, /usr/bin, /usr/sbin, /var, etc… ne devraient pas être partagés).

Partage d'imprimantes

La mise à disposition d'imprimantes partagée sur le serveur, accessible par différents poste de travail, se fait de la même manière et avec les mêmes outils que dans le cas de répertoires partagés.
Il faut noter que le partage d'imprimantes est celui qui pose le plus de problèmes à mettre en place dans la pratique. Ceci est dû à la diversité des types d'imprimantes, de spoolers sous Unix et des filtres utilisés. Mais cela reste quand même à la porté de tout administrateur.

Lancement de Samba

Les deux démons suivants sont nécessaires pour Samba :

Smbd (/usr/local/samba/bin/smbd) :
Le serveur SMB qui accepte les connexions en provenance des clients LanManager et fournit les services de partage de fichiers et d'impression. Veuillez noter qu'il y a des implications sérieuses pour la sécurité si vous lancez ce serveur, relisez donc bien votre smb.conf

Nmbd (/usr/local/samba/bin/nmbd) : Le serveur de nom NetBIOS que les clients utilisent pour consulter les serveurs. NetBIOS est l'abréviation de Network Basic Input/Outpout System, une interface utilisée par les applications pour communiquer avec les transports de réseau tels que TCP/IP, il permet notament l'association d'un nom à une adresse IP.
Nmbd peut être aussi utilisés comme serveur WINS. Ceci signifie qu'il répond à toutes les requêtes de résolution de nom qu'il reçoit directement (demande unicast). Les noms qu'il peut résoudre sont ceux présent dans le fichier de noms netbios (/etc/lmhosts ou voir l'option -H de nmdb), son propre nom et tous les autres noms pour lesquels il a pu obtenir des informations à partir des autres explorateurs sur le réseau
Un des légers problèmes de Samba (mais c'est plutôt la faute du protocole), c'est que vous devez être root pour lancer les processus, puisqu'il s'attachent sur les ports 137 et 139 qui sont des ports privilégiés. 137 est le port sur lequel on résoud les noms (NetBIOS) et 139 est le port sur lequel passe les données.

Le fichier /etc/services doit contenir les lignes suivantes:

#
# NETBIOS port - LM Server
#
nb-name       137/tcp     # Netbios Name Port
nb-name       137/udp     # Netbios Name Port
nb-dgram      138/tcp     # Netbios Datagram Port
nb-dgram      138/udp     # Netbios Datagram Port
nb-session    139/tcp     # Netbios Session Port
nb-session    139/udp     # Netbios Session Port

Attention, certains systèmes unix ont déjà une entrée netbios_ns ( _ et non - ) dans /etc/services. Dans ce cas là, il faudra mettre en accord les fichiers /etc/services et /etc/inetd.conf (le nom en lui-même n'a pas une réelle importance, il faut juste qu'il soit le même entre ces deux fichiers

Les deux serveurs nmbd et smbd peuvent être lancés de deux façons :

  1. manuellement ou au boot, par un script de démarrage. Ils tourneront alors en permanence (démons).
  2. par le super-démon inetd à chaque requête (plus économique pour la mémoire)

Première solution : Lancer samba en tant que démon

Créez un script dans lequel vous placerez les commandes de lancement des démons. Pour exemple, voici un script de lancement (il doit être exécutable, chmod +x /etc/rc.d/rc.smb) :

#!/bin/sh
# Fichier /etc/rc.d/rc.smb
# Lancement des démons smbd et nmbd
echo -n "Lancement de Samba : "
if /usr/local/samba/bin/smbd -D;
then echo -n "smbd"; fi
if /usr/local/samba/bin/nmbd -D; then echo -n "nmbd"; fi
Vous pouvez ensuite lancer Samba manuellement en tapant /etc/rc.d/rc.smb, ou bien inclure les lignes suivantes dans votre /etc/rc.local pour que samba soit exécuté dès le démarrage de votre système :
#Lancement de Samba
# Si le script /etc/rc.d/rc.smb existe,
if [ -r /etc/rc.d/rc.smb];
# Alors, on l'éxécute.
then /etc/rc.d/rc.smb;
fi

Deuxième solution : Lancement de Samba sur requête

Vous devez pour cela rajouter dans le fichier de configuration d'inetd (/etc/inetd.conf) les deux lignes suivantes (attention la syntaxe peut varier selon le système unix utilisé):
netbios-ssn stream tcp nowait root /usr/local/samba/bin/smbd smbd
netbios-ns dgram udp wait root /usr/local/samba/bin/nmbd nmbd
et relancez le daemon inetd avec la commande : killall -HUP inetd ou /etc/inetd -c

Consultez les page de manuel smbd.8 et nmbd.8 pour connaître les nombreuses options que l'on peut passer à smbd et nmbd. Le fonctionnement des démons est tracé dans /usr/local/samba/var/log.smb et /usr/local/samba/var/log.nmb

Configuration d'une machine Windows

Pour le moment, Samba ne permet d'accéder à la machine Windows que si elle offre un support TCP/IP. En attendant la prochaine version qui devrait offrir un service direct avec NetBIOS. Il faut que la machine Windows possède une couche NetBIOS, mais aussi une couche TCP/IP pour votre carte ethernet.
Les stations Windows 95 et NT4 disposent des fonctionnalités réseau nécessaires leur permettant d'accéder à un serveur LAN Manager.
Pour une station Windows pour Workgroups (3.11), il faut mettre à jour le système (télécharger le fichier wfwfiles.exe) et installer la couche TCP/IP (télécharger la pile IP à partir de ftp.microsoft.com/bussys/Clients/WFW/ ).
Ceci étant fait, après quelques reboot vous devriez voir apparaître dans votre Voisinage Réseau votre nouveau serveur Samba. Vous allez alors pouvoir accéder aux différents partages (que vous avez définis dans le fichier smb.conf), de votre serveur SAMBA, disponibles pour l'utilisateur courant.

Quelques renseignements sur les clients Windows :

D'une manière générale, il est conseillé de consulter régulièrement la base de connaissance (knowledge base) de Microsoft. L'excellent site Windows 95 system updates vous permettra d'être informé des patchs existants et de leur utilité.

WINS : Windows Internet Name Service

WINS est une base de données dynamique jouant le rôle d'un serveur de Noms NetBIOS et qui permet ainsi de faire la correspondance (mapping) d'un nom NetBIOS avec une adresse IP.

En effet, par soucis de convivialité, le nom NetBIOS des machines peuvent être différents de leur nom DNS.
Il parait évidement que l'on préfèrera se connecter à 'angelus' (nom NetBIOS) plutôt qu'à 'adm-le-tanou' (Nom DNS)...

En fait, il convient de signaler que WINS n'apporte pas grand chose sur ce point, puisque que l'on peut également donner des alias dans le D.N.S. Le principal intéret réside dans l'amélioration de la visibilité du voisinage réseau (browsing).
En effet, la présence d'un serveur WINS permet de minimiser le système de recherche et d'annonce par diffusion (broadcast), du fait que les machines configurées pour utiliser le serveur WINS adressent directement leurs requêtes à ce serveur. Ce qui accélére le processus de recherche et diminue notablement le traffic réseau. De plus, dans le cas de réseaux composés de sous-réseaux, le serveur WINS permet une visiblité accrue du réseau en jouant un rôle de passerelle entre les différents réseaux puisque les requêtes au serveur WINS sont routables contrairement aux annonces par diffusion qui sont le plus souvent bloqués (fort heureusement) par les routeurs.

Les bases de données WINS sont régulièrement mises à jour pour assurer une bonne concordance entre les noms NetBIOS et les adresses IP des machines. En régle générale, chaque serveur WINS renouvelle ses entrées tous les 4 jours et les clients WINS s'enregistrement tous les 2 jours dans la base.

Accéder depuis Unix à une ressource partagée sur un serveur SMB : smbclient

Un client SMB pour un hôte Unix est inclus dans la distribution de Samba. Il fournit une interface semblable au ftp, en ligne de commande. Vous pouvez utilisez cet utilitaire pour transférer des fichiers ou accéder à une imprimante sur un serveur SMB distant.
Smbclient permet donc de tester, de répertorier et d'accéder aux ressources offertes par des serveurs SMB. Tout d'abord, il est possible de vérifier si le serveur SMB est bien disponible, et de lister les différentes ressources qu'il partage grâce à la commande :

smbclient -L nom_serveur où nom_serveur représente le nom NetBIOS du serveur proposant des ressources SMB Ensuite, il est possible d'accéder au différents fichiers de la ressource partagée en s'y connectant avec smbclient, puis de la parcourir et de récupérer les fichier exactement comme avec un ftp (tapez help pour avoir une aide en ligne). Exemple, pour accéder à un dossier partagé :
smbclient \\\\nom_serveur\\nom_ressource -U nom_utilisateur nom_ressource représente le nom de la ressource partagée que l,on veut accéder. Après cela, il devrait vous être demandé un mot de passe (qui correspond à celui spécifié pour la ressource sous Windows). Une fois le mot de passe entré, il n'y a plus qu'à parcourir les fichiers exactement comme avec ftp (toutes les commandes MS-DOS sont utilisables).
Pour effectuer une impression sur une imprimante partagée par un LAN Manager, il faut utiliser l'option -P de smbclient.
Avec la majorité des Shell, il est nécessaire de doubler les backslashs (\) pour qu'ils soient pris en compte (le backslash étant considéré comme un caractére d'échappement).

De la même façon que vous accédez à des disques, vous pouvez accéder et imprimer sur une imprimante partagée :
smbclient \\\\nom_serveur\\nom_imprimante -P
ensuite :
pour imprimer le fichier /etc/networks : print /etc/networks
pour voir l'état de la queue d'impression : queue
pour sortir de smbclient : exit

Envoyer un message depuis votre station Unix vers un client LanManager

smbclient -M nom_de_l'ordinateur
Tapez votre message et terminez par Control-D

Si la machine de destination a un équivalent du WinPopup de Ms-Windows qui tourne, l'utilisateur recevra le message; sinon le message sera perdu et aucun message d'erreur ne sera produit.
Le message est tronqué automatiquement s'il dépasse 1600 octets (c'est la limite du protocole).

Recevoir des messages sur votre station Unix

Pour que le root reçoive par mail les message envoyé à la machine, vous pouvez rajouter la ligne suivante dans la section globale de vore smb.conf :
message commande = /bin/mail -s "Message de %f sur %m" root@localhost < %s; rm %s

Sur Linux, vous pouvez utiliser LinPopUp:
LinPopUp est une adaptation Xwindow du Winpopup de MS-Windows, qu'il émule en utilisant Samba. Il permet, entre autre, de communiquer avec un utilisateur Windows qui utilise Winpopup, en lui envoyant ou en recevant des messages.

Monter une ressource partagée sur Linux : smbmount

Les utilisateurs Linux peuvent également monter des ressources SMB en tant que filesytem distant. Pour cela il faut compiler le noyau avec le support du filesystem SMB (dans le noyau ou bien par module smbfs.o). Il faut également récupérer les utilitaires smbmount et smbumount. Ces utilitaires font partie du package smbfs disponible sur :

ftp://ftp.lip6.fr/pub/linux/sunsite/system/filesystems/smbfs/!INDEX.html

Smbmount permet de monter (comme par NFS) des ressources SMB sur l'arborescence Unix et de les manipuler le plus naturellement du monde. La syntaxe de montage est simple :
smbmount //nom_serveur/nom_resource /point_de_montage Il est parfois nécessaire de rajouter une entrée dans le fichier /etc/hosts pour nom_serveur avec son adresse IP, pour que smbmount puisse marcher correctement.

Pour démonter la ressource, il suffit d'appeler smbumount : smbumount /point_de_montage Quelques Problèmes possibles :

Samba fonctionne sur les systèmes suivants (juin 1998) :

A/UX 3.0
AIX
Altos Series 386/1000
Amiga
Apollo Domain/OS sr10.3
BSDI
B.O.S. (Bull Operating System)
Cray, Unicos 8.0
Convex
DGUX.
DNIX.
FreeBSD
HP-UX
Intergraph.
Linux with/without shadow passwords and quota
LYNX 2.3.0
MachTen (a unix like system for Macintoshes)
Motorola 88xxx/9xx range of machines
NetBSD
Release 2.X, 3.0 and greater (including OPENSTEP for Mach).
OS/2 using EMX 0.9b
OSF1
QNX 4.22
RiscIX.
RISCOs 5.0B
SEQUENT.
SCO (including: 3.2v2, European dist., OpenServer 5)
SGI.
SMP_DC.OSx v1.1-94c079 on Pyramid S series
SONY NEWS, NEWS-OS (4.2.x and 6.1.x)
SUNOS 4
SUNOS 5.2, 5.3, and 5.4 (Solaris 2.2, 2.3, and '2.4 and later')
Sunsoft ISC SVR3V4
SVR4
System V with some berkely extensions (Motorola 88k R32V3.2).
ULTRIX.
UNIXWARE
UXP/DS


Voici la dernière version de samba : samba-2.0.4a.tar.gz (18/05/99)
Exemple d'un fichier de configuration, voici le smb.conf commenté de mon linux

La page officielle de Samba (en anglais)
Documentation Samba (en anglais) - URL mentionnée par O. Macchioni
Liste des utilisateurs francophones de Samba
Remplacer Windows NT Server par Linux (en français)
Remplacer Windows NT Server par Linux (en anglais)
DAVE : Un client SMB pour Mac (en anglais)
pages de man de samba traduite
SMB to NFS protocol converter: Sharity Light
Windows 95 system updates

Tous mes remerciements à Gilles BRUNO de l'Université Joseph Fourier (Grenoble) pour sa contribution

Jerome.Le-Tanou@linuxfr.org