LDAP

Jiří Novosad, xnovosa1@fi.muni.cz


Obsah


LDAP


DIT

Directory Information Tree Ldap strom:
                        o dc=shire,dc=org
                       / \
                      /   \
          ou=hobbits o     o ou=dwarves
                    / \     \
  cn=Bilbo Baggins o   o     o cn=Thorin Oakenshield
                  cn=Frodo Baggins 

LDIF

Lightweight Directory Interchange Format

př:
# LDIF entry for shire
dn: dc=shire,dc=org
dc: shire
objectClass: dcObject
objectClass: organizationalUnit
ou: Shire ltd.

# LDIF entry for hobbits
dn: ou=hobbits,dc=shire,dc=org
ou: hobbits
objectClass: organizationalUnit

# LDIF entry for "Bilbo Baggins"
dn: cn=Bilbo Baggins,ou=hobbits,dc=shire,dc=org
cn: Bilbo Baggins
objectClass: inetOrgPerson
sn: Baggins
mail: bilbo_baggins@shire.org
mail: bilbo@gmail.com
userPassword: {plain}smaug


LDAP Schema

LDAP Schema


LDAP - nástroje

ldap-utils - často používané parametry:
-D "cn=Bilbo Baggins,ou=hobbits,dc=shire,dc=org"    # DN, které použiji na připojení (odp. uživ. jménu)
-x                                                  # použití jednoduché (simple) autentizace (ne SASL)
-W                                                  # zeptá se na heslo
-f file.ldif                                        # čte LDIF záznamy ze souboru místo stdin
-H ldap://ldap.shire.org/                           # adresa LDAP serveru
vyhledávání:
ldapsearch -b "dc=shire,dc=org" -xW -D "cn=sauron,dc=shire,dc=org" (&(objectClass=inetOrgPerson)(cn=*Baggins)) cn mail
přidávání záznamu:
ldapadd -xW -D "cn=admin,dc=shire,dc=org" << EOF
dn: cn=Balin,ou=dwarves,dc=shire,dc=org
cn: Balin
objectClass: inetOrgPerson
sn: Balin
EOF
modifikace existujícího záznamu:
ldapmodify -xW -D "cn=admin,dc=shire,dc=org" << EOF
dn: cn=Bilbo Baggins,ou=hobbits,dc=shire,dc=org
changetype: modify
add: telephoneNumber
telephonNumber: 379-111-111
-
delete: mail
mail: bilbo@gmail.com
EOF
mazání záznamů:
ldapdelete -D "cn=sauron,dc=shire,dc=org" -xW "cn=Frodo Baggins,ou=hobbits,dc=shire,dc=org"
ldapdelete -r "ou=hobbits,dc=shire,dc=org"
konfigurace - soubor ldap.conf (~/.ldaprc) (TLS_REQCERT allow)

Implementace LDAP


OpenLDAP

# ldap schema vytvoříme z již předdefinovaných schemat, závislosti
include     /etc/ldap/schema/core.schema
include     /etc/ldap/schema/cosine.schema
include     /etc/ldap/schema/nis.schema
include     /etc/ldap/schema/inetorgperson.schema

# bitová maska říkající, co zapsat do logu
loglevel     1368
pidfile      /var/run/slapd/slapd.pid
argsfile     /var/run/slapd/slapd.args

# default formát ukládání hesel
password-hash     {SSHA}
# kde hledat moduly
modulepath      /usr/lib/ldap
# nahrání modulů pro BerkeleyDB
moduleload      back_bdb

# databázová sekce
database bdb
suffix      "dc=shire,dc=org"
directory   /var/lib/ldap/shire.org
mode        0600

cachesize   1000
checkpoint  512     10 # kb  min

rootdn      "cn=sauron,dc=shire,dc=org"
rootpw      {SSHA}nYM6fcLapXnTfwBGVaqIt6sZ88IQHYpd

# povinný
index       objectClass         eq
index       cn,sn,mail          eq,sub


#ACL
access to *
    by * read
(DB_CONFIG)

offline nástroje - pracují přímo se soubory na disku: slapadd, slapcat, slaptest, slapacl, slapauth, slapdn, slapindex, slappasswd


Jednoduchá autentizace, ACL

Při použití jednoduché autentizace (přepínač -x) dochází k připojení tak, že se zašle heslo (cleartext) a porovná se s atributem userPassword v DN, které jsme zadali přepínačem -D. Pokud nezadáme DN, jedná se o anonymní připojení.

Autorizace je řízena pomocí ACL zadaných v slapd.conf. syntax: access to _what_ by _who_ _access_, kde

