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 * readviz 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