Appunti su Gentoo Linux.
Samba

Introduzione

La condivisione delle risorse

La possibilità di condividere risorse in una rete di computer, quali directory, stampanti, ecc... è molto importante e nel tempo si sono sviluppati svariati protocolli che realizzassero queste funzionalità.
A livello domestico la maniera più semplice per condividere delle risorse è quella di usare il protocollo CIFS (Common Internet File System) e affidare la risoluzione dei nomi della rete al protocollo NTP (NetBIOS over TCP/IP). Questi protocolli sono usati automaticamente da Microsoft Windows e ne esistono delle implementazioni per moltissimi altri sistemi operativi, primo fra tutti Linux, grazie a SAMBA. Si possono quindi facilmente creare delle reti in cui si condividono directory e stampanti anche tra computer con sistemi operativi differenti.
Invece, in una rete abbastanza grande (con più di 10 computer), spesso divisa a sua volta in sottoreti, la scelta migliore è quella di usare un sistema Active Directory.

SMB/CIFS. Un po' di storia

Nei primi anni '80 venne creato dall'IBM un protocollo che descriveva delle regole per la condivione dei file in una rete di computer, venne chiamato SMB (Server Message Block). Successivamente questo protocollo venne adottato da Microsoft che lo modificò più volte, implementandolo nei suoi sistemi operativi, fino al 1996 quando gli cambiò il nome in CIFS. Attualmente Microsoft sta cercando pian piano di soppiantare CIFS con una nuova versione del protocollo, chiamata SMB 2.0, supportata attualmente solo da Windows Vista.
Parallelamente Microsoft creò altri protocolli per la condivisione di risorse in rete, adatti a grandi reti di computer. Prima usando i Domini e successivamente con il sistema Active Directory.
L'implementazione dei protocolli di rete Microsoft (SMB, CIFS, SMB 2.0, Domini, Active Directory) nei sistemi operativi Linux prende il nome di SAMBA.

Il protocollo di rete NTB. Prima parte

