SlideShare ist ein Scribd-Unternehmen logo
1 von 31
Downloaden Sie, um offline zu lesen
OpenLDAP



A developer's perspective




  Gerrit Beine
 mail@gerritbeine.com


                            1
Motivation:
Warum dieser Vortrag?




                        2
Ziele des Vortrags


●   OpenLDAP als objektbasierte Datenbank verstehen lernen
●   CRUD Operationen aus Java und Perl ausführen
●   Grundlegendes Verständnis von Schema Dateien
●   Suchen im Verzeichnis, Aliase und extensibleObjects




                                                             3
Grundlegendes zu (Open)LDAP




                              4
LDAP


●   LDAP: Lightweight Directory Access Protocol
●   Version 2: RFC 1777-1778, 1823, 1959-1960
●   Version 3: RFC 2251-2253, 4510-4519
●   Frontend zu hierarchischen Datenbanken
●   Optimiert für Suchen und Finden von hierarchisch abgelegten
    Informationen
●   Basiert auf X.500 (DAP), vereinfacht dieses jedoch für TCP/IP-Netze




                                                                          5
Begriffswelt


●   bind – Information, wie man sich beim LDAP anmelden will: anonym oder
    via authorisiertem DN
●   dn – distinguished name;
    eindeutiger Identifikator für Objekte im Verzeichnis
●   objectClass – Strukturbeschreibung von Objekten im Verzeichnis
●   structural – Spezielle Objektklassen, nur eine pro Objekt
●   auxiliary – Optionale, ergänzende Objektklassen
●   schema – Beschreibung von Objektklassen und Attributen
●   scope – Suchbereich im Verzeichnis (base, one, subtree)
●   baseDn – Verzeichnisknoten, der Basis für Operationen ist
●   LDIF – LDAP Data Interchange Format,
    Dateiformat für den Austausch von Verzeichnisdaten in Textform



                                                                        6
LDAP-Zugriff von Java und Perl




                                 7
Perl & Net::LDAP


●   Net::LDAP bzw. Perl LDAP: http://ldap.perl.org/
●   Objektorienterte API für den Zugriff auf LDAP-Dienste
●   Verbindungsaufbau und Authentifizierung
●   Schnittstelle für CRUD-Operationen im Verzeichnis
●   LDIF-Schnittstelle
●   Schema-Bearbeitung




                                                            8
Suchen mit Perl


 1   #!/usr/bin/perl
 2
 3   use strict;
 4   use warnings;
 5
 6   use Net::LDAP;
 7   use Data::Dumper;
 8
 9   my   $host = '172.16.166.129';
10   my   $base = 'ou=users,dc=my-company,dc=com';
11   my   $filter = '(&(objectClass=person)(uid=user*))   ';
12   my   $message;
13
14   my $ldap = new Net::LDAP($host);
15
16   # Anonym arbeiten, keine Authentifizierung
17   $message = $ldap->bind();
18
19   # Suchen unter der angegebenen base mit dem Filter
20   $message = $ldap->search(base => $base, filter => $filter);
21
22   foreach my $entry ($message->entries) {
23     # Jeder gefundene Eintrag hat im Hash 'asn' ein Attribut 'objectName',
24     # in dem der DN enthalten ist
25     print $entry->{'asn'}->{'objectName'}, "n";
26   }




                                                                                9
Ergebnis der Suche


              ●   Ergebnis der Scriptausführung:
             gbeine$ perl -w search.pl
             uid=user1,ou=users,dc=my-company,dc=com
             uid=user2,ou=users,dc=my-company,dc=com
             uid=user3,ou=users,dc=my-company,dc=com




                                                       10
Anlegen mit Perl - I


 1   #!/usr/bin/perl
 2
 3   use strict;
 4   use warnings;
 5
 6   use Net::LDAP;
 7   use Data::Dumper;
 8
 9   my $host = '172.16.166.129';
10   my $base = 'ou=users,dc=my-company,dc=com';
11   my $message;
12
13   my $ldap = new Net::LDAP($host);
14
15   # Schreiben erfordert Authentifizierung
16   $message = $ldap->bind(
17           'cn=Administrator,dc=my-company,dc=com',
18           password => 'linux'
19   );
20
21   $message->code && warn "Fehler bei Auth: ", $message->error;
22




                                                                    11
Anlegen mit Perl - II


23   # Anlegen eines vierten Nutzers
24   $message = $ldap->add( 'uid=user4,'.$base,
25           attr => [
26               'uid' => 'user4',
27               'uidNumber' => '4',
28               'gidNumber' => '1',
29               'cn'   => 'User',
30               'sn'   => 'Four',
31               'homeDirectory' => '/home/user4',
32               'objectclass' => [ 'top', 'person', 'posixAccount' ],
33       ]
34   );
35
36   $message->code && warn "Fehler beim Anlegen: ", $message->error;




                                                                         12
Ändern mit Perl


 1   #!/usr/bin/perl
 2
 3   use strict;
 4   use warnings;
 5
 6   use Net::LDAP;
 7
 8   my $host = '172.16.166.129';
 9   my $base = 'ou=users,dc=my-company,dc=com';
10   my $message;
11
12   my $ldap = new Net::LDAP($host);
13
14   # Schreiben erfordert Authentifizierung
15   $message = $ldap->bind(
16           'cn=Administrator,dc=my-company,dc=com',
17           password => 'linux'
18   );
19
20   $message->code && warn "Fehler bei Auth: ", $message->error;
21
22   # Attribute ändern
23   $message = $ldap->modify(
24           'uid=user4,'.$base, replace => { 'sn' => 'Five' } );
25
26   $message->code && warn "Fehler beim Ändern: ", $message->error;




                                                                       13
Umbenennen mit Perl


 1   #!/usr/bin/perl
 2
 3   use strict;
 4   use warnings;
 5
 6   use Net::LDAP;
 7
 8   my $host = '172.16.166.129';
 9   my $base = 'ou=users,dc=my-company,dc=com';
10   my $message;
11
12   my $ldap = new Net::LDAP($host);
13
14   # Schreiben erfordert Authentifizierung
15   $message = $ldap->bind(
16           'cn=Administrator,dc=my-company,dc=com',
17           password => 'linux'
18   );
19
20   $message->code && warn "Fehler bei Auth: ", $message->error;
21
22   # DN ändern
23   $message = $ldap->moddn( 'uid=user4,'.$base,
24           newrdn => 'uid=user5', deleteoldrdn => 1);
25
26   $message->code && warn "Fehler beim Ändern: ", $message->error;




                                                                       14
Löschen mit Perl


 1   #!/usr/bin/perl
 2
 3   use strict;
 4   use warnings;
 5
 6   use Net::LDAP;
 7
 8   my $host = '172.16.166.129';
 9   my $base = 'ou=users,dc=my-company,dc=com';
10   my $message;
11
12   my $ldap = new Net::LDAP($host);
13
14   # Schreiben erfordert Authentifizierung
15   $message = $ldap->bind(
16           'cn=Administrator,dc=my-company,dc=com',
17           password => 'linux'
18   );
19
20   $message->code && warn "Fehler bei Auth: ", $message->error;
21
22   # Löschen
23   $message = $ldap->delete( 'uid=user5,'.$base );
24
25   $message->code && warn "Fehler beim Löschen: ", $message->error;




                                                                        15
Java & LDAP


●   Viele Wege führen nach Rom:
●   javax.naming.ldap – Zugriff auf LDAP via Java-Namendienste-API
●   Java LDAP – Ehemals Novell, jetzt an OpenLDAP übergeben
    http://www.openldap.org/jldap/
●   Mozilla LDAP SDK – Ehemals von Netscape entwickelt, seit 2008 tot
    http://www.mozilla.org/directory/javasdk.html
●   SPRING LDAP – LDAP-Zugriff via JDBC-Templates
    http://www.springsource.org/ldap




                                                                        16
Suchen mit Java - I


 3   import java.util.Hashtable;
 4
 5   import   javax.naming.Context;
 6   import   javax.naming.NamingEnumeration;
 7   import   javax.naming.directory.DirContext;
 8   import   javax.naming.directory.InitialDirContext;
 9   import   javax.naming.directory.SearchControls;
10   import   javax.naming.directory.SearchResult;
11
12
13   public class Search {
14
15             private final static String ldapAdServer =
16                             "ldap://172.16.166.129:389";
17             private final static String ldapSearchBase =
18                             "ou=users,dc=my-company,dc=com";
19             private final static String ldapFilter =
20                             "(&(objectClass=person)(user=user*))";
21
22             public static void main(String[] args) {
23                     Hashtable<String, Object> env =
24                                     new Hashtable<String, Object>();
25                     // Einfaches bind, ohne Authentifizierung
26                     env.put(Context.SECURITY_AUTHENTICATION, "simple");
27                     env.put(Context.INITIAL_CONTEXT_FACTORY,
28                             "com.sun.jndi.ldap.LdapCtxFactory");
29                     env.put(Context.PROVIDER_URL, ldapAdServer);




                                                                             17
Suchen mit Java - II


30
31         try {
32                 DirContext ctx = new InitialDirContext(env);
33
34                 SearchControls searchControls =
35                                  new SearchControls();
36                 searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE );
37
38                 NamingEnumeration<SearchResult> results =
39                       ctx.search(ldapSearchBase, ldapFilter, searchControls);
40
41                SearchResult searchResult = null;
42                while(results.hasMoreElements()) {
43                       searchResult = (SearchResult) results.nextElement();
44                       System.out.println(searchResult.getNameInNamespace());
45                }
46         } catch (Exception e) {
47                  System.err.println(e);
48         }
49
50     }
51 }




                                                                                   18
Arbeiten mit LDAP-Schema




                           19
Aufbau von Schema Definitionen



# Attributtypen

AttributeType ( <OID> NAME '<name>'
  DESC '<description>'
  EQUALITY <matchingRule>
  SUBSTR <matchingRule>
  SYNTAX <syntaxOID>
)

AttributeType ( <OID> NAME '<name>'
  DESC '<description>'
  SUP <superType>
)


# Klassen

objectclass ( <OID> NAME '<name>'
  DESC '<description>'
  SUP <superClass> # oder:
  < STRUCTURAL | ABSTRACT | AUXILIARY >
  MUST ( <attribute1> $ <attribute2> )
  MAY <attribute3> )




                                                     20
Syntax-Typen


Name                      Object Identifier              Beschreibung
boolean                   1.3.6.1.4.1.1466.115.121.1.7   Wahrheitswerte
directoryString           1.3.6.1.4.1.1466.115.121.1.15 Unicode (UTF-8) Zeichenkette
distinguishedName         1.3.6.1.4.1.1466.115.121.1.12 LDAP DN's
integer                   1.3.6.1.4.1.1466.115.121.1.27 Zahlen
numericString             1.3.6.1.4.1.1466.115.121.1.36 Numerische Zeichenketten
OID                       1.3.6.1.4.1.1466.115.121.1.38 Object Identifier
octetString               1.3.6.1.4.1.1466.115.121.1.40 BLOB's

●   An die Syntax kann in geschweiften Klammern noch eine Länge
    angehängt werden:
●   1.3.6.1.4.1.1466.115.121.1.15{256}
    steht für eine 256 Zeichen lange Zeichenkette




                                                                                   21
Matching Rules


Name                               Anwendbarkeit       Beschreibung
booleanMatch                       Gleichheit

caseIgnoreMatch                    Gleichheit          Ignoriert Groß-/Kleinschreibung und Leerzeichen
caseIgnoreOrderingMatch            Sortierung          Ignoriert Groß-/Kleinschreibung und Leerzeichen
caseIgnoreSubstringsMatch          Teilzeichenketten   Ignoriert Groß-/Kleinschreibung und Leerzeichen
caseExactMatch                     Gleichheit          Ignoriert Leerzeichen
caseExactOrderingMatch             Sortierung          Ignoriert Leerzeichen
caseExactSubstringsMatch           Teilzeichenketten   Ignoriert Leerzeichen
distinguishedNameMatch             Gleichheit

integerMatch                       Gleichheit

integerOrderingMatch               Sortierung

numericStringMatch                 Gleichheit

numericStringOrderingMatch         Sortierung

numericStringSubstringsMatch       Teilzeichenketten

octetStringMatch                   Gleichheit

octetStringOrderingStringMatch     Sortierung

octetStringSubstringsStringMatch   Teilzeichenketten

objectIdentiferMatch               Gleichheit

                                                                                                         22
Beispiel-Schema



# Basis OID für alle LDAP-Typen meines Unternehmens
objectIdentifier GBGmbH 1.3.6.1.4.1.40207;

# Empfohlene Aufteilung für SNMP und LDAP
objectIdentified MySNMP GBGmbH:1
objectIdentified MyLDAP GBGmbH:2
objectIdentifier MyAttributeType MyLDAP:1
objectIdentifier MyObjectClass MyLDAP:2

# Ein Attribut, von name geerbt
attributetype ( MyAttributeType:1 # ergibt 1.3.6.1.4.1.40207.2.1.1
    NAME 'applicationName'
    DESC 'Name of an Application'
    SUP name SINGLE-VALUE
)

# Eine Struktur-Klasse
objectclass ( MyObjectClass:1 # ergibt 1.3.6.1.4.1.40207.2.2.1
    NAME 'application'
    DESC 'An application object'
    STRUCTURAL
    MUST ( applicationName )
)




                                                                     23
Aufbau eines Verzeichnisses




                              24
Szenario


●   Benutzerverwaltung in Kombination
●   Authentifizierung: LDAP
●   Generisches Rechtemanagement: SQL-Datenbank
●   Teilweise datenbezogene Berechtigungen bis auf Objektebene für viele
    verschiedene Anwendungen
●   Skaliert mit Tabellen nur schwer

●   Idee: Erweiterte Nutzung des LDAP für Berechtigungen
●   Aliase auf Nutzer ersetzen JOIN ;-)
●   Aliase in LDAP entsprechen Symlinks in Unix-Dateisystemen
●   extensibleObjects lassen Aliase transparent erscheinen




                                                                           25
Anlegen eines Alias


               ●   objectClass alias auswählen
               ●   Wenn das neue Objekt
                   transparent sein soll:
                   ObjectClass extensibleObject
                   auswählen
               ●   Wenn extensibleObject möglich,
                   gleiches DN-Attribut nutzen, wie
                   im Original
               ●   Aliases sind geringfügig
                   langsamer als echte Objekte




                                                  26
Die Baumstruktur mit Aliases


                   ●   user1 und user2 unterhalb von
                       ou=applications sind Links auf die
                       echten Einträge unter ou=users
                   ●   Änderungen an Einträgen unter
                       ou=users wirken sich direkt aus
                   ●   Suchen nach objectClass=person
                       unter ou=applications liefert
                       user1 und user2 von ou=users
                   ●   Für Suchen muss deref=always
                       gesetzt sein




                                                         27
Wie funktioniert der „JOIN“?


●   Über den Distinguished Name!
●   Original:
    dn=uid=user1,ou=users,dc=my-company,dc=com
●   Alias:
    dn=uid=user1,ou=application1,ou=applications,dc=my-company,dc=com
●   Suche nach (&(objectClass=person)(uid=user1)) unterhalb von
    ou=application1,ou=applications,dc=my-company,dc=com liefert die
    Information, ob user1 das Recht hat, application1 zu nutzen
●   Suche nach (&(objectClass=person)(uid=user2)) unterhalb von
    ou=privilege1,ou=application2,ou=applications,dc=my-company,dc=com
    liefert die Information, ob user2 das Recht für privilege1 in application2
    zu nutzen
●   Die Existenz eines Suchergebnisses bedeutet, das Recht ist vorhanden



                                                                             28
Weitere Anwendungsmöglichkeiten, Beachtenswertes


●   Verfeinerung der Berechtigungen über Erweiterung der Hierarchie
    möglich – Funktionsprinzip bleibt identisch
●   Kein Tabellen-Jonglieren bei Authorisierung von Nutzern – Jede
    Anwendung kennt ihren eigenen Subtree im Verzeichnis und nur diesen!
●   Teilbäume können repliziert werden

●   Indizierung des Verzeichnisbaumes beachten – Aliase sind langsamer als
    echte Objekte
●   extensibleObject mit Vorsicht genießen – semistrukturierte Daten
    erfordert Anwendungslogik
●   Skalierungsmöglichkeiten berücksichtigen – OpenLDAP liest schnell,
    schreibt aber verhältnismäßig langsam




                                                                             29
Literaturempfehlungen


●   OpenLDAP: http://www.openldap.org/doc/admin24/index.html
●   LDAP für Java Entwickler:
    http://www.amazon.de/LDAP-für-Java-Entwickler-3-Auflage/dp/3939084
    077/
●   LDAP verstehen, OpenLDAP einsetzen:
    http://www.amazon.de/LDAP-verstehen-OpenLDAP-einsetzen-Praxiseins
    atz/dp/3898642631/
●   LDAPman home page: http://ldapman.org/
●   LDAP Linux HOWTO: http://tldp.org/HOWTO/LDAP-HOWTO/




                                                                     30
Viel Spaß noch auf der FrOSCon 2012!




                                       31

Weitere ähnliche Inhalte

Was ist angesagt?

Back to Basics-Webinar 5: Einführung in das Aggregation-Framework
Back to Basics-Webinar 5: Einführung in das Aggregation-FrameworkBack to Basics-Webinar 5: Einführung in das Aggregation-Framework
Back to Basics-Webinar 5: Einführung in das Aggregation-FrameworkMongoDB
 
Prototype 1.7
Prototype 1.7Prototype 1.7
Prototype 1.7msebel
 
MongoDB für Java-Programmierer
MongoDB für Java-ProgrammiererMongoDB für Java-Programmierer
MongoDB für Java-ProgrammiererUwe Printz
 
Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes
Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und GeoindizesBack to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes
Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und GeoindizesMongoDB
 
JSON in der Oracle12c Database
JSON in der Oracle12c DatabaseJSON in der Oracle12c Database
JSON in der Oracle12c DatabaseCarsten Czarski
 
MongoDB für Java Programmierer (JUGKA, 11.12.13)
MongoDB für Java Programmierer (JUGKA, 11.12.13)MongoDB für Java Programmierer (JUGKA, 11.12.13)
MongoDB für Java Programmierer (JUGKA, 11.12.13)Uwe Printz
 

Was ist angesagt? (6)

Back to Basics-Webinar 5: Einführung in das Aggregation-Framework
Back to Basics-Webinar 5: Einführung in das Aggregation-FrameworkBack to Basics-Webinar 5: Einführung in das Aggregation-Framework
Back to Basics-Webinar 5: Einführung in das Aggregation-Framework
 
Prototype 1.7
Prototype 1.7Prototype 1.7
Prototype 1.7
 
MongoDB für Java-Programmierer
MongoDB für Java-ProgrammiererMongoDB für Java-Programmierer
MongoDB für Java-Programmierer
 
Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes
Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und GeoindizesBack to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes
Back to Basics – Webinar 4: Fortschrittliche Indizierung, Text- und Geoindizes
 
JSON in der Oracle12c Database
JSON in der Oracle12c DatabaseJSON in der Oracle12c Database
JSON in der Oracle12c Database
 
MongoDB für Java Programmierer (JUGKA, 11.12.13)
MongoDB für Java Programmierer (JUGKA, 11.12.13)MongoDB für Java Programmierer (JUGKA, 11.12.13)
MongoDB für Java Programmierer (JUGKA, 11.12.13)
 

Andere mochten auch

Adaptive Object Model - IASA IL Meeting on Software Evolution (3/2014)
Adaptive Object Model - IASA IL Meeting on Software Evolution  (3/2014)Adaptive Object Model - IASA IL Meeting on Software Evolution  (3/2014)
Adaptive Object Model - IASA IL Meeting on Software Evolution (3/2014)Atzmon Hen-Tov
 
Sulpcegu5e ppt 7_4
Sulpcegu5e ppt 7_4Sulpcegu5e ppt 7_4
Sulpcegu5e ppt 7_4silvia
 
Faith is rewarding
Faith is rewarding Faith is rewarding
Faith is rewarding David Sr.
 
من دعائه ( ع) في طلب العفو والرحمة
من دعائه ( ع) في طلب العفو والرحمةمن دعائه ( ع) في طلب العفو والرحمة
من دعائه ( ع) في طلب العفو والرحمةAlMaymana
 
Evolución de la comunicación humana
Evolución de la comunicación humanaEvolución de la comunicación humana
Evolución de la comunicación humanaAlán Chávez
 

Andere mochten auch (7)

Adaptive Object Model - IASA IL Meeting on Software Evolution (3/2014)
Adaptive Object Model - IASA IL Meeting on Software Evolution  (3/2014)Adaptive Object Model - IASA IL Meeting on Software Evolution  (3/2014)
Adaptive Object Model - IASA IL Meeting on Software Evolution (3/2014)
 
Sulpcegu5e ppt 7_4
Sulpcegu5e ppt 7_4Sulpcegu5e ppt 7_4
Sulpcegu5e ppt 7_4
 
Faith is rewarding
Faith is rewarding Faith is rewarding
Faith is rewarding
 
من دعائه ( ع) في طلب العفو والرحمة
من دعائه ( ع) في طلب العفو والرحمةمن دعائه ( ع) في طلب العفو والرحمة
من دعائه ( ع) في طلب العفو والرحمة
 
Evolución de la comunicación humana
Evolución de la comunicación humanaEvolución de la comunicación humana
Evolución de la comunicación humana
 
Coating 3
Coating 3Coating 3
Coating 3
 
Propasol
PropasolPropasol
Propasol
 

Ähnlich wie OpenLDAP - A developer's perspective

Object-orientied way of using mysqli interface - Workshop
Object-orientied way of using mysqli interface - WorkshopObject-orientied way of using mysqli interface - Workshop
Object-orientied way of using mysqli interface - WorkshopWaldemar Dell
 
Automatisierte Linux Administration mit (R)?ex
Automatisierte Linux Administration mit (R)?ex Automatisierte Linux Administration mit (R)?ex
Automatisierte Linux Administration mit (R)?ex Jan Gehring
 
Microservices mit Rust
Microservices mit RustMicroservices mit Rust
Microservices mit RustJens Siebert
 
Creasoft - Windows powershell
Creasoft - Windows powershellCreasoft - Windows powershell
Creasoft - Windows powershellCreasoft AG
 
An Introduction to Ruby On Rails
An Introduction to Ruby On RailsAn Introduction to Ruby On Rails
An Introduction to Ruby On RailsJonathan Weiss
 
Rex Linuxtag 2012
Rex Linuxtag 2012Rex Linuxtag 2012
Rex Linuxtag 2012inovex GmbH
 
APIs mit Zend\Expressive erstellen
APIs mit Zend\Expressive erstellenAPIs mit Zend\Expressive erstellen
APIs mit Zend\Expressive erstellenRalf Eggert
 
Daten natuerlich modellieren und verarbeiten mit Neo4j
Daten natuerlich modellieren und verarbeiten mit Neo4jDaten natuerlich modellieren und verarbeiten mit Neo4j
Daten natuerlich modellieren und verarbeiten mit Neo4jPatrick Baumgartner
 
DOAG 2015 enterprise_securitymitlda_pundpki-pub
DOAG 2015 enterprise_securitymitlda_pundpki-pubDOAG 2015 enterprise_securitymitlda_pundpki-pub
DOAG 2015 enterprise_securitymitlda_pundpki-pubLoopback.ORG
 
IPC 2015 Zend Framework 3 Reloaded
IPC 2015 Zend Framework 3 ReloadedIPC 2015 Zend Framework 3 Reloaded
IPC 2015 Zend Framework 3 ReloadedRalf Eggert
 
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...NETWAYS
 
Schweine latein-vortrag
Schweine latein-vortragSchweine latein-vortrag
Schweine latein-vortragRamon Wartala
 
Seminar Joomla 1.5 SEF-Mechanismus
Seminar Joomla 1.5 SEF-MechanismusSeminar Joomla 1.5 SEF-Mechanismus
Seminar Joomla 1.5 SEF-MechanismusFabian Becker
 
Python builds mit ant
Python builds mit antPython builds mit ant
Python builds mit antroskakori
 

Ähnlich wie OpenLDAP - A developer's perspective (20)

Object-orientied way of using mysqli interface - Workshop
Object-orientied way of using mysqli interface - WorkshopObject-orientied way of using mysqli interface - Workshop
Object-orientied way of using mysqli interface - Workshop
 
Automatisierte Linux Administration mit (R)?ex
Automatisierte Linux Administration mit (R)?ex Automatisierte Linux Administration mit (R)?ex
Automatisierte Linux Administration mit (R)?ex
 
Microservices mit Rust
Microservices mit RustMicroservices mit Rust
Microservices mit Rust
 
Creasoft - Windows powershell
Creasoft - Windows powershellCreasoft - Windows powershell
Creasoft - Windows powershell
 
An Introduction to Ruby On Rails
An Introduction to Ruby On RailsAn Introduction to Ruby On Rails
An Introduction to Ruby On Rails
 
Rex Linuxtag 2012
Rex Linuxtag 2012Rex Linuxtag 2012
Rex Linuxtag 2012
 
FLOW3-Workshop F3X12
FLOW3-Workshop F3X12FLOW3-Workshop F3X12
FLOW3-Workshop F3X12
 
APIs mit Zend\Expressive erstellen
APIs mit Zend\Expressive erstellenAPIs mit Zend\Expressive erstellen
APIs mit Zend\Expressive erstellen
 
Web Entwicklung mit PHP - Teil 1
Web Entwicklung mit PHP - Teil 1Web Entwicklung mit PHP - Teil 1
Web Entwicklung mit PHP - Teil 1
 
Daten natuerlich modellieren und verarbeiten mit Neo4j
Daten natuerlich modellieren und verarbeiten mit Neo4jDaten natuerlich modellieren und verarbeiten mit Neo4j
Daten natuerlich modellieren und verarbeiten mit Neo4j
 
