Introduzione a Samba

(dettagli relativi a FreeBSD)

Antonio Bonifati http://ninuzzo.freehostia.com

Lo scopo di questo articolo è di introdurre l'uso di Samba, un potente tool che permette di integrare il mondo UNIX con Windows implementando il protocollo di condivisione di file e stampanti SMB, ora chiamato anche CIFS (Common Internet Filesystem). Samba è un programma molto complesso ed altamente configurabile. Esistono interi libri devoti all'argomento. Questo articolo rappresenta solo una prima introduzione e contiene una spiegazione dettagliata solo della configurazione di default, quella più comune e semplice. Tuttavia samba può fare molto di più, persino agire come un controllore primario di un dominio WinNT.

Installazione del pacchetto

Usando il sysinstall(8):
# /stand/sysinstall configPackages
selezionare net/samba-2.2.8 e confermare l'installazione.

Usando pkg_add(1) dalla directory /cdrom/packages/All:

# pkg_add samba-2.2.8.tgz
===> Stopping cupsd ...
No matching processes were found

**********************************************************************
**********************************************************************
NOTE FOR PACKAGE USERS ONLY:
============================
This package does not create the spool directory, due to limitations in
the packaging mechanism, or my knowledge of it.

Once the package is installed, please do the following (as root):

        cd /var/spool
        mkdir -p cups/tmp
        chown -R root:daemon cups

Thanks. 

--
AlanE, your friendly neighborhood cups maintainer and all around
wild and crazy (ok, well just crazy) guy.
**********************************************************************
**********************************************************************


=======================================================================

WARNING: In FreeBSD, it's known that compiling samba with any kind of
optimization flags might cause problems under certain circumstance.

If you caught any show stopper, please try taking optimization flag(s)
out of your CFLAGS and recompile/reinstall samba.

=======================================================================

Posizione dei file principali

Configurazione

Il file di configurazione di esempio si trova in /usr/local/etc/smb.conf.default oppure /usr/local/share/examples/samba/smb.conf.default, /usr/local/share/examples/samba/simple/smb.conf.
Il file delle password crittate, la controparte di /etc/passwd si trova in /usr/local/private/smbpasswd.

Eseguibili

I binari del server samba si trovano in /usr/local/sbin/ e sono smbd(8) e nmbd(8).
Il client tipo ftp si trova in /usr/local/bin/smbclient.
Il programma per testare la configurazione è in /usr/local/bin/testparm.
Tutti i binari sono nel path. Per avviare il server automaticamente al boot rinominare lo script di avvio predisposto come segue:
# cd /usr/local/etc/rc.d/
# mv samba.sh.sample samba.sh
Non è necessario riavviare, potete eseguire lo script samba.sh manualmente da root per questa volta. Prima però predisponete il file di configurazione di default:
# cd /usr/local/etc
# cp smb.conf.default smb.conf

Log

Il file di log di smbd si trova in /var/log/log.smbd e similmente quello di nmbd in /var/log/log.nmbd.

Documentazione

Il libro "Using Samba" si trova in /usr/local/share/swat/using_samba/index.html
Le manpage disponibili sono indicate dal seguente comando:
# pkg_info -L 'samba*' | grep -w man
Le FAQ in formato HTML sono in /usr/local/share/doc/samba/faq/sambafaq.html
per leggerle in modo testo fate:
# less /usr/local/share/doc/samba/faq/sambafaq.txt
Informazioni su come testare il server in /usr/local/share/doc/samba/textdocs/DIAGNOSIS.txt

Semplice configurazione

Analisi della configurazione di default

Il file di configurazione di default /usr/local/etc/smb.conf che abbiamo messo in produzione poco prima contiene i seguenti settaggi, escludendo quegli esempi che sono commentati:
[global]

# workgroup = NT-Domain-Name or Workgroup-Name, eg: REDHAT4
   workgroup = MYGROUP

# server string is the equivalent of the NT Description field
   server string = Samba Server

# If you want to automatically load your printer list rather
# than setting them up individually then you'll need this
   load printers = yes

# this tells Samba to use a separate log file for each machine
# that connects
   log file = /var/log/log.%m

# Put a capping on the size of the log files (in Kb).
   max log size = 50

# Security mode. Most people will want user level security. See
# security_level.txt for details.
   security = user

# Most people will find that this option gives better performance.
# See speed.txt and the manual pages for details
# You may want to add the following on a Linux system:
#         SO_RCVBUF=8192 SO_SNDBUF=8192
   socket options = TCP_NODELAY 

# DNS Proxy - tells Samba whether or not to try to resolve NetBIOS names
# via DNS nslookups. The built-in default for versions 1.9.17 is yes,
# this has been changed in version 1.9.18 to no.
   dns proxy = no 

#============================ Share Definitions ==============================
[homes]
   comment = Home Directories
   browseable = no
   writeable = yes

# NOTE: If you have a BSD-style print system there is no need to 
# specifically define each individual printer
[printers]
   comment = All Printers
   path = /var/spool/samba
   browseable = no
# Set public = yes to allow user 'guest account' to print
   guest ok = no
   writeable = no
   printable = yes
Il formato di questo file è molto semplice: è costituito da una serie di sezioni, ciascuna contenente l'impostazione di un certo numero di parametri. L'inizio di una sezione è contrassegnato dal nome della sezione racchiuso tra parentesi quadre (il tutto deve stare su una linea a se stante). Una sezione si estende fino al prossimo identificatore di sezione. I parametri vengono assegnati tramite il formato name = value (il tutto deve stare su una linea a se stante; tuttavia se una linea termina con \ la prossima linea viene considerata la continuazione della precedente). I nomi delle sezioni e dei parametri possono essere scritti indifferentemente in maiuscolo o minuscolo. Le linee che iniziano con # o ; rappresentano commenti. Per convenzione si è scelto di utilizzare # per i commenti in lingua naturale, mentre ; viene utilizzato per commentare direttive che non si vogliono utilizzare. Ogni sezione rappresenta una risorsa da condividere (in gergo detta share) eccetto le tre sezioni speciali [global], [homes] e [printers]. Nel file precedente ci sono solo queste sezioni speciali che adesso descriveremo. Per maggiori informazioni vedere smb.conf(5).

sezione [global]

Le opzioni di questa sezione controllano il comportamento globale di samba. Analizziamolo una per una limitatamente a quelle presenti nella configurazione standard:

sezione [homes]

Questa è una share speciale, che serve per generare dinamicamente dei servizi che connettono i client alle proprie home directory. Il meccanismo è il seguente: quando un client fa una richiesta di connessione il server samba cerca nell'elenco delle share configurate. Se ne trova una che corrisponde a quella richiesta dall'utente, la usa. Altrimenti usa il nome della sezione richiesta come un nome utente e cerca questo nome nel file delle password locali. Se il nome esiste e la password fornita dall'utente è quella corretta, viene creata una share al volo clonando la sezione [homes]. Alla nuova share creata clonando [homes] vengono applicate due modifiche: il nome della share viene cambiato da homes al nome utente individuato prima. Se la sezione [homes] non contiene un parametro path esplicito, il path della share viene impostato uguale alla home directory dell'utente individuato prima.

sezione [printers]

Questa è una sezione speciale che viene clonata, similmente alla homes, ma viene usata per condividere le stampanti anziché parti del filesystem. Se è presente questa sezione gli utenti potranno connettersi a qualsiasi stampante configurata nel file printcap(5) del server samba.

Nella sezione precedente abbiamo visto l'algoritmo di ricerca dei servizi. Questo si completa come segue: se non può essere usata la sezione homes, ed esiste la sezione printers, samba tratta il nome della sezione richiesta come un nome di stampante. Lo cerca nel file printcap(5) (fa match anche con gli alias del nome della stampante definiti in questo file). Se lo trova crea una nuova share di tipo stampante clonando la sezione printers e connette il client a questa share. Le modifiche che vengono fatte alla nuova share creata includono naturalmente il cambiamento del nome da printers al nome della stampante individuato.

Configurazione per l'accesso alle proprie home directory

Per tutti gli utenti a cui volete permettere l'accesso tramite samba alle loro home directory sul server, dovete eseguire il seguente comando (da root):
# smbpasswd -a user
-a sta per "add user", mentre user è il nome utente. Questo comando aggiorna il file /usr/local/private/smbpasswd con il nome utente e la password richiesta (da digitare due volte). Se l'utente esiste già non viene aggiunto e viene solamente aggiornata la password. Attenzione che un account utente unix con lo stesso nome utente deve esistere per ogni account samba, mentre la password può anche essere diversa, o l'account unix potrebbe essere disabilitato (ma deve esserci).

Per provare da unix, dopo essersi loggati con lo stesso nome utente user, fare:

$ smbclient //localhost/user
inserire poi la password di samba dell'utente user. Se si usa il client smb da un altro host, sostituire localhost con il nome del server samba. Se si è loggati con un altro utente aggiungere alla fine del comando precedente l'opzione -U user.

Altre impostazioni consigliate per la sicurezza

Per la sicurezza è altamente consigliabile abilitare la seguente direttiva, altrimenti il valore di default è no:
# You may wish to use password encryption. Please read
# ENCRYPTION.txt, Win95.txt and WinNT.txt in the Samba documentation.
# Do not enable this option unless you have read those documents
  encrypt passwords = yes
