====== Potrzebne paczki ======
* openldap
* openldap-backend-bdb
* openldap-backend-passwd
* openldap-libs
* openldap-nss-config
* openldap-schema-pam_ldap
* openldap-servers
* pam-pam_ldap
* nss_ldap
* ldap-MigrationTools
====== 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} >> /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 chmod 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
auth required pam_deny.so
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
password required pam_deny.so
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
nss_initgroups_ignoreusers root,bin,daemon,nobody,ssh
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:
-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 | grep 0:0
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:slapd.conf.txt|/etc/openldap/slapd.conf}}
* {{pl:przewodniki:slapd.access.conf.txt|/etc/openldap/slapd.access.conf}}
* {{pl:przewodniki:ldap.conf.txt|/etc/openldap/ldap.conf}}
* {{pl:przewodniki:system-auth.txt|/etc/pam.d/system-auth}}
* {{pl:przewodniki:ldap.txt|/etc/sysconfig/ldap}}
* {{pl:przewodniki:ldap2.conf.txt|/etc/ldap.conf}}
* {{pl:przewodniki:nsswitch.conf.txt|/etc/nsswitch.conf}}