direktivy access se uplatňují postupně odvrchu, první vyhovující se použije př:
access to dn="cn=Frodo Baggins,ou=hobbits,dc=shire,dc=org"
    by dn="cn=Bilbo Baggins,ou=hobbits,dc=shire,dc=org" write
    by dn="cn=sauron,dc=shire,dc=org" search
    by dn.children="ou=dwarves,dc=shire,dc=org" compare

# povolí čtení všeho všem (i neautentizovaným)
access to * 
    by * read
# umožní autentizaci
access to attrs=userPassword
    by self write
    by anonymous auth
# umoznuje pristup 
access to dn.base=""
    by * read
viz slapd.access(5)

LDAP a Unix

Databázi uživatelů je možno mít uloženou v LDAP stromě. K tomu se používají třídy posixAccount, shadowAccount a posixGroup, definované v souboru nis.schema:

objectclass ( 1.3.6.1.1.1.2.0 NAME 'posixAccount'
        DESC 'Abstraction of an account with POSIX attributes'
        SUP top AUXILIARY
        MUST ( cn $ uid $ uidNumber $ gidNumber $ homeDirectory )
        MAY ( userPassword $ loginShell $ gecos $ description ) )

objectclass ( 1.3.6.1.1.1.2.1 NAME 'shadowAccount'
        DESC 'Additional attributes for shadow passwords'
        SUP top AUXILIARY
        MUST uid
        MAY ( userPassword $ shadowLastChange $ shadowMin $
              shadowMax $ shadowWarning $ shadowInactive $
              shadowExpire $ shadowFlag $ description ) )

objectclass ( 1.3.6.1.1.1.2.2 NAME 'posixGroup'
        DESC 'Abstraction of a group of accounts'
        SUP top STRUCTURAL
        MUST ( cn $ gidNumber )
        MAY ( userPassword $ memberUid $ description ) )
Modul nss_ldap umožňuje prohledávání databáze s ůčty atd. v LDAPu:

# /etc/nsswitch.conf
passwd:         files ldap
group:          files ldap
shadow:         files ldap
...

# /etc/libnss-ldap.conf (Debian, jinde mozna /etc/ldap/ldap.conf)
host ldap.shire.org
base dc=shire,dc=org
bind_policy soft

Modul pam_ldap zase umožnňuje používání LDAPu pro autentizaci. Příklad konfigurace služby ssh:

# /etc/pam.d/ssh
auth        required      pam_nologin.so
auth        sufficient    pam_ldap.so
auth        required      pam_unix.so shadow use_first_pass

account     sufficient    pam_ldap.so
account     required      pam_unix.so

password    sufficient    pam_ldap.so
password    required      pam_unix.so

# /etc/pam_ldap.conf (Debian)
host ldap.shire.org
base dc=shire,dc=org
rootbinddn cn=admin,dc=debhome,dc=lan
pam_password crypt

NSCD

Name Service Cache Daemon - cache pro password, group a host dotazy. Konfigurace:

# /etc/nscd.conf
enable-cache            passwd          yes
positive-time-to-live   passwd          600
negative-time-to-live   passwd          20
suggested-size          passwd          211
check-files             passwd          yes

SASL

Simple Authentication and Security Layer (RFC 4422)


TLS

(RFC 4346)

# /etc/ldap/slapd.conf
...
TLSCipherSuite          HIGH
TLSCertificateFile      /etc/ldap/slapd-cert.pem
TLSCertificateKeyFile   /etc/ldap/slapd-key.pem
...
$ /usr/lib/ssl/misc/CA.pl -newcert
$ openssl rsa -in newkey.pem -out newkey_plain.pem
cn certifikatu = fqdn serveru
# /etc/ldap/ldap.conf
TLS_REQCERT  allow

# /etc/pam_ldap.conf
ssl start_tls
tls_checkpeer no

# /etc/libnss-ldap.conf
ssl start_tls
tls_checkpeer no
viz tls

Replikace

# /etc/ldap/slapd.conf - master
replogfile      /var/spool/slurpd/replica
replica         host=ldap_rep.shire.org:389
                suffix="dc=shire,dc=org"
                binddn="cn=replica,dc=shire,dc=org"
                credentials=heslo
                bindmethod=simple #(sasl)
                tls=yes
# /etc/ldap/slapd.conf - slave
suffix      "dc=shire,dc=org"
rootdn      "cn=replica,dc=shire,dc=org"
rootpw      {SSHA}aSZ50g8aDMj85MeEqkljKIfb7qKraQG8
updatedn    "cn=replica,dc=shire,dc=org"
updateref   ldap://ldap.shire.org

Zdroje