Samba je Open Source/Free Software kolekce nástrojů, která poskytuje služby
sdílení souborů a tisku pomocí SMB (včetně Microsoftích doplňků - "CIFS").
"Samba se tváří jako Windows server."
Samba is "Opening Windows to a Wider World". [1] :)
Protokol SMB byl vynalezen v laboratořích IBM (pro OS DOS), ale do dnešní doby prodělal mnoho změn (CIFS,Microsoft). Původně měl běžet nad dnes téměř neznámými protokoly a službami:
NetBIOS byl tedy navržen pro nepropojené malé sítě (LAN), což jeho použití v dnešních podmínkách poněkud komplikuje.
Základní prvky celé sady jsou:
Sdílení a tiskové služby jsou v Sambě poskytovány pomocí démona smbd. Tento démon také obsluhuje jednoduché způsoby autentizace/autorizace ("share" mód a "user" mód).
Lokace a browsing jsou řešeny démonem nmbd. Existují dva způsoby hledání prostředků v síti. První z nich používá metodu z původního NetBIOSu - vyšle broadcast s dotazem "Kde je Erigona?" na který Erigona odpoví: "Jsem na 10.0.0.1". Tento způsob se samozřejmě hodí spíše pro malé sítě (problém lokálnosti broadcastů, traffic).
Druhým způsobem je použítí mechanismu jmenné služby/registrátora. SMB používá NBNS (NetBIOS Name Service), ale Windows jej nazývají WINS (Windows Internet Name Service - proč "Internet"?!). Stroj se ke svému jménu přihlásí registrátorovi: "Jsem Erigona, hledej mě na adrese 10.0.0.1". Při vyhledávání jmen se potom stroje obrací na registrátora. Výhodou je, že NBNS server může být stejný pro různé LAN, takže (alespoň teoreticky :) je možné zprovoznit vyhledávání i mezi více LANs.
Hlavní rozdíl NBNS oproti DNS je v dynamičnosti a možnosti autentizace. Problémy mohou být ohledně konfliktu jmen.
Poslední službou je browsing. Jedná se o službu, která udržuje seznam služeb dostupných v síti. "Local Master Browser" (LMB, stroj udržující a poskytující seznam služeb dané LAN) je určen na základě negociace - jednotlivé stroje se nabídnou, že chtějí tuto službu zastávat a ten, kdo volby vyhraje se stává lokálním browserem.
Kromě toho existuje také "Domain Master Browser", který udržuje seznam služeb pro celou doménu (tedy případně i mezi různými LAN) pomocí synchronizace s jednotlivými LMB. Samba umí zastávat obě role. Ve Windows se seznam služeb zobrazuje pod "Okolní počítače" (Network Neighbourhood).
Velkou nevýhodou mechanismu browsingu je problém aktuálnosti seznamu a jeho cacheování. V seznamu tak mohou zůstávat prostředky, které už neexistují, změnila se jejich přístupová práva, apod. nebo naopak seznam neobsahuje služby, které se v síti nově objevily. Seznam je obnovován v pravidelných časových intervalech, které mohou být nedostatečné (podle [2] může trvat více než hodinu než se synchronizují údaje mezi vzdálenými LANs. Bohužel jsem neměl možnost tento údaj ověřit, zdá se mi poněkud nadsazený).
Samba obsahuje také klienta pro "adresářové" služby - winbindd. Ten může být např. použit k autentizaci oproti Windows serveru v rámci PAM (pam_winbind).
Samba existuje v drtivé většině distribucí jako připravený balíček. Rekompilace většinou není potřeba, kromě případů požadavků méně obvyklých vlastností, které v předkompilovaném balíčku nejsou. Těmito vlastnostmi může být např.:
Vlastnost | Volba configure |
Podpora LDAP | --with-ldap (default yes) |
Kerberos 5 | --with-krb5=base-dir (default=/usr) |
Podpora ACL | --with-acl-support (default=no) |
Podpora PAM | --with-pam (default=no) |
Podpora PAM autentizace oproti passdb | --with-pam_smbpass (default=no) |
Podpora kvót | --with-quotas (default=no), --with-sys-quotas (default=auto) |
Podpora clusterování | --with-cluster-support (default=no) |
Winbind (viz výše) | --with-winbind (default, if supported by OS -- Linux ano) |
V OpenSuSE 10.1 je například z těchto voleb použito:
--with-acl-support
--with-pam
--with-pam_smbpass
--with-quotas
--with-winbind
...takže pokud nechceme clusterovat, máme vše.
Pro zabezpečení přístupu ke sdíleným prostředkům existuje pět módů. Než se pustíme do konfigurace, je dobré jejich princip pochopit.
Share mode chrání sdílený prostředek (jedním) heslem. Klient musí toto heslo znát.
User mode - autentizace na základě loginu a hesla.
Domain mode - autentizace na základě loginu a hesla oproti doménovému serveru (domain controller, typicky NT PDC). Všechna "přihlášení do domény" (včetně Samba DC) umožňují SSO (single sign on) na základě tokenů. Doménu tvoří počítače hlásící se k jednomu doménovému serveru.
Server mode - podobné jako předchozí. Nedoporučovaný mód, ponechaný ze Samby 2.
ADC mode - autentizace proti serveru s Active Directory (Microsoftí obdoba LDAP).
Od způsobů autentizace se odvíjí role, které Samba může v SMB síti zastávat. Jelikož způsob konfigurace globální sekce se od těchto scénářů odvíjí, podíváme se na ni podle nich.
V tomto scénáři chceme po sambě pouze aby SMB klientům poskytovala soubory a tiskárny. Jelikož "share mode" autentizaci musíme považovat za nebezpečnou nebo alespoň nepraktickou, nebudeme ji vůbec používat. Použijeme "user" mód.
[global] workgroup = lab netbios name = prodavac # security mode security = user # tisk printing = cups # logovani log level = 2 # backend pro hesla passdb backend = smbpasswd # omezeni pristupu podle IP hosts allow = 192.168.2.0/24 127.0.0.1 hosts deny = 0.0.0.0/0 interfaces = 192.168.2.254/24 # tunning socket options = TCP_NODELAY IPTOS_LOWDELAY SO_RCVBUF=8192 SO_SNDBUF=8192 username map = /etc/samba/smbusers # soubor definujici sdileni include = /etc/samba/shares.conf
Soubor shares.conf obsahuje např.:
[printers] comment = SMB Print Spool path = /var/spool/samba # ! printable = Yes guest ok = Yes use client driver = Yes browseable = No [share] comment = Moje sdileni path = /var/lib/samba/usershares/share # clenove skupiny users valid users = @users browseable = yes public = no writable = yes printable = no create mask = 0774
Ve druhém scénáři budeme Sambu používat jako PDC. Chceme, aby hesla byla uložena v LDAPu a aby Samba obsluhovala všechny služby v síti. Každý uživatel má svůj domovský adresář, který se mountuje jako H: a cestovní profil.
K zlepšení spolupráce Samby s LDAPem použijeme balíček od IDEALX (v SuSE smbldap-tools). Uvedeme jen řádky, které se oproti předchozí konfiguraci změnily.
# kam ulozit hesla? jine mozne backendy: guest, tdbsam, smbpasswd, plaintext (passwd) passdb backend = ldapsam:ldap://127.0.0.1 # IDEALX skripty add user script = /usr/sbin/smbldap-useradd -m "%u" delete user script = /usr/sbin/smbldap-userdel "%u" add machine script = /usr/sbin/smbldap-useradd -t 0 -w "%u" add group script = /usr/sbin/smbldap-groupadd -p "%g" delete group script = /usr/sbin/smbldap-groupdel "%g" add user to group script = /usr/sbin/smbldap-groupmod -m "%u" "%g" delete user from group script = /usr/sbin/smbldap-groupmod -x "%u" "%g" set primary group script = /usr/sbin/smbldap-usermod -g '%g' '%u' passwd program = /usr/sbin/smbldap-passwd -u %u # chceme byt domenovy radic, browser, time a wins server domain logons = Yes local master = Yes os level = 99 domain master = Yes preferred master = Yes time server = yes wins support = yes ## skripty po prihlaseni (spousteny s pravy uzivatele!) # batch podle stroje ; logon script = %m.bat # batch podle uzivatele logon script = %U.bat # batch pro vsechny logon script = vsichni.bat # profily a home logon path = \\%L\Profiles\%U logon home = \\%L\%U logon drive = H: # LDAP ldap admin dn = cn=Manager,dc=domena,dc=cz ldap delete dn = No ;ldap filter = (uid=%u) ldap group suffix = ou=Groups ldap idmap suffix = ou=Idmap ldap machine suffix = ou=Computers ldap passwd sync = Yes ;ldap replication sleep = 1000 ;ldap ssl = Start_tls ldap suffix = dc=domena,dc=cz ldap timeout = 5 ldap user suffix = ou=People
Do sdílení musíme přidat adresář s profily, domácími adresáři a logon skripty.
[homes] comment = Home Directories path = %H/smbhome valid users = %S # uzivatel, ktery muze vse admin users = administrator read only = No create mask = 0664 browseable = No ;follow symlinks = yes [netlogon] comment = Network Logon Service path = /var/lib/samba/netlogon guest ok = Yes share modes = No [Profiles] comment = Users profiles path = /var/lib/samba/Profiles read only = No create mask = 0600 directory mask = 0700 browseable = No
V této konfiguraci bude jako domácí adresář (H:) přimountován $HOME/smbhome a jako cestovní profil bude použit /var/lib/samba/Profiles/username. Logon batch vsichni.bat by měl být umístěn v /var/lib/samba/netlogon/vsichni.bat
Pozor! Adresáře s domácími adresáři a s profily by měly být oddělené, jinak může dojít k problémům.
Pozor2! Samba musí znát heslo, pomocí kterého se může připojit k patřičně oprávněnému účtu LDAPu. Heslo zadáme pomocí:
# password -w strasnetajneheslo
Heslo je uloženo do secrets.tdb. Tato hodnota je v databázi klíčována pomocí DN účtu. Jestliže se tedy DN změní, je potřeba znovu zadat i heslo.
Se záznamy v LDAPu se lehce pracuje a mnohem jednodušší je i dávkové zpracování nejrůznějších správcovských úkolů. Podívejme se např. jak vypadají záznamy pro doménu, uživatele a skupinu (všechny záznamy jsou kráceny a citlivá data jsou pozměněna):
dn: sambaDomainName=nejaka,dc=domena,dc=cz objectClass: sambaUnixIdPool objectClass: sambaDomain uidNumber: 1000 gidNumber: 1000 sambaDomainName:: FFfvSa== sambaSID: S-1-5-21-1466517791-3619171566-2957044956 dn: uid=prymek,ou=administrativa,ou=people,dc=domena,dc=cz sambaPrimaryGroupSID: S-1-5-21-1466517791-3619171566-2957044956-2277 displayName: Prymek Miroslav sprava spravce objectClass: sambaSamAccount shadowLastChange: 12699 uid: prymek mail: prymek@domena.cz uidNumber: 596 cn: Prymek Miroslav sprava spravce sambaAcctFlags: [U ] loginShell: /bin/bash gidNumber: 638 sambaPwdMustChange: 2147483647 gecos: Prymek Miroslav sprava spravce sambaSID: S-1-5-21-1466517791-3619171566-2957044956-2276 homeDirectory: /home/prymek sambaPasswordHistory: 00000000000000000000000000000000000000000000000000000000 00000000 sambaPwdCanChange: 1163158639 sambaLMPassword: E81EE3836C729BD3AAD3B435B51404EE sambaNTPassword: 8039375C9DA8322EEEF1C4B1541A58A7 sambaPwdLastSet: 1163158639 dn: cn=Administrators,ou=Groups,dc=domena,dc=cz objectClass: posixGroup objectClass: sambaGroupMapping gidNumber: 544 cn: Administrators description: Netbios Domain Members can fully administer the computer/sambaDom ainName sambaSID: S-1-5-32-544 sambaGroupType: 5 displayName: Administrators structuralObjectClass: posixGroup
Zde stojí za povšimnutí především záznamy SID. LDAP je umožňuje nejen přehledně kontrolovat, ale i snadno měnit.
Samba obsahuje několik užitečných utilit, které se nám při správě domény budou hodit a které poskytují detailní výpisy (narozdíl od podobných nástrojů ve Windows). Jejich detailní popis je samozřejmě nad rámec tohoto textu. Představíme si jen některé.
Velmi užitečná utilita, která projde konfigurační soubor Samby, upozorní na možné problémy a vypíše konfigurační soubor očištěný od nepotřebných voleb.
# testparm Load smb config files from /etc/samba/smb.conf Processing section "[homes]" Processing section "[netlogon]" Processing section "[Profiles]" Processing section "[install]" Processing section "[utils]" Processing section "[socs]" Loaded services file OK. WARNING: passdb expand explicit = yes is deprecated WARNING: You have some share names that are longer than 12 characters. These may not be accessible to some older clients. (Eg. Windows9x, WindowsMe, and smbclient prior to Samba 3.0.) Server role: ROLE_DOMAIN_PDC Press enter to see a dump of your service definitions [homes] comment = Home Directories path = %H/smbhome valid users = %S admin users = administrator read only = No create mask = 0664 browseable = No ...
Tato utilita nám podá přehled o tom, jaká má server sdílení, jaké procesy jsou pod Sambou spuštěny a jaké služby plní a konečně také jestli mají uživatelé zamčeny nějaké soubory.
portal:/etc/samba # smbstatus Processing section "[homes]" Processing section "[netlogon]" Processing section "[Profiles]" Processing section "[install]" Processing section "[utils]" Processing section "[socs]" Processing section "[strava]" Processing section "[kuchyn]" Processing section "[public]" Samba version 3.0.22-13.18-SUSE-CODE10 PID Username Group Machine ------------------------------------------------------------------- 25306 karaskova 543 odd2 (192.168.2.22) Service pid machine Connected at ------------------------------------------------------- karaskova 25306 odd2 Tue Nov 14 13:16:02 2006 IPC$ 31263 admin2 Fri Nov 10 13:49:57 2006 utils 25306 odd2 Tue Nov 14 14:12:13 2006 utils 25306 odd2 Tue Nov 14 14:12:13 2006 IPC$ 31263 admin2 Thu Nov 9 14:55:30 2006 karaskova 25306 odd2 Tue Nov 14 13:15:54 2006 netlogon 25306 odd2 Tue Nov 14 13:15:55 2006 No locked files
Tato utilita nám vypíše všechny stroje v SMB síti. Obzvlášť užitečná je volba -S, která vypisuje všechna jména strojů. Můžeme tedy podle nich např. poznat, který stroj je právě lokální browser.
r2at189:/var/log/samba # nmblookup -S Admin2 querying Admin2 on 62.245.109.255 querying Admin2 on 192.168.231.255 querying Admin2 on 172.16.100.255 172.16.100.128 Admin2<00> Looking up status of 172.16.100.128 ADMIN2 <00> - BADMIN2 <03> - B MIRUSNET <00> - B ADMINISTRATOR <03> - B MIRUSNET <1e> - B ADMIN2 <20> - B MIRUSNET <1d> - B ..__MSBROWSE__. <01> - B MAC Address = 00-0C-XX-YY-ZZ-AA
Na konec jsem si nechal utilitku, o které by se dala napsat ne malá brožurka. Je inspirována stejnojmenným prográmkem z Windows, ale v mnohém jej předčí. Popis by byl velmi dlouhý, uveďme tedy jen ilustrativní přehled příkazů.
net time to view or set time information net lookup to lookup host name or ip address net user to manage users net group to manage groups net groupmap to manage group mappings net idmap to manage the idmap id mappings net join to join a domain net cache to operate on cache tdb file net getlocalsid [NAME] to get the SID for local name net setlocalsid SID to set the local domain SID net changesecretpw to change the machine password in the local secrets database only this requires the -f flag as a safety barrier net status Show server status net usersidlist to get a list of all users with their SIDs net adsto run ADS commands net rap to run RAP (pre-RPC) commands net rpc to run RPC commands
Protokol SMB je, jak již bylo řečeno, zatížen historickými vlastnostmi, které jeho správu poněkud ztěžují. Dalším problematickým rysem je také jeho dynamičnost a tím nutně i občasná nesynchronizovanost údajů. Vše navíc komplikuje velmi slabé logování na straně Windows (mnohý správce si již trhal vlasy, když mu Windows milosrdně napsaly něco ve smyslu "Nebylo možno přihlásit uživatele. Obraťte se na správce"). Místo závěru uvedu jen dvě věci, o kterých z praxe vím, že mohou způsobit mnoho problému a že je radno jim věnovat pozornost.
Velká většina údajů přenášených pomocí SMB je cacheována. Bohužel např. i včetně přihlašovacích údajů (credentials). Může se tak například stát, že v seznamu strojů v sítí je nebo není stroj, který tam ve skutečnsti naopak není nebo je.
Specielně je třeba si dát pozor na cacheování cestovních profilů. Jestliže dojde k přerušení kontaktu se serverem, nemusí to správce vůbec zjistit, protože uživatelé se dál mohou přihlásit úplně stejně. (malé varovné okýnko samozřejmě potvrdí a správci nic neřeknou).
Autentizace na Windows je řešena pomocí tajemných čísel SID, které se na Windows nedají žádným jednoduchým způsobem přehledně zjistit. Doménoví uživatelé mají SID relativní k SID domény. Jestliže např. při reinstalaci serveru SID nezachováte (viz net getlocalsid ), začnou se dít skutečně zajímavé věci (v kombinaci s první bolístkou) - uživatelé se totiž mohou přihlásit, ale nedostanou se k žádným sdílením, protože jejich SID je k přístupu neopravňuje...
Nakonec dobrá zpráva: pro Sambu existuje mnoho nástrojů, které správu Windows ještě výrazně zjednodušují a Samba se tak přibližuje Windows Serveru s Active Directory. Příkladem může být nejen již zmíněná sada skriptů IDEALX, ale i nástroj pro automatickou instalaci aplikací WPKG [3] nebo utilitky Samby pro práci s vyloženě Microsoftími daty: eventlogadm, profiles apod..
[1] http://de5.samba.org/
[2] http://de5.samba.org/samba/docs/SambaIntro.html
[3] http://www.wkpg.org