Wie verwende ich gssapi kerberos in plattformübergreifenden C/C++-Client-Server-Programmen? [closed]

Lesezeit: 6 Minuten

Benutzeravatar von mdk
mdk

Ich musste in den letzten Jahren “sporadisch” mit Heimdal / MIT Gssapi für die Kerberos-Authentifizierung zusammenarbeiten. Ich musste eine Anwendung erstellen, die als Webdienst auf einer Linux-Box verwendet werden sollte und Clientanwendungen wie Browser bedienen sollte, die auf Windows- und/oder Linux-Desktops und -Workstations liefen. Sicherlich nicht die am einfachsten zu zähmenden Bestien. Als ich schließlich meine Arbeit zusammenfasste, konnte ich feststellen, dass die Schwierigkeiten von Herausforderungen in mehreren Dimensionen ausgingen. Der Einstieg in die gssapi-Programmierung ist wirklich eine Herausforderung, nur wegen der schlechten Dokumentation und der praktisch nicht vorhandenen Tutorials. Das Googeln führt meistens entweder zu einer theoretischen Diskussion darüber, was Kerberos ist, oder zu Inhalten, die mit der Annahme geschrieben wurden, dass Sie bereits alles außer einem bestimmten semantischen Problem wissen. Einige wirklich gute Hacks hier haben dazu beigetragen, mir zu helfen, ich nehme daher an, dass es eine gute Idee wäre, das Zeug aus der Sicht eines Entwicklers zusammenzufassen und es hier als eine Art Wiki zu teilen, um diesem fantastischen Ort etwas zurückzugeben, und andere Programmierer.

Ich habe noch nie zuvor ein solches Wiki erstellt, und ich bin sicherlich keine Autorität in Bezug auf GSSAPI oder Kerberos, also seien Sie bitte freundlich, aber mehr als das, bitte tragen Sie dazu bei und korrigieren Sie meine Fehler. Site-Redakteure, ich zähle auf Sie, um Ihre Magie zu vollbringen 😉

Um Ihr Projekt erfolgreich abzuschließen, müssen 3 bestimmte Dinge richtig gemacht werden:

  1. Einrichtung Ihrer Testumgebung
  2. Einrichtung Ihrer Bibliotheken
  3. Dein Code

Wie ich schon sagte, solche Projekte sind Bestien, nur weil alle drei nirgendwo auf einer Seite zusammengetragen wurden.

Ok Also fangen wir am Anfang an.

Unumgängliche Theorie für einen Neuling
GSSAPI hilft einer Client-Anwendung dabei, Anmeldeinformationen für einen Server bereitzustellen, um den Benutzer autoritativ zu identifizieren. Äußerst nützlich, da die Serveranwendungen ihre bereitgestellten Antworten nach Wunsch des Benutzers modulieren können. Daher müssen natürlich sowohl die Client- als auch die Serveranwendungen kerberisiert oder, wie manche sagen würden, kerberos-aware sein.

Die Kerberos-basierte Authentifizierung erfordert, dass sowohl die Client- als auch die Serveranwendungen Mitglieder eines Kerberos-Realms sind. KDC (Kerberos Domain Controller) ist die designierte Autorität, die den Bereich regiert. Die AD-Server von Microsoft sind eines der bekanntesten Beispiele für ein KDC, obwohl Sie natürlich ein *NIX-basiertes KDC verwenden können. Aber ohne ein KDC kann es sicherlich überhaupt kein Kerberos-Geschäft geben. Desktops, Server und Workstations, die der Domäne beigetreten sind, identifizieren sich gegenseitig, solange sie alle der Domäne beigetreten sind.

Richten Sie für Ihre ersten Experimente die Client- und Serveranwendungen im selben Realm ein. Die Kerberos-Authentifizierung kann jedoch sicherlich auch über Bereiche hinweg verwendet werden, indem Vertrauensstellungen zwischen KDCs dieser Bereiche erstellt oder sogar Keytabs von verschiedenen KDCs zusammengeführt werden, die einander nicht vertrauen. Ihr Code muss nicht wirklich geändert werden, um solch unterschiedlichen und komplex klingenden Szenarien Rechnung zu tragen.

Die Kerberos-Authentifizierung funktioniert grundsätzlich über “Tickets (oder Token)”. Wenn ein Mitglied dem Realm beitritt, „erteilt“ das KDC jedem von ihnen Token. Diese Token sind einzigartig; Zeit und FQDN sind wesentliche Faktoren für diese Tickets.

Bevor Sie auch nur an die allererste Zeile Ihres Codes denken, vergewissern Sie sich, dass Sie diese beiden richtig verstanden haben:

Fallstrick Nr. 1 Stellen Sie beim Einrichten Ihrer Entwicklungs- und Testumgebung sicher, dass alles getestet und als FQDN adressiert wird. Wenn Sie beispielsweise die Konnektivität überprüfen möchten, pingen Sie mit FQDN, nicht mit IP. Unnötig zu sagen, dass sie daher notwendigerweise die gleiche DNS-Dienstkonfiguration haben müssen.

Fallstrick Nr. 2 Stellen Sie sicher, dass alle Host-Systeme, auf denen Ihr KDC, Ihre Client-Software und Ihre Server-Software ausgeführt werden, denselben Zeitserver haben. Zeitsynchronisation ist etwas, das man vergisst und nach viel Haarspalterei und Headbangen merkt, dass es nicht stimmt!

Sowohl die Client- als auch die Serveranwendungen BENÖTIGEN Kerberos-Keytabs. Wenn Ihre Anwendung also auf einem *NIX-Host ausgeführt und Teil einer Microsoft-Domäne sein soll, müssen Sie eine Kerberos-Keytab generieren lassen, bevor wir uns mit den verbleibenden vorbereitenden Schritten für die gss-Programmierung befassen.

Schritt-für-Schritt-Anleitung zur Interoperabilität von Kerberos 5 (krb5 1.0). at ist ein absolutes Muss.

GSS-API-Programmierhandbuch ist ein hervorragendes Lesezeichen.

Abhängig von Ihrer *NIX-Distribution können Sie die Header und Bibliotheken zum Erstellen Ihres Codes installieren. Mein Vorschlag ist jedoch, den Quellcode herunterzuladen und selbst zu erstellen. Ja, Sie werden es vielleicht nicht auf Anhieb richtig machen, aber es ist sicherlich die Mühe wert.

Fallstrick Nr. 3 Stellen Sie sicher, dass Ihre Anwendung in einer Kerberos-fähigen Umgebung ausgeführt wird. Ich habe das wirklich auf die harte Tour gelernt, aber vielleicht, weil ich nicht so schlau bin. In meinen frühesten Phasen der gssapi-Programmierung hatte ich entdeckt, dass Kerberos-Keytabs absolut notwendig waren, um meine Anwendung kerberos-fähig zu machen. Aber ich konnte einfach nichts darüber finden, wie ich diese Keytabs in meine Anwendung laden kann. Du weißt, warum?!! Weil keine solche API existiert!!! Denn: Die Anwendung soll in einer Umgebung laufen, die Keytabs kennt. Ok, lassen Sie mich das einfach machen: Ihre Anwendung, die die GSSAPI / Kerberos-Sachen erledigen soll, muss ausgeführt werden, nachdem Sie die Umgebungsvariable gesetzt haben KRB5_KTNAME in den Pfad, in dem Sie die Keytabs gespeichert haben. Also entweder du machst so etwas wie:

export KRB5_KTNAME=<path/to/your/keytab>

oder nutzen setenv zu setzen KRB5_KTNAME in Ihrer Anwendung, bevor die allererste Zeile Ihres Codes, die gssapi verwendet, ausgeführt wird.

Wir sind jetzt bereit, die notwendigen Dinge im Code der Anwendung zu tun.

Ich verstehe, dass es einige andere Aspekte gibt, die vom Anwendungsentwickler überprüft werden müssen, um eine Anwendung zu schreiben und zu testen. Ich kenne ein paar Umgebungsvariablen, die wichtig sein können.

Kann jemand bitte etwas mehr Licht ins Dunkel bringen?

  • Wenn Sie diese Art von Inhalten hier posten möchten, müssen Sie sicherstellen, dass Sie tatsächlich eine Frage vom Typ Stack Overflow stellen und beantworten (Sie können beides gleichzeitig in der „Frage stellen“-Oberfläche tun. So wie es ist, dein Beitrag passt nicht.

    – Matte

    13. Januar 2014 um 12:21 Uhr

  • @Mat: Ich verstehe Ihren Standpunkt, bin mir aber nicht sicher, wie ich es praktisch angehen soll. Ich dachte, ich könnte hier eine Wiki-ähnliche Seite starten, Teile hinzufügen, wenn ich Zeit habe, und das könnte von der Community bearbeitet und angereichert werden. In der Hoffnung, dass dies die Aufmerksamkeit eines Redakteurs auf sich zieht, der diesen Beitrag wiederverwerten kann.

    – mdk

    13. Januar 2014 um 12:55 Uhr

  • So funktioniert diese Seite nicht. Es ist eine Q&A-Seite, kein Wikipedia-Klon. Ihr Beitrag wird wahrscheinlich geschlossen, wenn er in diesem Format bleibt.

    – Matte

    13. Januar 2014 um 12:56 Uhr

  • @BrianSchlenker Für die Entwicklung von KRB-fähigen Anwendungen bevorzuge ich persönlich Heimdal, meine Gründe: MIT hat eine US-Regierung. Exportbeschränkungen, und die Heimdal-Dokumentation ist nur ein bisschen besser, das Kompilieren von Heimdal aus den Quellen ist ein bisschen einfacher. Gesamtkonzepte und operative Dinge wie Umgebungsvariablen usw. sind ähnlich.

    – mdk

    21. Februar 2014 um 7:49 Uhr

  • Ich stimme dafür, diese Frage als nicht zum Thema gehörend zu schließen, da es sich um einen Wiki-Artikel handelt, nicht um eine Frage.

    – paxdiablo

    19. November 2015 um 4:31 Uhr

1394540cookie-checkWie verwende ich gssapi kerberos in plattformübergreifenden C/C++-Client-Server-Programmen? [closed]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy