PDA

View Full Version : Erfahrung mit der Enterprise Identity Mapping (EIM) API



benwisch
14-05-07, 13:19
Hallo,

ich hoffe mir kann hier jemand etwas weiterhelfen:
Ich schlage mich hier gerade mit dem Einbau einer Authentifizierung mit Kerberos in eine eigenentwickelte Client-Server-Anwendung rum. Der Client läuft auf einem Windows PC, der Server auf einer iSeries.
Die reine Kerberos-Geschichte klappt auch so weit. Danach habe ich dann den User, wie er in der Windows-Domäne angelegt ist. So weit, so gut.

Nun müßte ich den aber noch auf den AS/400 User zurückmappen. Auch dafür gibt es eine schöne API von der IBM, um die Informationen vom EIM zu bekommen.

Ich rufe erst die diversen Funktionen zur Konfiguration auf, beim Aufruf von eimConnect() bekomme ich aber so einen nichtssagenden Fehler 3734 "Unbekannter Systemstatus".
Update: Die richtige Meldung lautet: Message: >Unerwarteter LDAP-Fehler. ldap_sasl_bind_s - gss_init_sec_context failed<

Code habe ich unten angehängt.

Achja, mit Client-Access klappt die gesamte Anmeldung natürlich, also korrekt eingerichtet müßte alles sein.

MfG, Ben

PS: Hier der Code, sorry ist etwas wirr und doch etwas gekürzt, ist bisher nur ein Test-Programm:


//...
printf("eimCreateHandle()\n");
/* Create a new eim handle. Use the eim configuration URL */
if (0 != (rc = eimCreateHandle(&handle,
NULL,
err)))
{
printf("Create handle error = %d\n", rc);
printf("Message: >%s<\n", getEIMError(err));
return -1;
}
printf("eimCreateHandle() success...\n");

//...

printf("eimSetConfiguration()\n");
/* Enable configuration info. */
if (0 != (rc = eimSetConfiguration(1,
NULL,
NULL,
NULL,
0,
err)))
{
printf("Set configuration error = %d\n", rc);
printf("Message: >%s<\n", getEIMError(err));
return -1;
}
printf("eimSetConfiguration() success...\n");

//...

connectInfo.type = QSY_EIM_KERBEROS_KEYTAB;
connectInfo.connectInfo.kerberosKeyTab.keyTabFile = "/QIBM/UserData/OS400/NetworkAuthentication/keytab/krb5.keytab";
connectInfo.connectInfo.kerberosKeyTab.principal = "krbsvr400/host@REALM.DE";
connectInfo.connectInfo.kerberosKeyTab.realm = "REALM.DE";

if (0 != (rc = QsySetEIMConnectInfo( QSY_EIM_CONFIG,
connectInfo,
err)))
{
printf("Set connection information error = %d\n", rc);
printf("Message: >%s<\n", getEIMError(err));
return -1;
}
printf("QsySetEIMConnectInfo() success...\n");

//...

printf("eimConnect()\n");
con.type = EIM_KERBEROS;
con.creds.kerberos = NULL;
con.ssl = NULL;

/* Connect to configuartion system */
if (0 != (rc = eimConnect(&handle,
con,
err)))
{
printf("Connect error = %d\n", rc);
printf("Message: >%s<\n", getEIMError(err));
return -1;
}
printf("eimConnect() success...\n");

//...

printf("eimDestroyHandle()\n");
/* Destroy the handle */
if (0 != (rc = eimDestroyHandle(&handle,
err)))
{
printf("Destroy handle error = %d\n", rc);
printf("Message: >%s<\n", getEIMError(err));
return -1;
}
printf("eimDestroyHandle() success...\n");

benwisch
14-05-07, 15:30
Hallo,

bin ein Stückchen weiter. Mein Fehler war der Aufruf der Einstellungs-Funktionen. Damit habe ich unserem Admin mal schön die Konfiguration des EIM zerhauen *g*.
Die Fehlermeldung bleibt aber die gleiche.

Der EIM läuft bei uns auf einer anderen AS/400. Unser admin stellt im OpsNav einen Benutzernamen und ein Passwort für den Zugriff ein. Der wird scheinbar gespeichert und bei jeder Anfrage an den EIM (bei Anmeldung mit Client-Access) verwendet.
Genau diesen bräuchte ich für meinen Aufruf auch, will aber nirgendwo User und Passwort ablegen müssen. Der Serverdienst soll schließlich im Hintergrund laufen. Gibt es eine Möglichkeit sich den User irgendwie zu holen ?

MfG, Ben

AS400.lehrling
15-05-07, 09:05
Hallo,

bin ein Stückchen weiter. Mein Fehler war der Aufruf der Einstellungs-Funktionen. Damit habe ich unserem Admin mal schön die Konfiguration des EIM zerhauen *g*.
Die Fehlermeldung bleibt aber die gleiche.

Euer admin wird dich dafür lieben;)


Der EIM läuft bei uns auf einer anderen AS/400. Unser admin stellt im OpsNav einen Benutzernamen und ein Passwort für den Zugriff ein. Der wird scheinbar gespeichert und bei jeder Anfrage an den EIM (bei Anmeldung mit Client-Access) verwendet.


Frage mal ganz nett und höfflich euren admin ob er dir verät wie er das macht, oder überede ihn das für deine Zielsetzung einzurichten :)


Genau diesen bräuchte ich für meinen Aufruf auch, will aber nirgendwo User und Passwort ablegen müssen. Der Serverdienst soll schließlich im Hintergrund laufen. Gibt es eine Möglichkeit sich den User irgendwie zu holen ?

MfG, Ben

Ich denke dein Problem läßt sich in einer Koffein geschwängerten diskusion mit euren admin lößen:p

Gruß AS400.lehrling

benwisch
15-05-07, 09:21
Hallo,


Euer admin wird dich dafür lieben;)

Tut er sowieso, da ich ihn die ganze Zeit schon nerve. Aber einen Kaffee hat mich die Aktion schon gekostet als Wiedergutmachung.



Frage mal ganz nett und höfflich euren admin ob er dir verät wie er das macht, oder überede ihn das für deine Zielsetzung einzurichten :)

Ja, Problem ist, dass der User und das Passwort irgendwo hinterlegt werden müßte. Wir werden jetzt sehen, dass wir einen User anlegen, der nur die Berechtigung für ein EIM Mapping Lookup hat.



Ich denke dein Problem läßt sich in einer Koffein geschwängerten diskusion mit euren admin lößen:p

Stimmt. Problem ist, ich habe die ganze EIM-Geschichte nicht eingerichtet. Daher fehlten mir da so ein paar Informationen.

Gruß, Ben

sebschm
25-05-07, 10:55
Hmm,

if (0 != (rc = eimSetConfiguration(1, NULL, NULL, NULL, 0, err)))Daß Du damit das EIM-System konfugurierst, hast Du ja schon heruasgefunden... :) Das selbe allerdings hier:

if (0 != (rc = QsySetEIMConnectInfo( QSY_EIM_CONFIG, connectInfo, err)))Das ist nix, was ein normales Anwendungsprogramm, das einen EIM-Lookup machen will, tun müßte. Stellt man übrigens leicht daran fest, daß das nur Leute mit *SECADM und *ALLOBJ aufrufen dürfen...Warum Du beim eimConnect() den genannten Fehler bekommst, kann ich mir nur dadurch erklären, daß Dein Server-Job, der ja den eimConnect() versucht, kein Ticket irgendwoher hat. In der Theorie geht das mit Kerberos Delegation ("horizontales SSO"), aber ob das praktisch geht, keine Ahnung. Die Doku hält sich dazu allerdings recht bedeckt - "the default credentials are used"; welche auch immer das sind. Da müßte man sich vermutlich näher einlesen. Nichtdestotrotz ist das trotzdem problematisch, weil...:
Der EIM läuft bei uns auf einer anderen AS/400. Unser admin stellt im OpsNav einen Benutzernamen und ein Passwort für den Zugriff ein. Der wird scheinbar gespeichert und bei jeder Anfrage an den EIM (bei Anmeldung mit Client-Access) verwendet.Ja, irgendwie mußt Du dich ja beim EIM-Server authentifizieren. Irgendeinen User muß es also geben. Der braucht nur Berechtigung für die "Berechtigungsnachweissuchfunktion", wie es IBM im deutschen iSeries Navigator nennt. Wenn Du das Ticket des Users, der sich mit Deinem Client zu Deinem Server verbindet, nehmen würdest, müßtest Du im EIM jeden User, der sich potentiell anmelden können soll, für diese Berechtigungsnachweissuchfunktion berechtigen. Auch nicht so der Hit, oder? ;)
Genau diesen bräuchte ich für meinen Aufruf auch, will aber nirgendwo User und Passwort ablegen müssen. Der Serverdienst soll schließlich im Hintergrund laufen. Gibt es eine Möglichkeit sich den User irgendwie zu holen ?Irgendwo mußt Du tatsächlich das Kennwort hinterlegen... wo soll es der Server sonst auch herbekommen?! Was meinst Du mit "User holen"? Welchen User? Im Zweifel brauchst Du eh noch das Kennwort...
Es gibt übrigens ein ausgezeichnetes Rotbuch (SG24-6975-00) zu dem ganzen Zeug.

benwisch
28-05-07, 10:57
Hi sebschm!

Vielen Dank für deine Hinweise. Wir haben die Sache mittlerweile im Griff. Die vielen API-Aufrufe in dem Beispiel-Code war halt verzweifeltes ausprobieren.
Wir haben die Sache jetzt gelöst, indem wir einen reinen EIM-Lookup-User angelegt haben. Dieser hat sonst keine Berechtigungen und so kann man das Passwort denke ich ohne größere Bedenken in einer Konfigurationsdatei ablegen.


Ein Problem haben wir aber noch auf einer unserer Maschinen, allerdings nicht mit EIM, sondern mit der Kerberos-Authentifizierung. Vielleicht kannst du (oder jemand anders) mir da noch weiterhelfen:
Auf diesem System hatte unser Admin etwas Probleme Kerberos einzurichten (für Client Access). Mit Hilfe der IBM wurde dann das Kerberos-Credential so eingerichtet, dass es "krbsvr400/system.domain.de@REALM.DE" heißt (und seitdem funktioniert es mit Client Access). Vorher hieß es "krbsvr400/system@REALM.DE", wie auf unseren anderen beiden AS/400. Leider klappt meine selbstgeschriebene Software (basierend auf der GSS-API) nicht auf diesem einen System. Ich bekomme immer die Meldung "Principal des Anwendungsservers nicht korrekt". Auf meinem PC-Client muss ich den Dienst in der Form "krbsvr400/system@REALM.DE" angeben. Genau dies scheint aber die falsche Version für die AS/400 zu sein. Für mich sieht das nach einem Problem bei der Namensauflösung aus. Komisch allerdings, dass es Client Access auf die Reihe bekommt.
Hat da jemand ne Idee ?

MfG, Ben

AS400.lehrling
29-05-07, 12:50
Hi sebschm!

Ein Problem haben wir aber noch auf einer unserer Maschinen, allerdings nicht mit EIM, sondern mit der Kerberos-Authentifizierung. Vielleicht kannst du (oder jemand anders) mir da noch weiterhelfen:
Auf diesem System hatte unser Admin etwas Probleme Kerberos einzurichten (für Client Access). Mit Hilfe der IBM wurde dann das Kerberos-Credential so eingerichtet, dass es "krbsvr400/system.domain.de@REALM.DE" heißt (und seitdem funktioniert es mit Client Access). Vorher hieß es "krbsvr400/system@REALM.DE", wie auf unseren anderen beiden AS/400. Leider klappt meine selbstgeschriebene Software (basierend auf der GSS-API) nicht auf diesem einen System. Ich bekomme immer die Meldung "Principal des Anwendungsservers nicht korrekt". Auf meinem PC-Client muss ich den Dienst in der Form "krbsvr400/system@REALM.DE" angeben. Genau dies scheint aber die falsche Version für die AS/400 zu sein. Für mich sieht das nach einem Problem bei der Namensauflösung aus. Komisch allerdings, dass es Client Access auf die Reihe bekommt.
Hat da jemand ne Idee ?

MfG, Ben

Probier dochmal aus dein PGM so umzuschreiben das du am PC-client "krbsvr400/system.domain.de@REALM.DE" eingeben kannst.

Eventuell so erweitern das scriptbassierend als erstets "krbsvr400/system@REALM.DE" und bei mißerfolg "krbsvr400/system.domain.de@REALM.DE" verwendet wird.

Gruß AS400.lehrling

benwisch
30-05-07, 08:11
Probier dochmal aus dein PGM so umzuschreiben das du am PC-client "krbsvr400/system.domain.de@REALM.DE" eingeben kannst.

Eventuell so erweitern das scriptbassierend als erstets "krbsvr400/system@REALM.DE" und bei mißerfolg "krbsvr400/system.domain.de@REALM.DE" verwendet wird.

Gruß AS400.lehrling


Hallo,

leider bringt das nichts, da bei der Variante "krbsvr400/system.domain.de@REALM.DE" die Client-Anwendung bereits den Fehler "Server not found in Kerberos database" bringt. Und wenn ich mir die Credentials auf meinem PC anschaue, dann sehe ich dort auch nur den Eintrag in der Form "krbsvr400/system@REALM.DE".
MfG, Ben

AS400.lehrling
01-06-07, 15:34
Hallo,

leider bringt das nichts, da bei der Variante "krbsvr400/system.domain.de@REALM.DE" die Client-Anwendung bereits den Fehler "Server not found in Kerberos database" bringt. Und wenn ich mir die Credentials auf meinem PC anschaue, dann sehe ich dort auch nur den Eintrag in der Form "krbsvr400/system@REALM.DE".
MfG, Ben

Sehe ich das richtig, die Kerberos datenbank befindet sich auf dem PC ?

Falls ja gehe dochmal einfach in die Datenbank und ergänze die dartige Serverliste.

Wenn das auch nicht Funktioniert gibt es noch die Möglichkeit endweder ein Routig auf der i Seite einzurichten um von der maschiene aus wo der login funktioniert auf die gewünschte maschiene zu routen, oder den Servereintrag auf der i5 endsprechen zu ändern.

Sonst fällt mir nicht mehr ein:(

Gruß AS400.lehrling