Forum: PC-Programmierung Webanwendung sicher hosten (Django)


von Heinz-R. (heinz-712)


Lesenswert?

Hallo zusammen,

ich habe eine kleine Webanwendung (mit Django) programmiert.
Die läuft auch schon lokal auf einem kleinen Linux Server (armbian) auf 
einem SBC (ähnlich RaspberryPi).
Ich nutze hier nginx und uwsgi.
Bisher war ich damit zufrieden, dass das Ganze irgendwie funktioniert.
Wenn ich das aber Produktiv und in ferner Zukunft vielleicht kommerziell 
nutzen möchte, sollte es natürlich auch möglichst sicher sein.

Wie macht man sowas, Stand heute?
Ich habe da schon so Stichwörter wie SE-Linux und Container gehört.
Bevor ich da aber viel Zeit investiere, würde ich gerne wissen was da 
aktuell so die übliche Vorgehensweise ist?

von Thomas (werists)


Lesenswert?

Heinz-R. schrieb:
> Bevor ich da aber viel Zeit investiere, würde ich gerne wissen was da
> aktuell so die übliche Vorgehensweise ist?

Ohne viel Zeit wird es nix.
Wie sich ein Server und die Software sicher im Internet betreiben lässt, 
kann man kaum in einem Forenbeitrag zusammenfassen. Dazu gibt es viele 
dicke Bücher.

von Kolja L. (kolja82)


Lesenswert?

Wenn du es schaffst, das ganze in einen Docker container zu packen, sind 
coolify und caprover vielleicht Wege die du gehen kannst. Ansonsten 
schau mal bei uberspace vorbei, ich weiß aber nicht, wie es mit deren 
Django Unterstützung steht.

von Ein T. (ein_typ)


Lesenswert?

Heinz-R. schrieb:
> ich habe eine kleine Webanwendung (mit Django) programmiert.
> Die läuft auch schon lokal auf einem kleinen Linux Server (armbian) auf
> einem SBC (ähnlich RaspberryPi).
> Ich nutze hier nginx und uwsgi.
> Bisher war ich damit zufrieden, dass das Ganze irgendwie funktioniert.
> Wenn ich das aber Produktiv und in ferner Zukunft vielleicht kommerziell
> nutzen möchte, sollte es natürlich auch möglichst sicher sein.

Naja, "möglichst sicher" ist im Zweifelsfall ein weites Feld, wie Thomas 
"werists" bereits ausgeführt hat...

> Wie macht man sowas, Stand heute?
> Ich habe da schon so Stichwörter wie SE-Linux und Container gehört.
> Bevor ich da aber viel Zeit investiere, würde ich gerne wissen was da
> aktuell so die übliche Vorgehensweise ist?

Die übliche Vorgehensweise ist zunächst, die Anwendung selbst möglichst 
"sicher" zu entwickeln. Das heißt, von der Eingabevalidierung bis hin 
zum Datenbackend alles so restriktiv wie möglich zu beschränken, bei 
Djangos Formularframework beispielsweise die Validatoren für die 
Forumlareingaben und in Djangos ORM für die Datenbank die Constraints 
für die Spalten und solche Dinge wie Fremdschlüssel (Foreign Keys) und 
so weiter. Im Zweifel kann es sogar sinnvoll sein, in der Datenbank 
zusätzlich zu dem, was der ORM erzeugt, noch eigene Constraints und 
Triggerfunktionen einzufügen.

Der nächste Schritt ist dann eine erstmalige Bedrohungsanalyse, also: 
sich ganz genau anzuschauen, wo mögliche Angriffspunkte sind, zu 
überlegen, was Angreifer bezwecken und was sie dazu tun könnten. Welche 
Daten sind dabei besonders sensibel hinsichtlich sicherheitstechnischer 
und gesetzlicher Aspekte? Können diese Daten mit kryptografischen 
Methoden, also eventuell einer Einweg- (Hashing), symmetrischer oder 
asymmetrischer Verschlüsselung geschützt werden? Diese Bedrohungsanalyse 
sollte während des Betriebs der Seite regelmäßig wiederholt werden.

