Protokoły udziału plików CIFS i SMB: wyjaśnienie różnic
Wybierając protokół do udostępniania plików w sieci, w interfejsach oprogramowania i dokumentacji często spotyka się terminy SMB i CIFS. Niektórzy użytkownicy uważają, że SMB i CIFS to to samo, a jednoznaczne określenie różnicy między nimi może być trudne. Przyjrzyjmy się jednak, dlaczego CIFS nie może być traktowany jako synonim SMB. Dowiedz się, czym różnią się protokoły SMB i CIFS oraz jak prawidłowo używać tych terminów.
Czym jest SMB?
SMB (Server Message Block) to protokół sieciowy działający w warstwie aplikacji modelu komunikacyjnego OSI. SMB służy do zapewniania współdzielonego dostępu do zasobów w sieci. Protokół SMB jest szeroko stosowany do udzielenia udziału plików na serwerach plików, wymiany plików między komputerami użytkowników oraz kopiowania plików między komputerami.
Oprócz obsługi plików, inne przypadki użycia SMB obejmują przesyłanie wiadomości i drukowanie (transakcje zdalne ogólnego przeznaczenia), a także przeglądanie komputerów w sieci. Firma IBM opracowała SMB w 1983 roku i od tego czasu protokół był wielokrotnie ulepszany.
Czym jest udział plików SMB?
Udostępniane udziały plików SMB to katalogi na zdalnym hoście, które są udostępniane za pośrednictwem protokołu SMB. Są one konfigurowane na serwerach plików, a dostęp do odczytu i zapisu można skonfigurować dla tych udziałów. Jeden serwer plików może mieć wiele udziałów plików SMB.
Jak działa SMB: Czym zajmuje się SMB?
SMB działa w oparciu o zasadę sieci klient-serwer. Protokół wykorzystuje zestaw pakietów danych zawierających żądanie wysłane przez klienta lub odpowiedź wysłaną przez serwer. Klienci mogą łączyć się z serwerem, używając adresu IP lub nazwy hosta. Te pakiety danych SMB można sklasyfikować jako:
- Pakiety kontroli sesji, które nawiązują/zamyka połączenia z udziałami plików
- Pakiety dostępu do plików, które, jak sugeruje nazwa, uzyskują dostęp do udziałów plików i manipulują plikami
- Ogólne pakiety komunikatów
SMB otwiera sesję po nawiązaniu połączenia i zakończeniu uwierzytelniania. Następnie komunikaty SMB mogą być przesyłane w ramach tej sesji. Podczas inicjowania sesji klient SMB wysyła listę swoich możliwości (możliwości zależą od wersji SMB klienta).
Protokół SMB może działać:
- bezpośrednio przez TCP przy użyciu portu 445 (bez NetBIOS) – jest to podejście nowoczesne.
- przez API NetBIOS przy użyciu portów UDP 137 i 138 oraz portów TCP 137 i 139 – jest to podejście starszego typu stosowane do systemu Windows 2000. Pierwsze wersje SMB wykorzystywały NetBIOS przez TCP/IP do transportu.
Protokół SMB obsługuje przetwarzanie wsadowe, czyli grupowanie wielu komunikatów i wysyłanie ich w jednej transmisji w celu poprawy wydajności.
Dodatkowa funkcja obejmuje mechanizmy blokowania plików w celu ochrony plików współdzielonych, gdy wielu użytkowników otwiera ten sam plik. Blokowanie plików pozwala uniknąć jednoczesnego zapisu danych przez wielu użytkowników i spowodowania niespójności danych w pliku. IPC (połączenie międzyprocesowe) znane jest również jako połączenie typu „null session”. Udostępniony katalog IPC$ utworzony przez system Windows służy do nawiązywania tymczasowych połączeń między klientami a serwerami. Ten ukryty katalog udostępniony został stworzony w celu udostępniania danych, których nie można zaklasyfikować jako pliki/katalogi ani drukarki, na przykład informacji o użytkownikach oraz wykazów udostępnionych zasobów.
Systemy Windows zawierają natywnego klienta i serwer SMB. Jednak wersje klienckie systemu Windows mają ograniczenie liczby użytkowników, którzy mogą połączyć się z hostem, w przeciwieństwie do wersji Windows Server, które nie mają takich ograniczeń.
- Windows XP i Vista – maksymalnie 10 jednoczesnych połączeń
- Windows 7 i Windows 10 – maksymalnie 20 jednoczesnych połączeń
Serwer SMB w systemie Linux instaluje się poprzez konfigurację Samby, która jest darmową implementacją serwera SMB dla systemu Linux. Należy pamiętać, że Samba umożliwia również dołączenie systemu Linux do domeny Active Directory oraz pozwala systemowi Linux pełnić rolę kontrolera domeny. Oprogramowanie klienckie SMB jest również dostępne w systemie Linux (bezpłatnie) oraz w innych systemach operacyjnych.
Czym jest CIFS?
CIFS, czyli Common Internet File System, to konkretna implementacja lub dialekt protokołu SMB opracowany przez firmę Microsoft w 1996 roku po wydaniu systemu Windows 95. Dialekt jest wersją, a nie odrębnym, niezależnym protokołem. Dialekt to zestaw pakietów komunikatów wysyłanych/odbieranych w celu komunikacji między hostami, który definiuje konkretną wersję protokołu. W przeciwieństwie do tego, co sugeruje nazwa, CIFS nie jest systemem plików.
Specyfikacja protokołu CIFS opiera się na oryginalnym protokole SMB, ale zawiera dodatkowe funkcje dodane przez firmę Microsoft. Firma Microsoft zaimplementowała połączenia bezpośrednie przez TCP i port 445 bez użycia NetBIOS over TCP (który był używany w pierwszych implementacjach SMB 1). CIFS jest implementacją SMB 1, a nie oddzielnym protokołem udostępniania plików.
Dialekty protokołu SMB
Kiedy mówimy o implementacji SMB1 przez Microsoft, możemy używać terminu CIFS. We wszystkich innych przypadkach, i ogólnie rzecz biorąc, SMB jest poprawnym terminem odnoszącym się do tego protokołu sieciowego. Przyjrzyjmy się bliżej wydaniom wersji SMB po CIFS, aby lepiej zrozumieć różnicę między CIFS a innymi (nowszymi) dialektami (wersjami) SMB.
SMB 2.0
Firma Microsoft przeprowadziła wydanie SMB 2.0 (lub SMB2) w 2006 roku wraz z systemem Windows Vista. Ta wersja SMB jest bardziej niezawodna niż SMB 1.0/CIFS i nie jest to CIFS. Liczba poleceń potrzebnych do przesyłania plików została zmniejszona z ponad 100 do 20. Wydajność jest wyższa dzięki mechanizmom przetwarzania potokowego, czyli możliwości wysłania kolejnego żądania przed otrzymaniem odpowiedzi na poprzednie. Zgrupowanie wielu operacji w jednym żądaniu zmniejsza liczbę żądań kierowanych do klienta, co poprawia wydajność.
SMB 2.1
SMB 2.1 zapewnia nieznaczne ulepszenia wydajności i mechanizmów blokowania w porównaniu z SMB 2.0. Ta wersja protokołu została wydana wraz z systemami Windows 7 i Windows Server 2008 R2.
SMB 3.0
Początkowo ta wersja protokołu nosiła nazwę SMB 2.2, ale później została przemianowana na SMB 3.0 wraz z systemem Windows 8. Wersja SMB 3.0:
- dodano SMB Direct (bezpośredni dostęp do pamięci), SMB Multichannel oraz Tryb failover
- poprawiono bezpieczeństwo
- dodano wsparcie dla szyfrowania typu end-to-end
- poprawiono wydajność sieci poprzez zmniejszenie opóźnień
SMB 3.0.2
SMB 3.0.2 lub 3.02 jest dostępny od czasu wprowadzenia systemów Windows 8.1 i Windows Server 2012 R2. W tej wersji można wyłączyć zgodność z SMB 1.0 w celu poprawy bezpieczeństwa.
SMB 3.1.1
Ta wersja stała się dostępna począwszy od Windows 10 i Windows Server 2016. Ulepszenia obejmują lepsze szyfrowanie (AES 128 GCM i AES 128 CCM) oraz skrót SHA-512 do kontroli integralności przed uwierzytelnieniem.
SMB w systemie Windows i Microsoft Server
Protokół SMB jest dostępny w systemie Windows począwszy od wersji Windows 3.1 (Windows for Workgroups). Wersje SMB i kompatybilność z różnymi wersjami systemu Windows zostały wyjaśnione w tabeli.
Kolumny i wiersze zawierają wersje systemu Windows, w których można uruchomić klienta SMB lub serwer SMB (kolumny i wiersze są zamienne). Komórka na przecięciu kolumny i wiersza pokazuje, która wersja protokołu SMB jest używana do komunikacji między odpowiednimi wersjami systemu Windows.
| Windows 10
Server 2016 i nowsze |
Windows 8.1
Server 2012 R2 |
Windows 8
Server 2012 |
Windows 7
Server 2008 R2 |
Windows Vista
Server 2008 |
Win XP, Server 2003 i starsze | |
| Windows 10
Server 2016 i nowsze |
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 i starsze | SMB 1.0 | SMB 1.0 | SMB 1.0 | SMB 1.0 | SMB 1.0 | SMB 1.0 |
CIFS vs SMB: Prawdopodobne źródło nieporozumień
Sprawdźmy na przykładzie, dlaczego terminy CIFS i SMB są nadal mylone przez użytkowników. Aby to zrobić, załóżmy, że korzystamy z serwera plików z udziałem plików SMB skonfigurowanym na Windows Server 2019 oraz z maszyną z systemem Linux łączącą się z tym serwerem plików za pośrednictwem protokołu SMB. W tym przykładzie używamy dystrybucji Ubuntu 20.04. Należy zauważyć, że konfiguracja jest taka sama dla Ubuntu 22.
W naszych środowiskach mamy następującą konfigurację:
- Windows Server 2019: 192. 168.101.209
- Linux Ubuntu 20.04: 192. 168.101.210
- Udział SMB na Windows Server: 192.168.101.209share
W systemie Windows Server 2019 protokół SMB 1.0/CIFS jest domyślnie wyłączony. Aby sprawdzić te ustawienia i ręcznie włączyć/wyłączyć klienta i serwer SMB 1.0/CIFS, przejdź do Server Manager > Add Roles and Features > Features.
Na naszym komputerze z systemem Windows Server 2019 pozostawiamy protokół SMB 1.0/CIFS wyłączony. Oznacza to, że domyślnie używany jest protokół SMB 3 z możliwością przełączenia się na SMB 2 w celu zapewnienia zgodności z klientami korzystającymi z wersji SMB 2 (dialektów).
W nowoczesnych wersjach systemu Windows, takich jak Windows 10, protokół CIFS jest domyślnie wyłączony w celu zapewnienia większego bezpieczeństwa, ale w razie potrzeby można go włączyć ręcznie.
Uwaga: W 2017 r. miały miejsce masowe ataki oprogramowania wymuszającego okup na całym świecie (WannaCry i NotPetya), przeprowadzone przy użyciu exploitów wykorzystujących luki w zabezpieczeniach SMB 1. Exploity te nazwano EternalBlue, EternalRomance i EternalChampion. Firma Microsoft wydała poprawki zabezpieczeń dla swoich systemów operacyjnych, począwszy od Windows XP i Windows Server 2003, mimo że systemy te nie były wówczas oficjalnie obsługiwane. Microsoft zalecił stosowanie protokołów SMB 2 i SMB 3 (obsługujących integralność przed uwierzytelnieniem) zamiast SMB 1.0/CIFS. Jak wspomniano powyżej, serwer SMB dla systemu Linux nosi nazwę Samba ( samba to nazwa pakietu). W systemie Windows korzystamy z serwera SMB. W tym przykładzie nie potrzebujemy więc Samby, a raczej klienta SMB dla systemu Ubuntu Linux.
Klient SMB dla systemu Linux jest zawarty w pakiecie Linux CIFS Utils ( cifs-utils to nazwa pakietu). Stąd właśnie bierze się to zamieszanie. Pierwsza wersja tego klienta dla systemu Linux powstała w czasach, gdy powszechnie stosowano protokół SMB 1.0/CIFS. Protokół SMB został zaktualizowany, pojawiły się wydania SMB 2 i 3, ale nazwa klienta SMB dla systemu Linux pozostała ta sama, a pakiet zawierający klienta SMB nadal nazywa się CIFS Utils. Pakiet cifs-utils nie jest częścią samba .
Połączymy się z systemu Linux przy użyciu CIFS Utils z udziałem SMB znajdującym się na serwerze Windows Server 2019, aby sprawdzić, czy CIFS jest nadal używany. Aby zainstalować CIFS Utils, uruchom następujące polecenie z uprawnieniami administratora:
sudo apt-get install cifs-utils
Utwórz katalog, który będzie służył jako punkt montowania udziału SMB:
mkdir /mnt/share
Połącz się z udziałem plików SMB znajdującym się na zdalnym serwerze plików Windows:
mount.cifs //192.168.101.209/share /mnt/share -o user=administrator
W naszym przykładzie używamy konta administratora systemu Windows w celach edukacyjnych.
CIFS vs SMB – który z nich jest używany w bieżącej sesji do połączenia z udziałem plików? Sprawdź wersję SMB klientów podłączonych do udziału SMB na serwerze Windows Server za pomocą polecenia PowerShell w systemie Windows Server 2019:
Get-SmbSession | Select-Object -Property ClientComputerName,ClientUserName,Dialect
Jak widać w wynikach PowerShell, do naszego połączenia z systemu Ubuntu Linux używana jest wersja SMB 3.1.1. SMB 1.0/CIFS nie jest używany, gdy łączymy się za pomocą cifs-utils i polecenia mount.cifs z serwerem plików skonfigurowanym w systemie Windows Server 2019.
Możemy również sprawdzić wersję protokołu SMB w /proc/mounts za pomocą polecenia cat /proc/mounts w systemie Linux. Możemy użyć następującego polecenia, aby odfiltrować tylko potrzebne wyniki:
cat /proc/mounts | grep cifs
Jak widać w wynikach, wersja protokołu do łączenia się z udziałem plików jest oznaczona jako cifs, ale wyświetlana wersja to 3.1.1 (vers=3.1.1), co nie jest wersją CIFS. To kolejny przykład pokazujący, jak terminy SMB i CIFS mogą być mylone.
W rzeczywistości używany jest protokół SMB 3.1.1, a nie CIFS. Możemy to udowodnić jeszcze jedną metodą, korzystając z nmap, czyli darmowego narzędzia do wykrywania sieci, służącego do analizy i rozwiązywania problemów.
Aby zainstalować nmap w systemie Ubuntu, uruchom polecenie jako root:
sudo apt-get install nmap
Aby przeskanować wszystkie hosty, które są online i podłączone do naszej sieci 192.168.101.0/24 , używamy polecenia:
nmap --script smb-protocols 192.168.101.0/24
Interesuje nas wynik dla adresu 192.168.101.209, który jest adresem IP naszego serwera Windows Server 2019 pełniącego rolę serwera plików. System Linux jest podłączony do udziału plików na tym serwerze. W wynikach widzimy, że dialekty protokołów SMB obsługiwane przez nasz serwer Windows to 2.02, 2.10, 3.00, 3.02 i 3.11. Nie ma SMB 1.0/CIFS, mimo że termin CIFS jest nadal używany w plikach konfiguracyjnych i poleceniach systemu Linux.
Możemy wymusić użycie CIFS ręcznie, dodając parametr vers=1.0 w poleceniu mount w systemie Linux (po stronie klienta), aby podczas łączenia się z udziałem plików na serwerze zdalnym używać wyłącznie protokołu SMB 1.0/CIFS.
mount -t cifs //192.168.101.209/share /mnt/share -o user=administrator,vers=1.0
lub
mount.cifs //192.168.101.209/share /mnt/share -o user=administrator,vers=1.0
Wynik jest następujący:
Serwer nagle zamknął połączenie. Może się to zdarzyć, jeśli serwer nie obsługuje wersji SMB, której próbujesz użyć. Domyślna wersja SMB została niedawno zmieniona z SMB1 na SMB2.1 i wyższą .
Wynik ten jest zgodny z poprzednimi wynikami naszego badania porównującego SMB i CIFS w nowoczesnych systemach operacyjnych. CIFS nie jest używany, a SMB 1.0/CIFS jest wyłączony na naszym serwerze Windows Server.
Jeśli ustawimy go na korzystanie z co najmniej SMB 2.0, wówczas możemy połączyć się z serwerem (pamiętaj o liście dialektów SMB obsługiwanych przez nasz serwer Windows Server 2019 wyświetlonej w nmap ):
mount.cifs //192.168.101.209/share /mnt/share -o user=administrator,vers=2.0
Korzystając z graficznego interfejsu użytkownika w systemie Linux lub innych systemach operacyjnych, użyj smb:// w wierszu adresu podczas definiowania protokołu sieciowego, który ma być używany do połączenia się z udziałem plików na serwerze zdalnym.
Podczas wprowadzania adresu do udziału plików SMB należy użyć:
smb://server-name/share-name
Nie należy używać:
cifs://server-name/share-name
, ponieważ klient będzie próbował połączyć się przy użyciu protokołu SMB1.0/CIFS, który może być wyłączony na serwerze (o ile klient w ogóle obsługuje składnię cifs:// ).
Wniosek
Ponieważ protokół CIFS jest przestarzały, SMB jest jednym z protokołów używanych do łączenia się z pamięcią współdzieloną na serwerach plików i urządzeniach NAS (innym powszechnie używanym protokołem jest NFS). Ponieważ pamięć współdzielona jest szczególnie podatna na uszkodzenia danych, oprogramowanie wymuszające okup i inne zagrożenia, które mogą łatwo rozprzestrzeniać się w sieci, należy pamiętać o wykonywaniu kopii zapasowych plików i folderów przechowywanych na zasobach współdzielonych, aby uniknąć utraty danych. Zainfekowanie komputera nawet jednego użytkownika posiadającego uprawnienia do zapisu w plikach współdzielonych może spowodować utratę danych dla wszystkich użytkowników. NAKIVO Backup & Replication to rozwiązanie do ochrony danych, które umożliwia tworzenie kopii zapasowych przyrostowych za pośrednictwem protokołów SMB i NFS dla danych przechowywanych na serwerach NAS oraz serwerach plików z systemem Windows lub Linux.





