atribut=hodnota
cn=Bilbo Baggins,ou=hobbits,dc=shire,dc=org
o dc=shire,dc=org
/ \
/ \
ou=hobbits o o ou=dwarves
/ \ \
cn=Bilbo Baggins o o o cn=Thorin Oakenshield
cn=Frodo Baggins
Lightweight Directory Interchange Format
# 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
objectclass ( 2.5.6.6 NAME 'person'
DESC 'RFC2256: a person'
SUP top STRUCTURAL
MUST ( sn $ cn )
MAY ( userPassword $ telephoneNumber $ seeAlso $ description ) )
objectclass ( 2.5.6.7 NAME 'organizationalPerson'
DESC 'RFC2256: an organizational person'
SUP person STRUCTURAL
MAY ( title $ x121Address $ registeredAddress $ destinationIndicator $
preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $
telephoneNumber $ internationaliSDNNumber $
facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $
postalAddress $ physicalDeliveryOfficeName $ ou $ st $ l ) )
objectclass ( 1.3.6.1.4.1.1466.101.120.111 NAME 'extensibleObject'
SUP top AUXILIARY )
attributetype ( 2.5.4.20 NAME 'telephoneNumber'
DESC 'RFC2256: Telephone Number'
EQUALITY telephoneNumberMatch
SUBSTR telephoneNumberSubstringsMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.50{32} )
-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 serveruvyhledávání:
ldapsearch -b "dc=shire,dc=org" -xW -D "cn=sauron,dc=shire,dc=org" (&(objectClass=inetOrgPerson)(cn=*Baggins)) cn mailpř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 EOFmodifikace 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 EOFmazá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)
# 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
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
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)
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
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
Simple Authentication and Security Layer (RFC 4422)
-D "uid=bilbo,[cn=shire.org,],cn=mechanizmus,cn=auth(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.pemcn 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 noviz tls
# /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