Samba: guida estesa
Versioni Compatibili Tutte le versioni supportate di Debian |
Introduzione
Samba è un diffusissimo software open-source, ideato nel 1991 da Andrew Tridgell e rilasciato sotto licenza GPL, che permette la condivisione di risorse come directory e stampanti fra gli host di una rete. Si avvale sostanzialmente del protocollo SMB (server message block) originario Microsoft, basato a sua volta sul protocollo NetBios (network basic input output system) sviluppato da IBM nel 1984.
Si sceglie solitamente l'uso di Samba per poter condividere file e stampanti in una rete mista (macchine GNU/Linux, MS-Windows, Mac OS..), in modo da sfruttare un unico protocollo e un unico sistema di autenticazione.
La suite
Analizziamo i programmi che otteniamo dall'installazione della suite Samba per Debian GNU/Linux:
# apt-get update && apt-get install samba smbfs
In breve:
- smbd: questo demone è sostanzialmente il cuore di Samba; in ascolto sulla 445/tcp, gestisce le autenticazioni e dà accesso ai filesystem e allo spooler di stampa.
- nmbd: questo demone in ascolto sulla 139/udp, rende note le risorse condivise tutte le volte che viene interrogato dai client. Per fare un esempio è quel demone che permette la visualizzazione dei serventi Samba in Risorse di Rete nei sistemi MS-Windows. È il primo dei due demoni ad avviarsi.
- smbclient: programma client a riga di comando quasi uguale a ftp (smbclient trasferisce solo in binary mode), dotato di diverse funzioni; tra le più importanti vi è quella di listare gli share messi in condivisione dai vari server Samba in una rete.
- smbmount & smbumount: utilizzati per montare/smontare filesystem condivisi.
- smbpasswd: strumento per la creazione utenti Samba. Un utente Samba dovrà essere anche un utente presente sulla macchina.
- testparm: strumento per la verifica del file
/etc/samba/smb.conf
.
- nmblookup: risolve i nomi host di un domain Samba (NetBIOS name) in indirizzi IP (es: nmblookup nomehost).
Installiamo poi alcuni tool utili, grafici e da linea di comando:
# apt-get install smbc tksmb xsmbrowser smbclient
Configurazione del server
Si compone di due fasi principali:
- Composizione del file
/etc/samba/smb.conf
. - Creazione degli utenti che avranno accesso alle risorse condivise tramie
smbpasswd
.
Il file smb.conf
E' sostanzialmente un elenco di sezioni sotto ognuna delle quali si definiscono uno o più parametri. Ci sono due tipi principali di sezioni:
- GLOBALE, dove semplicemente si definisco sia i parametri di "sistema" sia quelli comuni e/o più usati;
- RISORSA, dove sono definiti tutti quei parametri specifici e funzionali ad una certa risorsa (directory, lettore, stampante ecc.) che si vuole condividere o per abilitare specifiche funzionalità avanzate di samba.
In ogni file di configurazione andrà definita una sola sezione globale, mentre dovranno essere scritte tante sezioni risorse quante sono le risorse da condividere e/o funzionalità avanzate da abilitare. Il file smb.conf
avrà dunque un aspetto di questo tipo (al netto degli eventuali commenti):
[global] parametro1 = valore ... parametroN = valore [Condivisione1] parametro1 = valore ... parametroN = valore ... [CondivisioneM] parametro1 = valore ... parametroN = valore [Periferica1] parametro1 = valore ... parametroN = valore ... [PerifericaM] parametro1 = valore ... parametroN = valore [printers] parametro1 = valore ... parametroN = valore [Stampante1] parametro1 = valore ... parametroN = valore ... [StampanteM] parametro1 = valore ... parametroN = valore ecc.
Nota Data la moltitudine di parametri configurabili in questa guida ci si limiterà a trattarne solo una piccola parte. Per una panoramica completa si invita il lettore a fare riferimento alla pagina (man5) di Samba. |
In relazione ai parametri utilizzati in questa guida (spiegati nelle successive sezioni):
- GLOBALI, ovvero che possono essere inseriti nella sola sezione
global
workgroup
server string
netbios name
netbios aliases
include
security
guest account
map to guest
username map
printing
load printers
- GENERICI, ovvero che possono essere dichiarati in entrambi i tipi di sezioni; in linea generale se un parametro viene definito sia nella sezione
global
che in una specifica allora per quanto riguarda la suddetta risorsa sarà utilizzato come valore quanto dichiarato localmente.allow hosts
/hosts allow
guest ok
/public
guest only
/only guest
create mask
directory mask
browseable
/browsable
read only
writeable
/writable
- SPECIFICI, ovvero che possono essere inseriti nelle sole sezioni dedicate alle singole risorse
comment
path
printable
preexec
postexec
Parametri globali
[global] allow hosts = 192.168.1.0/24 workgroup = debianizzati server string = server@debianizzati.org security = user guest account = ospite map to guest = Bad User username map = /etc/samba/utenti.map netbios name = debianizzati netbios aliases = alias1 ... aliasN include = /etc/samba/smb.conf.%L
allow hosts
: range di IP ai quali è permesso l'accesso a tutte le risorse specificate nel seguito del file di configurazione; in questo caso vengono accettati tutti gli indirizzi compresi tra 192.168.1.1 e 192.168.1.254. Si noti che è possibile specificare più indirizzi e/o gruppi di indirizzi semplicemente separandoli con uno spazio, ad esempioallow hosts = 127.0.0.1 192.168.1.0/24
. Qualora l'utente non volesse rendere disponibile tutte le risorse agli stessi range di indirizzi allora il parametroallow hosts
non dovrebbe essere definito qui, ma in ciascuna delle sezioni dedicate alle singole risorse condivise. Il parametro è sostanzialmente additivo, ovvero il gruppo di indirizzi ammissibile per ogni risorsa è dato dalla somma di quelli specificati in questa sezione e da quelli definiti per la singola risorsa. Questo parametro è del tutto equivalente ahosts allow
.workgroup
: nome del gruppo di lavoro; non è un parametro critico, nel senso che anche se viene definito un nome differente da quello cui appartengono tutte le altre macchine della rete il risultato è che in windows il nome del server comparirà sotto un differente gruppo di lavoro.server string
: stringa che identifica il server.security
: definisce il "modo" con cui samba gestisce l'autenticazione degli utenti.- user: è il valore predefinito, implica che sia il nome delle risorse sia il loro contenuto risultano indisponibili all'utente fintanto che questi non si è autenticato con successo; deroga a questo principio il caso in cui l'utente venga automaticamente autenticato come ospite (si veda map to guest).
- share: è il valore storico, usato come predefinito nelle versioni di samba precedenti la terza; semplificando si può dire che gli utenti possono vedere le risorse, ma non accedervi, anche senza essersi autenticati con successo (quindi chiunque è in grado di vedere l'elenco delle risorse).
- domain e server: sono modalità specifiche per reti dove è configurato un dominio e non semplicemente un gruppo di lavoro.
guest account
: permette di definire l'utente da usare come utenza guest (il valore predefinito è nobody), in questo esempio l'utente ospite (che come ogni altro utente deve esistere sia in linux che in samba).map to guest
: questo parametro torna principalmente utile se si vuol creare una condivisione accessibile a chiunque tramite l'utenza guest (ovvero se si vuole permettere l'accesso ad una o più risorse senza che vengano richieste username e password) quando sia stato impostatosecurity = user
osecurity = domain
. Ci sono quattro valori possibili di questo parametro:- Never, valore di default, prevede che qualsiasi richiesta in cui username o password fornite siano errati venga respinta.
- Bad User, nel caso sia impostato
security = user
e lo username dell'utente in windows non coincida con alcun nome utente in linux allora l'utente viene automaticamente autenticato come guest, diversamente viene proposta la normale schermata di login. Si noti che un utente con nome windows coincidente con uno di quelli linux non può usare l'utenza guest, pertanto se l'utenza omonima sul server linux non è di sua proprietà egli non potrà autenticarsi presso il server, a meno di non creare per l'utente in questione una nuova utenza windows tale da non coincidere con alcuna utenza linux. Un utente automaticamente autenticato con un utenza guest può in ogni momento autenticarsi nuovamente con una differente utenza nel momento in cui accede ad una risorsa non pubblica, tuttavia una volta fatto ciò egli sarà visto dal server samba sempre con detta utenza, a meno di non disconnettersi e riconnettersi a windows. - Bad Password e Bad Uid, si veda il manuale.
username map
: indica un file testuale contenente la mappatura di uno più utenti, ovvero permette di trasformare un nome utente in un altro. Ogni riga di tale file (utenti.map nell'esempio) deve contenere il nome linux dell'utente seguito da un uguale e poi dal (o dai) nome windows dello stesso, ad esempio le righeroot = admin administrator
emario = "Mario Rossi"
mappano i nomi admin e administrator a root, mentre "Mario Rossi" a mario. La mappatura dei nomi può tornare ad esempio utile per impedire che uno o più utenti dotati di nome linux differente da quello windows possano accedere inizialmente come guest al server.netbios name
: stringa che sostituisce nella maggior parte dei casi (si veda il manuale) l'hostname della macchina (solo per quantoriguarda la visualizzazione da parte dei client).netbios aliases
: permette di identificare un server samba attraverso più nomi. Quest'opzione risulta particolarmente utile in congiunzione con il parametroinclude
.include
: permette di includere nel file di configurazionesmb.conf
un altro file di configurazione (e quindi le relative impostazioni). Nell'esempio riportato viene importato il file /etc/samba.smb.conf.alias, dove alias è uno degli alias definiti attraverso il parametronetbios aliases
(il carattere %L serve proprio a leggere l'imput dell'utente). Questo artificio è utile in quei casi dove può essere necessario caricare impostazioni parzialmente differenti a seconda del gruppo di utenti che accede al server, basta cioè che ciascuno di questi gruppi acceda al server sfruttando un diverso alias, ad esempio commerciale, amministrazione, tecnico, ecc.
Parametri generici
guest ok = no guest only = yes browseable = yes public = yes read only = yes create mask = 0750 directory mask = 0750
guest ok
: equivalente al parametropublic
definisce se una condivisione è accessibile o meno all'utenza guest, posto che questa sia abilitata (si veda la sezione dedicata alla creazione degli utenti). Attribuire no come valore a questo parametro nella sezione global è di norma inutile, visto che tale è proprio il suo valore predefinito, tuttavia ciò non è vero nel caso in cui il parametromap to guest
sia impostato su un valore diverso da never, come in questo esempio. Omettere di specificare no in questo caso comporterebbe l'impossibiiltà di accedere con utente diverso da guest a tutte quelle risorse per cui non è stato esplicitamente definitoguest ok = no
.guest only
: se impostato su yes restringe l'accesso alla risorsa alla sola utenza guest;browseable
, se impostato su yes rende visibile la condivisione nell'elenco delle risorse disponibili; dichiarare esplicitamente questo parametro con valore yes è utile solo qualora nella sezione global sia stato dichiatato esplicitamentebrowseable = no
, essendo yes il valore predefinito;public
, se impostato su yes rende la risorsa di libero accesso; è del tutto equivalente all'opzioneguest ok
;read only
, imposta la risorsa condivisa in sola lettura, è l'esatto opposto dell'opzionewriteable
, ovvero porreread only = yes
equivale awriteable = no
e viceversa; dichiarare esplicitamente questo parametro con valore yes è utile solo qualora nella sezione global sia stato dichiatato esplicitamenteread only = no
, essendo yes il valore predefinito.
IMPORTANTE I successivi due parametri NON devono essere dichiarati nelle sezioni dedicate alle stampanti. |
create mask
: definisce lo schema di permessi in stile UNIX che i file (e non delle cartelle) creati dai client windows avranno. Si noti che questo parametro non altera in alcun modo i permessi dei file eventualmente già presenti in una cartella condivisa oppure creati al di fuori di samba, per esempio da un utente che si è collegato tramite SSH;directory mask
: parametro identico acreate mask
, ma riguarda le cartelle invece dei file.
Parametri specifici
Essendo difficile una discussione unitaria si adotta un approccio caso per caso. Si noti dunque che inevitabilmente nei seguenti esempi potranno essere utilizzati anche parametri generici e non solo specifici.
Condivisione di una directory
Adesso sempre dentro il nostro /etc/samba/smb.conf
, creiamo la sezione specifica per la risorsa che vogliamo condividere. In questo esempio condivideremo una directory.
[shared] comment = Directory Shared path = /dir/da/condividere
comment
= commento per la directory;path
= percorso della directory condivisa;
Condivisione di una stampante
Adesso analizziamo i parametri da aggiungere al file /etc/samba/smb.conf
per poter condividere una stampante.
Aggiungiamo alla sezione global
:
[global] printing = [sistema di stampa utilizzato, es: cups, lprng..] load printers = yes
Creiamo inoltre la sezione printers
che fornirà i parametri di accesso alle nostre stampanti:
[printers] path = /var/spool/samba guest ok = yes printable = yes
ATTENZIONE Debian non crea in automatico la directory /var/spool/samba. |
Questa directory è adibita solo allo spool di stampa, volendo molti la sostituiscono con /tmp
. Se decidete di crearla voi, per un corretto funzionamento impostatele i permessi: nobody:nobody
con:
# chown nobody.nobody /var/spool/samba
# chmod -R 755 /var/spool/samba
Dopodiché scriviamo la sezione specifica per la nostra stampante (es. una canon).
[canon] comment = Canon Printer path = /var/spool/samba
Condivisione di dispositivi di lettura (CD-ROM, DVD..)
Poniamo come esempio di avere due pc e che solo uno dei due monti un lettore DVD. Bene, guardiamo come poter accedere ad un file, che risiedesse su un supporto DVD, dalla macchina sprovvista di lettore:
[dvd] comment = Lettore DVD-R preexec = mount /media/cdrom postexec = umount /media/cdrom path = /media/cdrom writable = no
Parametri supplementari al nostro /etc/samba/smb.conf
:
preexec
: permette di impostare un'azione che sarà eseguita una volta connessi alla risorsa;postexec
: in questo caso l'azione sarà eseguita quando la risorsa verrà sconnessa.
Nel momento in cui dal client monteremo la risorsa condivisa (con smbmount o smbclient) sul server sentiremo montare il DVD, il cui contenuto sarà a nostra disposizione per trasferire file o, in caso di file audio/video, anche di streaming.
Bene, a questo punto il file può considerarsi sufficientemente configurato per i nostri scopi.
Creazione utenti e Autenticazione
Per aggiungere o modificare la password di un utente:
# smbpasswd -a utente
Verrà richiesto di immettere due volte la password da attribuire al suddetto utente; fatto ciò in caso di nuovo utente comparirà il messaggio Added user utente
.
Per eliminare la password di un utente
# smbpasswd -n utente
Digitando invece # smbpasswd -an utente
si aggiunge un utente senza attribuirgli alcuna password.
Si noti che se il parametro security
è impostato sul valore user
allora il suddetto utente non potrà autenticarsi presso samba e quindi non avrà alcun accesso alle risorse. Nonrmalmente non si attribuisce password all'utenza da usare come guest, poiché per definizione viene usata per garantire l'accesso ad utenti anonimi.
Per eliminare un utente dall'elenco utenti di samba (con questo comando non si vanno a toccare gli utenti linux):
# smbpasswd -x utente
Nota Il file con l'elenco utenti e password di samba è di norma memorizzato in /var/lib/samba/passdb.tdb in forma criptata |
Il nome utente è la password definite con il precedente comando costituiscono le credenziali necessarie ad un utente per autenticarsi con successo presso il server samba nel momento in cui si connetteranno le risorse condivise (smbmount, smbclient in linux, finestrella di login in windows).
Si sottolinea che ciò è strettamente vero nel solo caso in cui sia impostato security = user
e map to guest = never
, poiché negli altri casi ciò potrebbe non essere vero; per esempio se è security = share
è possibile vedere tutte le risorse disponibili (e per cui non si sia definito browseable = no
) senza alcun bisogno di immettere alcun tipo di credenziali (queste vengono al limite richieste solo quando si richiede di accedere ad una specifica risorsa).
L'utenza guest ovvero le condivisione pubbliche
Il primo passo per rendere una risorsa pubblica, nel senso di accessibile a chiunque senza bisogno di credenziali, ma comunque sempre all'interno dell'intervallo di IP ammissibili definiti con allow hosts
, è come già scritto definire guest ok = yes
. Fatto ciò ci sono due strade per il secondo passo: la prima consiste nel definire security = share
, l'altra prevede di mantenere security = user
e imporre map to guest = Bad User
.
L'importante è che l'utente da usare come guest sia stato creato correttamente (che sia abilitato o meno è irrilevante); a tal proposito è possibile o usare l'utenza predefinita nobody
oppure usarne un'altra a sua scelta definendo nella sezione global
il parametro guest account = mio_utente
, dove mio_utente deve essere un utenza già esistente in linux.
Riavvio e test del server
Bene, riavviamo il server:
# /etc/init.d/samba restart Stopping Samba daemons: nmbd smbd. Starting Samba daemons: nmbd smbd. #
Adesso testiamo la validità del file /etc/samba/smb.conf
col comando:
# testparm /etc/samba/smb.conf Load smb config files from /etc/samba/smb.conf Processing section "[shared]" Processing section "[canon]" Processing section "[dvd]" Loaded services file OK. Server role: ROLE_STANDALONE Press enter to see a dump of your service definitions
Premendo enter vedremo il resoconto del nostro file.
Configurazione del client
Smbclient
Spostiamoci sul client:
# apt-get install smbfs smbclient
Come detto in precedenza, smbclient è un programma client ftp-like, utilizzato per l'accesso a un server Samba. Guardiamo i suoi principali flags e, una volta effettuato il login sul server, le sue principali funzioni.
Principali flags
(Usare smbclient --help
per uno screen completo):
smbclient -L hostname
: lista tutti gli share di un determinato host. Ad esempio, dal nostro client facciamo richiesta di listare gli share del server (come password digitiamo quella dell'user creato con smbpasswd o solo invio):
$ smbclient -L SERVER Password: **** Domain=[debianizzati] OS=[Unix] Server=[Samba 3.0.14a-Debian] Sharename Type Comment --------- ---- ------- shared Disk Directory Shared canon Disk Canon Printer dvd Disk Lettore DVD-R IPC$ IPC IPC Service (server@debianizzati.org) ADMIN$ IPC IPC Service (server@debianizzati.org) Domain=[debianizzati] OS=[Unix] Server=[Samba 3.0.14a-Debian] Server Comment --------- ------- SERVER server@debianizzati.org CLIENT server@debianizzati.org Workgroup Master --------- ------- debianizzati SERVER
Come si vede, nella colonna Sharename sono elencati i nomi degli share settati in /etc/samba/smb.conf
, quindi la nostra directory shared,la nostra stampante e il nostro lettore DVD (le sezioni [global]
e [printers]
non sono visibili poiché sono sezioni di parametri usate dal programma).
Nella colonna Server sono invece elencati gli host facenti parte del medesimo workgroup.
C'è poi la colonna Workgroup che visualizza l'host con ruolo di domain master browser nella subnet.
smbclient -U
: con questo flag possiamo specificare l'username e l'eventuale password per il login sulla macchina server;
smbclient -A
: sostanzialmente uguale a-U
ma possiamo dargli il path di un file dal quale attingere l'username e la password.
Accesso al server
$ smbclient //SERVER/shared Password: **** Domain=[SERVER] OS=[Unix] Server=[Samba 3.0.14a-Debian] smb: \>
Adesso siamo dentro al nostro server Samba il cui hostname è SERVER. Sostanzialmente il funzionamento di smbclient è il funzionamento di ftp, ma con in più degli utilissimi tools per il down/uploading dei file. Alcuni input uguali a quelli di una shell di bash sono: ls, cd, rm, rmdir, exit, coi quali ci sentiremo subito a casa nostra. Otteniamo comunque una lista di comandi utili digitando help.
Download di un file con get.
Poniamo come esempio che il contenuto della directory condivisa sia un insieme di file immagine con diverse estensioni e una directory con dentro qualsiasi cosa:
smb: \> ls . D 0 Tue Aug 23 23:57:51 2005 .. D 0 Wed Aug 17 03:05:20 2005 directory D 0 Wed Aug 24 12:21:43 2005 free_kevin.png 42604 Mon Aug 22 12:19:34 2005 pokemon.png 43404 Mon Aug 22 15:15:11 2005 dorothy_la_may.gif 46134 Mon Aug 21 21:16:00 2005
Scarichiamo il file free_kevin.png dalla macchina SERVER alla nostra macchina CLIENT, rinominandolo in kevin.png:
smb: \> get free_kevin.png kevin.png getting file \ free_kevin.png of size 42604 as kevin.png(1386.8 kb/s) (average 1386.8 kb/s)
Il file sarà salvato nella directory dalla quale ci siamo connessi al server. Qualora il file non venisse rinominato manterrebbe il proprio nome.
Alcune funzioni
lowercase
: abilita i file ad essere richiamati da get e mget utilizzando solo caratteri minuscoli. È utile viste le difficoltà spesso trovate negli share MSDOS (case insensitive).
es. di abilitazione dei parametri: smb: \> lowercase on smb: \> prompt on
prompt
: impostando prompt su on prima di ogni trasferimento ci verrà richiesta una conferma;showconnect
: mostra l' //host/nome_risorsa in uso:
smb: \> showconnect //SERVER/shared
stat nomefile
: stampa a video i permessi di un file e offre, in ordine temporale, info sugli accessi ad esso:
smb: \> stat free_kevin.png File: \free_kevin.png Size: 101 Blocks: 8 regular file Inode: 810 Links: 1 Access: (0644/-rw-r--r--) Uid: 1000 Gid: 1000 Access: 2005-08-24 00:10:39 +0200 Modify: 2005-08-24 00:10:51 +0200 Change: 2005-08-24 00:10:51 +0200
Mask, mget e recurse
Con il comando mget abilitiamo il download di tutti i file e directory in maniera ricorsiva. Tuttavia possiamo dare a tale comando un parametro (maschera) utilizzando mask . Es. nella nostra directory mettiamo di voler scaricare tutti i file con estensione .png:
smb: \> mask *png smb: \> mget
In questo modo mget intenderà scaricare tutti i files con tale estensione presenti nella directory corrente. Tuttavia con mget è possibile modificare la maschera on-fly digitando semplicemente:
smb: \> mget *png
In questo modo la funzione mask, manterrà il suo valore di default che è '*' (cioè tutto). La funzione recurse on attiva lo scanning & downloading (nel caso di una maschera) o il downloading, accedendo anche a tutte le directory presenti nella directory da cui parte il comando.
Smbmount & Smbumount
Con smbmount invece montiamo una risorsa in un mountpoint a nostra scelta. Montiamo la risorsa shared col comando:
$ smbmount //SERVER/shared /path/del/mountpoint
(come password digitiamo quella dell'user creato con smbpasswd o solo invio)
Così facendo potremmo accedere alla risorsa condivisa, raggiungendo il mountpoint:
$ cd /path/del/mountpoint $ ls directory free_kevin.png pokemon.png dorothy_la_may.gif
Esempi applicativi
Conclusioni
Samba è un software semplicemente straordinario. La sua anima, il file /etc/samba/smb.conf
è in perfetto stile Linux; cioè, lo stesso file, può divenire enorme e strutturatissimo oppure snello e semplicissimo, a seconda (e questo è il vero stile Linux) di quello che un utente vuole.
Autore: zmo Categora:Samba