Potrzebne paczki

  • openldap
  • openldap-backend-bdb
  • openldap-backend-passwd
  • openldap-libs
  • openldap-migration
  • openldap-nss-config
  • openldap-schema-pam_ldap
  • openldap-servers
  • pam-pam_ldap
  • nss_ldap

Konfiguracja serwera

Na pierwszy ogień bierzemy pod lupę plik konfiguracyjny slapd, /etc/openldap/slapd.conf. Jest on już wstępnie przygotowany, zmienimy w nim tylko parę rzeczy dostosowując go do naszych potrzeb. Zakładam, że chcemy aby nasz OpenLDAP obsługiwał połączenia TLS/SSL:

TLSCACertificateFile /usr/share/ssl/ca-bundle.crt
TLSCertificateFile /etc/openldap/slapd.pem
TLSCertificateKeyFile /etc/openldap/slapd.key
TLSVerifyClient never

Odkomentowujemy powyższe linijki. Certyfikaty wygenerujemy później. I dalej:

database        bdb
suffix          "dc=th-domena,dc=pl"
rootdn          "cn=Manager,dc=th-domena,dc=pl"

Oczywiście th-domena.pl zmieńcie sobie na coś bardziej przystającego do rzeczywistości ;-) Pozostaje nam jeszcze sprawa hasła. Możemy je wygenerować przy pomocy narzędzi z paczki openldap. W poniższym przykładzie dodaję je od razu do pliku konfiguracyjnego (ponieważ zapisze się na końcu pliku trzeba je sobie potem przenieść we właściwe miejsce):

sudo slappasswd -h {md5}|sudo tee -a /etc/openldap/slapd.conf

Niezbyt oryginalnie, ale skutecznie. Jak widać przyjąłem założenie, że hasła przechowujemy w formacie MD5 (można też np. SSHA). Po przeniesieniu wygenerowanego powyżej hasła we właściwe miejsce wygląda to tak:

password-hash   {md5}
rootpw  {MD5}BLci6etNGKi7oNjGX/EMFw==

Na koniec ważna uwaga: zakomentowujemy linijkę:

#include                /usr/share/openldap/schema/ns-pwd-policy.schema

Inaczej OpenLDAP się nie uruchomi. Dobrze, z demonem slapd mamy sprawę zakończoną. Bierzemy się za klienty. Edytujemy plik /etc/openldap/ldap.conf:

URI ldapi://%2fvar%2frun%2fslapd%2fslapd.sock ldaps://localhost:636
BASE dc=th-domena,dc=pl
TLS_CACERT /usr/share/ssl/ca-bundle.crt
TLS_REQCERT allow

W tym pliku jest znacznie więcej opcji, ale powyższe w zupełności nam wystarczą.

Pora na wygenerowanie certyfikatu:

sudo openssl req -new -x509 -nodes -out /etc/openldap/slapd.pem -keyout /etc/openldap/slapd.key -days 999999
sudo chown 600 /etc/openldap/slapd.key /etc/openldap/slapd.pem

Przed uruchomieniem demona slapd zaglądamy jeszcze do /etc/sysconfig/ldap:

SLAPDURLLIST="ldap:/// ldaps://localhost:636/ ldapi://%2fvar%2frun%2fslapd%2fslapd.sock"

Resztę pozostawiamy bez zmian.

Pozostaje jeszcze kwestia ustawień dostępu do slapd. Edytujemy plik /etc/openldap/slapd.access.conf i zmieniamy go jak poniżej:

access to attrs="userPassword"
    by dn="uid=root,ou=people,dc=th-domena,dc=pl" write
    by anonymous auth
    by self write
    by * none

access to *
    by dn="uid=root,ou=people,dc=th-domena,dc=pl" write
    by anonymous read
    by * search

Uruchamiamy usługę:

sudo /sbin/service ldap start

I sprawdzamy czy działa:

ldapsearch -D "cn=Manager,dc=th-domena,dc=pl" -W -x

Podajemy hasło, które wcześniej wygenerowaliśmy i zapisaliśmy w slapd.conf. Dodatkowo sprawdźmy czy usługa działa na portach 389 (ldap) i 636 (ldapssl) oraz czy utworzyło się gniazdko w /var/run/slapd. Jeśli wszystko jest jak należy to lecimy dalej.

Migracja kont

Wykorzystamy skrypty perla dostępne w paczce openldap-migration. Ponieważ będzie konieczny dostęp do pliku /etc/shadow musimy skorzystać z uprawnień roota. Najpierw jednak modyfikujemy plik /etc/openldap/migrate_common.ph:

$DEFAULT_BASE = "dc=th-domena,dc=pl";
$EXTENDED_SCHEMA = 1;

No to jesteśmy gotowi do eksportu danych:

export ETC_SHADOW=/etc/shadow
cd /usr/share/openldap/migration
./migrate_base.pl > /tmp/base.ldif
./migrate_group.pl /etc/group /tmp/group.ldif
./migrate_hosts.pl /etc/hosts /tmp/hosts.ldif
./migrate_passwd.pl /etc/passwd /tmp/passwd.ldif

Jak wspomniałem, będziemy potrzebowali uprawnień roota (przeniesienie haseł z /etc/shadow). Teraz importujemy dane do bazy OpenLDAP:

ldapadd -D "cn=Manager,dc=th-domena,dc=pl" -W -x -f /tmp/base.ldif
ldapadd -D "cn=Manager,dc=th-domena,dc=pl" -W -x -f /tmp/group.ldif
ldapadd -D "cn=Manager,dc=th-domena,dc=pl" -W -x -f /tmp/passwd.ldif
ldapadd -D "cn=Manager,dc=th-domena,dc=pl" -W -x -f /tmp/hosts.ldif

Konfiguracja klientów

Pora na “powiedzenie” PAM gdzie ma szukać informacji o kontach. Edytujemy plik /etc/pam.d/system-auth i modyfikujemy go jak poniżej:

#%PAM-1.0
auth            required        pam_listfile.so item=user sense=deny file=/etc/security/blacklist onerr=succeed
auth            required        pam_env.so
auth            required        pam_tally.so deny=0 file=/var/log/faillog onerr=succeed
auth            sufficient      pam_unix.so likeauth nullok shadow
auth            sufficient      pam_ldap.so use_first_pass

account         required        pam_tally.so file=/var/log/faillog onerr=succeed
account         required        pam_time.so
account         sufficient      pam_unix.so
account         sufficient      pam_ldap.so

# password      [success=1 ignore=reset abort=die default=bad] pam_pwgen.so upper=1 digit=1
password        required        pam_cracklib.so try_first_pass difok=2 minlen=8 dcredit=2 ocredit=2 retry=3
password        sufficient      pam_unix.so nullok blowfish shadow use_authtok
password        sufficient      pam_ldap.so use_authok use_first_pass
password        required        pam_exec.so failok seteuid /usr/bin/make -C /var/db
# password      required        pam_exec.so failok seteuid /usr/bin/make -C /var/yp

session         optional        pam_keyinit.so revoke
session         required        pam_limits.so change_uid
session         [success=1 default=ignore]      pam_succeed_if.so service in crond quiet use_uid
session         required        pam_unix.so
session         required        pam_mkhomedir.so skel=/etc/skel/ umask=0066
session         optional        pam_ldap.so

Słówko komentarza do modułu pam_mkhomedir.so: dzięki niemu katalog domowy zostanie utworzony automatycznie (o ile nie istnieje).

Przechodzimy do konfiguracji /etc/ldap.conf (nie mylić z /etc/openldap/ldap.conf):

uri ldaps://127.0.0.1:636/
ldap_version 3
rootbinddn cn=manager,dc=th-domena,dc=pl
scope sub
bind_policy soft
pam_login_attribute uid
pam_member_attribute memberuid
pam_password crypt
pam_password exop
nss_base_passwd         ou=People,dc=th-domena,dc=pl
nss_base_shadow         ou=People,dc=th-domena,dc=pl
nss_base_group          ou=Group,dc=th-domena,dc=pl
nss_base_hosts          ou=Hosts,dc=th-domena,dc=pl
ssl start_tls
ssl on

Pozostaje nam jeszcze zmiana /etc/nsswitch.conf (zmieniamy 3 linijki):

passwd:         files ldap
group:          files ldap
shadow:         files ldap

Na koniec musimy wykonać jeszcze jedną ważną rzecz. Zapisujemy hasło z pliku /etc/openldap/slapd.conf (rootpw) w /etc/ldap.secret w postaci niezaszyfrowanej i zmieniamy uprawnienia jak poniżej:

  1. rw——- 1 root root 9 2007-12-10 09:43 /etc/ldap.secret

Bez tego nie będziemy mogli odpytywać bazy LDAP.

Szybkie sprawdzenie jak to działa:

getent passwd root

Wynik tego polecenia powinien zwrócić dwa wpisy:

root:x:0:0:root:/root:/bin/sh 
root:x:0:0:root:/root:/bin/sh

Co by się zgadzało, bo informacje o kontach są teraz zapisane w /etc/passwd i w OpenLDAP.

Przykładowe pliki konfiguracyjne

pl/przewodniki/openldap-autoryzacja-uzytkownikow.txt · Last modified: 2007/12/10 12:16 by duddits
chimeric.de = chi`s home Creative Commons License Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0 Powered by Lighttpd - fly light