Quando si tratta di selezionare un protocollo per condividere file sulla rete, è comune incontrare i termini SMB e CIFS nelle interfacce software e nella documentazione. Alcuni utenti pensano che SMB e CIFS siano la stessa cosa, e identificare chiaramente la differenza potrebbe essere difficile. Tuttavia, vediamo perché CIFS non può essere usato come sinonimo di SMB. Scopri le differenze tra i protocolli SMB e CIFS e come utilizzare i termini.
Cosa è SMB?
SMB, o Server Message Block, è un protocollo di rete che lavora allo strato applicativo del modello di comunicazione OSI. SMB è utilizzato per fornire accesso condiviso alle risorse sulla rete. Il protocollo SMB è ampiamente utilizzato per condividere file su server di file, condividere file tra computer utente e copiare file tra computer.
Oltre alla manipolazione dei file, l’altro caso d’uso per SMB è la messaggistica e la stampa (transazioni remote a scopo generale), così come la navigazione tra i computer nella rete. IBM ha sviluppato SMB nel 1983, e da allora il protocollo è stato migliorato più volte.
Cosa è la condivisione file SMB?
Le condivisioni file SMB sono directory su un host remoto rese disponibili tramite il protocollo SMB. Sono configurate sui server di file e l’accesso in lettura e scrittura può essere configurato su queste condivisioni. Un server di file può avere più condivisioni SMB.
Come funziona SMB: cosa fa SMB?
SMB funziona sulla base del principio di rete client-server. Il protocollo utilizza un insieme di pacchetti di dati contenenti una richiesta inviata da un client o una risposta inviata da un server. I client possono connettersi a un server utilizzando un indirizzo IP o un nome host. Questi pacchetti di dati SMB possono essere classificati come:
- Pacchetti di controllo della sessione, che stabiliscono/interrompono le connessioni ai file condivisi
- Pacchetti di accesso ai file, che, come suggerisce il nome, accedono ai file condivisi e manipolano i file
- Pacchetti di messaggi generali
SMB apre una sessione dopo aver stabilito una connessione e completato l’autenticazione. Quindi i messaggi SMB possono essere trasmessi attraverso questa sessione. Quando si avvia una sessione, un client SMB invia un elenco delle sue capacità (le capacità dipendono dalla versione SMB del client).
Il protocollo SMB può funzionare:
- direttamente via TCP utilizzando la porta 445 (senza NetBIOS) – questo è l’approccio moderno.
- tramite l’API NetBIOS utilizzando le porte UDP 137 e 138 e le porte TCP 137 e 139 – questo è l’approccio legacy utilizzato fino a Windows 2000. Le prime versioni di SMB utilizzavano NetBIOS su TCP/IP per il trasporto.
Il protocollo SMB supporta il batching, cioè il raggruppamento di più messaggi e l’invio in una sola trasmissione per migliorare le prestazioni.
Le funzionalità aggiuntive includono meccanismi di blocco file per proteggere i file condivisi quando più utenti aprono lo stesso file. Il blocco dei file consente di evitare che i dati vengano scritti da più utenti contemporaneamente e causino inconsistenza dei dati in un file.
L’IPC (inter-process connection) è anche conosciuto come connessione a sessione nulla. La condivisione IPC$ creata da Windows viene utilizzata con connessioni temporanee tra client e server. Questa condivisione nascosta viene creata per condividere dati che non possono essere classificati come file/directory e stampanti, ad esempio, utenti e enumerazione delle condivisioni.
I sistemi Windows contengono un client e un server SMB nativi. Tuttavia, le versioni client di Windows hanno un limite sul numero di utenti che possono connettersi a un host, a differenza delle versioni Server di Windows, che non hanno tali limitazioni.
- Windows XP e Vista – massimo 10 connessioni simultanee
- Windows 7 e Windows 10 – massimo 20 connessioni simultanee
Un server SMB su Linux viene installato configurando Samba, che è un’implementazione gratuita di un server SMB per Linux. Si noti che Samba consente anche di unire Linux a un dominio Active Directory e consente a Linux di agire come controller di dominio. Il software client SMB è disponibile anche su Linux (gratuitamente) e su altri sistemi operativi.
Cosa è CIFS?
CIFS, o Common Internet File System, è un’implementazione o dialetto particolare di SMB sviluppato da Microsoft nel 1996 a seguito del rilascio di Windows 95. Un dialetto è una versione e non un protocollo indipendente separato. Un dialetto è un insieme di pacchetti di messaggi inviati/ricevuti per comunicare tra host che definisce una particolare versione del protocollo. CIFS non è un sistema di file, a differenza di quanto suggerisce il nome.
La specifica del protocollo CIFS si basa sul protocollo SMB originale ma con alcune funzionalità aggiuntive aggiunte da Microsoft. Microsoft ha implementato connessioni dirette tramite TCP e porta 445 senza utilizzare NetBIOS su TCP (che era utilizzato nelle prime implementazioni SMB 1). CIFS è un’implementazione di SMB 1 e non un protocollo di condivisione file separato.
Dialetti del Protocollo SMB
Parlando dell’implementazione Microsoft di SMB1, possiamo usare il termine CIFS. In tutti gli altri casi e in generale, SMB è il termine corretto da usare per indicare questo protocollo di rete. Vediamo più da vicino le versioni di SMB rilasciate dopo CIFS per capirne le differenze rispetto ai dialetti (versioni) più recenti.
SMB 2.0
Microsoft ha rilasciato SMB 2.0 (o SMB2) nel 2006 con Windows Vista. Questa versione di SMB è più affidabile di SMB 1.0/CIFS e non è CIFS. Il numero di comandi necessari per trasferire i file è stato ridotto da oltre 100 a 20. Le prestazioni sono migliori grazie ai meccanismi di elaborazione in pipeline, cioè la capacità di inviare una richiesta aggiuntiva prima di ricevere la risposta alla precedente.
SMB 2.1
SMB 2.1 presenta miglioramenti insignificanti in termini di prestazioni e meccanismi di blocco rispetto a SMB 2.0. Questa versione di protocollo è stata rilasciata con Windows 7 e Windows Server 2008 R2.
SMB 3.0
Initially questa versione di protocollo fu chiamata SMB 2.2, ma fu poi rinominata SMB 3.0 con Windows 8. SMB 3.0:
- ha aggiunto SMB Direct (accesso diretto alla memoria), SMB Multichannel e SMB Transport Failover
- ha migliorato la sicurezza
- ha aggiunto il supporto per la crittografia end-to-end
- ha migliorato l’efficienza di rete riducendo la latenza
SMB 3.0.2
SMB 3.0.2 o 3.02 è disponibile da Windows 8.1 e Windows Server 2012 R2. In questa versione, la compatibilità con SMB 1.0 può essere disattivata per migliorare la sicurezza.
SMB 3.1.1
Questa versione è disponibile a partire da Windows 10 e Windows Server 2016. Le migliorie includono una migliore crittografia (AES 128 GCM e AES 128 CCM) e hash SHA-512 per controlli di integrità pre-autenticazione.
SMB in Windows e Microsoft Server
SMB è disponibile in Windows a partire da Windows 3.1 (Windows for Workgroups). Le versioni di SMB e la compatibilità per diverse versioni di Windows sono spiegate nella tabella.
Le colonne e le righe contengono le versioni di Windows che possono eseguire un client SMB o un server SMB (le colonne e le righe sono intercambiabili). Una cella all’intersezione di una colonna e di una riga mostra quale versione del protocollo SMB viene utilizzata per la comunicazione tra le rispettive versioni di Windows.
Windows 10
Server 2016 e successivi |
Windows 8.1
Server 2012 R2 |
Windows 8
Server 2012 |
Windows 7
Server 2008 R2 |
Windows Vista
Server 2008 |
Win XP, Server 2003 e versioni precedenti | |
Windows 10
Server 2016 e successivi |
SMB 3.1.1 | SMB 3.02 | SMB 3.0 | SMB 2.1 | SMB 2.0 | SMB 1.0 |
Windows 8.1
Server 2012 R2 |
SMB 3.02 | SMB 3.02 | SMB 3.0 | SMB 2.1 | SMB 2.0 | SMB 1.0 |
Windows 8
Server 2012 |
SMB 3.0 | SMB 3.0 | SMB 3.0 | SMB 2.1 | SMB 2.0 | SMB 1.0 |
Windows 7
Server 2008 R2 |
SMB 2.1 | SMB 2.1 | SMB 2.1 | SMB 2.1 | SMB 2.0 | SMB 1.0 |
Windows Vista
Server 2008 |
SMB 2.0 | SMB 2.0 | SMB 2.0 | SMB 2.0 | SMB 2.0 | SMB 1.0 |
Win XP, Server 2003 e versioni precedenti | SMB 1.0 | SMB 1.0 | SMB 1.0 | SMB 1.0 | SMB 1.0 | SMB 1.0 |
CIFS contro SMB: la probabile fonte della confusione
Scopriamo insieme l’esempio per capire perché i termini CIFS e SMB sono ancora confusi dagli utenti. Supponiamo, per esempio, di utilizzare un file server con una condivisione SMB configurata su Windows Server 2019 e un computer Linux che connette a questo file server tramite il protocollo SMB. In questo esempio usiamo Ubuntu 20.04 come distribuzione Linux. Notare che la configurazione è la stessa per Ubuntu 22.
In nostri ambienti abbiamo la seguente configurazione:
- Windows Server 2019: 192.168.101.209
- Linux Ubuntu 20.04: 192.168.101.210
- Condivisione SMB su Windows Server: \\192.168.101.209\share
In Windows Server 2019, il protocollo SMB 1.0/CIFS è disabilitato per default. Per controllare questa impostazione e abilitare/disabilitare manualmente il client e il server SMB1.0/CIFS, andate a Server Manager > Aggiungi ruoli e funzionalità > Funzionalità.
Conserviamo disattivato SMB 1.0/CIFS su nostro macchina Windows Server 2019. Questo significa che SMB 3 è utilizzato per default con la possibilità di passare a SMB 2 per la compatibilità con client che utilizzano versioni (dialetti) di SMB 2.
Il protocollo CIFS è disattivato per default In versioni moderne di Windows come Windows 10 per maggiori garanzie di sicurezza, e puoi abilitarlo manualmente se necessario.
Nota: Nel 2017, attacchi ransomware a livello mondiale (WannaCry e NotPetya) sono stati condotti utilizzando esploits per vulnerabilità di SMB 1. Questi esploits erano conosciuti come EternalBlue, EternalRomance e EternalChampion. Microsoft ha rilasciato aggiornamenti di sicurezza per i suoi sistemi operativi a partire da Windows XP e Windows Server 2003, nonostante il fatto che questi OS non fossero una versione supportata ufficialmente all’epoca. Microsoft ha raccomandato l’uso di SMB 2 e SMB 3 (che supportano l’integrità pre-autenticazione) invece di utilizzare SMB 1.0/CIFS.
Come menzionato sopra, il nome del server SMB per Linux è Samba (samba è il nome del pacchetto). Noi usiamo un server SMB su Windows. Quindi non abbiamo bisogno di Samba in questo esempio, ma abbiamo bisogno invece di un client SMB per Ubuntu Linux.
Un client SMB per Linux è incluso in Linux CIFS Utils (cifs-utils è il nome del pacchetto). Da qui nasce la confusione. La prima versione di questo client per Linux è stata creata in un periodo in cui SMB 1.0/CIFS era ampiamente utilizzato. Il protocollo SMB è stato aggiornato, sono state rilasciate le versioni SMB 2 e 3, ma il nome del client SMB per Linux rimane lo stesso e il pacchetto che include il client SMB è ancora chiamato CIFS Utils. Il pacchetto cifs-utils non fa parte di samba.
Ci connetteremo da Linux utilizzando CIFS Utils a una condivisione SMB situata su Windows Server 2019 per scoprire se CIFS è ancora utilizzato. Per installare CIFS Utils, eseguire il seguente comando con privilegi di root:
sudo apt-get install cifs-utils
Creare una directory da utilizzare come punto di mount per la condivisione SMB:
mkdir /mnt/share
Connettersi alla condivisione file SMB situata su un server file Windows remoto:
mount.cifs //192.168.101.209/share /mnt/share -o user=administrator
Utilizziamo un account utente amministratore di Windows nel nostro esempio a scopo educativo.
CIFS vs SMB – quale viene utilizzato nella sessione corrente per connettersi al server file? Verificare la versione SMB dei client connessi alla condivisione SMB su Windows Server con il comando PowerShell su Windows Server 2019:
Get-SmbSession | Select-Object -Property ClientComputerName,ClientUserName,Dialect
Come vediamo nell’output di PowerShell, per la nostra connessione da Ubuntu Linux viene utilizzato SMB 3.1.1. SMB 1.0/CIFS non è utilizzato quando ci connettemoso cifs-utils e il comando mount.cifs a un file server configurato su Windows Server 2019.
Possiamo anche verificare la versione del protocollo SMB in /proc/mounts utilizzando il comando cat /proc/mounts in Linux. Possiamo usare il seguente comando per filtrare solo i risultati necessari:
cat /proc/mounts | grep cifs
Come vediamo nell’output, la versione del protocollo per la connessione alla condivisione file è indicata come cifs, ma la versione visualizzata è 3.1.1 (vers=3.1.1), che non è una versione di CIFS. Questo è un altro esempio che mostra come i termini SMB vs CIFS possono essere confusi.
In realtà, SMB 3.1.1 è utilizzato e non CIFS. possiamo provarlo con un’altra metodologia utilizzando nmap, che è uno strumento gratuito per la scoperta di rete utilizzato per l’analisi e la risoluzione dei problemi.
Per installare nmap in Ubuntu, eseguire il comando come amministratore:
sudo apt-get install nmap
Per scansionere tutti gli host online e connessi alla nostra rete 192.168.101.0/24, usiamo il comando:
nmap --script smb-protocols 192.168.101.0/24
Siamo interessati a visualizzare il risultato per 192.168.101.209, che è l’indirizzo IP del nostro Windows Server 2019 che funziona come server di file. Linux è connesso alla condivisione di file su questo server. Nell’output, vediamo che i dialetti per i protocolli SMB supportati dal nostro Windows Server sono 2.02, 2.10, 3.00, 3.02 e 3.11. Non c’è SMB 1.0/CIFS, anche se il termine CIFS è ancora utilizzato nei file di configurazione e nei comandi Linux.
Possiamo forzare l’uso di CIFS manualmente aggiungendo il parametro vers=1.0 nel comando mount in Linux (lato client) per utilizzare solo il protocollo SMB 1.0/CIFS quando ci si connette a una condivisione di file su un server remoto.
mount -t cifs //192.168.101.209/share /mnt/share -o user=administrator,vers=1.0
o
mount.cifs //192.168.101.209/share /mnt/share -o user=administrator,vers=1.0
Il risultato è il seguente:
Il server ha chiuso bruscamente la connessione. Questo può accadere se il server non supporta la versione SMB che stai cercando di utilizzare. La versione SMB predefinita è stata recentemente cambiata da SMB1 a SMB2.1 e superiore.
Questo risultato corrisponde ai risultati precedenti della nostra indagine SMB vs CIFS nei moderni sistemi operativi. CIFS non è utilizzato e SMB 1.0/CIFS è disabilitato sul nostro Windows Server.
Se lo impostiamo per utilizzare almeno SMB 2.0, allora possiamo connetterci al server (ricorda l’elenco dei dialetti SMB supportati dal nostro Windows Server 2019 visualizzato in nmap):
mount.cifs //192.168.101.209/share /mnt/share -o user=administrator,vers=2.0
Quando si utilizza la interfaccia grafica in Linux o altri sistemi operativi, usare smb:// nella riga dell’indirizzo quando si definisce il protocollo di rete da usare per connettersi a un file share su un server remoto.
Quando si immette l’indirizzo di un file share SMB, si dovrebbe usare:
smb://server-name/share-name
Non usare:
cifs://server-name/share-name
perché il client proverrà a connettersi utilizzando il protocollo SMB1.0/CIFS, che potrebbe essere disabilitato sul server (se il client supporta anche la sintassi cifs://).
Conclusione
Ora che il protocollo CIFS è obsoleto, SMB è uno dei protocolli utilizzati per connettersi a risorse condivise su server file e NAS (l’altro protocollo comunemente usato è NFS). Con le risorse condivise particolarmente vulnerabili alla corruzione dati, al ransomware e ad altre minacce in grado di diffondersi facilmente attraverso una rete, assicurarsi di fare backup di file e cartelle memorizzati su risorse condivise per evitare perdite di dati. Inferendo il computer di un utente con i permessi di scrittura sui file condivisi può causare la perdita di dati per tutti gli utenti.
NAKIVO Backup & Replication è una soluzione di protezione dati che supporta i backup incrementali attraverso SMB e NFS di dati residenti su NAS e server file Windows/Linux.