Samba

Martin Dufka, xdufka@fi.muni.cz


Obsah:


Co je to Samba?


Samba je sada Unixových aplikací, které se dorozumívají SMB (Server Message Block) protokolem. Mnoho operačních systémů včetně Windows a OS/2 užívají SMB protokol na vytváření sítí typu client-server. Tím že Samba podporuje SMB umožňuje Unixovým serverům komunikovat stejným síťovým protokolem jako Microsoft Windows.

Otcem Samby je Andrew Tridgell, který v roce 1991 vytvořil fileserver pro jeho lokální síť, který podporoval DEC protokol od Digital Pathworks. Ačkoli to tenkrát nevěděl, tak se protokol později změnil v SMB. Poté vytvořil SMB server a začal jej distribuovat na Internetu pod jménem SMB Server. Nicméně si nemohl ponechat toto jméno. To už náleželo produktu jiné společnosti. Proto se pokusil jej přejmenovat následujícím způsobem:
grep -i 's.*m.*b' /usr/dict/words


A získal následující odpověď:
salmonberry samba sawtimber scramble


Takže takto se zrodil název Samba.

Dnes se Samba točí okolo dvou Unixových daemonů, kteří poskytují sdílené zdroje (nebo služby) SMB klientům na síti:

o smbd
o nmbd

Samba je v současnosi udržována a rozšiřována skupinou dobrovolníků pod aktivním dohledem Andrewa Tridgella. Podobně jako Linux je Samba Open Source a je distribuována pod GNU General Public Licence (GPL).


SMB protokol


Samba implementuje SMB protokol nad TCP pro sdílení souborů a nad UDP browsing. Používají se následující porty:
 o 137/UDP - name resolving (WINS)
 o 138/UDP - browsing
 o 139/TCP - sharing


Na portu 138/UDP probíhá browsing, což je vlastně prohlížení sítí. Tady například servery oznamují broadcastem svou přítomnost. Na portu 137/TCP se odehrávají veškeré přenosy sdílených souborů a tiskáren.
Někdy se také mluví o protokolu CIFS (Common Internet File System), což je vlastně protokol SMB pojmenovaný podle Microsoftu.


Součásti balíku Samba

smbd - Daemon, který umožňuje sdílení souborů a tiskáren na SMB síti. Poskytuje také autentifikaci pro SMB klienty. Poslouchá na portu 139/TCP, pro každé spojení vytvoří nový proces, který bude klienta obsluhovat a ukončí se až poté, co se klient odpojí. Konfigurační soubor se reloaduje každou minutu nebo signálem HUP, neovlivňují se jednou započaté session. Navíc akceptuje ještě signály USR1 a USR2 pomocí nichž se zvyšuje respektive snižuje log level o 1. Může běžet buď jako daemon, nebo z inetd. Měli bychom se vyvarovat ukončení pomocí KILL signálu, kdy by se mohla poškodit data se kterými se pracuje.

nmbd - Daemon, který se stará o Windows Internet Name Service (WINS) a pomáhá při procházení sítě (browsing). Je to NetBIOS name server, který poskytuje NetBIOS jména klientům. Defaultně je NetBIOS jméno počítače jeho hostname. Může sloužit jako local master browser, nebo domain master browser. Signál HUP vypíše aktuální namelist do namelist.debug v adresáři var/locks. Tímto také vypíše svou server database do log.nmb

smbclient - jednoduchý SMB klient, dá se pomocí něj přistupovat ke sdíleným prostředkům na serverch užívajících SMB protokol. Dále umožňuje tisknout na tiskárně připojené k SMB serveru.

testparm - Velice užitečný program na kontrolu syntaxe konfiguračního souboru (smb.conf).

testprns - Program pro kontrolu tiskáren v souboru printcap.

smbstatus - Ukazuje aktivní spojení s smbd.

smbmount - Mountuje Linuxový SMB filesystem. Pracuje pouze pod Linuxem a smbfs musí být podporován jádrem.

smbumount - Smbfs umount pro běžné uživatele. Pracuje jako suid root.

smbtar - Skript který provádí zálohy sdílených "disků".

findsmb - Vypíše informace o strojích, které reagují na SMB name požadavky na síti.