Da Du leider nichts darüber sagst, was Deine Applikation tut und wer die 
Zielgruppe ist, fällt es mir schon an dieser Stelle nicht gerade leicht, 
Dir weitere Hinweise zu geben, sonst würde das hier zu allgemein und zu 
umfangreich, und Dir daher auch keine Hilfe. Vielleicht magst Du etwas 
genauer ausführen, worum es genau geht?

von Kolja L. (kolja82)


Lesenswert?

Ein T. schrieb:
> Da Du leider nichts darüber sagst, was Deine Applikation tut und wer die
> Zielgruppe ist

Das ist der erste Teil des Sicherheitskonzepts 😉

Aber jetzt wieder ernsthaft.

Sicherheit ist kein Zustand, sondern ein Prozess.

Keine Ahnung,woher dieser kluge Spruch stammt, aber er klingt sehr 
plausibel.
Meine Webanwendungen liegen alle auf Servern, die ich nicht managen 
muss. Auch wenn das mehr Geld kostet, als alles selbst zu hosten. Somit 
muss ich nur meine Anwendungen im Griff haben.

von Rene K. (xdraconix)


Lesenswert?

Kolja L. schrieb:
> Meine Webanwendungen liegen alle auf Servern, die ich nicht managen
> muss. Auch wenn das mehr Geld kostet, als alles selbst zu hosten. Somit
> muss ich nur meine Anwendungen im Griff haben.

Die eigene Verantwortung auf andere Abwälzen geht oftmals ganz arg nach 
hinten los. Ich habe in unserer Firma schon so einige ihren Stuhl räumen 
sehen, aus genau diesem Grund. Denn im Endeffekt und am Schluss der 
Nahrungskette stehst immer noch DU hinter deinem Produkt und DU musst 
dir dafür deine Pantoffeln anziehen.

Wie man eine Webanwendung sicher ins öffentliche Netz bringt. Ist der 
kleinste Teil des Sicherheitskonzeptes. Ich schätze das die Einfallstore 
bei Webanwendungen zu 95% die Anwendungen selber sind und nicht der 
Unterbau.

Wie man sicher einen NGINX oder Apache Server aufzieht findest du zu 
tausende im Netz. Welche Ports braucht denn deine Anwendung, die 
üblichen 443 und 80?

von Kolja L. (kolja82)


Lesenswert?

Rene K. schrieb:
> Die eigene Verantwortung auf andere Abwälzen geht oftmals ganz arg nach
> hinten los.

Irgendwo "muss" man ja eine Grenze ziehen. Ich produziere weder den 
Strom, noch ziehe ich den Si-Kristall, auch das überlasse ich 
erfahreneren Menschen und bezahle sie dafür.

Wo die eigene Grenze liegt, sollte jeder bewusst und wohlüberlegt 
entscheiden.

Aber lass uns mal nicht über meine, sondern die Anwendung des TO 
sprechen.

Uberspace hat da was passendes: https://lab.uberspace.de/guide_django/

Ich könnte mir aber vorstellen, dass es Vorbehalte gegen diesen Hoster 
geben wird 😝

von Heinz-R. (heinz-712)


Lesenswert?

Thomas schrieb:
> Heinz-R. schrieb:
>> Bevor ich da aber viel Zeit investiere, würde ich gerne wissen was da
>> aktuell so die übliche Vorgehensweise ist?
>
> Ohne viel Zeit wird es nix.

Eben :) Deswegen bitte ich ja um Stichworte damit ich mich nicht 
zeitintensiv in ein Konzept reinarbeite, dass vom Rest der Welt als 
veraltet betrachtet wird.

von Heinz-R. (heinz-712)


Lesenswert?

Kolja L. schrieb:
> Wenn du es schaffst, das ganze in einen Docker container zu packen, sind
> coolify und caprover vielleicht Wege die du gehen kannst. Ansonsten
> schau mal bei uberspace vorbei, ich weiß aber nicht, wie es mit deren
> Django Unterstützung steht.