Moderne Webentwicklung
Moderne WebentwicklungModerne Webentwicklung
Moderne Webentwicklung
 
Codesmells
CodesmellsCodesmells
Codesmells
 
Einführung in Docker
Einführung in DockerEinführung in Docker
Einführung in Docker
 
DOAG 2015 enterprise_securitymitlda_pundpki-pub
DOAG 2015 enterprise_securitymitlda_pundpki-pubDOAG 2015 enterprise_securitymitlda_pundpki-pub
DOAG 2015 enterprise_securitymitlda_pundpki-pub
 
IPC 2015 Zend Framework 3 Reloaded
IPC 2015 Zend Framework 3 ReloadedIPC 2015 Zend Framework 3 Reloaded
IPC 2015 Zend Framework 3 Reloaded
 
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...
 
Schweine latein-vortrag
Schweine latein-vortragSchweine latein-vortrag
Schweine latein-vortrag
 
Testing tools
Testing toolsTesting tools
Testing tools
 
Seminar Joomla 1.5 SEF-Mechanismus
Seminar Joomla 1.5 SEF-MechanismusSeminar Joomla 1.5 SEF-Mechanismus
Seminar Joomla 1.5 SEF-Mechanismus
 
Python builds mit ant
Python builds mit antPython builds mit ant
Python builds mit ant
 

Mehr von Gerrit Beine

Auf Lesereise mit Frit und Fred
Auf Lesereise mit Frit und FredAuf Lesereise mit Frit und Fred
Auf Lesereise mit Frit und FredGerrit Beine
 
Mastering Cargo Cult
Mastering Cargo CultMastering Cargo Cult
Mastering Cargo CultGerrit Beine
 
Conway’s Law & Soziologie in der Software-Architektur
Conway’s Law & Soziologie in der Software-ArchitekturConway’s Law & Soziologie in der Software-Architektur
Conway’s Law & Soziologie in der Software-ArchitekturGerrit Beine
 
Beyond User Stories - Backlogs priorisieren, wenn es anspruchsvoll wird
Beyond User Stories - Backlogs priorisieren, wenn es anspruchsvoll wirdBeyond User Stories - Backlogs priorisieren, wenn es anspruchsvoll wird
Beyond User Stories - Backlogs priorisieren, wenn es anspruchsvoll wirdGerrit Beine
 
Mastering Cargo Cult - Dunning, Kruger & die Agile Bias Curve
Mastering Cargo Cult - Dunning, Kruger & die Agile Bias CurveMastering Cargo Cult - Dunning, Kruger & die Agile Bias Curve
Mastering Cargo Cult - Dunning, Kruger & die Agile Bias CurveGerrit Beine
 
Gut genug - Rahmenbedingungen für agile Architekturen
Gut genug - Rahmenbedingungen für agile ArchitekturenGut genug - Rahmenbedingungen für agile Architekturen
Gut genug - Rahmenbedingungen für agile ArchitekturenGerrit Beine
 
Beyond Agile – Ungewissheit mit der Real Option Theory meistern
Beyond Agile – Ungewissheit mit der Real Option Theory meisternBeyond Agile – Ungewissheit mit der Real Option Theory meistern
Beyond Agile – Ungewissheit mit der Real Option Theory meisternGerrit Beine
 
Backlog Priorisierung 2020: Wertmodelle & Simulationen von Intangibles zur Pr...
Backlog Priorisierung 2020: Wertmodelle & Simulationen von Intangibles zur Pr...Backlog Priorisierung 2020: Wertmodelle & Simulationen von Intangibles zur Pr...
Backlog Priorisierung 2020: Wertmodelle & Simulationen von Intangibles zur Pr...Gerrit Beine
 
Backlog Priorisierung mit Cost of Delay & Monte Carlo Simulationen
Backlog Priorisierung mit Cost of Delay & Monte Carlo SimulationenBacklog Priorisierung mit Cost of Delay & Monte Carlo Simulationen
Backlog Priorisierung mit Cost of Delay & Monte Carlo SimulationenGerrit Beine
 
Der hyperbolische Thread-Koeffizient
Der hyperbolische Thread-KoeffizientDer hyperbolische Thread-Koeffizient
Der hyperbolische Thread-KoeffizientGerrit Beine
 
Vom Projektleiter zum Product Owner
Vom Projektleiter zum Product OwnerVom Projektleiter zum Product Owner
Vom Projektleiter zum Product OwnerGerrit Beine
 
Die Testedimaryp - Über die Antimonie des agilen Testens in der Praxis
Die Testedimaryp - Über die Antimonie des agilen Testens in der PraxisDie Testedimaryp - Über die Antimonie des agilen Testens in der Praxis
Die Testedimaryp - Über die Antimonie des agilen Testens in der PraxisGerrit Beine
 
Vom Projektleiter zum Product Owner
Vom Projektleiter zum Product OwnerVom Projektleiter zum Product Owner
Vom Projektleiter zum Product OwnerGerrit Beine
 
Technische Schulden - mit Notizen
Technische Schulden - mit NotizenTechnische Schulden - mit Notizen
Technische Schulden - mit NotizenGerrit Beine
 
Technische Schulden
Technische SchuldenTechnische Schulden
Technische SchuldenGerrit Beine
 
Die Product Owner Toolbox
Die Product Owner ToolboxDie Product Owner Toolbox
Die Product Owner ToolboxGerrit Beine
 
Agile Coach zu werden ist nicht schwer... - mit Notizen
Agile Coach zu werden ist nicht schwer... - mit NotizenAgile Coach zu werden ist nicht schwer... - mit Notizen
Agile Coach zu werden ist nicht schwer... - mit NotizenGerrit Beine
 
Agile Coach zu werden ist nicht schwer...
Agile Coach zu werden ist nicht schwer...Agile Coach zu werden ist nicht schwer...
Agile Coach zu werden ist nicht schwer...Gerrit Beine
 

Mehr von Gerrit Beine (20)

Auf Lesereise mit Frit und Fred
Auf Lesereise mit Frit und FredAuf Lesereise mit Frit und Fred
Auf Lesereise mit Frit und Fred
 
Mastering Cargo Cult
Mastering Cargo CultMastering Cargo Cult
Mastering Cargo Cult
 
Conway’s Law & Soziologie in der Software-Architektur
Conway’s Law & Soziologie in der Software-ArchitekturConway’s Law & Soziologie in der Software-Architektur
Conway’s Law & Soziologie in der Software-Architektur
 
Beyond User Stories - Backlogs priorisieren, wenn es anspruchsvoll wird
Beyond User Stories - Backlogs priorisieren, wenn es anspruchsvoll wirdBeyond User Stories - Backlogs priorisieren, wenn es anspruchsvoll wird
Beyond User Stories - Backlogs priorisieren, wenn es anspruchsvoll wird
 
