Table of Contents

Samba e condivisione con MS-Windows

Installazione Samba 3

Durante l'installazione creato il file con le password di Samba: /var/lib/samba/passdb.tdb. Cioè si utilizza come backend per le password il trivial database invece del vecchio formato smbpasswd.

Questi i comandi per elencare il contenuto del database password in formato nativo oppure in un formato compatibile col vecchio file /etc/samba/smbpasswd. Nel terzo esempio viene selezionato un backend specifico, diverso da quello di default in uso dal demone Samba:

pdbedit -L
pdbedit -L -w
pdbedit -L -w -b smbpasswd:/backup/samba/smbpasswd

I backend riconosciuti sono smbpasswd, tdbsam, ldapsam, nisplussam e mysql, la sintassi è spiegata in smb.conf(5).

Join a dominio

Per far entrare una macchina Samba in un dominio Windows (da verificare):

# net ads join member -U Administrator
Administrator's password:
Joined 'SAMBA1' to realm 'DOMAIN.NET.'

Windows XP in un dominio Samba

Installare Windws XP. Durante l'installazione scegliere l'installazione a WORKGROUP, il join al dominio si effattua successivamente. Come nome host scegliere quello che sarà aggiunto a dominio, come nome di workgroup si può indicare quello del domino, ma lo si potrà anche modificare durante il join.

Con regedit cambiare la seguente chiave del registry da 1 a 0:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters]
"requiresignorseal"=dword:00000000

In alternativa al regedit si può passare da Pannello di Controllo:

La modifica al registry serve a far comportare XP come un 2000 (rispetto alla crittografia) e quindi renderlo comprensibile da Samba.

Fare il join al dominio

Se il controllore di dominio non si trova sulla LAN (raggiungibile in broadcast), bisogna appoggiarsi ad un server WINS eventualmente attivato sul PDC stesso. Il WINS client si attiva da:

Il profilo utente viene per forza sincronizzato sul server di dominio! Qualche chiave di registry per disattivare questa porcata?

Migrare da un server Samba ad un altro

Le entità da migrare sono:

Che cos'è il SID? All Windows network machines (servers and workstations), users, and groups are identified by their respective SID. All desktop profiles are also encoded with user and group SIDs that are specific to the SID of the domain to which the user belongs.

Che cos'è il RID? Each user and group also needs a SID, and this is made up of both the Doamin SID and a RID 'Relitive Identifier'. Ad esempio:

Domain SID S-1-5-21-4117985702-3860941512-23890400
User RID 1081
User SID S-1-5-21-4117985702-3860941512-23890400-1081

Scoprire il SID di dominio

Il SID di dominio corrisponde al SID di host del controllore di dominio (PDC).

Per scoprire il SID di host con un server Samba-2 in esecuzione si può usare:

# rpcclient <PDC_NAME> -U administrator
INFO: Debug class all level = 3   (pid 27528 from pid 27528)
Enter Password:
session setup ok
Domain=[ITFVMIL] OS=[Unix] Server=[Samba 2.2.3a-15 for Debian]
rpcclient $> lsaquery
domain ITFVMIL has sid S-1-5-21-408567135-360756301-4015389932

Con Samba 2.2.9 o successivo dovrebbe funzionare anche il comando smbpasswd -S. In alternativa in un domain controller Samba-2 ci dovrebbe essere il file /etc/samba/MACHINE.SID.

Su un domain controller Samba-3 invece dovrebbero funzionare questi comandi per vedere il SID di host e quello di dominio:

net GETLOCALSID
net GETLOCALSID <DOMAIN>

Scoprire il SID/RID di utente o di host nel dominio

Come interrogare il PDC per farsi dire il SID completo (SID di dominio + RID) di un utente oppure di un host (ricordarsi che il nome di host termina con il carattere “$”):

# rpcclient SRVMIL -U administrator
INFO: Debug class all level = 3   (pid 28175 from pid 28175)
Enter Password:
session setup ok
Domain=[ITFVMIL] OS=[Unix] Server=[Samba 2.2.3a-15 for Debian]
rpcclient $> lookupnames amarchi
amarchi S-1-5-21-408567135-360756301-4015389932-3004 (1)
rpcclient $> lookupnames wkmil38$
wkmil38$ S-1-5-21-408567135-360756301-4015389932-3326 (1)

Su un server Samba-2 il RID utente (e gruppo) viene generato a partire dallo UID Unix con questo calcolo:

User RID = (UID * 2) + 1000
Group RID = (UID * 2) + 1001

Anche su un server Samba-3 pare che valga il calcolo di cui sopra, ma forse si può modificare a piacimento il RID e memorizzarlo in secrets.tdb?

Cambiare il SID di host/dominio

Per cambiare SID di host in Samba-3:

net SETLOCALSID S-1-5-21-408567135-360756301-4015389932

Ma così non si cambia il SID di dominio, come fare? Funzionato questo metodo orribile:

Il MACHINE.SID pare che venga migrato automaticamente come host SID e domain SID in /var/lib/samba/secrets.tdb, probabilmente il file originale può essere successivamente eliminato.

In Samba-3 il SID del dominio, quello degli utenti e degli host viene memorizzato in /var/lib/samba/secrets.tdb. Per vedere il contenuto di un tdb (Trivial Database) si usa il comando tdbdump dal pacchetto Debian tdb-tools.

Profilo roaming e il RID degli utenti

In un dominio NT ogni utente ha un RID (relative identifier), il RID è utilizzato per impostare il controllo di accesso (ACL) sugli oggetti di sistema: file, ecc. Nei profili roaming salvati sul PDC (ntuser.dat) ci sono delle ACL che fanno riferimento ar RID, purtroppo il metodo con cui Samba genera il RID differisce tra Windows NT, Samba-2 e Samba-3. Quindi con la semplice copia si ottiene un profile non utilizzabile a causa di problemi con i permessi.

Copia delle password

Se è attiva l'opzione passdb backend = tdbsam allora le password sono contenute nel file /var/lib/samba/private/passdb.tdb (Samba 4.11), dovrebbe essere sufficiente copiare il file dal server vecchio a quello nuovo (dopo aver fermato il servizio).

Scadenza password

E' possibile impostare la validità massima delle password samba (ad esempio 6 mesi) con il comando:

pdbedit --account-policy="maximum password age" -C 15768000

La policy diventa effettiva per tutti gli utenti, si controlla lo stato della password di un utente con:

pdbedit -v -u username

Manipolare il database TDB

Con Samba 3 lo storage predefinito per le password etc. è il Trivial DataBase memorizzato in /var/lib/samba/secrets.tdb. È possibile manipolarne il contenuto con le utility fornite dal pacchetto tdb-tools. In particolare tdbtool fornisce una shell interattiva. Ecco una sessione in cui si apre il database, se ne elenca le chiavi contenute e se ne elimina una:

tdb> open /var/lib/samba/secrets.tdb
tdb> keys
key 16 bytes: SECRETS/SID/GRML
key 20 bytes: SECRETS/SID/INTRANET
key 67 bytes: SECRETS/LDAP_BIND_PW/cn=samba_servers,ou=People,dc=soluzioni,dc=per
tdb> delete SECRETS/SID/GRML
tdb> quit

Il contenuto completo del database può essere visualizzato con il comando tdbdump:

tdbdump /var/lib/samba/secrets.tdb

Problema con Windows 7 (smb => win)

Cercando di accedere con smbclient ad una condivisione di un PC Windows 7 oppure Windows 10 con login e password:

smbclient -L pc_win -U username%MySecret

si ottiene l'errore:

lp_load_ex: refreshing parameters
Initialising global parameters
params.c:pm_process() - Processing configuration file "/etc/samba/smb.conf"
Processing section "[global]"
added interface eth0 ip=10.0.0.100 bcast=10.0.0.255 netmask=255.255.255.0
Client started (version 3.4.2-47.fc12).
Connecting to 10.0.0.98 at port 445
Doing spnego session setup (blob length=336)
SPNEGO login failed: Invalid parameter
session setup failed: SUCCESS - 0

La spiegazione è nel bug 7577: una nuova funzionalità introdotta da Microsoft Live Sign-in Assistant causa un'incompatibilità con Samba.

Il problema dovrebbe essere risolto con samba 3.5.6 e successivi, in alternativa è necessario disinstallare la componente di Windows 7. Da Pannello di Controllo, Programmi e funzionalità la componente da rimuovere può chiamarsi Windows Live Essentials 2011 oppure Microsoft Live Sign-in Assistant.

Altra accortezza: l'accesso con utente senza password probabilmente fallisce perché viene interpretato da Windows 7 come accesso anonimo.

Testato con le seguenti versioni del client Samba:

Fedora 12 3.4.9 Non funziona
Fedora 14 3.5.5.68 Non funziona
Debian 7.6 3.5.6 Funziona
Fedora 14 3.5.11 Funziona
Debian 8 4.1.17 Funziona

Problema con Windows 10 (win => smb)

Pare che Windows 10 (Home, ma forse anche altre versioni) non tentino più l'accesso a condivisioni remote in modalità guest, cioè senza login e password. Cliccando su una risorsa remota si potrebbe ottenere l'errore:

\\server\share is not accessible. You might not have permission to use this network resource.
Contact the administrator of this server to find out if you have access permissions.

The account is not authorized to log in from this station. 

in Italiano:

\\server\share non è accessibile. Non si dispone delle autorizzazioni necessarie
per utilizzare questa risorsa di rete. Contattare l'amministratore del server
per scoprire se si dispone delle autorizzazioni di accesso.

L'account non è autorizzato per accedere da questa stazione. 

La soluzione è da Control Panel, User Accounts, Credential Manager aggiungendo una voce con il nome o l'indirzzo IP del server remoto, un login e una password (eventualmente anche guest/guest). Senza bisogno di riavviare.

Problema "Nome di dispositivo locale già in uso" (win => smb)

Problema con unità disco mappata su risorsa di rete (ad esempio lettera G: mappata su \\server\share) in modo permanente, al riavvio di Windows l'unità di rete risulta disconnessa e cliccando su di essa si ottiene l'errore:

Errore durante la riconnessione di G: a \\server\share
Microsoft Windows Network: Nome di dispositivo locale già in uso.
La connessione non è stata ripristinata.

in inglese:

An error occurred while reconnecting G: to \\server\share
Microsoft Windows Network: The local device name is already in use.
This connection has not been restored.

FIXME Non si riesce a trovare una soluzione. Una cosa strana: creando un batch che disconnette e riconnette l'unità di rete, il batch fallisce se viene eseguito poco dopo il logon (ad esempio in esecuzione automatica). Lo stesso batch invece funziona qualche minuto dopo il logon.

net use G: /delete
net use G: \\server\share

Problema smbclient con Windows a dominio (smb => win)

Se un PC Windows è unito a un dominio, le credenziali fornite per accedere ad una risorsa condivisa vengono fatte verificare al controllore del dominio stesso.

Ad esempio con il comando:

smbclient -U user%password -L '\\WORKSTATION'

il programma smbclient usa come nome di dominio ciò che è indicato dal parametro workgroup di /etc/samba/smb.conf e quindi la WORKSTATION chiede al controllore del dominio di autenticare l'utente user con la password fornita.

Se si utilizzano le credenziali di un utente locale della WORKSTATION (che non esiste a livello di dominio), il comando fallisce con:

session setup failed: NT_STATUS_LOGON_FAILURE

Per risolvere il problema si può indicare esplicitamente sulla riga di comando smbclient sia il nome del dominio che l'ambito di esistenza dell'utente; quello che fa effettivamente la differenza è l'ambito LOCAL/ aggiunto all'utente:

smbclient -W WORKGROUP -U LOCAL/user%password -L '\\WORKSTATION'

Lettura/esecuzione di un file PDF in cartella Samba

Con i filesyste moderni anche Windows ha l'attributo Lettura ed esecuzione per i file. Se questo attributo è impostato su un file PDF è possibile “eseguirlo” da riga di comando, cioè in generale viene avviato il visualizzatore di PDF con tale documento aperto.