in questo modo le password sono conservate nel server in forma di hash (dall'hash non si può più risalire alla password in chiaro). Cosa ancora più importante la password e nemmeno il suo hash vengono mai mandate in chiaro attraverso la rete. Il meccanismo che viene usato per l'autenticazione, nonchè l'uso di smbpasswd(8) è spiegato in dettaglio in /usr/local/share/doc/samba/htmldocs/ENCRYPTION.html. L'abilitazione di questa direttiva in combinazione con l'impostazione security = user richiede però la gestione di un file delle password di Samba (smbpasswd(5)) separato da quello di sistema di UNIX ed occorre mantenerli sincronizzati. Purtroppo infatti l'hash unidirezionale di UNIX e quello usato da Samba sono differenti.

Come ulteriore livello di protezione oltre le password di utente, si può limitare l'accesso a tutti i servizi di samba. Per default l'accesso è permesso a tutti gli host (naturalmente anche in quest'ultimo caso occorre sempre fornire una password per le risorse che lo richiedono):

# This option is important for security. It allows you to restrict
# connections to machines which are on your local network. The
# following example restricts access to two C class networks and
# the "loopback" interface. For more examples of the syntax see
# the smb.conf man page
   hosts allow = 192.168.1. 192.168.2. 127.

Questo esempio non permette di fare nulla, nemmeno ottenere l'elenco delle share o degli host del gruppo di lavoro se samba è il local master browser agli host a cui non è permesso l'accesso.

Non è necessario riavviare samba dopo una modifica a smb.conf, se siete disposti ad aspettare un minuto, il file di configurazione verrà automaticamente ricaricato dopo un minuto. Se invece non volete aspettare allora si può forzare il reload mandando un segnale SIGHUP al server smbd(8), utilizzando il comando kill(1). Le connessioni che sono già stabilite non saranno influenzate da cambi di configurazione quando si ricarica il file di configurazione. Per testare questi cambi o l'utente deve disconnettersi e poi riconnettersi (usando il menu Start o Avvio di Windows e scegliendo "Disconnetti utente..."), oppure fermate e poi avviate il server smbd.

Per la sicurezza date molta attenzione ai permessi del file smbpasswd(8) e della directory che lo contiene, che dovrebbero essere molto restrittivi come segue:

# ls -ld /usr/local/private/
dr-x------  2 root  wheel  512 May 22 20:24 /usr/local/private/
# ls -l /usr/local/private/
total 16
-rw-------  1 root  wheel  8192 Jun 20 23:14 secrets.tdb
-rw-------  1 root  wheel  2643 Jun 20 17:40 smbpasswd
-rw-------  1 root  wheel  2643 May 22 19:03 smbpasswd.default

Per i backup/restore dei file TDB (Trivial Database) di samba si può utilizzare l'utility tdbbackup.

Se avete interfaccie di rete multiple, potete restringere la lista delle interfaccie usate da samba con il parametro interfaces.

Alcuni consigli e suggerimenti

Ogni tanto consultate i log, perchè contengono informazioni utili o segnalazioni di eventuali problemi. Ad esempio potete sapere se il vostro server Samba ha vinto le elezioni ed è diventato local master browser. In tal caso nel file di log /var/log/log.nmbd ci sarà scritto qualcosa del tipo:

  *****
  
  Samba name server NINUZZO is now a local master browser for workgroup HOME on subnet 1
92.168.1.1
  
  *****

Altro esempio: quando riavviate smbd mandando con kill(1) il segnale SIGHUP, verrà indicato in /var/log/log.smbd con una linea "Got SIGHUP".

Se volete utilizzare Samba per condividere delle stampanti, leggete /usr/local/share/doc/samba/textdocs/Printing.txt. Io lo uso per condividere una stampante USB. Ho attivato il supporto per stampanti USB nel kernel, e il demone usbd(8) inserendo la linea usbd_enable="YES" in rc.conf(5) ed ho configurato la stampante in modalità raw con cups, The Common UNIX Printing System, attraverso la sua interfaccia web di amministrazione.

L'utility smbstatus(1) riporta le connessione correnti di Samba. Se non ce n'è nessuna stampa:

$ smbstatus

 Samba version 2.2.8
 Service      uid      gid      pid     machine
 ----------------------------------------------

 No locked files
Supponendo ci sia una connessione al server samba per recuperare l'elenco degli host della LAN (la cosa avviene quando si clicca una volta sull'icona Risorse di rete) si ha qualcosa di simile a:
$ smbstatus

 Samba version 2.2.8
 Service      uid      gid      pid     machine
 ----------------------------------------------
 IPC$         nobody   nobody     419   dolly    (192.168.1.3) Fri Jun 20
 22:31:54 2003

 No locked files

Qui dolly è il nome della macchina client e 192.168.1.3 il suo indirizzo IP. Poco tempo dopo aver recuperato la lista la connessione viene chiusa. Supponiamo poi che l'utente ant su dolly clicchi sul computer che rappresenta il server samba:

$ smbstatus

 Samba version 2.2.8
 Service      uid      gid      pid     machine
 ----------------------------------------------
 IPC$         ant      ant        426   dolly    (192.168.1.3) Fri Jun 20
 22:34:50 2003

 No locked files

Questa connessione recupera l'elenco delle share sul server samba e viene chiusa dopo un po'. Cliccando sulla share che rappresenta la home directory si ha:

$ smbstatus

 Samba version 2.2.8
 Service      uid      gid      pid     machine
 ----------------------------------------------
 ant          ant      ant        434   dolly    (192.168.1.3) Fri Jun 20
 22:36:27 2003
 IPC$         ant      ant        434   dolly    (192.168.1.3) Fri Jun 20
 22:36:27 2003

 No locked files
e dopo un po' permane solo questa:
$ smbstatus

 Samba version 2.2.8
 Service      uid      gid      pid     machine
 ----------------------------------------------
 ant          ant      ant        434   dolly    (192.168.1.3) Fri Jun 20
 22:36:27 2003

 No locked files
Il formato breve si ottiene con l'opzione -b:
$ smbstatus -b

Samba version 2.2.8
PID     Username  Machine                       Time logged in
-------------------------------------------------------------------
434     ant       dolly                         Fri Jun 20 22:36:27 2003
Supponiamo poi l'utente ant apra con Blocco note il file /home/ant/.bashrc:
$ smbstatus

Samba version 2.2.8
Service      uid      gid      pid     machine
----------------------------------------------
ant          ant      ant        434   dolly    (192.168.1.3) Fri Jun 20
22:36:27 2003
IPC$         ant      ant        434   dolly    (192.168.1.3) Fri Jun 20
22:42:55 2003

Locked files:
Pid    DenyMode   Access      R/W        Oplock           Name
--------------------------------------------------------------
434    DENY_NONE  0x1         RDONLY     EXCLUSIVE+BATCH  /home/ant/.bashrc
Fri Jun 20 22:42:36 2003

$ smbstatus

Samba version 2.2.8
Service      uid      gid      pid     machine
----------------------------------------------
ant          ant      ant        434   dolly    (192.168.1.3) Fri Jun 20
22:36:27 2003

Locked files:
Pid    DenyMode   Access      R/W        Oplock           Name
--------------------------------------------------------------
434    DENY_NONE  0x1         RDONLY     EXCLUSIVE+BATCH  /home/ant/.bashrc
Fri Jun 20 22:42:36 2003
L'utente salva le modifiche e chiude il Blocco note e il lock viene rilasciato:
$ smbstatus

Samba version 2.2.8
Service      uid      gid      pid     machine
----------------------------------------------
ant          ant      ant        434   dolly    (192.168.1.3) Fri Jun 20
22:36:27 2003

No locked files
Oltre alle share homes e printers potete creare altre share non speciali utili. Alcuni esempi commentati sono forniti nel file smb.conf di default, occorre solo toglierli dal commento. Eccone uno che consente agli utenti di avere un'area di appoggio in cui scambiarsi temporaneamente dei file, senza ricorrere ad esempio a mezzi più lenti e poco pratici, quali i dischetti o la email:
# This one is useful for people to share files
[tmp]
   comment = Temporary file space
   path = /tmp
   read only = no
   public = yes
Guardare la lista dei file in questa share tmp è concesso a tutti, anche dall'utente guest per effetto di public = yes (se non è questo quello che desiderate, commentate o cancellate la riga or ora citata). Tuttavia per poter leggere i file che vi sono memorizzati occorre che l'utente connesso abbia i corrispondenti permessi di UNIX, altrimenti il client Windows visualizzerà un errore di autorizzazione negata se si tenta di aprire un file. Chiunque può creare dei file in questa cartella. La maschera dei permessi di default con cui vengono creati permette la lettura da parte di tutti e il pieno controllo solo all'utente proprietario. Sulla /tmp in UNIX di solito è settato lo sticky bit già descritto prima a proposito del parametro path nella sezione printers ed impone lo stesso tipo di restrizioni già viste.

Un altro esempio molto semplice potrebbe essere quello di una share per condividere la documentazione locale installata sul server samba. Supponiamo che questa venga gestita dall'amministratore e gli utenti generalmente abbiano bisogno solo di un accesso in lettura:

[doc]
   comment = Local documentation
   path = /usr/local/doc
   read only = yes
   public = yes

Riferimenti

http://fi.samba.org
http://www-106.ibm.com/developerworks/views/linux/articles.jsp
http://www.freebsddiary.org/cups.php