Mastering Cargo Cult - Dunning, Kruger & die Agile Bias Curve
Mastering Cargo Cult - Dunning, Kruger & die Agile Bias CurveMastering Cargo Cult - Dunning, Kruger & die Agile Bias Curve
Mastering Cargo Cult - Dunning, Kruger & die Agile Bias Curve
 
Gut genug - Rahmenbedingungen für agile Architekturen
Gut genug - Rahmenbedingungen für agile ArchitekturenGut genug - Rahmenbedingungen für agile Architekturen
Gut genug - Rahmenbedingungen für agile Architekturen
 
Beyond Agile – Ungewissheit mit der Real Option Theory meistern
Beyond Agile – Ungewissheit mit der Real Option Theory meisternBeyond Agile – Ungewissheit mit der Real Option Theory meistern
Beyond Agile – Ungewissheit mit der Real Option Theory meistern
 
Backlog Priorisierung 2020: Wertmodelle & Simulationen von Intangibles zur Pr...
Backlog Priorisierung 2020: Wertmodelle & Simulationen von Intangibles zur Pr...Backlog Priorisierung 2020: Wertmodelle & Simulationen von Intangibles zur Pr...
Backlog Priorisierung 2020: Wertmodelle & Simulationen von Intangibles zur Pr...
 
Backlog Priorisierung mit Cost of Delay & Monte Carlo Simulationen
Backlog Priorisierung mit Cost of Delay & Monte Carlo SimulationenBacklog Priorisierung mit Cost of Delay & Monte Carlo Simulationen
Backlog Priorisierung mit Cost of Delay & Monte Carlo Simulationen
 
Der hyperbolische Thread-Koeffizient
Der hyperbolische Thread-KoeffizientDer hyperbolische Thread-Koeffizient
Der hyperbolische Thread-Koeffizient
 
Broken by Design
Broken by DesignBroken by Design
Broken by Design
 
Vom Projektleiter zum Product Owner
Vom Projektleiter zum Product OwnerVom Projektleiter zum Product Owner
Vom Projektleiter zum Product Owner
 
Die Testedimaryp - Über die Antimonie des agilen Testens in der Praxis
Die Testedimaryp - Über die Antimonie des agilen Testens in der PraxisDie Testedimaryp - Über die Antimonie des agilen Testens in der Praxis
Die Testedimaryp - Über die Antimonie des agilen Testens in der Praxis
 
Vom Projektleiter zum Product Owner
Vom Projektleiter zum Product OwnerVom Projektleiter zum Product Owner
Vom Projektleiter zum Product Owner
 
Antifragilität
AntifragilitätAntifragilität
Antifragilität
 
Technische Schulden - mit Notizen
Technische Schulden - mit NotizenTechnische Schulden - mit Notizen
Technische Schulden - mit Notizen
 
Technische Schulden
Technische SchuldenTechnische Schulden
Technische Schulden
 
Die Product Owner Toolbox
Die Product Owner ToolboxDie Product Owner Toolbox
Die Product Owner Toolbox
 
Agile Coach zu werden ist nicht schwer... - mit Notizen
Agile Coach zu werden ist nicht schwer... - mit NotizenAgile Coach zu werden ist nicht schwer... - mit Notizen
Agile Coach zu werden ist nicht schwer... - mit Notizen
 
Agile Coach zu werden ist nicht schwer...
Agile Coach zu werden ist nicht schwer...Agile Coach zu werden ist nicht schwer...
Agile Coach zu werden ist nicht schwer...
 

OpenLDAP - A developer's perspective

  • 1. OpenLDAP A developer's perspective Gerrit Beine mail@gerritbeine.com 1
  • 3. Ziele des Vortrags ● OpenLDAP als objektbasierte Datenbank verstehen lernen ● CRUD Operationen aus Java und Perl ausführen ● Grundlegendes Verständnis von Schema Dateien ● Suchen im Verzeichnis, Aliase und extensibleObjects 3
  • 5. LDAP ● LDAP: Lightweight Directory Access Protocol ● Version 2: RFC 1777-1778, 1823, 1959-1960 ● Version 3: RFC 2251-2253, 4510-4519 ● Frontend zu hierarchischen Datenbanken ● Optimiert für Suchen und Finden von hierarchisch abgelegten Informationen ● Basiert auf X.500 (DAP), vereinfacht dieses jedoch für TCP/IP-Netze 5
  • 6. Begriffswelt ● bind – Information, wie man sich beim LDAP anmelden will: anonym oder via authorisiertem DN ● dn – distinguished name; eindeutiger Identifikator für Objekte im Verzeichnis ● objectClass – Strukturbeschreibung von Objekten im Verzeichnis ● structural – Spezielle Objektklassen, nur eine pro Objekt ● auxiliary – Optionale, ergänzende Objektklassen ● schema – Beschreibung von Objektklassen und Attributen ● scope – Suchbereich im Verzeichnis (base, one, subtree) ● baseDn – Verzeichnisknoten, der Basis für Operationen ist ● LDIF – LDAP Data Interchange Format, Dateiformat für den Austausch von Verzeichnisdaten in Textform 6
  • 8. Perl & Net::LDAP ● Net::LDAP bzw. Perl LDAP: http://ldap.perl.org/ ● Objektorienterte API für den Zugriff auf LDAP-Dienste ● Verbindungsaufbau und Authentifizierung ● Schnittstelle für CRUD-Operationen im Verzeichnis ● LDIF-Schnittstelle ● Schema-Bearbeitung 8
  • 9. Suchen mit Perl 1 #!/usr/bin/perl 2 3 use strict; 4 use warnings; 5 6 use Net::LDAP; 7 use Data::Dumper; 8 9 my $host = '172.16.166.129'; 10 my $base = 'ou=users,dc=my-company,dc=com'; 11 my $filter = '(&(objectClass=person)(uid=user*)) '; 12 my $message; 13 14 my $ldap = new Net::LDAP($host); 15 16 # Anonym arbeiten, keine Authentifizierung 17 $message = $ldap->bind(); 18 19 # Suchen unter der angegebenen base mit dem Filter 20 $message = $ldap->search(base => $base, filter => $filter); 21 22 foreach my $entry ($message->entries) { 23 # Jeder gefundene Eintrag hat im Hash 'asn' ein Attribut 'objectName', 24 # in dem der DN enthalten ist 25 print $entry->{'asn'}->{'objectName'}, "n"; 26 } 9
  • 10. Ergebnis der Suche ● Ergebnis der Scriptausführung: gbeine$ perl -w search.pl uid=user1,ou=users,dc=my-company,dc=com uid=user2,ou=users,dc=my-company,dc=com uid=user3,ou=users,dc=my-company,dc=com 10
  • 11. Anlegen mit Perl - I 1 #!/usr/bin/perl 2 3 use strict; 4 use warnings; 5 6 use Net::LDAP; 7 use Data::Dumper; 8 9 my $host = '172.16.166.129'; 10 my $base = 'ou=users,dc=my-company,dc=com'; 11 my $message; 12 13 my $ldap = new Net::LDAP($host); 14 15 # Schreiben erfordert Authentifizierung 16 $message = $ldap->bind( 17 'cn=Administrator,dc=my-company,dc=com', 18 password => 'linux' 19 ); 20 21 $message->code && warn "Fehler bei Auth: ", $message->error; 22 11
  • 12. Anlegen mit Perl - II 23 # Anlegen eines vierten Nutzers 24 $message = $ldap->add( 'uid=user4,'.$base, 25 attr => [ 26 'uid' => 'user4', 27 'uidNumber' => '4', 28 'gidNumber' => '1', 29 'cn' => 'User', 30 'sn' => 'Four', 31 'homeDirectory' => '/home/user4', 32 'objectclass' => [ 'top', 'person', 'posixAccount' ], 33 ] 34 ); 35 36 $message->code && warn "Fehler beim Anlegen: ", $message->error; 12
  • 13. Ändern mit Perl 1 #!/usr/bin/perl 2 3 use strict; 4 use warnings; 5 6 use Net::LDAP; 7 8 my $host = '172.16.166.129'; 9 my $base = 'ou=users,dc=my-company,dc=com'; 10 my $message; 11 12 my $ldap = new Net::LDAP($host); 13 14 # Schreiben erfordert Authentifizierung 15 $message = $ldap->bind( 16 'cn=Administrator,dc=my-company,dc=com', 17 password => 'linux' 18 ); 19 20 $message->code && warn "Fehler bei Auth: ", $message->error; 21 22 # Attribute ändern 23 $message = $ldap->modify( 24 'uid=user4,'.$base, replace => { 'sn' => 'Five' } ); 25 26 $message->code && warn "Fehler beim Ändern: ", $message->error; 13
  • 14. Umbenennen mit Perl 1 #!/usr/bin/perl 2 3 use strict; 4 use warnings; 5 6 use Net::LDAP; 7 8 my $host = '172.16.166.129'; 9 my $base = 'ou=users,dc=my-company,dc=com'; 10 my $message; 11 12 my $ldap = new Net::LDAP($host); 13 14 # Schreiben erfordert Authentifizierung 15 $message = $ldap->bind( 16 'cn=Administrator,dc=my-company,dc=com', 17 password => 'linux' 18 ); 19 20 $message->code && warn "Fehler bei Auth: ", $message->error; 21 22 # DN ändern 23 $message = $ldap->moddn( 'uid=user4,'.$base, 24 newrdn => 'uid=user5', deleteoldrdn => 1); 25 26 $message->code && warn "Fehler beim Ändern: ", $message->error; 14
  • 15. Löschen mit Perl 1 #!/usr/bin/perl 2 3 use strict; 4 use warnings; 5 6 use Net::LDAP; 7 8 my $host = '172.16.166.129'; 9 my $base = 'ou=users,dc=my-company,dc=com'; 10 my $message; 11 12 my $ldap = new Net::LDAP($host); 13 14 # Schreiben erfordert Authentifizierung 15 $message = $ldap->bind( 16 'cn=Administrator,dc=my-company,dc=com', 17 password => 'linux' 18 ); 19 20 $message->code && warn "Fehler bei Auth: ", $message->error; 21 22 # Löschen 23 $message = $ldap->delete( 'uid=user5,'.$base ); 24 25 $message->code && warn "Fehler beim Löschen: ", $message->error; 15
  • 16. Java & LDAP ● Viele Wege führen nach Rom: ● javax.naming.ldap – Zugriff auf LDAP via Java-Namendienste-API ● Java LDAP – Ehemals Novell, jetzt an OpenLDAP übergeben http://www.openldap.org/jldap/ ● Mozilla LDAP SDK – Ehemals von Netscape entwickelt, seit 2008 tot http://www.mozilla.org/directory/javasdk.html ● SPRING LDAP – LDAP-Zugriff via JDBC-Templates http://www.springsource.org/ldap 16
  • 17. Suchen mit Java - I 3 import java.util.Hashtable; 4 5 import javax.naming.Context; 6 import javax.naming.NamingEnumeration; 7 import javax.naming.directory.DirContext; 8 import javax.naming.directory.InitialDirContext; 9 import javax.naming.directory.SearchControls; 10 import javax.naming.directory.SearchResult; 11 12 13 public class Search { 14 15 private final static String ldapAdServer = 16 "ldap://172.16.166.129:389"; 17 private final static String ldapSearchBase = 18 "ou=users,dc=my-company,dc=com"; 19 private final static String ldapFilter = 20 "(&(objectClass=person)(user=user*))"; 21 22 public static void main(String[] args) { 23 Hashtable<String, Object> env = 24 new Hashtable<String, Object>(); 25 // Einfaches bind, ohne Authentifizierung 26 env.put(Context.SECURITY_AUTHENTICATION, "simple"); 27 env.put(Context.INITIAL_CONTEXT_FACTORY, 28 "com.sun.jndi.ldap.LdapCtxFactory"); 29 env.put(Context.PROVIDER_URL, ldapAdServer); 17
  • 18. Suchen mit Java - II 30 31 try { 32 DirContext ctx = new InitialDirContext(env); 33 34 SearchControls searchControls = 35 new SearchControls(); 36 searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE ); 37 38 NamingEnumeration<SearchResult> results = 39 ctx.search(ldapSearchBase, ldapFilter, searchControls); 40 41 SearchResult searchResult = null; 42 while(results.hasMoreElements()) { 43 searchResult = (SearchResult) results.nextElement(); 44 System.out.println(searchResult.getNameInNamespace()); 45 } 46 } catch (Exception e) { 47 System.err.println(e); 48 } 49 50 } 51 } 18
  • 20. Aufbau von Schema Definitionen # Attributtypen AttributeType ( <OID> NAME '<name>' DESC '<description>' EQUALITY <matchingRule> SUBSTR <matchingRule> SYNTAX <syntaxOID> ) AttributeType ( <OID> NAME '<name>' DESC '<description>' SUP <superType> ) # Klassen objectclass ( <OID> NAME '<name>' DESC '<description>' SUP <superClass> # oder: < STRUCTURAL | ABSTRACT | AUXILIARY > MUST ( <attribute1> $ <attribute2> ) MAY <attribute3> ) 20
  • 21. Syntax-Typen Name Object Identifier Beschreibung boolean 1.3.6.1.4.1.1466.115.121.1.7 Wahrheitswerte directoryString 1.3.6.1.4.1.1466.115.121.1.15 Unicode (UTF-8) Zeichenkette distinguishedName 1.3.6.1.4.1.1466.115.121.1.12 LDAP DN's integer 1.3.6.1.4.1.1466.115.121.1.27 Zahlen numericString 1.3.6.1.4.1.1466.115.121.1.36 Numerische Zeichenketten OID 1.3.6.1.4.1.1466.115.121.1.38 Object Identifier octetString 1.3.6.1.4.1.1466.115.121.1.40 BLOB's ● An die Syntax kann in geschweiften Klammern noch eine Länge angehängt werden: ● 1.3.6.1.4.1.1466.115.121.1.15{256} steht für eine 256 Zeichen lange Zeichenkette 21
  • 22. Matching Rules Name Anwendbarkeit Beschreibung booleanMatch Gleichheit caseIgnoreMatch Gleichheit Ignoriert Groß-/Kleinschreibung und Leerzeichen caseIgnoreOrderingMatch Sortierung Ignoriert Groß-/Kleinschreibung und Leerzeichen caseIgnoreSubstringsMatch Teilzeichenketten Ignoriert Groß-/Kleinschreibung und Leerzeichen caseExactMatch Gleichheit Ignoriert Leerzeichen caseExactOrderingMatch Sortierung Ignoriert Leerzeichen caseExactSubstringsMatch Teilzeichenketten Ignoriert Leerzeichen distinguishedNameMatch Gleichheit integerMatch Gleichheit integerOrderingMatch Sortierung numericStringMatch Gleichheit numericStringOrderingMatch Sortierung numericStringSubstringsMatch Teilzeichenketten octetStringMatch Gleichheit octetStringOrderingStringMatch Sortierung octetStringSubstringsStringMatch Teilzeichenketten objectIdentiferMatch Gleichheit 22
  • 23. Beispiel-Schema # Basis OID für alle LDAP-Typen meines Unternehmens objectIdentifier GBGmbH 1.3.6.1.4.1.40207; # Empfohlene Aufteilung für SNMP und LDAP objectIdentified MySNMP GBGmbH:1 objectIdentified MyLDAP GBGmbH:2 objectIdentifier MyAttributeType MyLDAP:1 objectIdentifier MyObjectClass MyLDAP:2 # Ein Attribut, von name geerbt attributetype ( MyAttributeType:1 # ergibt 1.3.6.1.4.1.40207.2.1.1 NAME 'applicationName' DESC 'Name of an Application' SUP name SINGLE-VALUE ) # Eine Struktur-Klasse objectclass ( MyObjectClass:1 # ergibt 1.3.6.1.4.1.40207.2.2.1 NAME 'application' DESC 'An application object' STRUCTURAL MUST ( applicationName ) ) 23
  • 25. Szenario ● Benutzerverwaltung in Kombination ● Authentifizierung: LDAP ● Generisches Rechtemanagement: SQL-Datenbank ● Teilweise datenbezogene Berechtigungen bis auf Objektebene für viele verschiedene Anwendungen ● Skaliert mit Tabellen nur schwer ● Idee: Erweiterte Nutzung des LDAP für Berechtigungen ● Aliase auf Nutzer ersetzen JOIN ;-) ● Aliase in LDAP entsprechen Symlinks in Unix-Dateisystemen ● extensibleObjects lassen Aliase transparent erscheinen 25
  • 26. Anlegen eines Alias ● objectClass alias auswählen ● Wenn das neue Objekt transparent sein soll: ObjectClass extensibleObject auswählen ● Wenn extensibleObject möglich, gleiches DN-Attribut nutzen, wie im Original ● Aliases sind geringfügig langsamer als echte Objekte 26
  • 27. Die Baumstruktur mit Aliases ● user1 und user2 unterhalb von ou=applications sind Links auf die echten Einträge unter ou=users ● Änderungen an Einträgen unter ou=users wirken sich direkt aus ● Suchen nach objectClass=person unter ou=applications liefert user1 und user2 von ou=users ● Für Suchen muss deref=always gesetzt sein 27
  • 28. Wie funktioniert der „JOIN“? ● Über den Distinguished Name! ● Original: dn=uid=user1,ou=users,dc=my-company,dc=com ● Alias: dn=uid=user1,ou=application1,ou=applications,dc=my-company,dc=com ● Suche nach (&(objectClass=person)(uid=user1)) unterhalb von ou=application1,ou=applications,dc=my-company,dc=com liefert die Information, ob user1 das Recht hat, application1 zu nutzen ● Suche nach (&(objectClass=person)(uid=user2)) unterhalb von ou=privilege1,ou=application2,ou=applications,dc=my-company,dc=com liefert die Information, ob user2 das Recht für privilege1 in application2 zu nutzen ● Die Existenz eines Suchergebnisses bedeutet, das Recht ist vorhanden 28
  • 29. Weitere Anwendungsmöglichkeiten, Beachtenswertes ● Verfeinerung der Berechtigungen über Erweiterung der Hierarchie möglich – Funktionsprinzip bleibt identisch ● Kein Tabellen-Jonglieren bei Authorisierung von Nutzern – Jede Anwendung kennt ihren eigenen Subtree im Verzeichnis und nur diesen! ● Teilbäume können repliziert werden ● Indizierung des Verzeichnisbaumes beachten – Aliase sind langsamer als echte Objekte ● extensibleObject mit Vorsicht genießen – semistrukturierte Daten erfordert Anwendungslogik ● Skalierungsmöglichkeiten berücksichtigen – OpenLDAP liest schnell, schreibt aber verhältnismäßig langsam 29
  • 30. Literaturempfehlungen ● OpenLDAP: http://www.openldap.org/doc/admin24/index.html ● LDAP für Java Entwickler: http://www.amazon.de/LDAP-für-Java-Entwickler-3-Auflage/dp/3939084 077/ ● LDAP verstehen, OpenLDAP einsetzen: http://www.amazon.de/LDAP-verstehen-OpenLDAP-einsetzen-Praxiseins atz/dp/3898642631/ ● LDAPman home page: http://ldapman.org/ ● LDAP Linux HOWTO: http://tldp.org/HOWTO/LDAP-HOWTO/ 30
  • 31. Viel Spaß noch auf der FrOSCon 2012! 31