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:

  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 | 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/openldap-uwierzytelnianie-kont.txt · ostatnio zmienione: 2009/10/29 13:00 przez simh
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