nmblookup - Překládá NetBIOS jména na IP adresy.

make_smbcodepage - Vytváří definiční soubory SMB kódových stránek pro smbd server.

smbpasswd - Nástroj pro změnu uživatelova SMB hesla.

swat - Samba Web Administration Tool - Umožňuje konfigurovat Sambu přes webový prohlížeč. Běží na portu 901.

Konfigurace serveru

Konfigurace se odehrává především v souboru smb.conf (obvykle /etc/samba/smb.conf). Jsou tady tři nejdůležitější sekce:

Sekce [global]:


parametry, které se zadají v této sekci mají význam pro všechna sdílení. Parametry zde uvedené se ale dají v příslušném sdílení upravit:
[global]
...
guest ok = no
...

[homes]
...

[pub]
...
guest ok = yes
...

V tomto příkladě mají guest účty defaultně zakázán přístup ke všem sdílením a přístup mají povolen pouze ke sdílení pub. Pokud použijeme položku guest ok, tak nám umožní se spojit bez autentifikace pomocí hesla.

Sekce [homes]:


umožňuje síťovým klientům se připojit k uživatelovi domovskému adresáři na serveru, aniž by musel být explicitní záznam v smb.conf. Pokud se klient pokusí přistoupit k nějakému sdílení, které v smb.conf neexistuje, tak Samba začne hledat sekci [homes]. Pokud existuje, tak předpokládá že uživatel chce přistoupit ke svému domovskému adresáři. Proto prohledá "password file" aby zjistila kde se nachází domovský adresář (a jak se jmenuje) daného přihlášeného uživatele. Pokud se požadavek shoduje s názvem domovského adresáře, tak poté ještě porovná hesla a v případě shody vytvoří nové sdílení pro daného uživatele.
[homes]
   comment = Home Directories
   browsable = no
   read only = no
   preserve case = yes
   short preserve case = yes
   create mode = 0750
Položka comment se zobrazuje klientům, položka browsable

Sekce [printers]:


Třetí speciální sekce se nazývá [printers] a je podobná [homes]. Pokud se klient pokusí připojit ke sdílení, které není v smb.conf a jméno neodpovídá žádnému uživateli, tak se Samba zjistí, jestli to není tiskové sdílení. To Samba provede přečtením souboru možností tisku (printer capabilities - často /etc/printcap) a pokud tam najde záznam daného jména, tak vytvoří tiskové sdílení.
V závislosti na systému to ale nemusí být soubor /etc/printcap. Můžete použít program testparm, který je součástí balíku Samba, abyste zjistili jak se tento soubor jmenuje.

Ukázkový příklad smb.conf

[global]
# NetBIOS jméno počítače
	netbios name = pc4
	
# Název pracovní skupiny
	workgroup = p090
	
# Rozhraní na kterých se mají poskytovat služby, maska /24 je totéž jako /255.255.255.0
	interfaces = 10.0.0.65/24
	
# Název serveru, %v zadává verzi nainstalované Samby.
	comment = Samba ver. %v

# Povolit přístup z těchto sítí
	hosts allow = 10.0.0.
	
# Zakázat přístup z těchto sítí
	hosts deny = 10.0.0.7

# tisk
	printcap name = /etc/printcap
	load printers = no
	printing = cups

# Browsing je schopnost prozkoumat server, které služby a sdílení jsou dostupné
	browseable = yes

# Ve sdílení s public = yes budou použity práva uživatele smbuser
	guest account = smbuser

# Při špatném hesle přepnout na účet guesta
	map to guest = bad password

# Zakázání přístupu pro daemony ap.
	invalid users = @wheel, mail, daemon

# Adresář pro zamykání souborů
	lock directory = /var/lock/samba/locks

# Logovací soubor pro každý stroj zvlášť (%m - machine (NetBIOS jména))
	log file = /var/log/samba/log.%m

# Do syslogu se budou zasílat zprávy s prioritou 0, 1, 2
	syslog = 2

# Říká serveru, jestli je klient přítomný (v sekundách)
	keep alive = 60

# Počet minut neaktivity klienta, po kterých se považuje spojení za mrtvé
	dead time = 30

# Typ zabezpečení
	security = user

