====== 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}}