Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Authentifizierung im TCP/IP Netzwerk (https://www.delphipraxis.net/138622-authentifizierung-im-tcp-ip-netzwerk.html)

Valle 13. Aug 2009 20:24


Authentifizierung im TCP/IP Netzwerk
 
Hallo DPler! :hi:

Da ich bei meinen Suchen im Internet nicht passendes gefunden habe, bin ich nun dabei mir ein eigenes Protokoll für mein Vorhaben zu schreiben. Das Protokoll ist für die Kommunikation von einem im Webserver laufendem PHP Prozess und einem als User root laufendem Python-Programm.

Die Kommunikation der beiden Komponenten (PHP & Python) ging schon immer über sogenannte Unix-Sockets. Diese werden nicht wie bei TCP/IP über Host und Port identifiziert, sondern über Dateien. Logische Konsequenz daraus ist, dass die Sockets nur auf der gleichen Maschine kommunizieren können. Das muss ich jetzt ändern, da wir demnächst weitere Server dazu bekommen. Funktionieren tut das ganze schon, da das Protokoll unabhängig von der darunter liegenden Schicht ist. Allerdings gibt es nun ein Problem mit der Sicherheit.

Bei Unix-Sockets hatte ich den Vorteil, dass ich der Socket-Datei einfach entsprechende Rechte (0770) geben konnte uns ihr eine bestimmte Gruppe zuordnete. Alle User in dieser Gruppe hatten damit Zugriff auf das Socket. Unter TCP/IP geht das schlecht. Daher brauche ich eine neue Form der Authentifizierung. Am einfachsten wäre es, einfach ein Passwort im Protokoll mit zu schicken. Ich bin mir aber nicht sicher, ob das so eine gute Idee ist. Der Datenverkehr ist ja auch nicht verschlüsselt. Und jetzt zur eigentlich Frage: Wie mache ich die Authentifizierung am besten und sichersten?

Hoffe ihr habt's verstanden, ansonsten natürlich einfach nachfragen! Danke im Voraus! :)

Mit freundlichen Grüßen,

Valle

generic 13. Aug 2009 21:15

Re: Authentifizierung im TCP/IP Netzwerk
 
Da kann man viel bis wenig machen!

* einfach user/pw übertragen
* challange & response verfahren
* zertifikat basiert verfahren

und das alles mit und ohne verschlüsselung.

Valle 13. Aug 2009 23:18

Re: Authentifizierung im TCP/IP Netzwerk
 
Hallo generic,

erstmal Danke für die Antwort! :)

Zertifikat-basiert klingt toll, finde ich. Bisher habe ich ziemlich wenig Ahnung von der Materie, was also eine ideale Möglichkeit wäre sich damit mal zu beschäftigen. Kannst du mir einige Stichworte oder so nennen, damit ich ausreichend Informationsstoff zum googlen habe? Wäre SSL in diesem Zusammenhang eine Wahl?

Mit freundlichen Grüßen,

Valle

generic 14. Aug 2009 10:23

Re: Authentifizierung im TCP/IP Netzwerk
 
SSL kann diese Funktion auch abdecken.
Dann schnapp dir am besten die aktuellen Indy's und die OpenSSL Dlls und dann passt das schon.
Ich selbst habe sowas auch noch nicht programmiert. Habe bis jetzt immer den Webserver die Sache übernehmen lassen.

Was ist ich allerdings mal gemacht habe, war eine Domänenauthentifierung über TCP.
Allerdings benötigst du dafür ein Active-Directory. Das ist dann das Thema SSPI.

Valle 14. Aug 2009 12:11

Re: Authentifizierung im TCP/IP Netzwerk
 
Zitat:

Zitat von generic
SSL kann diese Funktion auch abdecken.
Dann schnapp dir am besten die aktuellen Indy's und die OpenSSL Dlls und dann passt das schon.

Ich benutze Python und PHP. :stupid:

Zitat:

Zitat von generic
Ich selbst habe sowas auch noch nicht programmiert. Habe bis jetzt immer den Webserver die Sache übernehmen lassen.

Der Webserver ist in dem Fall gar nicht beteiligt. Lediglich der PHP Prozess wird vom Webserver ausgeführt, das hilft mir aber auch nicht weiter. Letztendlich muss ich das selbst machen. ;-)

