[gelöst] LDAP: ldapadd mit octet string

Alle weiteren Dienste, die nicht in die drei oberen Foren gehören.
Antworten
chmeyer
Beiträge: 96
Registriert: 03.02.2010 21:09:12
Wohnort: RLP

[gelöst] LDAP: ldapadd mit octet string

Beitrag von chmeyer » 17.06.2015 14:52:10

Guten morgen zusammen,

seit einiger Zeit rätsele ich über die korrekte Syntax beim hinzufügen eines octet string Wertes.
Es geht um die NetbootGUID von Client-Rechnern, die ich mit Debianmaschinen auf einem Windows AD Server ändern bzw. hinzufügen möchte. Mein Netzwerk besteht zur Zeit aus Windowsmaschinen und ich versuche nun Linuxrechner hinzuzufügen. Außerdem bin ich noch ein ziemlicher LDAP Anfänger, versuche aber mich hineinzuarbeiten.

Klar ist:
- die NetbootGUID ist im Format octet string und wird intern beim Abfragen mit base64 codiert.
- es geht nicht um die Endianness ("Byte-Reihenfolge") bei der Kommunikation mit dem Server, dieses Problem löse ich mit tr, sed und printf. Außerdem ist hierbei der Unterschied zweischen "/sys/class/dmi/id/product_uuid" und "dmidecode -s system-uuid" hilfreich.

Das Abfragen bereits installierter Windows-Maschinen klappt übrigens problemlos mit:
ldapsearch -Hldap:\\Server -D "user@Domain" -w "pw" -b "dc=XYZ,DC=TLD" "netbootGUID=\00\00\00\00\00\00\00\00\00\00\00\00\00\00\20\17"

Mein Problem:
1. Ein (Debian-)Rechner wird mit net ads join der Domäne hinzugefügt. Klappt. AD kennt jetzt den Rechner und dieser lässt sich per Hostname auch mit LDAP finden.
2. Die netbootGUID ist noch nicht gesetzt, dies möchte ich nun mit ldapmodify und der Datei ldif.txt ändern.
3. Datei ldif.txt:
dn: cn=hostname,cn=Computers,dc=XYZ,dc=TLD
changetype: modify
add: netbootGUID
netbootGUID: 00000000000000000000000000002017

ldapmodify -Hldap:\\Server -D "user@Domain" -w "pw" ldif.txt ergibt:
ldap-modify: Constraint Violation (19)
additional info: 00002082: AtrErr: DSID-031513C2, #1:
0: 00002082: DSID-131513C2, Problem 1005 (CONSTRAIT_ATT_TYPE), data 0, Att 90167 (netbootGUID):len 32

Klar, LDAP erwartet die Daten ja auch als octet string.
Ändere ich den Wert der GUID auf den Wert, der mit lpadsearch funktioniert (also:
netbootGUID: \00\00\00\00\00\00\00\00\00\00\00\00\00\00\20\17 ) erhalte ich folgende Fehlermeldung:
ldap-modify: Constraint Violation (19)
additional info: 00002082: AtrErr: DSID-031513C2, #1:
0: 00002082: DSID-131513C2, Problem 1005 (CONSTRAIT_ATT_TYPE), data 0, Att 90167 (netbootGUID):len 48

Hm, es scheint, als ob die Backslashes als normales Zeichen interpretieret würden.
Mit "echo -e \00\00\00....\20\17" "verschwinden" die führenden \00 Oktets zwar scheinbar vom Bildschirm, in die ldif-Datei umgeleitet sie sind aber noch als ^@ erkennbar. Und tatsächlich: Die Fehlermeldung ändert sich:
ldap-modify: Invalid syntax (21)
additional info: 00000057: LdapErr: DSID-0C090B8A, comment: Error in Attribute conversion Operation, data 0, v1db1

Im Internet habe ich zwei Hinweise gefunden, kann sie aber nicht ganz einordnen:
Auf einer Seite zum ExchangeServer findet sich bei der Fehlermeldung noch der Hinweis: "The requested attribute does not exist."
bzw. bei Oracle:
21 (0x15) LDAP_INVALID_SYNTAX: sent by Directory Server if your client is modifying the schema entry and no object class or attribute type is specified.

Die Windows Maschinen, die beim LDAP-Server bekannt sind haben tatsächlich alle ein Attribut "netbootGUID", bei den Linux-Rechern fehlt diese.

Was mache ich falsch oder habe ich übersehen?

Viele Grüße,

Christian
Zuletzt geändert von chmeyer am 23.06.2015 14:38:53, insgesamt 2-mal geändert.

chmeyer
Beiträge: 96
Registriert: 03.02.2010 21:09:12
Wohnort: RLP

Re: LDAP: No such attribute

Beitrag von chmeyer » 20.06.2015 11:00:56

Hallo zusammen,

es sieht aus, als ob ich dem eigentlichen Problem näher komme:

1. Während die Windowsrechner der Domäne ein Attribut "netbootGUID" haben, fehlt dieses Attribut bei den Debian-Rechnern. Ändere ich obige Datei ldif.txt zu (changetype add statt modify, ^Q erzeugt durch echo -e "\00"):
dn: cn=hostname,cn=Computers,dc=XYZ,dc=TLD
changetype: add
add: netbootGUID
netbootGUID: ^Q^Q^Q^Q^Q^Q^Q^Q^Q^Q^Q^Q^Q^Q\20\17

ändert sich die Fehlermeldung erneut und ich erhalte: "no such attribute (16)", also etwa (in Internet gefunden): "Indicates that the attribute specified in the modify or compare operation does not exist in the entry." Einfach einem Computer ein neues Attribut hinzuzufügen scheint also nicht zu gehen.

2. Das Attribut netbootGUID scheint also nicht für die (Linux)Computer vorhanden zu sein. Vergleiche ich die "objectClass"-Einträge der Windows Rechner (mit eingetragener netbootGUID) mit denen meiner Debian Rechner (Fehlermeldung), so stelle ich (leider) keinen Unterschied fest. Bei beiden sind vorhanden:
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: user
objectClass: computer

Schlecht, denn ich hatte mir erhofft mit "add: objectClass" das Attribut netbootGUID hinzufügen zu können.

3. Irgendwie verwirrend. Man kann ja auch beim "net ads join" z.B. osName="Debian GNU/Linux" osVer="8.1" übergeben (z.B. auch mit /etc/os-release und /etc/debian_version), und die LDAP Attribute werden dann hinzugefügt und richtig belegt. So eine Funktion mit der netbootGUID vermisse ich.

4. Ein letzter Gedanke, vielleicht ist es aber ja doch relevant: auf den "kinit"-Befehl vor "net ads join" verzichte ich, da er ja nur zum Testen der Kerberos Authentifizierung gedacht ist.

Neben einer Lösung für mein Problem freue ich mich auch über den Hinweis auf Denkfehler oder alternative Ansätze.

Christian

chmeyer
Beiträge: 96
Registriert: 03.02.2010 21:09:12
Wohnort: RLP

Re: [gelöst] LDAP: ldapadd mit octet string

Beitrag von chmeyer » 23.06.2015 14:44:45

Hier die Lösung, es war doch ein Kodierungsproblem:

Man kann "ganz einfach" in der Datei ldif.txt den netbootGUID-Wert mit base64 kodieren.
Dazu muss man aber zwischen dem Attribut netbootGUID und seinem base64-Wert den doppelten Doppelpunkt setzen.

Also: ldif.txt:
dn: cn=hostname,cn=Computers,dc=XYZ,dc=TLD
changetype: modify
add: netbootGUID
netbootGUID:: AAAAAAAAAAAAAAAAAAAgFw==

Der base64-Wert wird bei mir ermittelt mit:
netbootGUID=$(cat /sys/devices/virtual/dmi/id/product_uuid | tr -d - | while read -N2 code; do printf "\x$code"; done | base64 )

Oh mann. Wenn man die Lösung weiß, ist es wirklich ganz einfach. ...

Christian

Antworten