Vielen Dank für die Stichworte, das gucke ich mir mal an.

von Heinz-R. (heinz-712)


Lesenswert?

Ein T. schrieb:

> Da Du leider nichts darüber sagst, was Deine Applikation tut und wer die
> Zielgruppe ist, fällt es mir schon an dieser Stelle nicht gerade leicht,
> Dir weitere Hinweise zu geben, sonst würde das hier zu allgemein und zu
> umfangreich, und Dir daher auch keine Hilfe. Vielleicht magst Du etwas
> genauer ausführen, worum es genau geht?

Stimmt schon. Die Beschreibung "Django Anwendung" war sicher etwas 
knapp.
Im Prinzip sind die Daten nicht besonders sicherheitsrelevant, also 
keine personenbezogenen Sachen oder so. Im Grunde werden da in der 
Datenbank (SQLite) Textbausteine angelegt, von denen dann später eine 
Auswahl der Datensätze mit Reportlab  als PDF Datei ausgegeben wird.

von Heinz-R. (heinz-712)


Lesenswert?

Kolja L. schrieb:
> Ein T. schrieb:
>> Da Du leider nichts darüber sagst, was Deine Applikation tut und wer die
>> Zielgruppe ist
>
> Das ist der erste Teil des Sicherheitskonzepts 😉
>
> Aber jetzt wieder ernsthaft.
>
> Sicherheit ist kein Zustand, sondern ein Prozess.
>
> Keine Ahnung,woher dieser kluge Spruch stammt, aber er klingt sehr
> plausibel.
> Meine Webanwendungen liegen alle auf Servern, die ich nicht managen
> muss. Auch wenn das mehr Geld kostet, als alles selbst zu hosten. Somit
> muss ich nur meine Anwendungen im Griff haben.

Das ist natürlich auch ein Ansatz. Gibt es Anbieter, die sich da um 
alles kümmern? Ich schicke denen die Django Anwendung und die kümmern 
sich um die ganze Konfiguration?

von Heinz-R. (heinz-712)


Lesenswert?

Rene K. schrieb:

>
> Wie man eine Webanwendung sicher ins öffentliche Netz bringt. Ist der
> kleinste Teil des Sicherheitskonzeptes. Ich schätze das die Einfallstore
> bei Webanwendungen zu 95% die Anwendungen selber sind und nicht der
> Unterbau.

Das ist ja mein Problem. Ich habe nicht die Erfahrung einschätzen zu 
können ob meine Anwendung wirklich sicher ist.
Lässt sich die Webanwendung irgendwie einhegen (kapseln), so dass ein 
erfolgreicher Hacker aus der Anwendung heraus nicht das ganze System 
kompromittieren kann?

> Wie man sicher einen NGINX oder Apache Server aufzieht findest du zu
> tausende im Netz. Welche Ports braucht denn deine Anwendung, die
> üblichen 443 und 80?

Die Anwendung arbeitet nur mit Texten und erzeugt daraus ein PDF 
(reportlab). Nur die üblichen Ports.

von Kolja L. (kolja82)


Lesenswert?

Heinz-R. schrieb:
> Das ist natürlich auch ein Ansatz. Gibt es Anbieter, die sich da um
> alles kümmern? Ich schicke denen die Django Anwendung und die kümmern
> sich um die ganze Konfiguration?

Oh, die gibt es bestimmt, aber der "übliche" Weg ist, dass dir jmd die 
Infrastruktur zur Verfügung stellt und du darauf deine App betreibst.

Check mal UberSpace, mein letzter Link, die haben sehr detaillierte 
Anleitungen und kosten fast nix.
Und wenn du keine tausende Zugriffe pro Minute erwartest, sollte es 
einen Versuch wert sein.

von Ein T. (ein_typ)


Lesenswert?

