Samba to protokół sieciowy, który pozwala systemom Linux i Unix na współdzielenie zasobów dyskowych i drukarek z systemami Windows i innymi systemami Linux (Unix). Server Message Block (SMB) znany również jako Common Internet File System (CIFS) to protokół sieciowy stworzony przez Microsoft, IBM i Intel w latach 80-tych. Protokół używany jest przez systemy Windows jako podstawowy, natywny protokół wymiany plików i udostępniania drukarek.
Korzyści z używania Samby:
- zasoby samba dostępne są zarówno dla systemów Windows jak i systemów Linux oraz Unix;
- zasoby windows mogę być dostępne i montowane pod systemem Linux;
- domeny Linuksowe i Windowsowe mogą być stosowane zamiennie do identyfikacji i autoryzacji;
Serwer Samba może:
- działać jako serwer wydruku dla systemów Windows;
- być skonfigurowany jako podstawowy kontroler domeny (Primary Domain Controller) i jako zapasowy kontroler domeny (Backup Domain Controller);
- być ustawiony jako członek Active Directory w sieci Windowsowej;
- dostarczać nazewnictwo WINS (Windows Internet Name Service).
Komendy związane z zarządzaniem serwerem Samba przedstawia tabela poniżej.
Komenda | Opis |
smbclient |
Klient zasobów dyskowych samby. |
smbpasswd |
Dodaje użytkowników (parametr -a) i zmienia hasło do Samby. |
testparm |
Sprawdza składnię pliku smb.conf. |
pbedit |
Zarządza bazą lokalnych użytkowników w pliku /var/lib/samba/private/smbpasswd. |
mount |
Podłącza zasoby Samby wskazane z linii poleceń lub w pliku /etc/fstab. |
umount |
Odłącza zasoby Samby. |
mount.cifs |
Podłącza zasoby Samby. |
Pliki związane z pakietem Samba przedstawia tabela poniżej.
Plik | Opis |
/etc/samba/smb.conf |
Plik konfiguracyjny Samby. |
/etc/samba/smbusers |
Utrzymuje mapowanie pomiędzy użytkownikami Samby a użytkownikami systemu. |
/etc/sysconfig/samba |
Zawiera dyrektywy używane podczas startu Samby. |
/var/lib/samba/private/smbpasswd |
Zawiera hasła użytkowników Samby. Hasła mogą być inne od haseł użytkowników systemu. |
/var/log/samba |
Logi Samby. |
Dyrektywy związane z plikiem konfiguracyjnym smb.conf przedstawia tabela jak niżej.
Dyrektywa | Ustawienia globalne |
opcje sieciowe | |
workgroup |
Nazwa grupy roboczej, do której należy serwer. |
server string |
Opis identyfikujący serwer Samba. |
netbios name |
Nazwa serwera Samba. |
interfaces |
Określa nazwę interfejsu sieciowego, na którym ma nasłuchiwać serwer. |
host allow/deny |
Zezwala/zabrania na dostęp do usług z określonych podsieci lub domen. |
opcje logowania | |
log file |
Określa osobny plik z logiem w katalogu /var/log/samba dla każdego klienta, który korzysta z Samby. |
max log size |
Maksymalny rozmiar pliku log w KB, po którym plik będzie rotowany. Domyślny rozmiar to 50KB. 0 wyłącza rotowanie logów. |
opcje serwera | |
security |
Możliwe opcje:
|
passdb backend |
Określa backend służący do składowania informacji o użytkownikach i grupach:
|
definicje zasobów | |
comment |
Krótki opis zasobu. |
browseable |
Zezwala/zabrania klientom na przeglądanie listy zasobów. |
writable |
Określa czy dany zasób może być zapisywalny. Dyrektywa przeciwna “read only”. |
valid users |
Lista użytkowników lub grup (nazwa grupy poprzedzona jest znakiem @), którzy mają prawo dostępu do zasobu. Jeżeli dyrektywy nie będzie lub będzie pusta, wszyscy użytkownicy będą mieli dostęp do danego zasobu. |
path |
Ścieżka do udostępnianego zasobu. |
guest ok |
Zezwala na dostęp do zasobu bez podawania hasła. |
public |
Dyrektywa tożsama z “guest ok”. Zezwala na dostęp (odczyt) do zasobu wszystkim użytkownikom. |
write list |
Lista użytkowników i grup, którzy mają prawo zapisywania do zasobu. Dyrektywa działa nawet gdy włączona jest dyrektywa “read only”. |
guest only |
Tylko goście mają dostęp do zasobu. |
force group |
Określa grupę systemową, która ustawiana jest jako domyślna grupa na nowo tworzonych plikach i katalogach w zasobie. |
create mask |
Określa jaki umask ma być ustawiony dla plików tworzonych w zasobie. |
Więcej dyrektyw w man smb.conf.
Pakiety yum związane z serwerem Samba opisuje tabela jak niżej.
Pakiet | Opis |
samba | Pakiet z serwerem Samba. |
samba-client | Zawiera narzędzia do przeprowadzania różnych operacji związanych z serwerem i klientem. |
samba-common | Dostarcza dokumentację man, komendy i pliki konfiguracyjne. |
samba-libs | Biblioteki używane przez serwer i klienta. |
cifs-utils | Narzędzia klienckie do montowania i zarządzania zasobami CIFS. |
Wymagania SELinux związane z serwerem plików Samba.
Katalog, który ma być udostępniony przez Sambę musi mieć ustawiony kontekst samba_share_t. Jeżeli dany katalog ma być udostępniony również przez inne serwery usług (NFS lub FTP) to powinien mieć on dodatkowo ustawiony kontekst public_content_ro_t (tylko odczyt) lub public_content_rw_t (odczyt/zapis).
Polityka SELinux zawiera ponadto wiele zmiennych boolean związanych z Sambą:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# getsebool –a | egrep ‘samba|smb|cifs’ cobbler_use_cifs --> off ftpd_use_cifs --> off git_cgi_use_cifs --> off git_system_use_cifs --> off httpd_use_cifs --> off ksmtuned_use_cifs --> off mpd_use_cifs --> off polipo_use_cifs --> off samba_create_home_dirs --> off samba_domain_controller --> off samba_enable_home_dirs --> off samba_export_all_ro --> off samba_export_all_rw --> off samba_portmapper --> off samba_run_unconfined --> off samba_share_fusefs --> off samba_share_nfs --> off sanlock_use_samba --> off smbd_anon_write --> off use_samba_home_dirs --> off virt_sandbox_use_samba --> off virt_use_samba --> off |
Zmmienna boolean | Przeznaczenie |
ftpd_use_cifs |
Zezwala/zabrania podmontowanemu zasobowi Samby być używanym jako publiczny zasób FTP. |
httpd_use_cifs |
Zezwala/zabrania podmontowanemu zasobowi Samby być używanym przez Apache. |
samba_create_home_dirs |
Zezwala/zabrania Sambie na tworzenie katalogów domowych. |
samba_enable_home_dirs |
Zezwala/zabrania Sambie na udostępnianie katalogów domowych. |
samba_export_all_ro |
Zezwala/zabrania Sambie na udostępnianie zasobów tylko w trybie read only. |
samba_export_all_rw |
Zezwala/zabrania Sambie na udostępnianie zasobów w trybie read i write. |
smbd_anon_write |
Zezwala/zabrania Sambie na zapisywanie w katalogach z kontekstem public_content_rw. |
use_samba_home_dirs |
Zezwala/zabrania klientom Samby na montowanie katalogów domowych. |
Montowanie zasobów w trybie multiuser.
Dobrym zwyczajem jest montowanie zasobów samby z minimalnymi uprawnieniami dla wszystkich użytkowników. Dostęp do zapisu powinien być możliwy tylko dla wybranych użytkowników po wpisaniu dodatkowego hasła. Takie rozwiązanie umożliwia tryb multiuser. Wprowadzenie hasła dla konkretnego użytkownika umożliwia komenda cifscreds:
1 2 |
# su user $ cifscreds add server1 |
lub
1 |
# cifscreds -u user add server1 |
gdzie server1 to serwer plików Samba.
Opcje komendy cifscreds przedstawia tabela jak niżej.
Opcja | Opis |
add | Dodanie danych logowania do zasobów Samby dla sesji aktualnie zalogowanego użytkownika. |
update | Aktualizacja danych logowania. |
clear | Usuwa dane logowania związane z sesją aktualnie zalogowanego użytkownika. |
clearall | Usuwa wszystkie dane logowania. |
Ćwiczenie 1. Udostępnianie zasobów Samby.
1. Instalacja serwera i klienta Samby.
1 2 3 4 |
# yum –y install samba samba-client Package samba-4.1.1-31.el7.x86_64 already installed and latest version Package samba-client-4.1.1-31.el7.x86_64 already installed and latest version Nothing to do |
2. Utworzenie katalogu /smbrhcsa:
1 |
# mkdir /smbrhcsa |
3. Aktywacja zmiennych SELinux boolean aby udostępnić zasoby w trybie odczyt oraz odczyt/zapis a także aby pozwolić Sambie i NFS na udostępnienie katalogu /common.
1 2 3 4 5 |
# setsebool –P samba_export_all_ro=1 samba_export_all_rw=1 samba_share_nfs=1 # getsebool –a | egrep ‘samba_export|samba_share_nfs’ samba_export_all_ro --> on samba_export_all_rw --> on samba_share_nfs --> on |
4. Dodanie kontekstu SELinux public_content_rw_t dla katalogu /common i kontekstu samba_share_t dla katalogu /smbrhcsa:
1 2 3 4 5 6 |
# semanage fcontext –at public_content_rw_t “/common(/.*)?” # semanage fcontext –at samba_share_t “/smbrhcsa(/.*)?” # restorecon /common /smbrhcsa # ll –Zd /common /smbrhcsa drwxr-xr-x. root root unconfined_u:object_r:public_content_rw_t:s0 /common drwxr-xr-x. root root unconfined_u:object_r:samba_share_t:s0 /smbrhcsa |
5. Dodanie Samby do firewalla:
1 2 3 |
# firewall-cmd --permanent --add-service=samba; firewall-cmd --reload success success |
6. Utworzenie pliku smb.conf:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# vim /etc/samba/smb.conf [global] workgroup = EXAMPLE server string = server1 is the Samba Server Sharing /common and /smbrhcsa interfaces = lo, eth0, 192.168.0. passdb backend = smbpasswd log file = /var/log/samba/%m.log idmap config * : backend = tdb hosts allow = 127., 192.168.0., .example.com [common] comment = /common directory available to user10 path = /common valid users = user10 write list = user10 read only = No guest ok = Yes hosts deny = 192.168.2.0/24 [smbrhcsa] comment = /smbrhcsa directory available to user1 path = /smbrhcsa valid users = user1 write list = user1 read only = Yes guest ok = Yes |
7. Sprawdzenie poprawności pliku konfiguracyjnego :
1 2 3 4 5 6 7 8 |
# testparm Load smb config files from /etc/samba/smb.conf rlimit_max: increasing rlimit_max (1024) to minimum Windows limit (16384) Processing section "[common]" Processing section "[smbrhcsa]" Loaded services file OK. Server role: ROLE_STANDALONE Press enter to see a dump of your service definitions |
8. Utworzenie konta użytkownika user10 z hasłem user123:
1 2 |
# useradd user10 # echo user123 | passwd --stdin user10 |
9. Dodanie użytkownika (–a) user10 do bazy użytkowników Samby /var/lib/samba/private/smbpasswd:
1 2 3 4 5 6 7 8 9 |
# smbpasswd –a user10 New SMB password: Retype new SMB password: startsmbfilepwent_internal: file /var/lib/samba/private/smbpasswd did not exist. File successfully created. Added user user10. # cat /var/lib/samba/private/smbpasswd user10:2003:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:EACB2C6A3AAA4ED476ED2741BE8C7A4E:[U ]:LCT- 54CAD791: |
10. Wyświetlenie (–L) informacji o użytkownikach samby:
1 |
# pdbedit -Lv |
11. Dodanie Samby do autostartu, uruchomienie i sprawdzenie statusu:
1 2 3 |
# systemctl enable smb # systemctl start smb # systemctl status smb |
12. Wylistowanie zasobów (–L) Samby dostępnych na serwerze jako user10 (–U):
1 |
# smbclient -L //localhost -U user10 |
Ćwiczenie 2. Montowanie zasobów serwera plików na kliencie.
1. Instalacja klienta Samby:
1 2 3 4 |
# yum –y install samba-client cifs-utils Package samba-client-4.1.1-31.el7.x86_64 already installed and latest version Package cifs-utils-6.2-6.el7.x86_64 already installed and latest version Nothing to do |
2. Utworzenie użytkownika user10, zwracamy uwagę na to aby były te same UID/GID co na serwerze dla tego użytkownika:
1 2 |
# useradd user10 # echo user123 | passwd --stdin user10 |
3. Listujemy (–L) jakie zasoby są dostępne na serwerze server1 dla użytkownika user10:
1 |
# smbclient -L /server/common -U user10 |
4. Logowanie do zasobu /common share jako user10:
1 2 3 4 5 6 7 |
# smbclient //server1/common –U user10 Enter user10's password: Domain=[EXAMPLE] OS=[Unix] Server=[Samba 4.1.1] smb: \> The connection is successfully established with the /common share. You can run the help subcommand to list available commands, use ls to list files in the share, use get/mget and put/mput to transfer one or more files, and so on. Issue exit when done to disconnect. |
5. Utworzenie punktu montowania /smbrhcemnt:
1 |
# mkdir /smbrhcemnt |
6. Podmontowanie zasobu /common do katalogu /smbrhcemnt jako user10:
1 2 |
# mount //server1/common /smbrhcemnt –o username=user10 Password for user10@//server1/common: ******* |
7. Sprawdzamy czy zasób został podmontowany:
1 2 3 4 5 6 |
# df –h | grep smbrhcemnt //server1/common 8.8G 3.4G 5.4G 39% /smbrhcemnt # mount | grep smbrhcemnt //server1/common on /smbrhcemnt type cifs (rw,relatime,vers=1.0,cache=strict,username=user10,domain=SERVER1,uid=0,noforceuid,gid=0,noforcegid,addr=192.168.0.110,unix,posixpaths,serverino,acl,rsize=1048576,wsize=65536,actimeo=1) |
8. Utworzenie pliku z danymi logowania /etc/samba/smbrhcecred:
1 2 3 |
# vi /etc/samba/smbrhcecred username=user10 password=user123 |
9. Ustawienie praw dostępu do pliku na 0400:
1 |
# chown root /etc/samba/smbrhcecred && chmod 0400 /etc/samba/smbrhcecred |
10. Dodanie stosownego wpisu do /etc/fstab:
1 |
//server1/common /smbrhcemnt cifs _netdev,rw,credentials=/etc/samba/smbrhcecred 0 0 |
Ćwiczenie 3. Udostępnienie przez Sambę katalogu do pracy grupowej.
Konfiguracja po stronie serwera.
1. Instalacja Samby i klienta Samby:
1 |
# install samba samba-client |
2. Utworzenie użytkowników user11 and user12 :
1 2 |
# useradd user11 && passwd user11 # useradd user12 && passwd user12 |
3. Dodanie grupy smbgrp z GID 8888:
1 |
# groupadd –g 8888 smbgrp |
4. Dodanie użytkowników user11 i user12 do grupy smbgrp:
1 2 |
# usermod –G smbgrp user11 # usermod –G smbgrp user12 |
5. Utworzenie katalogu /smbsdata, zmiana grupy i nadanie odpowiednich uprawnień do katalogu:
1 2 3 |
# mkdir /smbsdata # chgrp smbgrp /smbsdata # chmod 0770 /smbsdata |
6. Aktywacja zmiennych SELinux booleans tak aby zasoby dostępne były w trybach odczyt oraz odczyt/zapis:
1 |
# setsebool -P samba_export_all_ro=1 samba_export_all_rw=1 |
7. Dodanie kontekstu SELinux samba_share_t dla katalogu /smbsdata:
1 2 3 4 |
# semanage fcontext –at samba_share_t “/smbsdata(/.*)?” # restorecon /smbsdata # ll –Zd /smbsdata drw-rw----. root smbgrp unconfined_u:object_r:samba_share_t:s0 /smbsdata |
8. Dodanie Samby do firewalla:
1 |
# firewall-cmd --permanent --add-service=samba; firewall-cmd --reload |
9. Zasób smbdata w pliku /etc/samba/smb.conf wygląda następująco:
1 2 3 4 5 6 7 8 9 10 |
[smbdata] comment = /smbdata for group collaboration path = /smbdata public = no browseable = yes valid users = @smbgroup write list = @smbgroup writable = no force group = +smbgrp create mask = 0770 |
10. Sprawdzenie poprawności pliku smb.conf:
1 |
# testparm |
11. Dodanie użytkowników user11 i user12 do bazy użytkowników Samby /var/lib/samba/private/smbpasswd:
1 2 |
# smbpasswd –a user11 # smbpasswd –a user12 |
12. Wyświetlenie informacji o użytkownikach Samby:
1 |
# pdbedit –Lv |
13. Autostart, uruchomienie i sprawdzenie statusu Samby:
1 2 3 |
# systemctl enable smb # systemctl start smb # systemctl status smb |
Konfiguracja po stronie klienta.
14. Instalacja pakietów potrzebnych po stronie klienta:
1 |
# yum -y install samba samba-client cifs-utils |
15. Utworzenie użytkowników user11 and user12 :
1 2 |
# useradd user11 && passwd user11 # useradd user12 && passwd user12 |
16. Dodanie grupy smbgrp z GID 8888:
1 |
# groupadd –g 8888 smbgrp |
17. Dodanie użytkowników user11 i user12 do grupy smbgrp:
1 2 |
# usermod –G smbgrp user11 # usermod –G smbgrp user12 |
18. Wylistowanie (–L) zasobów dostępnych na serwerze server1:
1 |
# smbclient -L //server1 -U user11 |
19. Zalogowanie na zasób /smbsdata jako user11 przy użyciu smbclient:
1 2 3 4 |
# smbclient //server1/smbsdata –U user11 Enter user11's password: Domain=[EXAMPLE] OS=[Unix] Server=[Samba 4.1.1] smb: \> |
20. Utworzenie pktu montowania /smbsdatamnt:
1 |
# mkdir /smbsdatamnt |
21. Zamontowanie zasobu /smbsdata w pkcie montowania /smbsdatamnt jako user11:
1 2 |
# mount //server1/smbsdata /smbsdatamnt –o username=user11 Password for user11@//server1/smbsdata: ******* |
22. Weryfikacja:
1 2 3 4 5 |
# df –h | grep smbsdata //server1/smbsdata 8.8G 3.4G 5.4G 39% /smbsdatamnt # mount | grep smbsdata //server1/smbsdata on /smbsdatamnt type cifs (rw,relatime,vers=1.0,cache=strict,username=user11,domain=SERVER1,uid=0,noforceuid,gid=0,noforcegid,addr=192.168.0.110,unix,posixpaths,serverino,acl,rsize=1048576,wsize=65536,actimeo=1) |
23. Utworzenie pliku /etc/samba/smbsdatacred z danymi logowania i ustawienie odpowiednich praw dostępu do tego pliku:
1 2 3 4 5 6 |
# vi /etc/samba/smbsdatacred username=user11 password=user123 # chown root /etc/samba/smbsdatacred # chmod 0400 /etc/samba/smbsdatacred |
24. Dodanie wpisu do /etc/fstab:
1 |
//server1/smbsdata /smbsdatamnt cifs _netdev,credentials=/etc/samba/smbsdatacred 0 0 |
Ćwiczenie 4. Montowanie zasobów Samby w trybie multiuser.
Punkty od 1 do 23 (za wyjątkiem 9 i 21) wykonujemy tak jak w ćwiczeniu 3. Punkty 9 i 24 wykonujemy jak niżej.
9. Zasób smbdata w pliku /etc/samba/smb.conf wygląda następująco:
1 2 3 4 5 6 7 8 |
[smbdata] comment = /smbdata for group collaboration path = /smbdata public = no browseable = yes valid users = @smbgroup # lub user11, user12 write list = user12 writable = no |
24. Do pliku /etc/fstab
dodajemy inny wpis:
1 |
//server1/common /smbrhcemnt cifs _netdev,credentials=/etc/samba/smbrhcecred,sec=ntlmssp,multiuser 0 0 |
Ze względu na to, że zasób [common] ma na serwerze server1 w pliku smb.conf
ustawioną dyrektywę writable=no i użytkownika user11 nie ma na liście write list (jest tylko user12) to zasób zostanie podmontowany w trybie tylko do odczytu z takimi uprawnieniami jakie posiada użytkownik user11.
To się nie powinno udać:
1 2 |
# su user11 $ echo test > /smbrhcemnt/user11-file |
Zapis będzie możliwy po podaniu komendą cifscreds danych logowania użytkownika user12:
1 2 |
# su user12 $ cifscreds add server1 |
Teraz zapis do /smbrhcemnt powinien się powieść:
1 |
$ echo test > /smbrhcemnt/user12-file |
Ćwiczenie 5. Bezpieczny dostęp do serwera plików przez Kerberos.
Na serwerze KDC (serwer Kerberos):
1. Logowanie jako root principal do bazy KDC i dodanie serwera server1 jako cifs principal:
1 2 3 4 5 6 |
# kadmin –p root/admin Authenticating as principal root/admin with password. Password for root/admin@EXAMPLE.COM: kadmin: addprinc –randkey cifs/server1.example.com WARNING: no policy specified for cifs/server1.example.com@EXAMPLE.COM; defaulting to no policy Principal "cifs/server1.example.com@EXAMPLE.COM" created. |
2. Wygenerowanie pliku keytab:
1 |
kadmin: ktadd –k /etc/krb5.keytab cifs/server1.example.com |
Plik powinien należeć do użytkownika i grupy root i mieć prawa 0600.
3. Skopiowanie pliku keytab do serwera Samby – server1:
1 |
# scp /etc/krb5.keytab server1:/etc |
Na Serwerze Samby – server1:
4. Wykonujemy czynności jak niżej:
1 2 3 4 5 6 |
# mkdir /smbkrb5 # useradd user7; passwd user7 # chown user7 /smbkrb5 # smbpasswd -a user7 # semanage fcontext –at samba_share_t “/smbkrb5(/.*)?” # restorecon -Rv /smbkrb5 |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# vim /etc/samba/smb.conf [global] workgroup = EXAMPLE security = ads realm = EXAMPLE.COM [smbkrb5] comment = /smbkrb5 path = /smbkrb5 valid users = user7 write list = user7 read only = Yes |
Na kliencie Samby:
5. Potwierdzamy dostęp do zasobu logując się do zasobu z opcją (–k) kerberos:
1 |
# smbclient –k //server1/smbkrb5 –U user7 |
6. Tworzymy punkt montowania /smbkrb5mnt:
1 |
# mkdir /smbkrb5mnt |
7. Podmontowanie zasobu /smbkrb5 w pkcie montowania /smbkrb5mnt jako user7:
1 |
# mount //server1/smbkrb5 /smbkrb5mnt –o username=user7,sec=krb5,rw |
8. Weryfikacja
1 2 |
# df # mount |
9. Dodanie wpisu do pliku /etc/fstab:
1 2 |
# vim /etc/fstab //server1/smbkrb5 /smbkrb5mnt cifs username=user7,rw,sec=krb5 0 0 |