Facebook
Twitter
Google+
Kommentare
12
Willkommen bei "the web hates me". Mittlerweile hat unser Team ein tolles neues Monitoringtool für Agenturen gelauncht. Unter dem Namen koality.io haben wir einen Service geschaffen, der er Agenturen ermöglicht mit sehr geringen Kosten alle Ihre Webseiten zu überwachen.

Security Patterns

Ich habe eine Weile überlegt welches Thema ich für meinen ersten Beitrag hier im Blog nehmen soll. Da bei phphatesme ja viel und gerne über Entwurfsmuster geschrieben wird und ich beruflich als Softwarearchitekt / Security-Analytiker tätig war dachte ich mir, ich versuch euch mal die nicht so verbreiteten Security Patterns näher zu bringen. Ihr werdet vielleicht Anfangs beim Lesen denken: „Das klingt (hoffentlich) alles interessant aber dafür habe ich eigentlich keinen Verwendungszweck“. Ich werde im letzten Teil aber versuchen aufzuzeigen wie und wieso jeder Entwickler von Security Patterns profitieren und diese anwenden kann auch wenn die Beispiele hier vielleicht persönlich nicht zutreffen.

Was sind Security Patterns?

Am wichtigsten ist es zu erst ein mal zu verstehen, dass sich Security Patterns von den klassischen Patterns in so fern unterscheiden, dass es eigentlich gar keine richtigen Design Patterns sind. Die Intention die sich hinter diesen Patterns verbirgt ergibt sich am besten aus einem Bezug zur Realität. Stellen wir uns eine große Firma vor in der wir nun zwei Abteilungen in unseren Fokus nehmen. Die Entwicklungs-Abt. und die Security-Abt. . Beide Abteilungen arbeiten gemeinsam an einem Projekt für eine interne Verwaltungssoftware, jedoch mit zwei unterschiedlichen Prioritäten. Während sich die Entwicklungsabteilung überwiegend um die Funktionalität Gedanken macht, beschäftigt sich die Securityabteilung vorwiegend damit, das festgesetzte Sicherheitsrichtlinien eingehalten werden und prozessbegleitend Sicherheitslücken vorzeitig erkannt und darauf regiert werden kann. Ein in sich übergreifender Prozess bei dem Konflikte durch die unterschiedlichen Prioritäten vorprogrammiert sind. Hier greifen die Security Patterns ein. Sie sollen einen Konsens zwischen den unterschiedlichen Prioritäten und Expertisen schaffen und einen flüssigen Entwicklungs- und Kontrollprozess garantieren. Da wir die Frage nach dem Was geklärt haben können wir uns nun dem Wie widmen.

Wann entwirft man Security Patterns?

Greifen wir unser Szenario von eben wieder auf. Logischerweise sollten die Security Patterns bereits vorhanden sein, bevor der eigentliche Entwicklungsprozess beginnt. Ich möchte jetzt nicht zu sehr in die Unternehmensprozesse eingehen und erspar euch Hinweise in der Form: „Das Projektmanagement muss den Entwurf der Security Patterns berücksichtigen…etc“. Also wir gehen davon aus es wurde bereits alles geplant, entworfen und gemanaged bis auf, genau, die Security Patterns. Schon ergibt sich das erste große Fragezeichen. Wer darf anfangen? Sollte sich erst mal die Security Abteilung über das komplette Konzept hermachen, mögliche sicherheitskritische Faktoren im Vorfeld analysieren und die nötigen Security Patterns entwerfen. Oder sollte erst mal die Entwicklungsabteilung auf Basis des kompletten Konzepts die geplanten Funktionalitäten programmiertechnisch erörtern und die Security Patterns danach entwerfen, da diese ja auch von ihnen umgesetzt werden sollen? Ihr werdet es euch sicher schon denken können, beides ist falsch. Denn bereits hier sorgt die Idee hinter den Security Patterns für den nötigen Konsens. Wie man sich genau abspricht ist egal solange beide Lager es gemeinsam an einem Tisch machen. Wie man sicherlich bemerken konnte habe ich immer von Patterns , also in der Mehrzahl gesprochen. Entscheidet man sich für dessen Einsatz benötigt man natürlich mehr als nur ein Pattern da es logischerweise viele verschiedene Security-Probleme in einem Projekt geben kann. Alle Patterns zusammen bilden das Repository anhand dessen der Entwicklungsverlauf in verschiedene Kontrollabschnitte eingeteilt wird.

Wie entwirft man Security Patterns?

Zu erst sollte man durch das Konzept die verschiedenen Patterns erörtern, mit einem eindeutigen Namen versehen und dazu eine bewusst kurzgehaltene Problembeschreibung verfassen. Die dadurch entstanden Tabelle ist also unser „Index“. Für jeden Eintrag verfassen wir nun das eigentliche Security Pattern das man am besten folgt strukturiert:

  • Problemstellung
  • Problemlösung
  • Realisierung
  • Beispiel
  • Referenzen

Gehen wir die Struktur mal durch:
Die Problemstellung sollte klar definiert und detailiert sein, sprich alle Eventualitäten und Möglichkeiten des Problems sowie dessen Ursachen berücksichtigen. (Schwerpunkt der Security)

Die Problemlösung sollte keine programmiertechnischem Details enthalten und die Problemstellung theoretisch lösen. Desweitern ist es hilfreich sich an dem Schema der Problemstellung zu orientieren. Dieser Teil ist eigentlich das Herzstück des Security Patterns. Es verbindet die Anliegen beider Lager so dass sie für beide zufriedenstellend sind.

In der Realisierung darf man sich nun mit dem programmiertechnischen austoben und auf die Details eingehen. Wichtig ist hier jedoch auch die Security nicht außen vor zu lassen. Es kann nämlich auch passieren dass durch eine Problemlösung ungewollt neue Sicherheitslücken auftreten. Die Realisierung bildet also ein Design Pattern. (Schwerpunkt der Entwicklung)

Die Beispiele sind wieder ein sehr wichtiger Punkt. Es ist hilfreich aus beiden Lagern ein kleines Beispiel zu gestalten. Ein verständliches Beispiel der Security das zusammen mit der Entwicklung in Code umgesetzt wird, kann später im Entwicklungsprozess sehr nützlich sein und als Denkhilfe herangezogen werden.

Als Referenzen können interne oder externe Quellen wie z.B. Webseiten, Blogs etc. dienen und hilft dabei vieleicht überflüssige Rücksprachen zwischen der Security und Entwicklung zu vermeiden. Was natürlich nicht heißen soll das man Rücksprachen generell vermeiden soll, aber oft kann es auch einfach nur Zeit und Nerven sparen, die Antwort schneller in einer Referenz nach zu schlagen.

Wurden alle Security Patterns entworfen und die Kontrollpunkte im Projektplan eingetragen kann die Entwicklung anfangen in die Tasten zu hauen und die Security kann anfangen die Prüftechniken und Testplanung zu kreieren. Da die Security Abteilung hier wieder mit der QS-Abteilung zusammenarbeiten muss dient der entworfene Security Pattern wieder als Vermittler.

Ein (gekürztes) Security Pattern könnte nun z.B. folgt aussehen:

Eintrag im Index des Repository:

Name: Client-Session-Authentication

Beschreibung: Dieses Pattern behandelt die mit der Authentifizierung verbundene Datenübertragung vom Client zum Server und beschreibt Methoden um mögliche XSS und MITM Angriffe zu unterbinden.

Security Pattern [ Client-Session-Authentication ]

Problemstellung: Bei der Client-Session-Authentication besteht die Gefahr einer Session Fixation. Die zudem unverschlüsselte Datenübertragung ermöglicht MITM Angriffe durch Session Hijacking.

Problemlösung: Der Verbindung sollte verschlüsselt werden. Eine Kontrolle von multiplen bzw. identischen Sessions sollte prozessgebunden stattfinden.

Realisierung: Die Verbindung sollte über SSL verschlüsselt werden. Über einen gesonderten Datenbank Eintrag beinhaltend: Session ID, IP/MAC können durch eine Triggerfunktion mögliche Angriffe und Manipulationen erkannt und unterbunden werden.

Beispiel: // Schema einer super Kontrollfunktion

Referenzen: XSS www.ich –bin-hilfreich.de , MITM www.ich-auch.com

Natürlich wäre das in der Realität wesentlich detailierter und umfangreicher, aber zur Veranschaulichung sollte es reichen. Spätestens hier kann man erkennen dass Security Patterns alle Vorzüge bieten die man von Design Patterns her bereits kennt, nur das sie in einem anderen Kontext stehen. Das ganze klingt nicht nur nach viel Arbeit, dass ist es leider auch erst einmal 🙂 .Wer sich aber einmal die Mühe gemacht hat Security Patterns für ein Projekt zu entwerfen, kann natürlich für spätere Projekte einen immens Profit aus seinem Repository ziehen und erweitert dieses ggf. nur noch um das ein oder andere Security Pattern.

Noch wach ? … Ich hoffe bisher war das alles nicht zu einschläfernd. Da wahrscheinlich die wenigsten in einem Unternehmen tätig sind das eine große Security Abteilung hat wäre es jetzt natürlich ok zu sagen: „Gähn… interessiert mich nicht, brauch ich nicht“ .

Damit mein Beitrag trotzdem seine Daseinsbrechtigung in diesem PHP Blog findet schauen wir uns mal an wie man davon auch im kleinen Team oder als Hobbyentwickler profitieren kann.


Security Patterns für Jederman

Nicht jeder Softwareentwickler ist zudem ein Experte in Punkto IT-Security, wodurch sich das erste Problem ergibt: Wie kann man ohne großartiges Know-How und Erfahrung mögliche Risiken aus einem Konzept ableiten? Am besten man nimmt sich etwas Zeit und zieht ein älteres Projekt zur Hand. Je umfangreicher das ist desto besser, da sich wahrscheinlich mehr Sicherheitslücken finden lassen. Von Cross-Site-Scripting und SQL-Injection hat wahrscheinlich schon jeder einmal gehört, aber Themen wie Cache Poisoning oder ARP-Spoofing sind vielen eher ein Fremdwort. Nun das sollte aber absolut kein Problem geschweige denn ein Hindernis darstellen. Wenn man gar nicht so recht weis wo man mit Suchen anfangen soll der kann sich an folgende kleine „Regel“ halten: Schwachstellen sind meist dort zu finden, wo Daten ausgetauscht werden. Desweiteren sollte man seinen Code auch mal kritisch hinsichtlich möglicher Fehler und Abstürze begutäugeln, oft können diese auch zu Gunsten eines Angriffes ausgenutzt werden. Weiter ist es hilfreich sich parallel ein wenig über Sicherheitslücken und Angriffsszenarien zu informieren. Dazu muss nicht unbedingt Kilo weise Fachliteratur geschmökert werden, es kann schon inspirierend wirken ein wenig bei Wikipedia zu stöbern um seinen Code noch mal kritisch zu hinterfragen. Wendet man das nun auf ein fertiges Projekt an, hat man sicher ein oder zwei Security Patterns die man entwerfen kann. In welcher Form bzw. Art man sein Repository dabei gestaltet sei jedem selbst überlassen. Aber vielleicht würde es sich empfehlen an dieser Stelle ein kleines Entwicklungsprojekt zu konzipieren dass eine eigene Reposiroty-Software zum Ziel hat. Steht das Konzept könnte man gleich mal, die aus dem alten Projekt entwickelten Security Patterns auf das neue Anwenden, sofern die Problemstellung gegeben scheint.
Ihr seht Security Pattern können für jeden hilfreich sein um Sicherheitslücken vor der eigentlichen Entwicklung zu erkennen und während des Entwicklungsprozess zu vermeiden. Eine meiner Meinung nach tolle Sache, mit vor allem langfristigem Nutzen. Zudem hat das ganze für einen Entwickler einen weiteren persönlichen Effekt. Man lernt beim Entwurf einiges über Security und kann das mit ein bisschen Routine später größtenteils auch ohne Repository berücksichtigen, da man die ganzen Security Patterns irgendwann wohl aus dem FF beherrscht.
Ich hoffe mein erster Beitrag hat euch gefallen. Natürlich kann man zu den Security Patterns noch viel mehr ins Detail gehen, aber das würde sicherlich ein ganzes Buch füllen. Daher hoffe ich das es als Einführung ausreichend genug war.

Über den Autor

Daniel Liebmann

Kommentare

12 Comments

  1. Sehr interessanter Artikel. Da würde ich mir auch gleich einen weiteren Artikel zum Thema wünschen, wo mal ein etwas ausgereifter Security Pattern vorgestellt wird und wie man als Entwickler das berücksichtigen soll, quasi eine kleine Demo-Anwendung, das würde einem als Neuling in Sachen Security Patterns sicherlich gut helfen 🙂 Ein wirklich gelungener Artikel!

    Reply
  2. Ok in meinem nächsten Artikel werd ich dann mal versuchen ein greifbares Security Problem durch zu kauen und anhand von Code und einem detailiertem Security Pattern, einen Lösungsweg entwerfen. Da ich mir eh „vorgenommen“ hab die Security Kategorie hier ein wenig zu füllen, werd ich versuchen das zukünftig bei allen Artikeln so zu machen, wo es eben möglich ist. Wer weis, vieleicht haben wir dann hier in einiger Zeit genug Patterns um das ganze noch mal gesondert zusammen zu fassen und als erstes „PHP Security Patterns Repository“ im Inet zu veröffentlichen, denn bisher gibt es dazu nur wenig Informationen und noch keinerlei Standards.

    Reply
  3. Sehr interessant, weiter so! Ich kenne eigentlich niemanden der in einer Firma arbeitet, die eine eigene (Web-)Security Abteilung hat, darum ist das von einen Insider natuerlich super.
    freue mich auch schon auf den folgenden praktischeren Beitrag 🙂

    Reply
  4. Sehr schöner und hilfreicher Artikel, dennoch eine Frage zum Verständnis.

    Ist das etwas anderes, als dass man eben diverse Security-Thematiken zentralisiert?
    Als Beispiel kann ein Inputcleaner genannt werden, der bösen Code aus Request-Variablen filtert und diesen zugängig macht – sei es XSS oder anderes.
    So würden die „eigentlichen Devs“ nur auf das $input-Objekt (Wenn der Inputcleaner eben im Objekt $input gespeichert ist) zugreifen und die Security-Profis würden nur die Input-Klasse ändern müssen, ohne dass die Devs etwas beachten müssen (es sei denn es wurden neue Funktionalitäten hinzugefügt natürlich).

    Reply
  5. Danke, freut mich natürlich dass mein erster Beitrag scheinbar gut ankam 🙂
    @Dave: Nein das ist nichts anderes, eher im Gegenteil, da hast du sogar ein sehr praktisches Beispiel gefunden, denn wie Security Patterns umgesetzt werden ist immer stark vom jeweiligen Umfeld abhängig. Die Idee hinter dem Entwurf ist hingegen immer derselbe: Sicherheitsfaktoren kontinuierlich so zusammen zu fassen, dass diese zukünftig leichter und früher erkannt und vermieden werden (im Idealfall schon vor dem eigentlichem Entwicklungsprozess).

    Reply
  6. Arbeite gerade das Buch „Design Patterns“ von Stefan Bergmann durch. Wenn man sich mal mit Patterns beschäftigt will man nicht mehr ohne Leben ;).

    Also bitte mehr davon, klingt sehr vielversprechend 🙂

    Reply
  7. Danke für den Artikel!

    Gibt es für Privatleute vielleicht eine Liste mit 100 Pattern, die man einfach mal abklappern kann und seine eigene Software drauf untersuchen kann? Ich könnte mir vorstellen, dass es schon fertige Repositories gibt.

    Reply
  8. Jein 😉

    Es gibt zwar bereits ein oder zwei Repositories, aber mir ist keins bekannt das z.B. direkt auf eine Sprache wie PHP Bezug nimmt, sondern eher sehr allgemein gehalten sind, was wiederum bei der Umsetzung Fragen oder Probleme aufwirft.
    Ich bin der Meinung es sollte zu jeder Sprache ein Repository an Security Patterns geben, wobei die Betonung hier auf einem, das als Standard verstanden und auch so gepflegt und erweitert wird, geben. Aber das ist ,wenn auch ein erstrebenswertes Ziel, etwas das glaub ich in weiter Ferne liegt, da es einfach unglaublich viel Arbeit darstellet, zu dem sich erfahrene PHP Profis und Security Experten gleichermaßen aufraffen müssten.

    Reply

Leave a Comment.

Link erfolgreich vorgeschlagen.

Vielen Dank, dass du einen Link vorgeschlagen hast. Wir werden ihn sobald wie möglich prüfen. Schließen