LEKCJA 12 - SERWER SAMBA

Wprowadzenie do lekcji

Postawiliśmy na naszym serwerze już trzy najważniejsze usługi – DHCP, Routing i DNS. Pora więc uruchomić coś bardziej użytkowego z czym "użytkownicy" naszej sieci będą mieć bliższą styczność. Zdarza się tak, że potrzebujemy udostępniać jakieś zasoby innym użytkownikom przez sieć. Użyć do tego możemy tzw. "serwer plików". Takich serwerów plików na rynku mamy mnóstwo, jednakże wśród nich wszystkich wyłania się jeden najpopularniejszy serwer – Samba, która korzysta z protokołu SMB. Jednak od początku. SMB to skrót od Server Message Block i określa się nim protokół komunikacyjny, który pozwala na udostępnianie plików, drukarek czy portów com w sieci. Został opracowany przez IBM, a następnie pieczę nad nim przejął Microsoft. Obecnie najnowszą wersją tego protokołu jest SMB 3.1.1, która zaimplementowana jest w systemie Windows 10 i jego serwerowym odpowiedniku. Samba jest jedną z otwarto źródłowych implementacji protokołu SMB (wszystkich wersji). Prócz podstawowych funkcji, czyli udostępniania plików oraz drukarek, pozwala ona również na uruchomienie usług katalogowych, więc może działać jako kontroler domeny. Samba składa się z trzech demonów (czyli usług):

smbd jest demonem odpowiedzialnym za najważniejsze usługi czyli obsługa protokołu SMB, udostępnianie zasobów oraz kontrola domeny;

nmbd jest demonem usługi nazw NetBIOS;

winbind pobiera dane na temat użytkowników i grup z Windowsa oraz odwzorowuje je na lokalne numery ID, dzięki czemu samba jest kompatybilna z systemami Windows.

Warto również wiedzieć, że w terminologii Samby, konkretny folder jaki udostępniamy nazywa się udziałem lub po angielsku share. Przed przystąpieniem instalacji należy zaktualizować repozytoria oraz pakiety, mam nadzieję, że każdy pamięta jak to zrobić.

I. Przygotowanie struktury plików oraz kont.

1. Krótkie wprowadzenie


Zanim rozpoczniemy właściwą instalację, przygotujemy strukturę katalogów oraz kont na naszym serwerze. Usługa Samba pozwala zabezpieczać udziały sieciowe, wykorzystując do tego celu konta utworzone w samym systemie Linux. System ten umożliwia przede wszystkim stosowanie jednego konta do wielu usług. Każde połączenie z udziałem wywołuje (jako dany użytkownik) demona smb. również w przypadku dostępu anonimowego wykorzystuje się wbudowane w Sambę konto gościa.


2. Założenia teoretyczne


  • Docelowo chcemy przedstawić cztery podstawowe rodzaje udziałów sieciowych:
  • udział publiczny – dostępny dla wszystkich użytkowników, również bez konieczności posiadania konta (dostęp anonimowy);
  • udział prywatny – dostępny dla wszystkich użytkowników zarejestrowanych w bazie danych Samby;
  • udział autoryzowany grupowy – dostępny wyłącznie dla członków konkretnej grupy w systemie Linux;
  • udział autoryzowany indywidualny – dostępny wyłącznie dla jednego, wskazanego użytkownika.


Aby zrealizować ten cel, w katalogu /srv (który zgodnie ze standardem FHS – Linux Filesystem Hierarchy Standard – służy do przechowywania danych udostępnianych przez usługi) utworzymy katalog samba, a w nim podkatalogi: public, private, uczniowie oraz nauczyciel. Utworzymy również trzy konta użytkowników: uczen1, uczen2 oraz nauczyciel. Dwa pierwsze konta będą należeć do grupy uczniowie, którą także utworzymy w systemie.

krok_02_12-1

Zaczynamy od utworzenia struktury kont i grup. Do tworzenia użytkowników wykorzystujemy polecenie adduser z interaktywnym kreatorem. Wykonujemy w konsoli następujące komendy:


$ sudo adduser uczen1
$ sudo adduser uczen2
$ sudo adduser nauczyciel


Podajemy zdefiniowane przez nas hasła oraz opcjonalne dane szczegółowe o użytkownikach.

krok_03_12-2

Tworzymy grupę uczniowie za pomocą polecenia:


$ sudo addgroup uczniowie


A następnie dodajemy do niej obu uczniów poleceniami:


$ sudo usermod -G uczniowie -a uczen1
$ sudo usermod -G uczniowie -a uczen2


Parametr -G wskazuje grupę, do której chcemy przypisać użytkownika, natomiast przełącznik -a (append) powoduje dołączenie nowej grupy do istniejących, zapobiegając ich nadpisaniu.

krok_04_12-3

Po przygotowaniu użytkowników i grup przechodzimy do utworzenia struktury katalogów w ścieżce /srv, przeznaczonej na dane usług systemowych.

krok_05_12-4

Całą strukturę katalogów możemy utworzyć za pomocą kilku zwięzłych poleceń. Przechodzimy do katalogu /srv i wpisujemy:


$ sudo mkdir samba
$ cd samba
$ sudo mkdir public uczniowie nauczyciel private
$ tree /srv


Za pomocą polecenia tree możemy zweryfikować, czy nasza struktura została poprawnie utworzona. Jeżeli narzędzie tree nie jest zainstalowane w systemie, instalujemy je poleceniem:


$ sudo apt install tree

Uprawnienia do katalogów


Po utworzeniu katalogów dostosowujemy ich prawa dostępu oraz właścicieli, co zapewni odpowiednie bezpieczeństwo udostępnianych zasobów.


Dla katalogu public ustalamy następujące uprawnienia:

  • właściciel – pełne prawa (rwx);
  • grupa – pełne prawa (rwx);
  • pozostali użytkownicy – odczyt i wykonanie (r-x).


Zmieniamy właściciela katalogu public na użytkownika nobody oraz grupę nogroup. Są to wbudowane w system Linux obiekty przeznaczone do obsługi procesów niewymagających konkretnego użytkownika ani grupy.


Dla pozostałych katalogów zasady kształtują się następująco:


Katalog uczniowie – właściciel nobody, grupa uczniowie:

  • właściciel – pełne prawa (rwx);
  • grupa – pełne prawa (rwx);
  • pozostali użytkownicy – brak praw (---).


Katalog nauczyciel – właściciel nauczyciel, grupa nauczyciel (wykorzystujemy grupę prywatną utworzoną automatycznie wraz z kontem):

  • właściciel – pełne prawa (rwx);
  • grupa – pełne prawa (rwx);
  • pozostali użytkownicy – brak praw (---).


Katalog private:

  • właściciel – pełne prawa (rwx);
  • grupa – pełne prawa (rwx);
  • pozostali użytkownicy – odczyt i wykonanie (r-x).


krok_07_12-5

Mając zaplanowane prawa dostępu oraz właścicieli katalogów, przechodzimy do wykonania odpowiednich poleceń. Najpierw modyfikujemy uprawnienia, a następnie zmieniamy właścicieli:


$ sudo chmod -R 775 public
$ sudo chown -R nobody:nogroup public


Parametr -R w obu poleceniach oznacza działanie rekurencyjne (odnosi się również do wszystkich podkatalogów i plików wewnątrz). Zestaw poleceń dla pozostałych katalogów przedstawiono na zrzucie ekranu powyżej. Na koniec weryfikujemy wprowadzone zmiany komendą:


$ ls -l samba

II. Instalacja i konfiguracja serwera Samba

krok_08_12-6

Instalację serwera Samba przeprowadzamy za pomocą polecenia:


$ sudo apt install samba -y
krok_09_12-7

Po zakończeniu instalacji sprawdzamy status usługi. Spośród demonów usługi Samba interesuje nas przede wszystkim demon smbd. Wykonujemy polecenie:


$ systemctl status smbd


Upewniamy się, że usługa ma status active (running). Gdyby usługa była nieaktywna, należy uruchomić ją ręcznie.

krok_10_12-8

Kolejnym krokiem jest dodanie naszych użytkowników systemowych do bazy danych Samby, co umożliwi im uwierzytelnianie przy dostępie do zasobów sieciowych. Służy do tego polecenie:


$ sudo smbpasswd -a nazwa_konta


Polecenie to wykonujemy łącznie trzy razy – dla każdego z utworzonych wcześniej kont. Za każdym razem system poprosi o podanie i powtórzenie hasła dla Samby.

UWAGA: Jest to hasło używane do logowania się do udziałów sieciowych. Może być ono identyczne z hasłem systemowym użytkownika lub od niego inne. Wykonujemy polecenia:


$ sudo smbpasswd -a uczen1
$ sudo smbpasswd -a uczen2
$ sudo smbpasswd -a nauczyciel
krok_11_12-9

Przechodzimy do edycji głównego pliku konfiguracyjnego /etc/samba/smb.conf za pomocą edytora nano:


$ sudo nano /etc/samba/smb.conf


W sekcji Browsing/Identification zwracamy uwagę na parametry workgroup oraz server string:

  • workgroup – określa nazwę grupy roboczej, w której widoczny będzie nasz serwer (ma to kluczowe znaczenie dla systemów Windows). Domyślna nazwa WORKGROUP jest odpowiednia dla większości sieci lokalnych;
  • server string – opisowa nazwa serwera Samby widoczna dla klientów sieciowych (opcja ułatwiająca identyfikację serwera).


Właściwa konfiguracja udziałów znajduje się na samym końcu pliku smb.conf. Definicję każdego udziału rozpoczynamy od podania w nawiasach kwadratowych nazwy, pod jaką zasób będzie widoczny w sieci (np. [public]). W kolejnych liniach wpisujemy parametry danego udziału (opcje oznaczone symbolem * są wymagane):

  • *path = /sciezka/do/katalogu – pełna ścieżka do katalogu udostępnianego w systemie plików;
  • comment = tekst – opcjonalny komentarz opisujący dany udział;
  • *browseable = yes:no – określa, czy dany udział będzie widoczny na liście zasobów serwera podczas przeglądania sieci (ustawienie "no" ukrywa udział, ale pozostaje on dostępny po wpisaniu bezpośredniej ścieżki);
  • writable = yes:no – określa, czy klienci mają prawo zapisu i modyfikacji w danym udziale;
  • guest ok = yes:no – zezwala na dostęp anonimowy (bez logowania). Opcję tę włączamy (yes) wyłącznie dla udziału public;
  • *read only = yes:no – określa, czy udział jest przeznaczony wyłącznie do odczytu. Aby umożliwić zapis, ustawiamy wartość no;
  • valid users = obiekty – lista użytkowników i grup posiadających dostęp do udziału (elementy rozdzielamy przecinkami, a nazwy grup poprzedzamy symbolem @, np. @uczniowie);
  • invalid users = obiekty – lista użytkowników i grup, dla których dostęp do udziału jest bezwzględnie zabroniony (stosowane do jawnego wykluczenia konkretnych kont).
krok_13_12-10

Poprawnie skonfigurowana sekcja udziałów w pliku /etc/samba/smb.conf została przedstawiona na zrzucie ekranu powyżej.

krok_14_12-11

Po zapisaniu zmian w pliku konfiguracyjnym restartujemy usługę Samby i sprawdzamy jej status:


$ sudo systemctl restart smbd
$ sudo systemctl status smbd

III. Korzystanie z serwera Samba po stronie klienta

krok_15_12-12

Aby uzyskać dostęp do udziałów w systemie Ubuntu Desktop, otwieramy menedżer plików, wybieramy z lewego panelu opcję "Inne położenia", a następnie w polu adresowym na dole wpisujemy ścieżkę: smb://adres_serwera (w naszym przypadku smb://192.168.10.10) i klikamy przycisk "Połącz".

krok_16_12-13

W oknie pojawią się dostępne udziały sieciowe (domyślny udział pomocniczy print$ można zignorować). Zauważamy, że udział private nie jest widoczny na liście, co wynika z ustawienia parametru browseable = no.

krok_17_12-14

Otwieramy katalog public, wybieramy opcję dostępu "Anonimowy", klikamy "Połącz" i uzyskujemy dostęp do zasobu sieciowego.

krok_18_12-15

W celu przetestowania uprawnień do zapisu tworzymy w udziale public nowy katalog o nazwie testowy_katalog.

krok_19_12-16

Katalog został pomyślnie utworzony, co potwierdza poprawność naszej konfiguracji.

krok_20_12-17

W systemie Windows 11 domyślna konfiguracja bezpieczeństwa blokuje anonimowe logowanie do udziałów SMB (logowanie jako gość). Poniżej przedstawiamy sposób włączenia obsługi dostępu anonimowego na kliencie Windows.


Uruchamiamy konsolę PowerShell z podwyższonymi uprawnieniami administratora.

