Ewa Skrenty
Uczelniane Centrum Informatyczne, UMK
W projekcie Samba informacje o koncie użytkownika takie jak nazwa użytkownika, uid, zakodowane hasła LANMAN/NT, flagi, data ustawienia hasła zazwyczaj są przechowywane w zakodowanym pliku smbpasswd. Ograniczenia takiego podejścia (brak możliwości przechowywania dodatkowych atrybutów, trudności w replikowaniu pliku smbpa sswd, konieczność sekwencyjnego wykonywania zapytań) zmusiły twórców projektu do skonstruowania efektywniejszych metod przechowywania atrybutów użytkownika. W niniejszym dokumencie opisany jest sposób wykorzystania protokołu LDAP do przechowywania informacji o koncie użytkownika lub stacji roboczej w Sambie.
W dokumencie jest przedstawiony opis konfiguracji serwera SMB dla Samby-TNG i Samby 2.2.x w oparciu o serwer OpenLDAP 2.0.x (ldap v.3). Informacje dotyczące instalacji serwera OpenLDAP można znaleźć w OpenLDAP 2.0 Administrator's Guide. Przyjmujemy, że serwer OpenLDAP został zainstalowany w katalogu /usr/local/openldap/.
$ cvs -d :pserver:cvs@pserver.samba.org:/cvsroot login
$ CVS password: <cvs>
$ cvs -z3 -d :pserver:cvs@pserver.samba.org:/cvsroot co -r SAMBA_2_2 samba
Źródła pakietu zostaną umieszczone w katalogu samba. Przed konfiguracją i instalacją należy skopiować biblioteki i nagłówki ldap-a w domyślne miejsce np. /usr/lib i /usr/include:
$ cp -p /usr/local/openldap/include/* /usr/include
$ cp -p /usr/local/openldap/lib/* /usr/lib
Instalacja pakietu wymaga wykonania standardowych kroków instalacyjnych. Dodatkowo należy podczas konfiguracji ustawić opcję with-ldapsam, co umożliwi współpracę Samby z LDAP-em. Wykonujemy:
$ ./configure --prefix=/usr/local/samba --with-ldapsam
$ make
$ make install
Poniżej przedstawiona jest przykładowa konfiguracja pliku slapd.conf:
#########################################################
# global configuration directives
#########################################################
include /usr/local/openldap/etc/openldap/schema/core.schema
include /usr/local/openldap/etc/openldap/schema/cosine.schema
include /usr/local/openldap/etc/openldap/schema/nis.schema
include /usr/local/openldap/etc/openldap/schema/inetorgperson.schema
include /usr/local/openldap/etc/openldap/schema/samba.schema
pidfile /usr/local/openldap/var/slapd.pid
argsfile /usr/local/openldap/var/slapd.args
schemacheck on
loglevel 776
#########################################################
# ldbm database definitions
#########################################################
database ldbm
rootdn "cn=root,o=samba,dc=uci,dc=uni,dc=torun,dc=pl"
rootpw secret
suffix "o=samba,dc=uci,dc=uni,dc=torun,dc=pl"
directory /usr/local/openldap/var/openldap-samba
index objectcalass eq
index primaryGroupID,rid,uid,cn eq
index default sub
access to dn=".*,o=samba,dc=uci,dc=uni,dc=torun,dc=pl"
by self write
by * search
Po konfiguracji możemy uruchomić serwer slapd. Wykonujemy
Szczegółowe informacje na temat uruchamiania serwera OpenLDAP można znaleźć w OpenLDAP 2.0 Administrator's Guide.
Na początku wprowadzamy do serwera LDAP trzy podstawowe rekordy:
dn: o=samba,dc=uci,dc=uni,dc=torun,dc=pl
o: samba
objectClass: organization
# Administrator, samba, umk, pl
dn: uid=Administrator, o=samba,dc=uci,dc=uni,dc=torun,dc=pl
objectClass: sambaAccount
uid: Administrator
primaryGroupID: 508
rid: 508
lmPassword: F0D412BD764FFE81AAD3B435B51404EE
ntPassword: 209C6174DA490CAEB422F3FA5A7AE634
pwdLastSet: 0
pwdMustChange: 0
pwdCanChange: 0
logonTime: 0
logoffTime: 0
kickoffTime: 0
acctFlags: [U ]
# nobody, samba, umk, pl
dn: uid=nobody, o=samba,dc=uci,dc=uni,dc=torun,dc=pl
objectClass: sambaAccount
uid: nobody
primaryGroupID: 99
rid: 99
lmPassword: NO PASSWORDXXXXXXXXXXXXXXXXXXXXX
ntPassword: NO PASSWORDXXXXXXXXXXXXXXXXXXXXX
pwdLastSet: 0
pwdMustChange: 0
pwdCanChange: 0
logonTime: 0
logoffTime: 0
kickoffTime: 0
acctFlags: [NU ]
Powyższe dane umieszczamy w pliku dane.ldif i wprowadzamy do serwera LDAP za pomocą komendy
Wszystkie dodawane konta muszą mieć swoje wpisy w /etc/passwd i /etc/group. Jeżeli nie istnieje w systemie konto Administratora, należy je najpierw utworzyć.
LmPassword i ntPassword są zakodowanymi hasłami reprezentowanymi w postaci hexadecymalnej. Muszą zgadzać się z hasłem użytkownika w systemie. Do tworzenia haseł lmPassword i ntPassword można użyć narzędzia mkntpwd oraz poniższego skryptu:
#!/usr/bin/perl
system "stty -echo";
print "Podaj haslo:";
chomp($haslo=<STDIN>);
print "\n";
system "stty echo";
$ntpwd = `/usr/local/sbin/mkntpwd '$haslo'`;
$lmpassword = substr($ntpwd, 0, index($ntpwd, ':'));
chomp $lmpassword;
$ntpassword = substr($ntpwd, index($ntpwd, ':')+1);
chomp $ntpassword;
print "LmPassword: " ,$lmpassword , "\nNtPassword: ", $ntpassword, "\n";
W katalogu /usr/local/samba/lib/ tworzymy plik smb.conf i definiujemy w nim parametry konfiguracyjne Samby. Po dodaniu przy kompilacji opcji --with-ldapsam, dostępne są dodatkowe parametry dotyczące współpracy z serwerem LDAP:
ldap server | - określa nazwę hosta, na którym jest uruchomiony serwer LDAP |
ldap admin dn | - określa DN, za pomocą którego serwer Samby będzie łączył się z serwerem LDAP |
ldap suffix | - określa bazowy DN, jaki będzie przeszukiwany |
ldap port | - definiuje port, na którym odbywać się będzie komunikacja z serwerem LDAP |
ldap filter | - określa filtr używany przy przeszukiwaniu bazy LDAP |
ldap ssl | - określa, czy komunikacja z serwerem LDAP ma się odbywać za pomocą protokołu SSL |
Najczęściej wystarczy zdefiniować pierwsze cztery paramerty. Parametr ldap filter można pozostawić przy domyślnej wartości. Przeszukiwane są wówczas obiekty klasy sambaAccount według atrybutu uid. W przypadku, gdy komunikacja z serwerem LDAP ma odbywać się bez pośrednictwa protokołu SSL, ustawić trzeba parametr ldap ssl = off (domyślnie obsługa SSL jest włączona).
Oto przykładowa konfiguracja pliku smb.conf:
[global]
ldap suffix = "o=samba,dc=uci,dc=uni,dc=torun,dc=pl"
ldap admin dn = "cn=root,dc=uci,dc=uni,dc=torun,dc=pl"
ldap server = efa.uci.uni.torun.pl
ldap port = 389
ldap ssl = off
workgroup = UCI
netbios name = efa
comment = Linux RedHat Samba Server
security = user
null passwords = Yes
encrypt passwords = yes
logon drive = U:
domain master = yes
domain logons = yes
preferred master = yes
os level = 255
wins support = yes
wins proxy = yes
time offset = 60
time server = True
log file = /usr/local/samba/logs
public = No
browseable = No
writable = No
[homes]
comment = Katalogi domowe
path = /home/%u
read only = no
create mode = 0700
browseable = yes
[netlogon]
path = /usr/local/samba/netlogon
locking = no
writeable = no
guest ok = no
browseable = yes
[profiles]
path = /usr/local/samba/profiles
writeable = no
guest ok = yes
browseable = yes
create mode 0777
Przed uruchomieniem serwera należy ustawić w Sambie hasło administratora (admin dn), za pomocą którego będzie możliwa komunikacja serwerem slapd. Musi to być to samo hasło jakie ustawione jest w parametrze rootpw w pliku slapd.conf. Hasło administratora w Sambie przechowywane jest w pliku secrets.tdb w katalogu /usr/local/samba/private. Ustawiamy je uruchamiając program smbpasswd z opcją -w:
$ /usr/local/samba/bin/smbpasswd -w <haslo>
Tworzymy jeszcze brakujące katalogi:
$ cd /usr/local/samba/
$ mkdir var/locks
$ mkdir profiles
$ mkdir netlogon
$ chmod 755 var/locks
$ chmod 755 profiles
$ chmod 755 netlogon
i startujemy demony serwera SMB:
$ ./sbin/smbd -D
$ ./sbin/nmbd -D
gdzie opcja -D 256 oznacza poziom debugowania.
Dla przykładu utworzymy w Sambie konto użytkownika efa:
$ /usr/local/samba/bin/smbpasswd -a efa -D 256
New SMB password: <haslo>
Retype new SMB password: <haslo>
LDAP search "(&(uid=efa)(objectclass=sambaAccount))" returned 0 entries.
Added user efa.
Wykonując komendę:
$ /usr/local/openldap/bin/ldapsearch -b "o=samba,dc=uni,dc=torun,dc=pl" -D "cn=root,o=samba,dc=uni,dc=torun,dc=pl" -W "uid=efa"
możemy zobaczyć, jakie dane nowego konta zostały umieszczone w bazie LDAP:
#
# filter: uid=efa
# requesting: ALL
#
# efa, samba, umk, pl
dn: uid=efa,o=samba,dc=uci,dc=uni,dc=torun, dc=pl
uid: efa
pwdLastSet: 1015313324
logonTime: 0
logoffTime: 2147483647
kickoffTime: 2147483647
pwdCanChange: 0
pwdMustChange: 2147483647
displayName: Ewa Skrenty
cn: Ewa Skrenty
rid: 2000
primaryGroupID: 2001
lmPassword: 56ADA603D6D3F48EAAD3B435B51404EE
ntPassword: E61A5D8E9B8D5DAAA21F74A97D82FEB6
acctFlags: [UX ]
objectClass: sambaAccount
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
Należy pamiętać, że przy tworzeniu konta stacji roboczej nazwa komputera musi być zakończona znakiem "$", zarówno przy tworzeniu konta w Sambie jaki i w systemie.
Może się okazać, że wartości domyślne niektórych atrybutów nie są zgodne z naszymi oczekiwaniami, bądź chcelibyśmy ustawić dla poszczególnych kont nowe atrybuty. Należy wówczas utworzyć plik ldif zawierający potrzebne dane i wykonać komendę ldapmodify. Dla przykładu zmodyfikujemy konto użytkownika efa dodając atrybut scriptPath, profilePath, oraz wyłączymy konieczność zmiany hasła przy pierwszym logowaniu. Warto zwrócić uwage na fakt, iż wartości parametrów zdefiniowanych w pliku smb.conf są przysłaniane wartościami przechowywanymi w bazie LDAP.
Tworzymy plik modyf.ldif zawierający dane:
dn: uid=efa,o=samba,dc=uci,dc=uni,dc=torun,dc=pl
changetype: modify
replace: profilePath
profilePath: \\%N\profiles\%u
-
replace: scriptPath
scriptPath: script.bat
-
replace: pwdMustChange
pwdMustChange: 0
i wykonujemy
$ /usr/local/openldap/bin/ldapmodify -D "cn=root,o=samba,dc=uci,dc=uni,dc=torun,dc=pl" -W -f modyf.ldif
$ cvs -d :pserver:anoncvs@anoncvs.dcerpc.org:/home/cvsroot login
$ CVS password: <anoncvs>
$ cvs -z3 -d :pserver:anoncvs@anoncvs.dcerpc.org:/home/cvsroot co tng
Źródła pakietu zostaną umieszczone w katalogu tng.
Przed konfiguracją i instalacją należy skopiować biblioteki i nagłówki
ldap-a w domyślne miejsce np. /usr/lib i /usr/include:
$ cp -p /usr/local/openldap/include/* /usr/include
$ cp -p /usr/local/openldap/lib/* /usr/lib
Instalacja Samby wymaga wykonania kilku komend. Najpierw należy wygenerować brakujące pliki:
$ cd ./tng/source
$ ./autogen.sh
a następnie wykonać standardowe kroki instalacyjne. Konieczne jest ustawienie opcji with-ldap, co umożliwi współpracę Samby z LDAP-em. Katalog, w którym pakiet zostanie zainstalowany oczywiście mozna wybrać dowolny. W naszym przykładzie będzie to /usr/local/samba-tng. Wykonujemy:
$ ./configure --prefix=/usr/local/samba-tng --with-ldap
$ make
$ make install
$ cp ./tng/sources/ldap/sambatng.schema-v3 /usr/local/openldap/etc/openldap/schema/samba-tng.schema
a następnie zmodyfikować plik slapd.conf. Klasy obiektów definiowane w samba.schema korzystają z atrybutów definiowanych w schemacie nis.schema, dlatego również i ten schemat należy dołączyć. Poniżej przedstawiona jest przykładowa konfiguracja:
#########################################################
# global configuration directives
#########################################################
include /usr/local/openldap/etc/openldap/schema/core.schema
include /usr/local/openldap/etc/openldap/schema/cosine.schema
include /usr/local/openldap/etc/openldap/schema/nis.schema
include /usr/local/openldap/etc/openldap/schema/samba-tng.schema
pidfile /usr/local/openldap/var/slapd.pid
argsfile /usr/local/openldap/var/slapd.args
schemacheck on
loglevel 776
#########################################################
# ldbm database definitions
#########################################################
database ldbm
rootdn "id=root,o=samba,dc=uci,dc=uni,dc=torun,dc=pl"
rootpw secret
suffix "o=samba,dc=uci,dc=uni,dc=torun,dc=pl"
directory /usr/local/openldap/var/openldap-tng
index objectcalass eq
index sn,cn,uid pres,sub,eq
index default sub
access to dn=".*,o=samba,dc=uci,dc=uni,dc=torun,dc=pl"
by self write
by * search
Po konfiguracji możemy uruchomić serwer slapd:
dn: o=samba,dc=uci,dc=uni,dc=torun,dc=pl
o: samba
objectClass: organization
dn: id=root, o=samba, dc=uci,dc=uni,dc=torun, dc=pl
id: root
objectClass: sambaConfig
nextrid: 3ed
dn: uid=Administrator, o=samba,dc=uci,dc=uni,dc=torun,dc=pl
objectClass: sambaAccount
uid: Administrator
lmPassword: F0D412BD764FFE81AAD3B435B51404EE
ntPassword: 209C6174DA490CAEB422F3FA5A7AE634
pwdLastSet: 3982F885
grouprid: 508
pwdMustChange: ffffffff
ntuid: Administrator
acctFlags: [U ]
uidNumber: 508
rid: 1f4
dn: uid=nobody, o=samba,dc=uci,dc=uni,dc=torun,dc=pl
objectClass: sambaAccount
uid: nobody
uidNumber: 99
ntuid: nobody
rid: 1f5
pwdLastSet: 39856D06
acctFlags: [NU ]
lmPassword: NO PASSWORDXXXXXXXXXXXXXXXXXXXXX
ntPassword: NO PASSWORDXXXXXXXXXXXXXXXXXXXXX
Powyższe dane umieszczamy w pliku dane.ldif i wykonujemy
Podstawowym obiektem utrzymywanym w bazie LDAP jest obiekt klasy SambaAccount. Część atrybutów tej klasy została opisana w punkcie 1.3. Dodatkowo w Sambie TNG obiekt tej klasy może zawierać atrybut gidNumber umożliwiający przypisanie użytkownika do określonej grupy użytkowników. Umieszczanie w bazie rekordu uid=root nie jest zazwyczaj konieczne, w przypadku Samby TNG jest niezbędne do utrzymywania wartości nextrid. Wartości takie jak uidNumber, gidNumber pochodzą bezpośrednio z pliku /etc/passwd. Należy wcześniej upewnić się, że w systemie istnieje konto Administratora, jak i innych dodawanych użytkowników. Hasła lmPassword i ntPassword są 16-bajtowymi ciągami znaków reprezentowanymi w postaci hexadecymalnej. Sposób ich generowania jest opisany w punkcie 1.3.
$ cd /usr/local/samba-tng/
$ mkdir private
$ chmod 700 private
$ mkdir -p profiles
$ mkdir -p netlogon
W katalogu /usr/local/samba-tng/private należy utworzyć plik ldappasswd i umieścić w nim hasło,
które będzie uzywane do łączenia się z serwerem LDAP (rootpw z pliku konfiguracyjnego slapd.conf).
Następnie tworzymy plik smb.conf w katalogu /usr/local/samba-tng/lib/,
który należy odpowiednio skonfigurować. Z dystrybucją Samby w katalogu examples
jest dostarczony przykładowy plik konfiguracyjny. Wystarczy go skopiować do
/usr/local/samba-tng/lib/smb.conf i zmodyfikować, bądź utworzyć własnoręcznie.
Część dotycząca serwera LDAP umieszczamy w sekcji [global]. Potrzebne będzie określenie następujących parametrów:
ldap server | określa nazwę hosta, na którym jest uruchomiony serwer LDAP |
ldap bind as | określa DN za pomocą którego serwer Samby będzie łączył się z serwerem LDAP |
ldap suffix | określa bazowy DN używany do przeszukiwania bazy LDAP |
ldap scope | określa zakres przeszukiwania bazy LDAP (możliwe wartości: base, one, sub) możemy pozostawić przy domyślnej wartości one. |
Oto przykładowa konfiguracja pliku smb.conf
[global]
ldap suffix = "o=samba,dc=uci,dc=uni,dc=torun,dc=pl"
ldap bind as = "id=root,dc=uci,dc=uni,dc=torun,dc=pl"
ldap passwd file = /usr/local/samba-tng/private/ldappasswd
ldap server = efa.uci.uni.torun.pl
ldap port = 389
workgroup = UCI
netbios name = efa
comment = Linux RedHat Samba Server
security = user
null passwords = Yes
encrypt passwords = yes
logon drive = U:
domain master = yes
domain logons = yes
preferred master = yes
os level = 255
wins support = yes
wins proxy = yes
time offset = 60
time server = True
log file = /usr/local/samba-tng/logs
public = No
browseable = No
writeable = No
[homes]
comment = Katalogi domowe
path = /home/%u
read only = no
create mode = 0700
browseable = yes
[netlogon]
path = /usr/local/samba-tng/netlogon
locking = no
writeable = no
guest ok = no
browseable = yes
[profiles]
path = /usr/local/samba-tng/profiles
writeable = no
guest ok = yes
browseable = yes
create mode = 0777
Do uruchomienia serwera potrzebne jest wystartowanie demonów, znajdujących się w /usr/local/samba-tng/sbin. Warto wcześniej zapoznać się z działaniem każdego z demonów i uruchomić te, które są potrzebne. Ich opis znajduje się w manualu dostępnym w pakiecie. W naszym przypadku uruchamiamy następujące demony:
$ /usr/local/etc/samba_tng/sbin/smbd -d 3
$ /usr/local/etc/samba_tng/sbin/nmbd -d 3
$ /usr/local/etc/samba_tng/sbin/srvsvcd
$ /usr/local/etc/samba_tng/sbin/wkssvcd
$ /usr/local/etc/samba_tng/sbin/lsarpcd
$ /usr/local/etc/samba_tng/sbin/samrd
$ /usr/local/etc/samba_tng/sbin/netlogond
$ /usr/local/etc/samba_tng/sbin/browserd
Możemy sprawdzić czy poprawnie skonfigurowaliśmy serwer Samby
$ /usr/local/samba-tng/bin/smbclient -L efa.uci.uni.torun.pl
Po uruchomieniu powyższej komendy powinniśmy otrzymać listę zasobów dostępnych na serwerze. Jeżeli pojawił się błąd to albo niepoprawnie skonfigurowaliśmy serwer lub jeden z potrzebnych demonów nie został wystartowany. Warto prześledzić plik /usr/local/samba-tng/logs zawierający komunikaty wysyłane przez serwer Samby.
Narzędzia samedit można użyć również w sposób interaktywny. Najpierw logujemy się jako root:
$ /usr/local/samba-tng/bin/samedit -S . -U root
added interface ip=158.75.1.50 bcast=158.75.1.127 nmask=255.255.255.128
następnie możemy załoyć konto użytkownikowi efa:
[root@.]$ createuser efa -p
SAM Create Domain User
Domain: UCI Name: efa ACB: [U ]
Create Domain User: OK
Po uruchomieniu komendy:
[root@.]$ enumusers
otrzymamy listę utworzonych użytkowników i stacji.
Atrybuty poszczególnych kont możemy dostosować do własnych potrzeb modyfikując je lub dodawać nowe. Tworzymy wówczas plik ldif zawierający nowe dane i dodajemy je do serwera za pomocą ldapmodify. Atrybuty przechowywane w bazie LDAP przysłonią wówczas parametry definiowane w pliku konfiguracyjnym Samby dla danego konta.
W obrębie domeny użytkowników lub stacje robocze możemy przypisywać do określonych grup, co pozwala na manipulowanie uprawnieniami kont. Grupy mogą być przechowywane w bazie LDAP jako obiekty klasy sambaGroup, sambaBuiltin oraz sambaAlias. Za pomocą tych obiektów możemy zaimplementować w bazie LDAP konfigurację takich parametrów jak local group map, domain user map oraz domain group map. Grupy możemy tworzyć ręcznie umieszczając dane w pliku ldif i dodając do bazy komendą ldapmodify. Przykładowy plik grupa.ldif może mieć postać:
dn: dn=Administratorzy Domeny,o=samba,dc=uci,dc=uni,dc=torun,dc=pl
cn: Administratorzy Domeny
objectClass: sambaGroup
sambaMember: Administrator,1f4,1
sambaMember: efa,3ed,1
ntuid: Administratorzy Domeny
rid: 200
Po dodaniu pliku do bazy LDAP zostanie utworzona grupa "Administratorzy Domeny" do której należą użytkownicy Administrator i efa. Należy jeszcze zmodyfikować konto użytkownika efa zastępując wartość atrybutu grouprid wartością rid grupy oraz gidNumber wartością gid konta Administratora w systemie.
Powyższe operacje można wykonywać również za pomocą narzędzia samedit. Służą do tego funkcje addgroupmem, creategroup, addaliasmem, createalias. Niestety nie wszystkie funkcje programu samedit są jeszcze w pełni funkcjonalne, dlatego większość operacji należy wykonywać ręcznie.
Źródła
Ignacio Coupeau, SambaTNG-PDC
LDAP
Ignacio Coupeau, Samba-PDC LDAP
v.3
Samba Project
Documentation