Questi protocolli di condivisione riguardano la comunicazione fra due computer, cioè fra due nodi della rete, nulla sanno riguardo la struttura della stessa, dell'identificazione dei computer della rete, né di come raggiungerli. Per fare questo devono lavorare a braccetto di altri protocolli che invece gestiscono questi aspetti. All'inizio ci fu NetBIOS (Network Basic Input/Output System) un vecchissimo protocollo (in realtà un'API) che gestiva una particolare struttura di rete chiamata PC Network. Successivamente venne ampliato prendendo il nome di NetBEUI (NetBIOS Extended User Interface) permettendo la gestione di reti con topologia a stella (lavorando a livello di LLC Ethernet, cioè in pratica con gli indirizzi MAC) e ad anello. SMB fu pensato per poter riconoscere e contattare i computer della rete usando questi protocolli.

Data la diffusione della suite di protocolli TCP/IP anche a livello di reti domestiche, nel 1987 NetBIOS venne di nuovo riscritto per poter funzionare in maniera generica su ogni rete che supportasse TCP/IP. Nacque così NTB (NetBIOS over TCP/IP). Attualmente una comune rete LAN è a stella, con al centro della stella uno switch. I protocolli usati sono il protocollo ethernet e il protocollo TCP/IP. Cioè i computer della LAN sono identificati tramite un indirizzo MAC e un indirizzo IP privato (ad esempio 192.168.1.23). Con NTB si aggiunge un ulteriore modo per raggiungere un computer nella LAN e cioè il nome NetBIOS. CIFS è stato pensato per poter identificare i computer della rete e le risorse fornite dagli stessi, tramite il protocollo NTB. CIFS è capace anche di comunicare con un altro computer usando direttamente il TCP/IP (porta tcp445) cioè direttamente l'indirizzo IP, senza usare i nome NetBIOS; come vedremo però in questo modo non si ha la possibilità di sapere quali sono i computer in rete e le risorse messe a disposizione da questi. Insomma si dovrebbe conoscere a priori l'indirizzo IP privato da contattare su cui risiedono le risorse condivise.

Il protocollo di rete NTB. Seconda parte

Spieghiamo un po' più in dettaglio come funziona NTB.
Quando un computer entra in una rete locale, oltre a richiedere un indirizzo IP, se è in funzione NTB il computer manderà un messaggio in broadcast, cioè a tutti gli indirizzi della subnet, comunicando il proprio nome. Se il nome è disponibile verrà accettato dagli altri computer della subnet.
Similmente, nel caso di risoluzione di un nome NetBIOS, cioè di necessità di sapere l'IP di un computer a partire dal suo nome NetBIOS, il computer manda un messaggio in broadcast a cui risponderà solo il computer con il nome NetBIOS cercato.
Questo tipo di comportamento genera molto traffico su reti di medie/grandi dimensioni, è stato quindi trovato un escamotage facendo spedire questi messaggi, non in broadcast, ma ad un singolo computer della rete, chiamato server NBNS (NetBios Name Server) che funziona come una specie di DNS, cioè associa un nome NetBIOS all'indirizzo IP. Nel mondo Microsoft un server NBNS viene chiamato server WINS (Windows Internet Name Service). L'inconveniente del server WINS è che deve risiedere su un PC sempre acceso e con un IP privato statico per ovvie ragioni. Inoltre ogni computer della rete con indirizzo statico deve sapere qual è l'IP del server WINS e pertanto va configurato. Questo non accade per i PC che hanno un IP dinamico perché il protocollo DHCP permette di inviare svariate informazioni ad un nuovo computer della rete, non solo l'IP da assegnare, ma anche, ad esempio, i server DNS (altrimenti non potresti navigare su internet) ed anche il server WINS della subnet in questione.
In Windows con il comando ipconfig /all potete vedere che tipo di nodo è il vostro computer all'interno della rete gestita da NTB, cioè potete vedere in che modo risolve i nome NetBIOS. Ci sono quattro possibilità:

In realtà una macchina Windows opera in maniera ancora più complessa, basandosi però di default, come appena detto, sul comportamento di un nodo di tipo ibrido:

  1. legge la cache NetBIOS
  2. interroga un server WINS
  3. fa broadcast
  4. legge il file LMHOSTS (WINDOWS\lmhosts, lo si trova come lmhosts.sam)
  5. legge il file HOSTS (WINDOWS\hosts)
  6. interroga un server DNS

NTB mette a disposizione tre servizi, usati poi da CIFS per compiere le sue operazioni:

Come già detto, CIFS può funzionare direttamente sopra il TCP/IP, senza usare NTB; questa modalità prende il nome di "Naked SMB" o "Raw SMB". In questo modo i tre servizi precedenti non saranno più disponibili (e di conseguenza le tre porte associate non saranno più in ascolto). La porta utilizzata da CIFS sarà la 445/tcp che va a sostituire il servizio Sessioni di NTB. Gli altri due servizi invece scompaiono semplicemente e così non si avrà più la possibilità né di esplorare la rete né di associare un nome ad un indirizzo IP. Per ovviare a questi inconvenienti bisogna usare protocolli più sofisticati come Active Directory o, se ci si accontenta di non avere la navigazione della rete ma solamente l'associazione nome-IP, si può installare nella rete un server DNS che però chiaramente deve risiedere su di un PC sempre acceso.

Il protocollo di rete NTB. Terza parte

I nomi NetBIOS possono essere lunghi fino a 15 caratteri (byte) e contenere caratteri alfanumerici standard ( a-z, A-Z, 0-9, ! @ # $ % ^ & ( ) - ' ). (NetBIOS è stato pensato per piccole reti di computer quindi un indirizzamento numerico e/o gerarchico come l'IP non era stato preso in considerazione.) Esiste un sedicesimo e ultimo byte che indica il tipo di risorsa messo a disposizione da quel computer (non potendo usare le porte si è usato questo suffisso). Siccome le risorse possono essere più di una i nomi generati saranno tanti quanti le risorse messe a disposizione. Esiste poi il "workgroup" cioè un raggruppamento logico nomi NetBIOS. Ecco una lista dei casi più comuni che si incontrano.

Queste e molte altre informazioni possono essere ricavate usando il comando Windows nbtstat. Prima però parliamo della navigazione (browsing) della rete. Microsoft ha introdotto in NTB la navigazione della rete grazie a dei computer che mantengono una lista di tutti i computer in rete e le risorse da loro condivise. Per ogni workgroup c'è un Local Master Browser che tiene la lista di tutti i computer di quel workgroup e un unico Domain Master Browser per tutta la LAN che tiene la lista di tutti i Local Master Browser. I ruoli vengono scelti dinamicamente, tramite una elezione tra i vari computer presenti nella lan. Ecco un esempio:

LAN

WORKGROUP1      WORKGROUP2      WORKGROUP3
---------       ---------       ---------	
| pc 1	|   |===| pc 5+*|===|   | pc 7	|	
| pc 2+	|===|	| pc 6	|   |   | pc 8	|
| pc 3	|       |       |   |===| pc 9+	|
| pc 4	|       |       |       |       |
---------       ---------       ---------

+: Local Master Browser
*: Domain Master Browser

Con il comando nbtstat -a <nome computer> si ottengono tutte le informazioni NetBIOS relative al computer specificato. In particolare si otterranno le informazioni riguardanti il tipo di risorse precedentemente descritte ed inoltre informazioni riguardanti il gruppo o il Dominio in cui ci si trova. Ad esempio:

SAMBA: installazione

Prima di installare SAMBA, siccome i filesystem sono gestiti dal kernel, bisogna permettere al kernel di sapere come montare una partizione cifs. Abilitate le seguenti opzioni nel kernel e ricompilate.

File systems  --->
  Network File Systems  --->
    < > SMB file system support
    <*> CIFS support

Dopo tanta teoria veniamo finalmente alla pratica. Installare SAMBA ci metterà a disposizione i programmi per agire sia da client che da server. Purtroppo non c'è modo di installare solo i tool che fanno da client.

Diamo un'occhiata veloce alla use flag a disposizione:

aclAccess Control List. Abilitare
cupsSupporto per le stampanti. Abilitare
ipv6Supporto IPv6. Abilitare
pamSupporto PAM. Necessario per fare il login. Abilitare
pythonSupporto Python. Abilitare
readlineAbilitare
-ads???
-async???
-automountSupporto per l'automount.
-caps???
-fam ???
-ldapSupporto LDAP, cioè per Active Directory.
-quotasSupporto per le quote.
-swat Interfaccia grafica per il server SAMBA.
-syslog ???
-winbindNecessario per il login su Active Directory.

Dopo aver scelto le use-flag da abilitare, installare Samba e mount-cifs.

emerge -pDvNu samba

cambiare i permessi seguenti affinché tutti gli utenti possano usare cifs

chmod +s /usr/bin/mount.cifs
chmod +s /usr/bin/umount.cifs

Ora avrete a disposizione alcuni comandi molto potenti tra i quali net, nmblookup, findsmb, mount.cifs, umount.cifs, smbclient. Purtroppo però non sono riuscito finora a trovare dei tool, sia testuali che grafici, che permettono di visualizzare la struttura della rete (domain browser, master browser, client, ...)

net domain

nmblookup -M -- -
nmblookup -A ip_address
nmblookup -S NetBIOS_name

smbclient -L ip_address

Se si riceve l'errore Error returning browse list: NT_STATUS_ACCESS_DENIED specificare un utente purché non esista! (nell'esempio sotto l'utente -). Oppure specificate un vero nome utente della macchina a cui vi state connettendo e digitate quando vi viene chiesto la password corretta.

smbclient -L ip_address -U -

Non ho capito da cosa dipenda questo errore. Credo da uno o entrambi questi fattori: l'uso della condivisione non-semplice :) oppure il fatto di aver disabilitato NetBIOS sulla macchina Windows.

SAMBA: lato client

Ora non resta che accedere ad una cartella condivisa nella proprio rete privata. Ci sono vari strumenti a disposizione, non parlerò di quelli a riga di comando (già elencati sopra), anche se sono molto istruttivi per capire il funzionamento della rete.

Tra i client smb/cifs grafici, che non sono nient'altro che gui ai comandi testuali di Samba, troviamo smb4k, il migliore, ma disponibile solo a patto di installare molte librerie dell'ambiente KDE; xSMBrowser (non incluso in Portage), spartano ma funzionale, richiede TCL/TK ed Expect; LinNeighborhood, ottimo ma usa ancora le vecchie GTK; pyNeighborhood (non incluso in Portage), riscrittura in Python di LinNeighborhood, ottimo e funzionale. In quest'ultimo caso ricordatevi di disabilitare nelle opzioni l'uso di SMB e lasciare solo quello di CIFS; consiglio di creare anche una cartella mnt nella vostra home dove pyNeighborhood potrà creare cartelle a suo piaceminento per montare le risorse remote.
Fortunatamente da poco è uscita una versione di Thunar che supporta il browsing della rete SAMBA tramite gvfs (dovete installare gvfs con la use flag samba abilitata)! Dovrebbe comparire una cartella Network nella barra laterale ma a me non compare :( Mi compare però in Gigolo! Per crearla bisogna digitare smb:/// e dare invio. Poi si prende il mouse sull'iconcina della barra degli indirizzi e si trascina questa iconcina nella barra laterale! Il bookmark si chiamerà Windows Network. Questi bookmark spariranno non appena vi sloggate!!! Altro problema: quando voglio aprire una condivisione Thunar invece di aprirla apre una finestra "Apri con..."! Se faccio "apri in una nuova finestra" la finestra è vuota. Quindi date le circostante è tutto inutile il supporto per Samba. O si ritorna alla versione 1.1 oppure si passa alla 1.3 che è appena uscita ma ancora non disponibile in Gentoo. È importante anche installare thunar-shares-plugin se volete condividere delle cartelle senza essere amministratori di sistema. Serve poi un'opportuna configurazione di Samba (vedi sotto). Queste nuove funzionalità di Thunar permettono anche di accedere a ftp:// ssh:// ecc... quindi quando tutto funzionerà si potrà anche disinstallare Gigolo! Per ora bisogna tenerselo.

Alcune info (http://www.computerhope.com/unix/smbclien.htm ):

smbclient //ROUTER/video -U user -c "put file-locale [nome-file-remoto]"
smbclient //ROUTER/video -U user -c "get file-remoto [nome-file-locale]"
smbclient //ROUTER/video -U user -c "prompt;recurse;mget/mput cartella [cartella]"

SAMBA: lato server

Finora non abbiamo ancora parlato di come condividere delle risorse. Per questo esistono centinaia di ottime risorse, tratterò solo alcuni esempi particolari in cui mi sono imbattuto.
Ricordo che le seguenti configurazioni possono essere realizzate solo dall'utente root. Contrariamente a Windows infatti, un semplice utente non può condividere directory. Questa limitazione è stata attualmente superata nelle ultime versioni di Samba in cui sono stati introdotti i così detti Linux Usershare di cui parlerò in seguito.

Impostazioni Generali

Il file di configurazione di Samba è /etc/samba/smb.conf ed è suddiviso in sezioni. Parleremo prima di tutto della sezione [global], in cui vengono messe tutte le impostazioni generali del server e le impostazioni valide per tutte le condivisioni. Condivisioni che invece verranno specificate successivamente in questo file di configurazione, introducendole con la sintassi [nome_condivisione]

Prima di tutto creiamo l'utente smbguest, che sarà l'utente ospite di default per le connessioni remote (di default Samba usa l'utente nobody, che di solito è già presente in un sistema Linux, però, per motivi che non sto qui a spiegare, è meglio non usarlo).

useradd -c "Samba guest" -d /dev/null smbguest -s /bin/false
(viene creato l'utente e il gruppo smbguest)

Ecco la parte di configurazione globale del file smb.conf

[global]

# Nome e descrizione del server Samba
workgroup = HOMYNET
netbios name = HOMY
server string = "SAMBA SU HOMY"

# Impostazioni generali di condivisione.
security=user
encrypt passwords = yes
map to guest = bad user

# l'utente ospite corrisponde all'utente smbguest del server
guest account = smbguest

# Impostazioni logging
log level = 1
log file = /var/log/samba.log.%m
max log size = 50

# Impostazioni per la gerarchia del presente server nella rete
local master = yes
os level = 99
domain master = yes
preferred master = yes

[condivisione_1]
...

[condivisione_2]
...

Dopo aver aggiunto le opportune condivisioni (vedi sotto), si può testare il file appena scritto con il comando testparm.
Infine bisogna aggiungere Samba all'avvio del PC: rc-update add samba default. Oppure riavviarlo se già in esecuzione per fargli prendere i cambiamenti.

Cartella Pubblica

Come primo esempio spiegherò come creare una cartella pubblica (alla Windows) in cui tutti gli utenti locali del sistema (appartenenti ad uno specifico gruppo) e tutti gli utenti remoti possano creare e cancellare file e directory di tutti. NOTA: si suppone che ogni utente del sistema abbia come gruppo primario un gruppo con lo stesso nome dell'utente.

Come prima cosa creiamo una cartella pubblica per gli utenti locali (quindi senza usare Samba), dopodiché mostreremo come condividerla in rete usando Samba. Tutti gli utenti locali che appartengono al gruppo smbguest potranno usare correttamente questa cartella.

Ora veniamo alla sua condivisione in rete.

[public]
comment = "Directory Pubblica"
path = /home/public
guest ok = yes
read only = no
# non capisco perché ma la seguente impostazione è necessaria, 
# altrimenti si vedono strani comportamenti.
# Per esempio si può creare un file ma non cancellarlo. modificarlo 
# ma non rinominarlo. e così via. Probabilmente ha a che fare con
# i permessi delle directory e con le ACL? Boh
force group = smbguest 

Home con autenticazione

Usershares

Le usershare sono le cartelle che un utente normale può condividere. Ancora non ho ben capito come funzionano. Per XFCE esiste un plugin per Thunar che permette di condividere le cartella con un semplice menù contestuale. Il plugin si chiama thunar-shares-plugin.

emerge thunar-shares-plugin

Ecco la configurazione di Samba necessaria a far funzionare gli usershare.

mkdir -p /var/lib/samba/usershares
groupadd sambashare
chown root:sambashare /var/lib/samba/usershares
chmod 01770 /var/lib/samba/usershares

Dopo queste operazioni preliminari, aprire il smb.conf e aggiungete in maniera opportuna:

[global]
...
security = share
usershare path = /var/lib/samba/usershares
usershare max shares = 100
usershare allow guests = yes
usershare owner only = yes
...

Ora aggiungete gli utenti che volete possano condividere delle cartelle in rete al gruppo sambashare.

usermod -a -G sambashare utente

Ora potete riavviare Samba:

/etc/init.d/samba restart

Per aggiungere cartelle condivise l'utente non deve far altro che cliccare con il tasto destro su una cartella e spuntare le varie opzioni. C'è come al solito un problema fondamentale. I permessi. Se provate a creare una cartella dentro /tmp e a condividerla vedrete che non ci sarà alcun problema. Se invece volete condividere una cartella all'interno della vostra HOME, la faccenda si fa più complicata. Dovete far sì che i permessi della cartella siano uguali o meno restrittivi di quelli che scegliete per la condivisione. In pratica se volete che su quella cartella possano scrivere tutti allora non potete settare i permessi della cartella senza la scrittura di chiunque. Questa cosa è fatta in automatico dal plugin di thunar. Un altro problema invece è poter arrivare a tale cartella! Tutte le cartelle precedenti fino alla cartella radice devono avere almeno i permessi di esecuzione altrimenti samba non potrà entrare nella vostra cartella condivisa. Se siete molto restrittivi e non volete che le vostre cose vengano viste da altri ma volete fare comunque in modo di condividere delle cartelle tramite usershare allora i permessi sono

chmod 0771 cartella

Altra cosa fondamentale! Non cancellate una cartella prima di averla rimossa dalle cartelle condivise! Altrimenti non vi funziona più il samba plugin per thunar. Se lo fate dovete andare a rimuovere manualmente lo usershare dalla cartella /var/lib/samba/usershares.