krok_21_12-18

W oknie PowerShell wykonujemy następujące polecenia:


$ Set-SmbClientConfiguration -RequireSecuritySignature $false

$ Set-SmbClientConfiguration -EnableInsecureGuestLogons $true


Pierwsza komenda wyłącza wymóg cyfrowego podpisywania pakietów SMB po stronie klienta, natomiast druga zezwala na nieodpłatne, anonimowe połączenia z serwerem bez konieczności podawania poświadczeń.


Druga komenda włącza możliwość "niebezpiecznych logowań jako gość" (Insecure Guest Logons). Zezwala systemowi Windows na wysyłanie nieszyfrowanych i nieuwierzytelnionych zapytań o dostęp do plików. Kiedy łączysz się anonimowo, nie podajesz loginu ani hasła, a serwer Samba identyfikuje Cię po prostu jako konto guest lub nobody


krok_22_12-19

Po skonfigurowaniu ustawień w systemie Windows 11 otwieramy Eksplorator plików i w pasku adresu wpisujemy ścieżkę do udziału publicznego:

\\192.168.10.10\public. 

Dostęp do zasobu następuje bez wyświetlania okna logowania.

krok_23_12-20

W udziale widoczny jest katalog utworzony wcześniej w systemie Linux. Dla potwierdzenia dwukierunkowej komunikacji tworzymy nowy katalog z dopiskiem windows.

krok_24_12-21

Sprawdzimy teraz dostęp do udziałów zabezpieczonych. Próbujemy otworzyć udział nauczyciel, podając poświadczenia użytkownika uczen1. System poprawnie odrzuca próbę połączenia i wyświetla komunikat o braku dostępu.

krok_25_12-22

Następnie wprowadzamy dane logowania użytkownika nauczyciel.

krok_26_12-23

Połączenie zostaje pomyślnie nawiązane. W udziale nauczyciel tworzymy testowy katalog o nazwie sprawdziany_windows.

krok_27_12-24

Przechodzimy na stację roboczą Ubuntu i otwieramy udział nauczyciel.

krok_28_12-25

W oknie logowania wybieramy opcję "Zarejestrowany użytkownik" i podajemy dane konta nauczyciel.

krok_29_12-26

Widzimy katalog utworzony w systemie Windows oraz tworzymy nowy katalog sprawdziany_linux.

krok_30_12-27

Zawartość udziałów sprawdzamy również bezpośrednio na serwerze Linux. Przechodzimy do katalogu /srv i weryfikujemy zawartość udostępnionych katalogów:


$ cd /srv
$ ls -l samba/public
$ sudo ls -l samba/nauczyciel


Bez podwyższonych uprawnień (sudo) nie mamy dostępu do katalogu nauczyciel, co jest zgodne z wcześniej zdefiniowanymi prawami w systemie plików.

krok_31_12-28

W analogiczny sposób należy zweryfikować dostęp do pozostałych zasobów dla poszczególnych użytkowników.


Na koniec przeanalizujemy działanie parametru invalid users. Służy on do jawnego zablokowania dostępu konkretnemu użytkownikowi, nawet jeżeli należy on do grupy posiadającej uprawnienia do danego zasobu. W naszym przykładzie użytkownik uczen2 należy do grupy uczniowie, która posiada dostęp do udziału uczniowie. Edytujemy plik /etc/samba/smb.conf i w sekcji udziału [uczniowie] dodajemy wpis blokujący: invalid users = uczen2.

krok_32_12-29

Po zapisaniu zmian w konfiguracji restartujemy usługę Samby:


$ sudo systemctl restart smbd
krok_33_12-30

Sprawdzamy dostęp do udziału uczniowie z poziomu konta uczen1.

krok_34_12-31

Logowanie przebiega pomyślnie, po czym tworzymy w udziale katalog uczen1.

krok_35_12-32

Odmontowujemy udział uczniowie (klikając prawym przyciskiem myszy i wybierając opcję "Odmontuj"), aby umożliwić zmianę poświadczeń.

krok_36_12-33

Próbujemy zalogować się do udziału uczniowie, podając dane użytkownika uczen2.

krok_37_12-34

Dostęp zostaje zablokowany – okno logowania pojawia się ponownie z wyczyszczonymi polami poświadczeń, co potwierdza prawidłowe działanie reguły invalid users.