# Jestli Samba akceptuje prázdná hesla
	null passwords = no

# Synchronizace hesel s unixovými účty
	unix password sync = yes

# Jestli se budou hesla posílat šifrovaná
	encrypt passwords = yes

# Soubor s hesly pro Sambu
	smb passwd file = /etc/samba/smbpasswd

# Pro větší výkonnost
	socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
	
# Pro každý přistupující stroj lze vytvořit samostatnou konfiguraci
	include = /etc/samba/smb.conf.%m

#============================== Definice Sdileni ==============================
[homes]
	comment = Home Directories

# Sdílení nebude viditelné při prohlížení (browsing)
	browseable = no

# Opak k read only.
	writable = yes

# %S je jméno aktuálního uživatele.
	valid users = %S

# Práva na vytváření souborů a adresářů.
	create mode = 0640
	directory mode = 0755

[printers]
	comment = All Printers

# Tisková fronta
	path = /var/spool/samba

	browseable = no

# Synonymum k public. Pokud chcete povolit tisk guestovi, tak nastavit yes.
	guest ok = no

	writable = no

# Umožňuje uživatelům zapisovat požadavky do tiskové fronty. U tiskáren je vhodné nastavit na yes :-)
	printable = yes

[test]
	comment = Pokusné sdílení
	path = /tmp/pokus
	browseable = yes
	writable = yes

# Přinutí uživatele provádět operace jako guest
	public = yes
	only guest = yes

# Skryje soubory začínající tečkou, tak jako by měli skrytý atribut ve Windows.
	hide dot files = yes

	create mode = 0666
	directory mode = 0777
	printable = no

Více informací můžete naleznout v manuálové stránce smb.conf(5).


Spolupráce s doménami NT


Nyní si můžeme ukázat, jak nastavit Sambu aby se stala primárním řadičem domény pro Windows 95/98/NT. Otázka může znít: Proč používat domény? Můžeme zkusit nalézt odpověď.

Při použití pracovní skupiny Windows 95/98 jednoduše akceptují každé uživatlské jméno a heslo, které jim zadáte při logování do systému. Neexistují tady neautorizovaní uživatelé, pokud se nějaký nový uživatel loguje, tak se Windows 95/98 jednoduše zeptají na nové heslo. Windows 95/98 používají heslo jen při přistupování ke sdílení.

Na druhé straně logování do domény se podobá Unixu. Je vyžadováno platné uživatelské jméno a heslo, které se ověřuje proti databázi hesel primárního řadiče domény. Pokud je heslo neplatné, tak je to uživateli okamžitě sděleno a nemůže se přihlásit do domény.

Jsou tu i další výhody. Pokud se jednou úspěšně přihlásíte do domény, tak můžete přistupovat ke všem sdílením v doméně ke kterým máte oprávnění aniž by jste se museli znovu autentifikovat. Přesněji, primární řadič domény vrátí token klientskému počítači, který vám umožní přistupovat ke sdílením aniž by jste se museli znovu dorozumívat s primárním řadičem domény. To mimo jiné vede ke snížení zátěže sítě. Pokud by jste toto chtěli zakázat, tak můžete použít revalidate položku.

Nastavení Samby jako primárního řadiče domény pro Windows 95/98


Jediné co musíte udělat je ujistit se zda:
o Samba je jediný primární řadič domény pro aktuální pracovní skupinu.
o Na síti je WINS server, buď Samba server, nebo Windows NT server.
o Samba používá user-level security. Neměli by jste používat domain-level security, pokud Samba dělá sama sobě primární řadič domény.

Nakonec můžete vložit následující položky do smb.conf:
	workgroup = skupina
	domain logons = yes
	security = user

# os level = 34 zajišťuje, že se Samba stane primárním řadičem domény. Windows 95 používá 1, Windows NT klient používá 17 a Windows NT server 33.
	os level = 34

	local master = yes
	preferred master = yes
	domain master = yes
Poté musíte ještě přidat sdílení s názvem [netlogon] s následujícími parametry:
[netlogon]
	comment = The domain logon service
	path = /usr/local/samba/lib/netlogon
	public = no
	writeable = no
	browsable = no