Se il file è esportato da Samba 4.5 dovrebbe bastare dare l'attributo di eseguibilità Unix in maniera opportuna (es. a tutti).

Per forzare l'attributo di eseguibilità a prescindere dagli effettivi attributi Unix è possibile mettere questa direttiva nello share Samba:

[tmp]
    comment = Temporary file space
    path = /tmp
    acl allow execute always = yes
    ...

In questo caso l'attributo di eseguibilità comunque NON risulta da Windows (file, click destro ⇒ ProprietàSicurezza), ma una eventuale richiesta di esecuzione viene consentita.

Problema con scanner Brother MFC-L5750DW

Avendo configurato la scansione su Network (si intende cartella condivisa Windows) con login e password, durante il test si ottiene l'errore:

ECODE: 0x28242446, -28, STATUS_ACCESS_DENIED

Nel file di log Samba si legge:

Bad SMB2 signature for message

Selezionare il protocollo NTLMv2 sullo scanner non risolve il problema, mentre è risolutivo cambiare protocollo lato Samba con la direttiva:

server max protocol = NT1

Le versioni più recenti di protocollo implementate in Samba (SMB2_10 e SMB3_00) invece non sono compatibili.

Samba 3 e Condivisione Windows 10

Ci sono problemi ad accedere ad uno share Windows 10 se il client GNU/Linux è troppo vecchio (es. Debian 6 Squeeze con Samba 3.5). Con i nuovi aggiornamenti di Windows 10 (a partire dalla versione 1709) non è più disponibile il server SMBv1, vengono supportati in maniera predefinita solo protocolli successivi.

Utilizzando il vecchio protocollo si ottiene l'errore:

smbclient -U guest%guest -m NT1 '\\WIN10DESKTOP\Share'
protocol negotiation failed: NT_STATUS_CONNECTION_RESET

Purtroppo i nuovi protocolli non sono supportati con vecchie versioni di Samba:

smbclient -U guest%guest -m SMB2 '\\WIN10DESKTOP\Share'
Unrecognised protocol level SMB2

La situazione è chiarita dal post Microsoft: SMBv1 is not installed by default in Windows 10 Fall Creators Update and Windows Server, version 1709.

Dal post How to Roll Back Builds and Uninstall Updates on Windows 10 si capisce che disinstallare l'aggiornamento di Windows non è soluzione praticabile.

Per fortuna è ancora possibile abilitare il server SMB 1.0, basta accedere all'impostazione relativa da Pannello di Controllo:

È necessario un reboot (e forse condividere nuovamente la cartella) per ottenere il risultato.

NOTA1: Gli aggiornamenti di Windows possono essere rimossi entro un mese dalla loro applicazione (Windows-I, Aggiornamento e sicurezza), poi i file necessari vengono cancellati.

NOTA2: Dopo l'aggiornamento di sistema, il protocollo SMBv1 viene disattivato se non viene usato per 15 giorni.

Come verificare la versione e il build di Windows:

Gestione Avanzata del Dominio con Samba 4

In un dominio Windows esistono dei gruppi predefiniti che hanno ruoli ben specifici:

Domain Admins I membri di questo gruppo dispongono del controllo completo di tutti i controller di dominio.
Domain Users Questo gruppo contiene tutti gli utenti del dominio. Anche se un utente non appartiene a questo gruppo (per la parte Unix), Samba ne forza l'appartenenza nella rappresentazione Windows.
Domain Guests Nessun diritto utente predefinito.

Lato Samba/Unix si definiscono dei gruppi Unix e si mappano i gruppi Windows su quelli Unix:

addgroup --system domadmin
addgroup --system domuser
addgroup --system domguest

net groupmap add ntgroup="Domain Admins" unixgroup=domadmin rid=512 type=domain
net groupmap add ntgroup="Domain Users"  unixgroup=domuser rid=1023 type=domain
net groupmap add ntgroup="Domain Guests" unixgroup=domguest rid=1024 type=domain

Il gruppo Domain Admins è speciale e deve avere RID = 512.

Per vedere i gruppi definiti:

net groupmap list
Domain Guests (S-1-5-21-4236855997-251099150-3575921365-1024) -> domguest
Domain Admins (S-1-5-21-4236855997-251099150-3575921365-512) -> domadmin
Domain Users (S-1-5-21-4236855997-251099150-3575921365-1023) -> domuser

Verificare che il SID corrisponda a quello del dominio:

net getlocalsid
SID for domain DOMAINNAME is: S-1-5-21-4236855997-251099150-3575921365

Gruppi e utenti si gestiscono con i tool Unix, ma si può verificare l'appartenenza di un utente ai gruppi Windows (cioè il mapping di Samba) con:

net user INFO john -U Administrator%password
None
Domain Admins
Domain Users
Domain Guests

Si può chiedere l'elenco dei permessi assegnabili:

net rpc rights list -U Administrator%password

e assegnare, vedere e revocare un privilegio ad un utente:

net rpc rights grant simone SeBackupPrivilege -U Administrator%password
net rpc rights list simone -U Administrator%password
net rpc rights revoke simone SeBackupPrivilege -U Administrator%password

passdb backend tdbsam

Quando si utilizza come database degli utenti il tdbsam (opzione passdb backend di /etc/samba/smb.conf), è possibile specificare diversi campi per ogni utente, ad esempio il Full Name, che è indipendente dal campo gecos estratto da /etc/passwd in Unix.

Per vedere tutti gli utenti e tutti i loro attributi si usa:

pdbedit -Lv

Ecco ad esempio come modificare un attributo:

pdbedit --fullname="Niccolo Rigacci" -u niccolo

Accesso ad uno share Windows 7 smbclient

After a Windows 7 update (which upgraded the operating system to Windows 7 Professional 7601 Service Pack 1) a connection from a GNU/Linux host via smbclient stopped working:

smbclient -L pcwindows7 -U username%password
session setup failed: NT_STATUS_INVALID_HANDLE

asking for debug on the smbclient command line showed the usual, useless data:

SPNEGO login failed: Invalid handle

The Event Viewer on the sharing host were showing the expected Logon Type 3 (Network), but the event were immediately followed by a disconnect event.

It turned out theat the user had the Administrator's privileges, removing that and making it a regular user, fixed the problem.

Analisi Log Samba

Ecco alcuni esempi di log (ripuliti da informazioni non strettamente necessarie come timestamp, riferimento alla funzione sorgente, ecc.):

Join a dominio di un host

_samr_create_user:
    Running the command
    `/usr/sbin/useradd -g machines -c "Machine account" -d /var/lib/samba -s /bin/false myhost$'
    gave 0
Forcing Primary Group to 'Domain Users' for MYHOST$
api_rpcTNP: rpc command: SAMR_QUERYUSERINFO
User:[MYHOST$]
api_rpcTNP: rpc command: SAMR_GETUSERPWINFO
api_rpcTNP: rpc command: SAMR_SETUSERINFO2
Forcing Primary Group to 'Domain Users' for MYHOST$

Logon

check_ntlm_password:  Checking password for unmapped user
                      [MYDOMAIN]\[myuser]@[MYHOST] with the new password interface
check_ntlm_password:  mapped user is: [MYDOMAIN]\[myuser]@[MYHOST]
Forcing Primary Group to 'Domain Users' for myuser
check_ntlm_password: sam authentication for user [myuser] succeeded
check_ntlm_password:  authentication for user [myuser] -> [myuser] -> [myuser] succeeded
Forcing Primary Group to 'Domain Users' for myuser

Logon fallito

È stato usato un account macchina al posto di un account utente:

check_ntlm_password:  Checking password for unmapped user
                      [MYDOMAIN]\[MYHOST$]@[MYHOST] with the new password interface
check_ntlm_password:  mapped user is: [MYDOMAIN]\[nobody]@[MYHOST]
check_sam_security: Couldn't find user 'nobody' in passdb.
check_ntlm_password:  Authentication for user [MYHOST$] -> [nobody] FAILED with
                      error NT_STATUS_NO_SUCH_USER, authoritative=1