Samba

Miroslav Prýmek [m.prymek at gmail tecka com]


Obsah


Část 1 - Co je Samba? (Jako kdo se Samba tváří?)

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:

  1. Lokační služba (name resolution) ~ DNS
  2. Procházení sítě (browsing) ~ (nemá klasický Unixový ekvivalent)
  3. Poskytování souborů (sdílení) ~ NFS
  4. Poskytování tiskáren ~ CUPS
  5. Autentizace, autorizace a spol. ("Windows doména") ~ (různá řešení)

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).


Část 2 - Instalace (Pane, pojďte si hrát)

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.


Část 3 - Autentizace/autorizace a la SMB/CIFS (Kdo si bude hrát?)

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).


Část 4 - Konfigurace (Na co si budeme hrát?)

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.

Samba jako prodavač

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

Samba jako policajt

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.

Část 5 - Utility (S čím si budeme hrát?)

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é.

testparm

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

...

smbstatus

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

nmblookup

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> -         B 
        ADMIN2          <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

net

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 ads      to run ADS commands
  net rap      to run RAP (pre-RPC) commands
  net rpc      to run RPC commands

Část 6 - Na co si dát pozor (Jak si nerozbít koleno?)

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.

První rozbité koleno - cache

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).

Druhé rozbité koleno - SID

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...

Pofoukání

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..


Odkazy

[1] http://de5.samba.org/
[2] http://de5.samba.org/samba/docs/SambaIntro.html
[3] http://www.wkpg.org