Nastavení Samby pro Windows NT klienty


Pokud máte Windows NT klienty, tak je tu ještě pár kroků které musíte udělat aby Samba dělala jejich primární řadič domény.

Jako předtím se musíte ujistit, zda Samba je primární řadič domény pro aktuální pracovní skupinu a používá user-level security. Avšak musíte se také ujistit, zda Samba používá šifrovaná hesla:

[global]
	workgroup = skupina
	encrypted passwords = yes
	domain logons = yes
	security = user

Vytvoření důvěrných účtů pro NT klienty


Tento krok je exkluzivní pro Windows NT klienty. Všechny NT klienti, kteří se připojí k primárnímu řadiči domény mohou využívat důvěrných účtů. Tyto účty umožňují stroji se přihlásit k primárnímu řadiči domény, což znamená, že primární řadič domény může věřit veškerým budoucím spojením od uživatelů na daném stroji. Důvěrné účty jsou stejné jako uživatelské. Ve skutečnosti budeme používat standardního Unixového uživatele na emulaci důvěrného účtu pro Samba server.

Název důvěrného účtu stroje je jméno stroje s dolarem ($) nakonci. Například pokud se Windows NT stroj jmenuje chimaera, tak název tohoto účtu bude chimaera$. Počáteční heslo je jméno stroje malými písmeny. Pokud chcete založit důvěrný účet pro Sambu, tak musíte vytvořit Unixový účet s názvem stroje a dolarem na konci, stejně jako položku šifrovaného hesla v smbpasswd databázi.

K vytvoření uživatele pouze potřebujeme modifikovat soubor /etc/passwd. Nemusíme zakládat domovský adresář, ani přiřazovat shell. Proto můžeme uživatele založit třeba takto:

chimaera$:*:1000:900:duverny ucet:/dev/null:/bin/false
Nyní můžeme přidat šifrované heslo použitím smbpasswd:
# smbpasswd -a -m chmaera
Added user chimaera$
Password changed for user chimaera$
Heslo se automaticky nastaví na NetBIOS jméno počítače malými písmeny.

Hesla


Hesla jsou trnem Samby v takové míře, že téměř pokaždé jsou prvním významným problémem který uživatel zaznamená když nainstaluje Sambu.

Hesla zaslaná z individuálních klientů mohou být buď zašifrovaná, nebo nešifrovaná. Zašifrovaná jsou samozřejmě bezpečnější. Nezašifrované heslo může být snadno přečteno např. pomocí tcpdumpu. Jestli se hesla budou posílat šifrovaná záleží na operačním systému který klient používá aby se spojil se Sambou. Tady je přehled některých Windows:

OShesla
Windows 95nešifrovaná
Windows 95 s SMB updatemšifrovaná
Windows 98šifrovaná
Windows NT 4.0 před SP 3nešifrovaná
Windows NT 4.0 po SP 4šifrovaná

V současnosti jsou dva různé způsoby šifrování hesel: jeden pro klienty Windows 95/98, který využívá Microsoft LAN Manager šifrování a druhý pro Windows NT klienty a servery.

Pokud jsou šifrovaná hesla podporována, tak Samba uchovává zašifrované hesla v souboru nazvaném smbpasswd. Současně klienti uchovávají zašifrované verze uživatelských hesel na svém systému. Nezašifrované heslo není nikdy uchováváno na žádném systému. Každý systém šifruje heslo automaticky použitím známého algoritmu když je heslo nastavováno, nebo měněno.

Pokud se chce klient spojit s SMB serverem který podporuje šifrovaná hesla (Samba, Windows NT) podstoupí následující vyjednávání:
o Klient se pokusí dohodnout protokol se serverem.
o Server odpoví pomocí protokolu a indikuje, že podporuje šifrovaná hesla a vrací zpět náhodně generovaný 8-bytový řetězec.
o Klient použije řetězec jako klíč k zašifrování (již zašifrovaného) hesla použitím algoritmu předdefinovaného vyjednaným protokolem. Výsledek vrací serveru.
o Server dělá to samé s heslem uloženým ve své databázi. Pokud se výsledky shodují, hesla jsou stejná a uživatel je autentifikován.

www.samba.org
samba.he.net/using_samba