Laden...

WCF-Server übers Internet zur Verfügung stellen

Erstellt von emuuu vor 8 Jahren Letzter Beitrag vor 8 Jahren 3.355 Views
emuuu Themenstarter:in
286 Beiträge seit 2011
vor 8 Jahren
WCF-Server übers Internet zur Verfügung stellen

Guten Morgen zusammen,

zunächst möchte ich mich entschuldigen, falls die Lösung doch direkt hier im Forum zu finden ist, aber ich hab mich jetzt gefühlt seit einer Ewigkeit durch google und das Forum geforstet und vllt steh ich einfach nur schwer auf dem Schlauch aber ich finde bisher einfach keine Lösung.

Zu meinem Problem:
Ich habe ein funktionierendes System in dem ein Server und mehrere Mobilgeräte Daten via TCP-Socket übers Internet austauschen.
Dies möchte ich gerne auf WCF umstellen bzw erstmal beide Schnittstellen gleichzeitig anbieten (größere Flexibilität usw.)

Da ich bisher in WCF gar keine Erfahrung habe wollte ich mich step-by-step herantasten.Das grundsätzliche Prinzip, Contracts, etc habe ich auch soweit verstanden und eine kleine Testapplikation erstellt. Diese funktioniert lokal ohne Probleme nur leider nicht im Internet.

Generell zu den Vorraussetzungen: Es muss HTTP sein und ich kann das Zyan Framework leider nicht benutzen, da die internen Handyapps mit Xamarin.iOS geschrieben werden und das unterstützt Zyan und net.tcp leider nicht.

Ich würde die Bindings und Konfigurationen gerne hardcoded (also ohne App.config) implementieren:

Server


    class Program
    {
        static void Main( string[ ] args )
        {
            ServiceHost serviceHost = new ServiceHost(new Service());
            serviceHost.AddServiceEndpoint(typeof(IService), new BasicHttpBinding(), "http://subdomain.domain.com:9001/Service");
            serviceHost.Open();

            Console.WriteLine("Server running...");
            Console.WriteLine("Press any key to exit");
            Console.ReadKey();

            serviceHost.Close();
        }
    }

Client


    class Program
    {
        static void Main( string[ ] args )
        {
            //ChannelFactory<IService> channelFactory = new ChannelFactory<IService>(new BasicHttpBinding(), "http://subdomain.domain.com:9001/Service");
            ChannelFactory<IService> channelFactory = new ChannelFactory<IService>(new BasicHttpBinding(), "http://localhost:9001/Service");
            IService service = channelFactory.CreateChannel();
            Console.WriteLine("Client ready...");

            for (int i = 0; i < 100; i++)
            {
                Console.WriteLine("Client: got response " + service.Operation("Hello " + i));
                Thread.Sleep(1000);
            }
        }
    }

Wenn ich den den Client über localhast verbinden lasse klappt alles ohne Probleme. Wenn ich die Domain verwende passiert nichts.
Ich scheine also ein Problem damit zu haben, dass der Client nicht übers Internet an den Server kommt (die entsprechenden Portfreigaben in Router, Firewall, etc. existieren natürlich).

Vielen Dank schonmal und beste Grüße
Timm

2+2=5( (für extrem große Werte von 2)

16.842 Beiträge seit 2008
vor 8 Jahren

"Passt nichts" geht bei einem Webserver nicht.
Irgendeine Antwort - und sei es 200 Empty Response - muss es gebe. Welche?
Der Service hat ein korrektes Binding in Deinem IIS?

Im Zweifel verwende IIS Logging um zu schauen, ob die Anfrage überhaupt an den Service kommt.
Für mich hört sich das irgendwie schon ziemlich nach Firewall an.

emuuu Themenstarter:in
286 Beiträge seit 2011
vor 8 Jahren

Ja das mit passiert nichts war meiner Ungeduldt geschuldet:

Die Exception tritt erst nach ca 5sec auf bis dahin hatte ich die Ausführungs meist schon beendet.

Er wirft eine EndpointNotFoundException mit> Fehlermeldung:

"Es war kein an
>
lauschender Endpunkt vorhanden, der die Nachricht annehmen konnte. Dies wird häufig durch eine fehlerhafte Adresse oder SOAP-Aktion verursacht. Weitere Details finden Sie unter "InnerException", sofern vorhanden."

InnerExeption: Ein Verbindungsversuch ist fehlgeschlagen, da die Gegenstelle nach einer bestimmten Zeitspanne nicht richtig reagiert hat, oder die hergestellte Verbindung war fehlerhaft, da der verbundene Host nicht reagiert hat 94.114.xxx.xxx:9001

Einen IIS habe ich nicht, der gesamte Aufbau besteht nur aus dem Code oben (plus natürlich dem SharedProject mit dem Interface).

Dazu muss ich sagen, dass ich das ganze mit net.tcp schon am laufen hatte (und dann gemerkt habe, dass Xamarin.iOS da nicht mitspielt).

Das war aber aber mehr etwas zusammenkopiertes, dass ich mehr kopiert als verstanden habe.

2+2=5( (für extrem große Werte von 2)

16.842 Beiträge seit 2008
vor 8 Jahren

Und was ist hinter 94.114? Nen Server? Nen Handy? Nen Whateverest?

Dei Exception wird im Client geworfen, weil Du am Server/Host wohl irgendwas nicht stimmt, zB Firewall.
Du musst also auch dort mal überprüfen, was Sache ist. Nicht nur im Client.

emuuu Themenstarter:in
286 Beiträge seit 2011
vor 8 Jahren

Meh.. Montage..

Aus irgendwelchen sich mir nicht ergebenen Gründen sind die Portfreigaben in der zweiten Firewall nicht mehr eingetragen gewesen.

Danke für die Hilfe, auch wenns ein dummer Fehler war.

Aber darüber hinaus mal die Frage:
Wenn ich das so wie es jetzt implementiere, wie sicher/unsicher wäre das ganze?

2+2=5( (für extrem große Werte von 2)

A
350 Beiträge seit 2010
vor 8 Jahren

It Depends:

Was macht dein Service ?
Hat deine Firewall/Proxy eine DDOS Attacken Prevention ?
Hast du einen Login Mechanismus mit Throtteling ?
Ist das abrufen von Metadaten gesperrt ?

Erzähl uns mehr und wir sagen dir wie sicher das ganze ist 😉

1.696 Beiträge seit 2006
vor 8 Jahren

Wenn ich das so wie es jetzt implementiere, wie sicher/unsicher wäre das ganze?

Steht der Server im LAN, dann ist es schon gefährlich bzw. fahrlässig, denn wenn der Server geknackt wird, steht dem Angreifer das komplette LAN-Netzwerk offen. Besser wäre dass der Server in der DMZ steht und nur durch bestimmte Port erreichbar. Außerdem Rechner in der DMZ dürfen untereinander nicht kommunizieren, dann ist die Sicherheit schon relativ hoch.

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

emuuu Themenstarter:in
286 Beiträge seit 2011
vor 8 Jahren

Also grundsätzlich sage ich mal habe ich bisher keinerlei Sicherheit.

Alle mobilen Endgeräte sind bei uns hinterlegt mit Seriennummer, Identifier, etc. Das heißt bei der bisherigen Lösung via TCP-Socket schmeißt der Server sofort alles raus was sich nicht mit bekanntem Identifier meldet.

Den Ansatz über eine Identifikation über eine Geräte-ID soll auch bestehen bleiben.

Meine Frage wäre nun welche Schwachstellen ich habe, wenn ich in die vom Client aufgerufenen Funktionen imme eine Validierung einbaue, dass überhaupt nur etwas passiert wenn eine bekannte Geräte-ID gemeldet wird.

Also ich bin was das angeht auch für grundlegende Infos dankbar, weil ich bin eigentlich Maschinenbauingenieur und meine gesamte Programmiererfahrung bezieht sich auf praktische Anwendungen. Ich bin bisher noch nicht in die Verlegenheit gekommen Übertragungen via Internet zu implementieren und habe daher was Sicherheitssysteme angeht keine wirklichen Kenntnisse.

2+2=5( (für extrem große Werte von 2)

16.842 Beiträge seit 2008
vor 8 Jahren
  • Wenn Du keine entsprechend gesicherte Verbindung hast, dann kann jeder via Sniffing zB in öffentlichen WLANs den Traffic mitschneiden und die Geräte ID als Identifikator verwenden. Sowas muss via HTTPS abgesichert werden; der Identifikator darf nur via POST gesendet werden, niemals ein Bestandteil eines GET Strings sein. HTTPS Zertifikate sind mittlerweile in der einfachen Variante kostenlos zu haben
  • DMZ wurde schon gesagt. In manchen Umgebungen wie Azure ist das auch viel einfacher umzusetzen als in eigenen Netzwerken (einfach aufgrund der Features der Plattform)
  • Hardening ist ein Stichwort. Für alle Server in der DMZ ein Muss.
  • Firewall wurde Dir ja schon genannt, wobei ich nicht viel von Firewalls halte, die alleine auf dem gleichen Server laufen, wie die Anwendung. Durch eine entsprechende Lücke wird einfach die Firewall ausgehebelt.

Weitere Themen wären dann eben zB. noch nen Schutz gegenüber Brute-Force und Co.
Das wird allerdings meist durch die Applikationslogik abgedeckt; also ohne Eingriff in die Infrastruktur.

Es gibt auch Sevices wie CloudFlare, die den eigenen Server schützen.
CloudFlare arbeitet hierbei als Relay, untersucht den Traffic auf Threats und blockt diese gegeben falls. Verwende ich zB für meinen Blog (wobei mein Blog selbst auf Azure läuft).
Durch CloudFlare "kennt" niemand die IP meines Servers. Und durch Azure ist nur der Port 80 von außen freigegeben.

HTTP Verkehr ist viel leichter abzusichern oder sicherer zu machen, als net.tcp.

emuuu Themenstarter:in
286 Beiträge seit 2011
vor 8 Jahren

Besten Dank 😃
mit den Hinweisen werde ich jetzt erstmal wieder google bemühen und um mich da besser einzulesen.

2+2=5( (für extrem große Werte von 2)

emuuu Themenstarter:in
286 Beiträge seit 2011
vor 8 Jahren

Soo nach einigem Gelese und probieren hab ich nun ein Konzept und eine teilweise Implementierung stehen.

Bevor ich nun weitermache wollte ich euch mal fragen, ob das in sich Sinn macht und auch einigermaßen sicher ist:

Ich habe einen WCF-Service der auf einem IIS gehostet ist. Die Verbindung zum Service läuft über https.

Der Server auf dem der Dienst ist steht in der DMZ wo er sonst nichts kennt/kann und läuft auf Win Server 2012 R2. Neben der Sicherheitssoftware hat er keine weitere Software installiert.

Im internen LAN steht ein MS SQL-Server der zwei Datenbanken enthält. Datenbank A enthält Stammdaten wie Kunden, Projekte, Standorte etc. Datenbank B enthält die Daten die für die Funktion des Services sind.

Die mobile App fragt über den Service zu Beginn direkt eine Liste mit Projekten, Standorten, etc. ab. Als erstes prüft der Service ob die gemeldete DeviceID in Datebank B vorhanden ist. Ist dem so werden die für den, der DeviceID zugeordneten, Mitarbeiter freigeschalteten Projekte aus Datenbank A gelesen und über den Service der App mitgeteilt.

Darauf hin kann der Mitarbeiter in der App Eintragungen vornehmen die zu Update- und Insert-Aktionen in Datenbank B führen.

Der User der für den Zugang zum MS Sql-Server benutzt wird hat in Datenbank A nur Lese- und in Datenbank B nur Schreibrechte (insert /update). (Hier wäre für mich eine Frage ob es praktischer ist einen SQL-User anzulegen oder einen speziell dafür eingerichteten User aus der Domäne via Win-Authentication zu verwenden, macht das einen effektiven Unterschied? - Ich würde intuitiv den Sql-User bevorzugen, weil meiner Meinung wenn ein Angreifer bis hierhin kommen sollte der Weg zum restlichen LAN größer ist wenn nur ein SQL-User kompromittiert ist als ein User der Domäne)

Ich würde mich über ein Feedback freuen. Ist wie gesagt meine erste Anwendung die mit direkter Internetanbindung umgehen muss.
Das heißt ich würde mich sehr über eine Bewertung freuen, welches Maß an Sicherheit ich so erreichen würde und welche Schwachstellen ich noch habe.

Beste Grüße
Timm

2+2=5( (für extrem große Werte von 2)