Zitat:

Zitat von generic
Was ist ich allerdings mal gemacht habe, war eine Domänenauthentifierung über TCP.
Allerdings benötigst du dafür ein Active-Directory. Das ist dann das Thema SSPI.

Und ich benutze Linux. :mrgreen:

Mit freundlichen Grüßen,

Valle

generic 14. Aug 2009 12:46

Re: Authentifizierung im TCP/IP Netzwerk
 
Na gut dann halt nicht Delphi in einem Delphi Forum.

Wir Delphianer können ALLES! Manche Dinge nur nicht besonders gut.

Aus Py halte ich mich mal raus, aber PHP sollte nicht so das Problem sein.

Dafür gibt es ja:
http://de.php.net/manual/en/book.openssl.php

Apollonius 14. Aug 2009 12:58

Re: Authentifizierung im TCP/IP Netzwerk
 
Eigentlich müsste das doch mit beidseitig authentifiziertem SSL gehen, d.h. Server und Client haben beide ein Zertifikat und weisen sich damit aus. Jetzt ist nur noch die Frage, was für Zertifikate du verwendest. So wie es aussieht, müsstest du eigentlich deine eigenen Zertifikate erstellen können (d.h. du bastelst dir selbst eine Authority, der du dann per se vertraust). Die Frage ist dabei natürlich, inwiefern die SSL-Bibliothek deines Vertrauens dir erlaubt, selbst zu entscheiden, ob ein Zertifikat gültig ist.

Valle 14. Aug 2009 13:06

Re: Authentifizierung im TCP/IP Netzwerk
 
Zitat:

Zitat von generic
Wir Delphianer können ALLES!

Deswegen bin ich doch hier. :thumb:

Zitat:

Zitat von Apollonius
Eigentlich müsste das doch mit beidseitig authentifiziertem SSL gehen, d.h. Server und Client haben beide ein Zertifikat und weisen sich damit aus. Jetzt ist nur noch die Frage, was für Zertifikate du verwendest. So wie es aussieht, müsstest du eigentlich deine eigenen Zertifikate erstellen können (d.h. du bastelst dir selbst eine Authority, der du dann per se vertraust). Die Frage ist dabei natürlich, inwiefern die SSL-Bibliothek deines Vertrauens dir erlaubt, selbst zu entscheiden, ob ein Zertifikat gültig ist.

Ich denke mal die erste Wahl ist wohl OpenSSL. Liegt wohl auch daran, dass ich bisher noch von nichts anderem gehört habe. Ansonsten Danke für die Info, dann wird's jetzt wohl (endlich) mal Zeit mich in die Materie einzuarbeiten. Bisher konnte ich mich da immer schön von fern halten. :mrgreen:

Edit:// Es wird wohl doch eher GnuTLS.
Zitat:

Zitat von Wikipedia
Zusätzlich zu den meisten in OpenSSL implementierten Funktionen unterstützt GnuTLS TLSv1.1, zlib- und LZO-Kompression, Authentifizierung über SRP, X.509- und OpenPGP-Keys.

Mit freundlichen Grüßen,

Valle

Nikolas 14. Aug 2009 14:48

Re: Authentifizierung im TCP/IP Netzwerk
 
Wenn die Übertragung nicht verschlüsselt ist, warum machst du überhaupt eine Authentifizierung?
Wenn sich ein Rechner authentifiziert hat, kann man doch eine man-in-the-middle-Attacke fahren oder wird das irgendwie durch dein Protokoll verhindert?

Wenn sich deine Sockets per Datei identifizieren, könntest du diese Dateien doch per ssh/scp übertragen. So ganz habe ich die Dateien noch nicht verstanden. Wenn ein Rechner mit dem Server redet, haben dann beide die gleiche Datei oder ist das etwas in Richtung public/private Key wie bei ssh?

Wenn ein neuer Rechner kommt, könnte der doch eine Datei per scp in einen nur-schreiben-Ordner im Server legen, in der dann das Passwort und ID steht. Dann könnte der Server dem Rechner wieder per scp einen passenden Schlüssel/Authentifizierung, sonstwas schicken, mit der sich dann der Rechner von da an melden kann.

Nach einer gewissen Zeit kann dann der Server dieses Zertifikat wieder ungueltig machen und der Client muss sich wieder neu anmelden.

Und ein Pythonscript als root? Da musst du schon gut auf deine Rechte aufpassen, nicht dass dir jemand ein exec('rm -rf') (oder ist das Java?) reinschreibt : )

Also zusammengefasst: schau dir mal das public-Key anmelden per ssh an, damit müsstest du das eigentlich hinbekommen können.

Aber beschreib vielleicht mal ein bischen genauer, wer wann mit welchem Server reden muss.

Valle 14. Aug 2009 15:02

Re: Authentifizierung im TCP/IP Netzwerk
 
Zitat:

Zitat von Nikolas
Wenn die Übertragung nicht verschlüsselt ist, warum machst du überhaupt eine Authentifizierung?
Wenn sich ein Rechner authentifiziert hat, kann man doch eine man-in-the-middle-Attacke fahren oder wird das irgendwie durch dein Protokoll verhindert?

Das versuche ich ja gerade zu ändern. Wobei ich mir nicht sicher bin, ob ich einer Man-in-the-Middle überhaupt vorbeugen muss, das die Server in versch. Rechenzentren stehen und nur über das Internet kommunizieren.

Zitat:

Zitat von Nikolas
Wenn sich deine Sockets per Datei identifizieren, könntest du diese Dateien doch per ssh/scp übertragen. So ganz habe ich die Dateien noch nicht verstanden. Wenn ein Rechner mit dem Server redet, haben dann beide die gleiche Datei oder ist das etwas in Richtung public/private Key wie bei ssh?

Wenn ein neuer Rechner kommt, könnte der doch eine Datei per scp in einen nur-schreiben-Ordner im Server legen, in der dann das Passwort und ID steht. Dann könnte der Server dem Rechner wieder per scp einen passenden Schlüssel/Authentifizierung, sonstwas schicken, mit der sich dann der Rechner von da an melden kann.

Nach einer gewissen Zeit kann dann der Server dieses Zertifikat wieder ungueltig machen und der Client muss sich wieder neu anmelden.

Nein, das funktioniert so nicht. Stell dir einfach vor es ist wie TCP/IP. Statt IP und Port gibst du allerdings einen einfachen Dateipfad an. Schau einfach mal hier, das ist ja nicht meine Erfindung. ;-)

Letztendlich ist das aber auch irrelevant, da das ja nun geändert wird.

Zitat:

Zitat von Nikolas
Und ein Pythonscript als root? Da musst du schon gut auf deine Rechte aufpassen, nicht dass dir jemand ein exec('rm -rf') (oder ist das Java?) reinschreibt : )

Python ist es jedenfalls nicht. :mrgreen: Dennoch hat das durchaus seinen Sinn, bzw. das ist ja der Grund, warum ich das ganze brauche. Ich könnte natürlich auch einfach PHP als root laufen lassen (da es die entsprechenden Rechte braucht), aber das ist ja nun noch 100 Mal hirnloser. Also lieber eine Kommunikation über's Netzwerk und nur das machen lassen, was es es soll. ;-)

Zitat:

Zitat von Nikolas
Also zusammengefasst: schau dir mal das public-Key anmelden per ssh an, damit müsstest du das eigentlich hinbekommen können.

Wie schon gesagt, das ist nicht das was ich will. Wie man Dateien per scp kopiert und sich per SSH über Passwort oder Public-Key einloggt weiß ich schon länger. :-)

Zitat:

Zitat von Nikolas
Aber beschreib vielleicht mal ein bischen genauer, wer wann mit welchem Server reden muss.

Ein PHP-Script soll sich über das Internet (TCP/IP) bei einen Python-Programm authentifizieren. Die beiden sollen ein wenig kommunizieren, anschließend macht mein Python-Programm etwas als root und dann kann das PHP-Script bei seiner Arbeit weiter machen. Und weil ich eben noch nie eine Authentifizierung programmiert habe, dachte ich, ich frage einfach mal nach. ;-)

Danke für deine Hilfe! :)

Mit freundlichen Grüßen,

Valle


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:05 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz