FAQ:Arktur4/LDAPtool
Archiv: Dieser Artikel beschreibt nicht die Funktionalität des derzeit aktuellen delixs-Servers. Er beschreibt ältere Schulserver-Funktionen und dient dem Zweck der Archivierung. |
Ein kleines LDAP-Tool
Frage:
Ich möchte den Umgang mit LDAP lernen. Was kann ich tun?
Antwort:
Hier ein nützliches keines Script:
Name: l_tool.sh Liegt im Pfad: /usr/local/bin/ Rechte: -rwxr--r-- root:root
Der Inhalt (Kommentare unterdrückt):
Capella:~ # cat /usr/local/bin/l_tool.sh|grep -v ^#
my_conf="/etc/ldap.conf" my_sec="/etc/ldap.secret" [ -f "$my_conf" ] || [ -f "$my_sec" ] || ( echo \ "LDAP ist nicht konfiguriert." ; echo \ "Steige aus." ; exit 1 ) if ! [ "`cat $my_sec|wc -c`" = "`/usr/bin/stat -c %s $my_sec`" ]; then echo -n "`cat $my_sec`" > $my_sec fi ldap_base=$(grep ^base $my_conf | awk '{ print $2 }') ldap_bind=$(grep rootbinddn $my_conf | awk '{ print $2 }') ldapsearch -x -LLL -D $ldap_bind -y /etc/ldap.secret "$@" Capella:~ #
Erklärung: Das Script macht nicht viel. Das aber gut. Es vereinfacht den "ldapsearch" Aufruf. Das Script funtioniert mit allen openldap Servern, vorausgesetzt, sie benutzen wie Arktur 4 eine Plaintext Anmeldung (-x), rootdn Kennung und Passworte werden direkt aus den Dateien gelesen.
Eine Eingabe ist nicht erforderlich. Da die "/etc/ldap.secret" dem Nutzer "root" gehört, funktioniert das Script nur, wenn "root" es auch startet. Der Parameter "-LLL" verkürzt die Ausgabe (also LDIFF Kommentare werden entfernt).
Nun ein paar praktische Beispiele.
Ausgabe des GANZEN LDAP-Baums (wenig sinnvoll, es sei denn Mensch braucht ein unvollstaendiges Backup. Nur Nutzdaten, keine internen Attribute)
l_tool.sh
Ergebnis: Zig Seiten im ldiff Format.
Ausgabe aller Maschienenaccounts:
l_tool.sh ou=ARBEITSSTATIONEN
Ergebnis:
dn: ou=ARBEITSSTATIONEN,o=SCHULE,dc=europaschuledortmund,c=de ou: ARBEITSSTATIONEN objectClass: organizationalUnit description: Container der Samba-Maschinen-Accounts
Auf diesem Arktur4rc1 Server befindet sich die Maschinen-Accounts unterhalb
von ou=ARBEITSSTATIONEN,o=SCHULE,dc=europaschuledortmund,c=de
Jetzt kommt die eigentliche Suche (Alles auf eine Zeile):
l_tool.sh -b ou=ARBEITSSTATIONEN,o=SCHULE,dc=europaschuledortmund,c=de -s sub objectclass=*
Erklärungen:
-b gibt die Suchbasis im Baum an -s sub finde alle Eintraege unterhalb von (-b), auch verschachtelte objectclass=* Ein LDAP-Filter. Dieser findet einfach alles!
Das Ergebnis (Passwoerter entfernt):
dn: uid=admin$,ou=ARBEITSSTATIONEN,o=SCHULE,dc=europaschuledortmund,c=de cn: admin objectClass: account objectClass: posixAccount objectClass: sambaSamAccount uid: admin$ uidNumber: 11000 gidNumber: 97 homeDirectory: /dev/null gecos: Windows-Maschinenaccount admin description: Windows-Maschinenaccount admin loginShell: /bin/false sambaSID: S-1-5-21-2668716448-1598664822-178526104-23000 sambaPrimaryGroupSID: S-1-5-21-2668716448-1598664822-178526104-1195 displayName: Windows-Maschinenaccount admin sambaPwdCanChange: 1157442896 sambaPwdMustChange: 2147483647 sambaPwdLastSet: 1157442896 sambaAcctFlags: [W ] dn: uid=blaq$,ou=ARBEITSSTATIONEN,o=SCHULE,dc=europaschuledortmund,c=de cn: blaq objectClass: account objectClass: posixAccount objectClass: sambaSamAccount uid: blaq$ uidNumber: 11001 gidNumber: 97 homeDirectory: /dev/null gecos: Windows-Maschinenaccount blaq description: Windows-Maschinenaccount blaq loginShell: /bin/false sambaSID: S-1-5-21-2668716448-1598664822-178526104-23002 sambaPrimaryGroupSID: S-1-5-21-2668716448-1598664822-178526104-1195 displayName: Windows-Maschinenaccount blaq sambaPwdCanChange: 1157631948 sambaPwdMustChange: 2147483647 sambaLMPassword: #secretsecretsecretsecretsecret# sambaNTPassword: #secretsecretsecretsecretsecret# sambaPwdLastSet: 1157631948 sambaAcctFlags: [W ]
Also: Auf diesem Server gibt es zwei Maschinen-Accounts: admin$ und blaq$
Admin$ wurde durch das Migrationsscript angelegt. Vielleicht gab es ihn auch schon in der alten smbpasswd. Dieser Host hat KEIN Passwort. Der Eintrag funktioniert also NICHT! blaq$ wurde vom Migrationsscript bei der Migration einer Artur 3.0o auf 4rc1 übernommen. Dieser Eintrag funktioniert. Ist eine windows2000 Maschine.
Diesmal was kürzeres:
l_tool.sh o=SCHULE
Ergebnis:
dn: o=SCHULE,dc=europaschuledortmund,c=de o: SCHULE objectClass: organization objectClass: top
Also: Wie der Mensch sehen kann, werden die internen Attribute der LDAP-Datenbank nicht ausgegeben. Wer die auch haben möchte, hängt einfach ein "*" "+" an die Abfrage:
l_tool.sh o=SCHULE "*" "+"
Ergebnis:
dn: o=SCHULE,dc=europaschuledortmund,c=de o: SCHULE objectClass: organization objectClass: top structuralObjectClass: organization entryUUID: 1eb77e24-cfdd-102a-83a5-b3d381ce8f09 creatorsName: cn=admin,dc=europaschuledortmund,c=de createTimestamp: 20060903211550Z entryCSN: 20060903211550Z#000004#00#000000 modifiersName: cn=admin,dc=europaschuledortmund,c=de modifyTimestamp: 20060903211550Z entryDN: o=SCHULE,dc=europaschuledortmund,c=de subschemaSubentry: cn=Subschema hasSubordinates: TRUE
Das letzte Attribut "hasSubordinates" ist besonders interessant. Wenn das Attribut wahr (TRUE) ist, dann hat dieser Eintrag im LDAP-Baum Blätter (Kinder). Also lasst uns danach suchen. Der Mensch kann diese Verzweigungen gut als Suchbasis (mit Parameter -b) benutzen.
l_tool.sh "(&(objectClass=*)(hasSubordinates=TRUE))" dn hasSubordinates dn: dc=europaschuledortmund,c=de hasSubordinates: TRUE
Ergebnis:
dn: o=SYSTEM,dc=europaschuledortmund,c=de hasSubordinates: TRUE dn: o=DHCP,dc=europaschuledortmund,c=de hasSubordinates: TRUE dn: o=SCHULE,dc=europaschuledortmund,c=de hasSubordinates: TRUE dn: ou=sysusers,o=SYSTEM,dc=europaschuledortmund,c=de hasSubordinates: TRUE dn: ou=sysgroups,o=SYSTEM,dc=europaschuledortmund,c=de hasSubordinates: TRUE dn: ou=ARBEITSSTATIONEN,o=SCHULE,dc=europaschuledortmund,c=de hasSubordinates: TRUE dn: ou=GRUPPEN,o=SCHULE,dc=europaschuledortmund,c=de hasSubordinates: TRUE dn: ou=LEHRER,o=SCHULE,dc=europaschuledortmund,c=de hasSubordinates: TRUE dn: ou=SCHUELER,o=SCHULE,dc=europaschuledortmund,c=de hasSubordinates: TRUE dn: ou=PROJEKTE,o=SCHULE,dc=europaschuledortmund,c=de hasSubordinates: TRUE dn: ou=KLAUSUR,o=SCHULE,dc=europaschuledortmund,c=de hasSubordinates: TRUE dn: ou=PAdmins,ou=PROJEKTE,o=SCHULE,dc=europaschuledortmund,c=de hasSubordinates: TRUE dn: ou=PGruppen,ou=PROJEKTE,o=SCHULE,dc=europaschuledortmund,c=de hasSubordinates: TRUE dn: cn=DHCP Service Config,o=DHCP,dc=europaschuledortmund,c=de hasSubordinates: TRUE dn: cn=192.168.0.0,cn=DHCP Service Config,o=DHCP,dc=europaschuledortmund,c=de hasSubordinates: TRUE dn: cn=mygroup,cn=192.168.0.0,cn=DHCP Service Config,o=DHCP,dc=europaschuledortmund,c=de hasSubordinates: TRUE
Und schon hat man eine komplette Übersicht der Struktur des LDAP-Baumes von Arktur 4rc1.
Der generelle Aufruf sieht so aus:
ldapsearch (viele Parameter) "Filter" Attribute die angezeigt werden sollen
oder
l_tool.sh "Filter" Attribute die angezeigt werden sollen
Wichtig sind also Filter.
Beispiele:
Einfache Filter:
- cn=root
- uid=root
- o=schule
Ungenaue Filter:
- l_tool.sh sn=*meier* sn
dn: uid=hansm,ou=LEHRER,o=SCHULE,dc=europaschuledortmund,c=de sn: Hans Mittermeier dn: uid=mmar,ou=SCHUELER,o=SCHULE,dc=europaschuledortmund,c=de sn: Maria Meier dn: uid=manna,ou=SCHUELER,o=SCHULE,dc=europaschuledortmund,c=de sn: Anna Meier
- Und Filter: &
"(&(objectClass=*)(hasSubordinates=TRUE))"
- Oder Filter: |
"(|(objectClass=*)(hasSubordinates=TRUE))"
Das Und & bzw das Oder | werden voran gestellt. Das Ganze muss dann in Klammern eingefasst werden. Und damit die Bash die Klammern nicht mit interpretiert, kommt alles zusammen nochmals in Hochkommata "".
Wer alles etwas über Filter wissen will, tut sich dieses fürchterliche Dokument an: http://www.faqs.org/rfcs/rfc2254.html
-- aus einer Mail von Harry J.