Heinz-R. schrieb:
> Im Prinzip sind die Daten nicht besonders sicherheitsrelevant, also
> keine personenbezogenen Sachen oder so. Im Grunde werden da in der
> Datenbank (SQLite) Textbausteine angelegt, von denen dann später eine
> Auswahl der Datensätze mit Reportlab  als PDF Datei ausgegeben wird.

"Personenbezogene Daten" können natürlich auch E-Mail-Adressen, 
Logindaten und Ähnliches sein, eventuell auch die Textfragmente in 
Deiner DB. Je nach Datenschutzbeauftragtem sind sogar alle Logindaten 
personenbezogen, denn eine Authentifizierung soll ja gerade 
sicherstellen, daß ein Benutzer der ist, der er zu sein vorgibt.

Außerdem ist die Frage, wie die Textfragmente in die DB kommen und wer 
da Zugang hat -- in Textdaten, die dann in ein PDF verwurstet werden, 
könnte ein Angreifer beispielsweise Codefragmente einfügen, die bei der 
Anzeige Deiner PDFs ausgeführt werden könnten [1]. Daher ist es sicher 
sinnvoll, die Textfragmente bei der Eingabe zu prüfen und / oder zu 
filtern.

Außerdem sollen die Textfragmente ja ausgewählt werden können, wenn ich 
das richtig verstehe. Üblicherweise würde man das bei einer 
SQL-Datenbank (oder auch bei SQLite) über die ID der Datensätze machen, 
das heißt: Deine User geben eine ID ein, und die mußt Du natürlich 
überprüfen. Bei einer ID wird das vermutlich relativ einfach sein, die 
fortgeschrittene Validierung kann aber auch überprüfen, ob eingegebene 
IDs in der Datenbank vorhanden sind.

Dann ist zudem die Frage, wie die Benutzeraccounts angelegt werden. Wenn 
jeder sich dort registrieren kann, sind auch diese Daten penibel zu 
prüfen, wenngleich der ORM von Django viele Angriffsmöglichkeiten wie 
zum Beispiel SQL-Injections recht wirksam unterbinden sollte. Aber auch 
hier gilt: je strenger die Validierung Deiner Formulareingaben ist, 
desto früher kannst Du böswillige Eingaben abfangen und darauf 
reagieren. Die Validatoren von Django (zB. RegexValidator) sind Deine 
Freunde! :-)

Was das Hosting selbst angeht, ist auch die Frage, wieviel Besucher und 
Traffic Du erwartest, ob Du Geld für Sicherheit ausgeben willst, indem 
Du beispielsweise ein sicherheitszertifiziertes Hosting (PCI-DSS, HIPAA, 
SOC) wählst... kostet extra Geld, kann aber je nach Sensibilität Deiner 
Daten eine lohnenswerte Investition sein. An diesen Fragen hängt auch, 
welche Technologien Du wählst, ob Docker-Container in einer Public Cloud 
oder bekannte Anbieter mit eigenen Lösungen wie Heroku oder oder oder... 
Dazu kann ich allerdings leider relativ wenig sagen, ich hoste meine 
privaten Anwendungen auf einem eigenen, selbstgepflegten Cluster mit 
Docker Swarm und das Businesszeug meiner Arbeit- und Auftraggeber auf 
zertifizierten Managed-Servern bei Atlantic.NET -- das ist aber sehr 
teuer.


[1] 
https://helpx.adobe.com/de/acrobat/using/javascripts-pdfs-security-risk.html

von Kolja L. (kolja82)


Lesenswert?

Risiko = Schaden x Eintrittswahrscheinlichkeit

Kurz gesagt, das Risiko ist das Produkt aus dem potentiell möglichen 
Schaden und der damit verbunden Eintrittswahrscheinlichkeit

Wie hoch ist die Wahrscheinlichkeit, dass jemand dein System angreift?

von Ein T. (ein_typ)


Lesenswert?

Kolja L. schrieb:
> Risiko = Schaden x Eintrittswahrscheinlichkeit

Ob Allgemeinplätzchen dem TO wirklich helfen? Ich glaube eher, daß er 
eher nach praxisorientierten Hinweisen sucht. :-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.