This site is the archived OWASP Foundation Wiki and is no longer accepting Account Requests.
To view the new OWASP Foundation website, please visit https://owasp.org
Difference between revisions of "Germany/Projekte/Top 10 fuer Entwickler-2013/A6-Verlust der Vertraulichkeit sensibler Daten"
Timo Pagel (talk | contribs) (Remove Java-Specific parts from PHP) |
m (Updated Link to DRAFT-ietf-tls-rfc4492bis to draft-ietf-tls-rfc4492bis-17) |
||
(62 intermediate revisions by 2 users not shown) | |||
Line 22: | Line 22: | ||
}} | }} | ||
− | {{ | + | {{Top_10_2010:SummaryTableHeaderBeginTemplate|type=images|year=2013|language=de}} |
{{Top_10:SummaryTableTemplate|exploitability=3|prevalence=3|detectability=2|impact=1|language=de|year=2013}} | {{Top_10:SummaryTableTemplate|exploitability=3|prevalence=3|detectability=2|impact=1|language=de|year=2013}} | ||
− | {{Top_10_2010:SummaryTableHeaderEndTemplate}} | + | {{Top_10_2010:SummaryTableHeaderEndTemplate|year=2013|language=de}} |
− | <td {{Template:Top 10 2010:SummaryTableRowStyleTemplate}}>Jeder | + | <td {{Template:Top 10 2010:SummaryTableRowStyleTemplate}}>Jeder mit Zugriff auf Ihre vertraulichen Daten (Backups inkl.) ist zu betrachten. Das betrifft die Speicherung, die Übertragung und auch die Daten im Browser der Kunden. Externe und interne Bedrohungen sind relevant.</td> |
− | + | <td {{Template:Top 10 2010:SummaryTableRowStyleTemplate}}> | |
− | + | Angreifer brechen i.d.R. nicht die Verschlüsselung selbst. Stattdessen stehlen sie Schlüssel, führen Seiten- oder MITM-Angriffe aus oder stehlen Klartext vom Server, während der Übertragung oder aus dem Browser des Kunden heraus.</td> | |
− | <td {{Template:Top 10 2010:SummaryTableRowStyleTemplate}}>Angreifer brechen | + | <td colspan=2 {{Template:Top 10 2010:SummaryTableRowStyleTemplate}}> |
− | <td colspan=2 {{Template:Top 10 2010:SummaryTableRowStyleTemplate}}>Fehlende Verschlüsselung vertraulicher Daten ist die häufigste Schwachstelle | + | Fehlende Verschlüsselung vertraulicher Daten ist die häufigste Schwachstelle. Die Nutzung von Kryptographie erfolgt oft mit schwacher Schlüsselerzeugung und -verwaltung und der Nutzung schwacher Algorithmen, insbesondere für das Password Hashing. Browser Schwachstellen sind verbreitet und leicht zu finden, aber nur schwer auszunutzen. Ein eingeschränkter Zugriff lässt ext. Angreifer Probleme auf dem Server i.d.R. nur schwer finden und ausnutzen.</td> |
− | <td {{Template:Top 10 2010:SummaryTableRowStyleTemplate}}>Fehler kompromittieren regelmäßig vertrauliche Daten. Es handelt sich hierbei oft um sensitive Daten wie personenbezogene Daten, Benutzernamen und Passwörter oder Kreditkarteninformationen.</td> | + | <td {{Template:Top 10 2010:SummaryTableRowStyleTemplate}}> |
− | <td {{Template:Top 10 2010:SummaryTableRowStyleTemplate}}>Betrachten Sie den Wert verlorener Daten und die Auswirkungen auf die Reputation des betroffenen Unternehmens. Hat es ggf. auch juristische Konsequenzen, wenn die Daten bekannt werden?</td> | + | Fehler kompromittieren regelmäßig vertrauliche Daten. Es handelt sich hierbei oft um sensitive Daten wie personenbezogene Daten, Benutzernamen und Passwörter oder Kreditkarteninformationen.</td> |
+ | <td {{Template:Top 10 2010:SummaryTableRowStyleTemplate}}> | ||
+ | Betrachten Sie den Wert verlorener Daten und die Auswirkungen auf die Reputation des betroffenen Unternehmens. Hat es ggf. auch juristische Konsequenzen, wenn die Daten bekannt werden?</td> | ||
{{Top_10_2010:SummaryTableEndTemplate}} | {{Top_10_2010:SummaryTableEndTemplate}} | ||
− | {{Top_10:SubsectionTableBeginTemplate|type=main}} {{ | + | {{Top_10:SubsectionTableBeginTemplate|type=main}} {{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=example|position=firstLeft|risk=6|year=2013|language=de}} |
− | ''' | + | '''Szenario 1''': Eine Anwendung verschlüsselt Kreditkartendaten automatisch bei der Speicherung in einer Datenbank. Das bedeutet aber auch durch SQL-Injection erlangte Kreditkartendaten in diesem Fall automatisch entschlüsselt werden. Die Anwendung hätte die Daten mit eine Public Key verschlüsseln sollen und nur nachgelagerte Anwendungen und nicht die Webanwendung selbst hätten die Daten mit dem Private Key entschlüsseln dürfen.<br/> |
− | ''' | + | '''Szenario 2''': Eine Webseite schützt die authentisierten Seiten nicht mit SSL. Der Angreifer stiehlt das Sitzungscookie des Nutzers durch einfaches Mitlesen der Kommunikation (z.B. in einem offenen WLAN). Durch Wiedereinspielen dieses Cookies übernimmt der Angreifer die Sitzung des Nutzers und erlangt Zugriff auf die privaten Daten des Nutzers.<br/> |
− | ''' | + | '''Szenario 3''': Die Passwortdatenbank benutzt Hashwerte ohne Salt zur Speicherung der Passwörter. Eine Schwachstelle in der Downloadfunktion erlaubt dem Angreifer den Zugriff auf die Datei. Zu allen Hashes kann über eine Rainbowtabelle mit vorausberechneten Hashes der Klartext gefunden werden.<br/> |
− | {{ | + | {{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=howPrevent|position=right|risk=6|year=2013|language=de}} |
− | Eine Übersicht über alle Tücken unsicherer Kryptografie liegt weit außerhalb | + | Eine Übersicht über alle Tücken unsicherer Kryptografie, SSL-Verwendung und Datensicherheit liegt weit außerhalb der Top 10. Für alle vertraulichen Daten sollten Sie zumindest: |
− | # | + | # Klärung der Bedrohungen, vor denen die Daten zu schützen sind (z. B. Innen- und Außentäter) und sicherstellen, dass vertrauliche Daten bei der Übertragung/Speicherung geeignet durch Verschlüsselung geschützt werden. |
− | # | + | # Kein unnötiges Speichern vertraulicher Daten. Löschung nicht mehr benötigter Daten. Daten, die es nicht gibt, können auch nicht gestohlen werden. |
− | # Sicherstellen, dass | + | # Sicherstellen, dass starke Algorithmen und Schlüssel (z.B. gemäß FIPS-140, [https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen/TechnischeRichtlinien/TR02102/BSI-TR-02102-2.pdf BSI TR-02102-2)] verwendet werden. |
− | + | # Sicherstellen, dass Passwörter mit einem speziell für Passwortschutz entwickelten Algorithmus gespeichert werden ([http://en.wikipedia.org/wiki/Bcrypt bcrypt], [http://en.wikipedia.org/wiki/PBKDF2 PBKDF2] oder [http://en.wikipedia.org/wiki/Scrypt scrypt]). | |
− | + | # Deaktivieren der Autovervollständigung und des Cachings in Formularen mit vertraulichen Informationen. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | # | ||
− | |||
− | |||
− | |||
− | # | ||
{{Top_10:SubsectionTableEndTemplate}} | {{Top_10:SubsectionTableEndTemplate}} | ||
− | = '''JAVA''' = | + | = '''JAVA''' = |
− | {{Top_10:SubsectionTableBeginTemplate|type=headertab}} {{ | + | ==== JAVA-Teil 1: Kryptografisch unsichere Speicherung ==== |
+ | {{Top_10:SubsectionTableBeginTemplate|type=headertab}} {{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=defOp|position=firstLeft|title=1|risk=6|year=2013|language=de}} | ||
Ein einfaches Beispiel für die Veschlüsselung von Texten, hier mit dem AES-128 Algorithmus. Die Auswahl an Verschlüsselungsparametern wie beispielsweise Algorithmus, Ciphermodus oder Schlüssellänge ist groß und kommt immer auf die jeweiligen Daten und die Anwendung an. | Ein einfaches Beispiel für die Veschlüsselung von Texten, hier mit dem AES-128 Algorithmus. Die Auswahl an Verschlüsselungsparametern wie beispielsweise Algorithmus, Ciphermodus oder Schlüssellänge ist groß und kommt immer auf die jeweiligen Daten und die Anwendung an. | ||
− | + | {{Top_10_2010:ExampleBeginTemplate|year=2013}} | |
− | String plainText = "HelloWorld"; | + | String plainText = "HelloWorld";<br/> |
− | + | <br/> | |
− | // password setzen | + | // password setzen <br/> |
− | String password = "my128bitPassword"; | + | String password = "my128bitPassword";<br/> |
− | + | <br/> | |
− | // CBC Cipher immer mit einem zufällig erzeugten | + | // CBC Cipher immer mit einem zufällig erzeugten <br/> |
− | // Initialization Vector (IV) initialisieren (Länge 16 Byte) | + | // Initialization Vector (IV) initialisieren (Länge 16 Byte)<br/> |
− | byte[] ivBytes = new byte[16]; | + | byte[] ivBytes = new byte[16];<br/> |
− | (new SecureRandom()).nextBytes(ivBytes); | + | (new SecureRandom()).nextBytes(ivBytes);<br/> |
− | + | <br/> | |
− | // den Schlüssel erzeugen | + | // den Schlüssel erzeugen<br/> |
− | SecretKeySpec key = new SecretKeySpec(password.getBytes(), "AES"); | + | SecretKeySpec key = new SecretKeySpec(password.getBytes(), "AES");<br/> |
− | + | <br/> | |
− | // Container für die Verschlüsselungs Parameter | + | // Container für die Verschlüsselungs Parameter<br/> |
− | IvParameterSpec paramSpec = new IvParameterSpec(ivBytes); | + | IvParameterSpec paramSpec = new IvParameterSpec(ivBytes); <br/> |
− | + | <br/> | |
− | // Chiffrierer erzeugen und initialisieren | + | // Chiffrierer erzeugen und initialisieren<br/> |
− | // Algorithmus: AES | + | // Algorithmus: AES<br/> |
− | // Modus: CBC | + | // Modus: CBC<br/> |
− | // Padding: PKCS5Padding | + | // Padding: PKCS5Padding<br/> |
− | Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); | + | Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");<br/> |
− | cipher.init(Cipher.ENCRYPT_MODE, key, paramSpec); | + | cipher.init(Cipher.ENCRYPT_MODE, key, paramSpec); <br/> |
− | + | <br/> | |
− | // Verschlüsselung durchführen | + | // Verschlüsselung durchführen<br/> |
byte[] encrypted = cipher.doFinal(plainText.getBytes()); | byte[] encrypted = cipher.doFinal(plainText.getBytes()); | ||
− | + | {{Top_10_2010:ExampleEndTemplate}} | |
− | + | <br/> | |
Die Benutzung der ESAPI erleichtert die Handhabung, da neben einer großen Bandbreite an Verschlüsselungs-, Hash-, und Signaturalgorithmen auch Methoden für die Schlüsselerzeugung und -verwaltung unterstüzt werden. Nach Initialisierung der Parameter in der Konfigurationsdatei ESAPI.properties, reduziert sich die eigentliche Verschlüsselung eines Textes beispielsweise zu: | Die Benutzung der ESAPI erleichtert die Handhabung, da neben einer großen Bandbreite an Verschlüsselungs-, Hash-, und Signaturalgorithmen auch Methoden für die Schlüsselerzeugung und -verwaltung unterstüzt werden. Nach Initialisierung der Parameter in der Konfigurationsdatei ESAPI.properties, reduziert sich die eigentliche Verschlüsselung eines Textes beispielsweise zu: | ||
− | + | {{Top_10_2010:ExampleBeginTemplate|year=2013}} | |
− | CipherText ciphertext = | + | CipherText ciphertext = |
− | + | :: ESAPI.encryptor().encrypt( new PlainText(myplaintext) ); | |
− | + | {{Top_10_2010:ExampleEndTemplate}} | |
− | {{ | + | {{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=defOp|position=right|title=2|risk=6|year=2013|language=de}} |
Beispiele für das Hashen von Passwörtern. Um die Sicherheit zu erhöhen sollte jedes Passwort mit einem Zufallswert (Salt) berechnet und gespeichert werden sowie möglichst viele Iterationen beim Hashing genutzt werden. | Beispiele für das Hashen von Passwörtern. Um die Sicherheit zu erhöhen sollte jedes Passwort mit einem Zufallswert (Salt) berechnet und gespeichert werden sowie möglichst viele Iterationen beim Hashing genutzt werden. | ||
− | + | {{Top_10_2010:ExampleBeginTemplate|year=2013}} | |
String password = "mypassword"; | String password = "mypassword"; | ||
− | + | <br/> | |
− | // salt anlegen und mit zufälligen Bytes befüllen | + | // salt anlegen und mit zufälligen Bytes befüllen<br/> |
− | byte[] salt = new byte[8]; | + | byte[] salt = new byte[8];<br/> |
(new SecureRandom()).nextBytes(salt); | (new SecureRandom()).nextBytes(salt); | ||
− | + | <br/> | |
− | // Hash-Generator anlegen (verwendeter Algorithmus ist SHA-256) | + | // Hash-Generator anlegen (verwendeter Algorithmus ist SHA-256)<br/> |
− | // und mit salt initialisieren (=> höhere Sicherheit gegen Angriffe) | + | // und mit salt initialisieren (=> höhere Sicherheit gegen Angriffe)<br/> |
− | MessageDigest digest = MessageDigest.getInstance("SHA-256"); | + | MessageDigest digest = MessageDigest.getInstance("SHA-256");<br/> |
− | digest.reset(); | + | digest.reset();<br/> |
digest.update(salt); | digest.update(salt); | ||
− | + | <br/> | |
− | byte[] input = digest.digest(password.getBytes("UTF-8")); | + | byte[] input = digest.digest(password.getBytes("UTF-8"));<br/> |
− | + | <br/> | |
− | // Hash in mehreren Iterationen (n = 100.000) berechnen | + | // Hash in mehreren Iterationen (n = 100.000) berechnen<br/> |
− | // mehr Iterationen verlangsamen Angriffe (signifikant?) | + | // mehr Iterationen verlangsamen Angriffe (signifikant?)<br/> |
for (int i = 0; i < 100000; i++) { | for (int i = 0; i < 100000; i++) { | ||
− | + | : digest.reset(); | |
− | + | : input = digest.digest(input); | |
− | } | + | }<br/> |
// am Ende der Iterationen enthält input den berechneten Hash | // am Ende der Iterationen enthält input den berechneten Hash | ||
− | + | {{Top_10_2010:ExampleEndTemplate}} | |
− | + | <br/> | |
+ | ;PBKDF2 | ||
Sicherer ist allerdings die Nutzung einer PBKDF2 (Password-Based Key Derivation Function 2) wie im folgenden Beispiel: | Sicherer ist allerdings die Nutzung einer PBKDF2 (Password-Based Key Derivation Function 2) wie im folgenden Beispiel: | ||
− | + | {{Top_10_2010:ExampleBeginTemplate|year=2013}} | |
public byte[] generatePBKDF2Hash(String password) | public byte[] generatePBKDF2Hash(String password) | ||
− | + | : throws NoSuchAlgorithmException, InvalidKeySpecException { <br/> | |
− | + | :: byte[] salt = new byte[20]; | |
− | + | :: // salt mit zufälligen Bytes befüllen | |
− | + | :: (new SecureRandom()).nextBytes(salt); | |
− | + | ::<br/> | |
− | + | :: int iterations = 10000; | |
− | + | :: int keyLength = 160; | |
− | + | :: // neuen Schlüssel erzeugen | |
− | + | :: SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); | |
− | + | :: PBEKeySpec pbeKeySpec = new PBEKeySpec(password, salt, iterations, keyLength); | |
− | + | :: SecretKey mySecretKey = factory.generateSecret(pbeKeySpec); | |
− | |||
} | } | ||
− | + | <br/> | |
− | byte[] hash = generatePBKDF2Hash(password).getEncoded(); | + | byte[] hash = generatePBKDF2Hash(password).getEncoded();<br/> |
− | + | {{Top_10_2010:ExampleEndTemplate}} | |
− | + | <br/> | |
+ | ;bcrypt | ||
Eine weiterer empfohlener Algorithmus ist bcrypt, hier bespielsweise unter Verwendung der jBCrypt-Bibliothek (siehe Referenzen). | Eine weiterer empfohlener Algorithmus ist bcrypt, hier bespielsweise unter Verwendung der jBCrypt-Bibliothek (siehe Referenzen). | ||
− | + | {{Top_10_2010:ExampleBeginTemplate|year=2013}} | |
String hashed = BCrypt.hashpw(password, BCrypt.gensalt(12)); | String hashed = BCrypt.hashpw(password, BCrypt.gensalt(12)); | ||
− | + | {{Top_10_2010:ExampleEndTemplate}} | |
Zu bcrypt gibt es mittlerweile eine noch sicherere Variante scrypt, der Link zu einer Beispielimplementierung findet sich bei den Referenzen. | Zu bcrypt gibt es mittlerweile eine noch sicherere Variante scrypt, der Link zu einer Beispielimplementierung findet sich bei den Referenzen. | ||
− | {{ | + | {{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=defOp|position=left|title=3|risk=6|year=2013|language=de}} |
Um geheime Schlüssel sicher, aber auch gleichzeitig einfach zugänglich und austauschbar aufzubewahren empfiehlt sich eine spezielle Schlüsseldatei, wie beispielweise der Java KeyStore. In dieser Datei werden die Schlüssel mit einem Master-Password gesichert, die Datei selbst sollte getrennt von den verschlüsselten Daten abgelegt werden: | Um geheime Schlüssel sicher, aber auch gleichzeitig einfach zugänglich und austauschbar aufzubewahren empfiehlt sich eine spezielle Schlüsseldatei, wie beispielweise der Java KeyStore. In dieser Datei werden die Schlüssel mit einem Master-Password gesichert, die Datei selbst sollte getrennt von den verschlüsselten Daten abgelegt werden: | ||
− | + | {{Top_10_2010:ExampleBeginTemplate|year=2013}} | |
− | // Erzeugung eines symmetrischen Schlüssels mittels der vorher beschriebenen PBKDF2 | + | // Erzeugung eines symmetrischen Schlüssels mittels der vorher beschriebenen PBKDF2<br/> |
− | String password = "mypassword"; | + | String password = "mypassword";<br/> |
− | byte[] mySecretKey = generatePBKDF2Hash(password); | + | byte[] mySecretKey = generatePBKDF2Hash(password);<br/> |
− | + | <br/> | |
− | // neuen KeyStore für symmetrische Schlüssel erzeugen | + | // neuen KeyStore für symmetrische Schlüssel erzeugen <br/> |
− | KeyStore ks = KeyStore.getInstance("JCEKS"); | + | KeyStore ks = KeyStore.getInstance("JCEKS");<br/> |
− | ks.load(null, null); | + | ks.load(null, null);<br/> |
− | + | <br/> | |
− | // Schlüssel speichern | + | // Schlüssel speichern<br/> |
− | KeyStore.ProtectionParameter passwordProtection = | + | KeyStore.ProtectionParameter passwordProtection =<br/> |
− | + | : new KeyStore.PasswordProtection(password); | |
− | KeyStore.SecretKeyEntry entry = new KeyStore.SecretKeyEntry(mySecretKey); | + | KeyStore.SecretKeyEntry entry = new KeyStore.SecretKeyEntry(mySecretKey);<br/> |
− | ks.setEntry("beispielkey", entry, passwordProtection); | + | ks.setEntry("beispielkey", entry, passwordProtection);<br/> |
− | + | <br/> | |
− | // KeyStore in Datei speichern | + | // KeyStore in Datei speichern <br/> |
− | FileOutputStream fos = new FileOutputStream("SecretKeyStoreDatei"); | + | FileOutputStream fos = new FileOutputStream("SecretKeyStoreDatei");<br/> |
− | ks.store(fos,password); | + | ks.store(fos,password);<br/> |
fos.close(); | fos.close(); | ||
− | + | {{Top_10_2010:ExampleEndTemplate}} | |
− | + | {{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=references|position=right|risk=6|year=2013|language=de}} | |
− | {{ | + | {{Top_10_2010:SubSubsectionOWASPReferencesTemplate}} |
− | ; | + | * Einen umfangreicheren Überblick über die Anforderungen, gibt es unter [[ASVS|ASVS requirements on Cryptography (V7), Data Protection (V9) und Communications Security (V10)]]. |
− | + | * [[Cryptographic_Storage_Cheat_Sheet|OWASP Cryptographic Storage Cheat Sheet]] | |
− | + | * [[Password_Storage_Cheat_Sheet|OWASP Password Storage Cheat Sheet]] | |
+ | * [[Transport_Layer_Protection_Cheat_Sheet|OWASP Transport Layer Protection Cheat Sheet]] | ||
+ | * [[Testing_for_SSL-TLS|OWASP Testing Guide: Chapter on SSL/TLS Testing]] | ||
+ | * [[O-Saft|OWASP SSL Advanced Forensic Tool (O-SAFT)]] | ||
+ | * [[OWASP_Proactive_Controls | OWASP Proactive Controls:]] [[OWASP_Proactive_Controls#7:_Protect_Data|Kapitel über 'Protect Data']] | ||
+ | : Älter: | ||
+ | * [[Top_10_2007-Insecure_Cryptographic_Storage | OWASP Top 10-2007 on Insecure Cryptographic Storage]] | ||
+ | * [[Guide_to_Cryptography#Insecure_transmission_of_secrets|OWASP Development Guide: Chapter on Cryptography]] | ||
+ | * [[Codereview-Cryptography | OWASP Code Review Guide: Chapter on Cryptography]] | ||
+ | {{Top_10_2010:SubSubsectionExternalReferencesTemplate|language=de}} | ||
+ | * [http://cwe.mitre.org/data/definitions/310.html CWE Entry 310 on Cryptographic Issues] | ||
+ | * [http://cwe.mitre.org/data/definitions/312.html CWE Entry 312 on Cleartext Storage of Sensitive Information] | ||
+ | * [http://cwe.mitre.org/data/definitions/319.html CWE Entry 319 on Cleartext Transmission of Sensitive Information] | ||
+ | * [http://cwe.mitre.org/data/definitions/326.html CWE Entry 326 on Weak Encryption] | ||
+ | * [http://www.mindrot.org/projects/jBCrypt Reine Java Implementierung von BCrypt] | ||
+ | * [https://github.com/wg/scrypt Beispielimplementierung von SCrypt] | ||
+ | * [https://www.ssllabs.com/projects/best-practices/index.html SSL LABS: 'SSL/TLS Deployment Best Practices'] | ||
+ | * [https://www.bsi.bund.de/DE/Publikationen/TechnischeRichtlinien/tr02102/index_htm.html BSI: 'TR-02102-2 Teil 2'] | ||
+ | * [https://www.enisa.europa.eu/activities/identity-and-trust/library/deliverables/study-on-cryptographic-protocols ENISA: 'Study on cryptographic protocols'] | ||
+ | * [https://bettercrypto.org bettercrypto.org:] [https://bettercrypto.org/static/applied-crypto-hardening.pdf 'Applied Crypto Hardening (DRAFT)'] | ||
+ | * [https://wiki.mozilla.org/Security/Server_Side_TLS MozillaWiki: Security/Server Side TLS] | ||
+ | {{Top_10:SubsectionTableEndTemplate}}{{Top 10 DeveloperEdition:NavigationByHeadertab | ||
+ | |headertab=JAVA | ||
+ | |headertabRight=JAVA2 | ||
+ | |useprev=2013PrevHeaderTabDeveloperEdition | ||
+ | |usenext=Nothing <!--- 2013NextHeaderTabDeveloperEdition ---> | ||
+ | |prev=A5-{{Top_10_2010:ByTheNumbers | ||
+ | |5 | ||
+ | |year=2013 | ||
+ | |language=de}} | ||
+ | |next=A6-{{Top_10_2010:ByTheNumbers | ||
+ | |6 | ||
+ | |year=2013 | ||
+ | |language=de}} | ||
+ | |year=2013 | ||
+ | |language=de | ||
+ | }} | ||
+ | = '''JAVA2''' = | ||
+ | ==== JAVA-Teil 2: Unzureichende Absicherung der Transportschicht ==== | ||
+ | {{Top_10:SubsectionTableBeginTemplate|type=headertab}}{{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=defOp|position=firstLeft|title=1|risk=6|year=2013|language=de}} | ||
+ | ;Absicherung der Transportschicht (beim Deployment) | ||
+ | Um die Verschlüsselung auf der Transportebene sollte sich der Entwickler nie selbst kümmern, sondern dies immer dem Webserver überlassen. | ||
Im J2EE-Deployment-Descriptor der Anwendung (= web.xml) ist die folgende Konfiguration vorzunehmen, um sicherzustellen, dass nur ausschließlich über https kommuniziert wird: | Im J2EE-Deployment-Descriptor der Anwendung (= web.xml) ist die folgende Konfiguration vorzunehmen, um sicherzustellen, dass nur ausschließlich über https kommuniziert wird: | ||
− | + | {{Top_10_2010:ExampleBeginTemplate|year=2013}} | |
<security-constraint> | <security-constraint> | ||
− | + | : <web-resource-collection> | |
− | + | :: <web-resource-name>Protected Context</web-resource-name> | |
− | + | :: <url-pattern>/*</url-pattern> | |
− | + | : </web-resource-collection> | |
− | + | : <!-- auth-constraint an dieser Stelle für Authentisierung --> | |
− | + | : <user-data-constraint> | |
− | + | :: <transport-guarantee>CONFIDENTIAL</transport-guarantee> | |
− | + | : </user-data-constraint> | |
</security-constraint> | </security-constraint> | ||
− | + | {{Top_10_2010:ExampleEndTemplate}} | |
− | + | <br/> | |
Für Session-Cookies ist immer das Attribute SECURE zu setzen: | Für Session-Cookies ist immer das Attribute SECURE zu setzen: | ||
− | + | {{Top_10_2010:ExampleBeginTemplate|year=2013}} | |
<session-config> | <session-config> | ||
− | + | : <cookie-config> | |
− | + | :: <secure> | |
− | + | ::: true | |
− | + | :: </secure> | |
− | + | : </cookie-config> | |
</session-config> | </session-config> | ||
− | + | {{Top_10_2010:ExampleEndTemplate}} | |
+ | <br/> | ||
In der Server-Configuration ist sicherzustellen, dass nur TLS und SSL3 unterstützt werden. | In der Server-Configuration ist sicherzustellen, dass nur TLS und SSL3 unterstützt werden. | ||
Das Speichern von vertraulichen Inhalten am Client oder auf einem Proxy kann über den Header Cache-Control verhindert werden: | Das Speichern von vertraulichen Inhalten am Client oder auf einem Proxy kann über den Header Cache-Control verhindert werden: | ||
− | + | {{Top_10_2010:ExampleBeginTemplate|year=2013}} | |
− | + | Header set Cache-Control "no-cache, no store, must-revalidate" | |
+ | {{Top_10_2010:ExampleEndTemplate}} | ||
Weitere Hinweise im [https://www.owasp.org/index.php/Transport_Layer_Protection_Cheat_Sheet Transport Layer Protection Cheat Sheet] | Weitere Hinweise im [https://www.owasp.org/index.php/Transport_Layer_Protection_Cheat_Sheet Transport Layer Protection Cheat Sheet] | ||
+ | {{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=defOp|position=right|title=2a|risk=6|year=2013|language=de}} | ||
+ | ;Absicherung der Transportschicht (auf dem Webserver - Teil 1) | ||
+ | <b>Sichere Verschlüsselung</b> | ||
+ | * Nutzen Sie aktuelle Empfehlungen zur SSL/TLS-Sicherheit, das Thema ist derzeit sehr(!) dynamisch. Z.B.: | ||
+ | :* [https://www.ssllabs.com/projects/best-practices/index.html SSL LABS: 'SSL/TLS Deployment Best Practices'] | ||
+ | :* [https://www.bsi.bund.de/DE/Publikationen/TechnischeRichtlinien/tr02102/index_htm.html BSI TR-02102 Teil 2] | ||
+ | * aktuelle Verschlüsselungsbibliotheken einsetzen, die aktuelle Protokolle und Verfahren unterstützen | ||
+ | * Nur sichere Verschlüsselungsprotokolle unterstützen (TLS1.2, TLS1.1, ggf auch TLS1.0) | ||
+ | * Die Verschlüsselungsverfahren auf dem Server priorisieren | ||
+ | * sichere, ephemerale Verschlüsselungsverfahren (Cipher-Suites), die 'Forward Secrecy' unterstützen (z.B. DHE_RSA, ECDHE_RSA) mit hoher Prio versehen. Derzeit sollte dabei DHE bevorzugt werden (bei ausreichender CPU), da es an vertrauenswürdigen Kurven für ECDHE mangelt, vgl [http://safecurves.cr.yp.to http://safecurves.cr.yp.to], [https://www.schneier.com/blog/archives/2013/09/the_nsa_is_brea.html#c1675929]; Teilweise sind bereits [http://www.researchgate.net/profile/Johannes_Merkle/publication/260050106_Standardisierung_der_Brainpool-Kurven_fr_TLS_und_IPSec/file/60b7d52f36a0cc2fdd.pdf Brainpool Curves] für TLS implementiert [https://tools.ietf.org/html/rfc7027 (RFC 7027)]. Aussichtsreiche, neue Kurven sind [https://tools.ietf.org/html/draft-josefsson-tls-curve25519-06 'Curve25519'] und [http://sourceforge.net/p/ed448goldilocks/wiki/Home/ 'Ed448-Goldilocks'], die gerade für TLS definiert werden (vgl [https://tools.ietf.org/html/rfc7748 RFC 7748 - Elliptic Curves for Security]), [http://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-8 IANA] und [https://tools.ietf.org/html/draft-ietf-tls-rfc4492bis-17 DRAFT-ietf-tls-rfc4492bis] <!--- Stand: September 2017 ---> | ||
+ | * sichere Schlüssellängen für assymetrische und symmetrische Verfahren (gem. BSI TR-02102 Teil 2): | ||
+ | :* Schlüsseleinigung und Authentisierung: DHE(-Parameter), RSA, DSS: 3000 bits für RSA; ECDHE: 256 bits | ||
+ | :* (symmetrische) Verschlüsselung: AES: 128 bits | ||
+ | * RC4 und andere schwache oder exotische Cipher <u>abschalten</u> (vgl (see [https://tools.ietf.org/html/rfc7465], [http://tools.ietf.org/html/rfc5469]), <u>ohne</u> den Zugriff von (noch) unterstützten Browsern, oder Suchmaschinen-Bots (Webcrawlern) zu verlieren. | ||
+ | * Richtlinie erstellen, welche Browser und Betriebssysteme, unterstützt werden sollen, sowie welche Protokolle und welche Cipher für die verschlüsselte Verbindung jeweils ausgewählt werden sollen (z.B. vorübergehend noch TLSv1, TLS_RSA_WITH_AES_128_CBC_SHA). | ||
+ | * Empfehlungen für den 'Cipher-String' auf Grundlage der oben genannten Anforderungen (inkl. Priorität) anhand folgender Szenarien: | ||
+ | :* <b>Cipher-String 'A+'</b> (Advanced+, eingeschränkte Kompatibilität, z.B. auf die neueren Browser-Versionen) | ||
+ | ::* Empfohlen, wenn Sie die benutzten Server und Clients steuern (z.B. freigeben) und die Kompatibilität vorab prüfen können; Nutzt nur die stärksten Perfect-Forward-Secrecy-Cipher (PFS-Cipher) | ||
+ | ::* Protokoll: TLSv1.2 (und neuer) | ||
+ | :* <b>Cipher-String 'A'</b> (Advanced, bessere Kompatibilität, z.B. die meisten neueren Browser-Versionen) | ||
+ | ::* Empfohlen, wenn Sie die benutzten Server und Clients steuern (z.B. freigeben) und die Kompatibilität vorab prüfen können, wenn 'A+' zu sehr einschränkt; Nutzt die stärkeren PFS-Cipher | ||
+ | ::* Protokoll: TLSv1.2 (und neuer) | ||
+ | :* <b>Cipher-String 'B'</b> (Broad Compatibility, weitgehende Kompatibilität) | ||
+ | ::* Empfohlen, wenn Sie nur die benutzten Server steuern; Nutzt nur PFS-Cipher; Streben Sie mittelfristig 'A' für https an | ||
+ | ::* Protokoll: TLSv1.0, besser: TLSv1.1 (und neuer) | ||
+ | :* <b>Cipher-String 'C'</b> (Widest Compatibility, weitgehende Kompatibilität, auch zu Alt-Browsern und älteren, noch gepatchten Bibliotheken sowie anderen Anwendungs-Protokollen, wie z.B. IMAPS) | ||
+ | ::* Noch nutzbar, wenn Sie nur die benutzten Server steuern und Alt-Client-Systeme noch unterstützen; PFS-Cipher werden bis auf DHE mit SHA-1 bevorzugt (um potentielle Inkompatibilitäten zu vermeiden); Bestehende Risiken der zusätzlichen Verfahren (z.B. auch ohne PFS) sollten bewusst eingegangen werden; Streben Sie mittelfristig 'A' für https an, sonst mind. 'B' | ||
+ | ::* Protokoll: TLSv1.0 (und neuer) | ||
+ | :* <b>Cipher-String 'C-'</b> (Legacy, weitgehende Kompatibilität zu uralten Browsern und alten, noch gepatchten Bibliotheken, Laufzeitumgebungen sowie anderen Anwendungs-Protokollen, z.B. SMTP) | ||
+ | ::* Nutzen Sie diese Cipher-Zusammenstellung nur, wenn Sie 3DES (=TLS_RSA_WITH_3DES_EDE_CBC_SHA, =DES-CBC3-SHA) für richtig alte Systeme anbieten <u>müssen</u>; PFS-Cipher werden bis auf DHE mit SHA-1 bevorzugt (um potentielle Inkompatibilitäten zu vermeiden); Bestehende Risiken der zusätzlichen Verfahren (z.B. auch ohne PFS, 3DES) sollten bewusst eingegangen werden; Streben Sie kurzfristig 'C' an | ||
+ | ::* Protokoll: TLSv1.0 (und neuer) | ||
+ | :* Tabelle der Cipher: | ||
+ | ::{| border="1" cellspacing="1" cellpadding="1" style="border-collapse:collapse; text-align: center; font-size:84%;" | ||
+ | |- style="font-size: 119%; background-color:#DCDCDC;" | ||
+ | ! style="text-align:left;" |Cipher-Name: <br> IANA, [openssl] | ||
+ | ! style="width: 8%;" | Cipher-Hex-Wert | ||
+ | ! style="width:11%;" | Advanced+ (A+) | ||
+ | ! style="width:11%;" | Advanced (A) | ||
+ | ! style="width:11%;" | Broad <br> Compatibility (B) | ||
+ | ! style="width:11%;" | Widest <br> Compatibility (C) | ||
+ | ! style="width:11%;" | Legacy (C-) | ||
+ | |- style="background-color:#B9FFC5;" | ||
+ | <!--- | IANA, <br> [openssl] || Hex || A+ || A || B || C || C- ----> | ||
+ | | style="text-align:left" | TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, <br> [DHE-RSA-AES256-GCM-SHA384] || 0x009f || 1 || 1 || 1 || 1 || 1 | ||
+ | |- style="background-color:#B9FFC5;" | ||
+ | | style="text-align:left" | TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, <br> [DHE-RSA-AES128-GCM-SHA256] || 0x009e || 2 || 2 || 2 || 2 || 2 | ||
+ | |- style="background-color:#B9FFC5;" | ||
+ | | style="text-align:left" | TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, <br> [ECDHE-RSA-AES256-GCM-SHA384] || 0xc030 || 3 || 3 || 3 || 3 || 3 | ||
+ | |- style="background-color:#B9FFC5;" | ||
+ | | style="text-align:left" | TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, <br> [ECDHE-RSA-AES128-GCM-SHA256] || 0xc02f || 4 || 4 || 4 || 4 || 4 | ||
+ | |- style="background-color:#E3FFE3;" | ||
+ | | style="text-align:left" | TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, <br> [DHE-RSA-AES256-SHA256] || 0x006b || || 5 || 5 || 5 || 5 | ||
+ | |- style="background-color:#E3FFE3;" | ||
+ | | style="text-align:left" | TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, <br> [DHE-RSA-AES128-SHA256] || 0x0067 || || 6 || 6 || 6 || 6 | ||
+ | |- style="background-color:#E3FFE3;" | ||
+ | | style="text-align:left" | TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, <br> [ECDHE-RSA-AES256-SHA384] || 0xc028 || || 7 || 7 || 7 || 7 | ||
+ | |- style="background-color:#E3FFE3;" | ||
+ | | style="text-align:left" | TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, <br> [ECDHE-RSA-AES128-SHA256] || 0xc027 || || 8 || 8 || 8 || 8 | ||
+ | |- | ||
+ | | style="text-align:left" | TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, <br> [ECDHE-RSA-AES256-SHA] || 0xc014 || || || 9 || 9 || 9 | ||
+ | |- | ||
+ | | style="text-align:left" | TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, <br> [ECDHE-RSA-AES128-SHA] || 0xc013 || || || 10 || 10 || 10 | ||
+ | |- style="background-color:#F4F6F8;" | ||
+ | | style="text-align:left" | TLS_RSA_WITH_AES_256_GCM_SHA384, <br> [AES256-GCM-SHA384] || 0x009d || || || || 11 || 11 | ||
+ | |- style="background-color:#F4F6F8;" | ||
+ | | style="text-align:left" | TLS_RSA_WITH_AES_128_GCM_SHA256, <br> [AES128-GCM-SHA256] || 0x009c || || || || 12 || 12 | ||
+ | |- style="background-color:#F4F6F8;" | ||
+ | | style="text-align:left" | TLS_RSA_WITH_AES_256_CBC_SHA256, <br> [AES256-SHA256] || 0x003d || || || || 13 || 13 | ||
+ | |- style="background-color:#F4F6F8;" | ||
+ | | style="text-align:left" | TLS_RSA_WITH_AES_128_CBC_SHA256, <br> [AES128-SHA256] || 0x003c || || || || 14 || 14 | ||
+ | |- style="background-color:#F4F6F8;" | ||
+ | | style="text-align:left" | TLS_RSA_WITH_AES_256_CBC_SHA, <br> [AES256-SHA] || 0x0035 || || || || 15 || 15 | ||
+ | |- style="background-color:#F4F6F8;" | ||
+ | | style="text-align:left" | TLS_RSA_WITH_AES_128_CBC_SHA, <br> [AES128-SHA] || 0x002f || || || || 16 || 16 | ||
+ | |- style="background-color:#FFFF88;" | ||
+ | | style="text-align:left" | TLS_RSA_WITH_3DES_EDE_CBC_SHA, <br> [DES-CBC3-SHA] || 0x000a || || || || || 17 | ||
+ | |- | ||
+ | | style="text-align:left" | TLS_DHE_RSA_WITH_AES_256_CBC_SHA, <br> [DHE-RSA-AES256-SHA] || 0x0039 || || || 11 || 17 || 18 | ||
+ | |- | ||
+ | | style="text-align:left" | TLS_DHE_RSA_WITH_AES_128_CBC_SHA, <br> [DHE-RSA-AES128-SHA] || 0x0033 || || || 12 || 18 || 19 | ||
+ | |} | ||
+ | ::<b>Anmerkungen:</b><br>- Die Nummer gibt die Position der jeweiligen Priorisierung an<br>- Da ältere Internet-Explorer- und Java-Versionen <u>keine</u> Diffie-Hellman-Parameter >1024 bit unterstützen wurden die Verfahren 'TLS_DHE_RSA_WITH_AES_256_CBC_SHA' und 'TLS_DHE_RSA_WITH_AES_128_CBC_SHA' am Ende angeordnet, um Inkompatibilitäten mit Altversionen zu vermeiden; Alternative: Diese Verfahren ganz weglassen.<br/> | ||
+ | :* Beispiel-Cipher-Strings für OpenSSL: | ||
+ | ::{| border="1" cellspacing="1" cellpadding="1" style="border-collapse:collapse; text-align: left; font-size:84%;" | ||
+ | |- style="font-size: 119%; background-color:#EAECF0;" | ||
+ | !Cipher-String || OpennSSL-Syntax | ||
+ | |- style="background-color:#B9FFC5;" | ||
+ | | style="font-size: 119%;"| <b>Advanced+ (A+)</b> || DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256 | ||
+ | |- style="background-color:#E3FFE3;" | ||
+ | | style="font-size: 119%;"| <b>Advanced (A)</b> || DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256 | ||
+ | |- | ||
+ | | style="font-size: 119%;"| <b>Broad Compatibility (B)</b> || DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA | ||
+ | |- style="background-color:#F4F6F8;" | ||
+ | | style="font-size: 119%;"| <b>Widest Compatibility (C)</b> || DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA | ||
+ | |- style="background-color:#FFFF88;" | ||
+ | | style="font-size: 119%;"| <b>Legacy (C-)</b> || DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA | ||
+ | |} | ||
+ | * TLS/SSL-Konfiguration des Webservers härten: | ||
+ | :* nur sichere Server-initiierte Renegotiation | ||
+ | :* <u>keine</u> Komprimierung | ||
+ | :* Einstellungen aller virtuellen Server (virtualHosts) prüfen | ||
+ | :* Bei Einsatz von Server Name Indication (SNI), prüfen, welcher Server der Default-Server ist. Alte Browser bzw. Betriebssysteme, ohne SNI-Unterstützung erreichen nur diesen! | ||
+ | :* Prüfen der, von der installierten OpenSSL-Version unterstützten Cipher | ||
+ | :* Reduktion der SSL-Extensions auf das notwendige Maß, z.B. Deaktivieren von Heart-Beat (vgl [http://heartbleed.com Heartbleed]), kein Aktivieren von unsicheren Extension-DRAFTS wie z.B. Additional random, Opaque PRF Input (vgl. [http://dualec.org/DualECTLS.pdf DualECTLS]) | ||
+ | * Konfigurations-Beispiel für Apache inkl. Cipher String 'A': | ||
+ | {{Top_10_2010:ExampleBeginTemplate|year=2013}} | ||
+ | SSLProtocol +TLSv1.2 # for Cipher-String 'A+', 'A'<br> | ||
+ | <nowiki>#</nowiki>SSLProtocol +TLSv1.2 +TLSv1.1 +TLSv1 # for Cipher-String 'B', 'C', 'C-'<br> | ||
+ | SSLCompression off <br> | ||
+ | SSLHonorCipherOrder on <br> | ||
+ | SSLCipherSuite 'DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256'<br> | ||
+ | <nowiki>#</nowiki>optional kann ':!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:!ADH:!IDEA' ergänzt werden. | ||
+ | {{Top_10_2010:ExampleEndTemplate}} | ||
+ | <b>Anmerkungen:</b> - Der Cipher-String mit den SSL-Cipher-Suites wurde als Whitelist formuliert, um die serverseitige Kompatibilität mit alten Versionen von OpenSSL zu erhöhen.<br/> | ||
+ | - Überwachen Sie die Performance Ihres Servers, der Verbindungsaufbau mit DHE ist ca. 2,4 Mal CPU-intensiver als mit ECDHE (vgl [http://vincent.bernat.im/en/blog/2011-ssl-perfect-forward-secrecy.html#some-benchmarks <nowiki>[Vincent Bernat, 2011]</nowiki>], [http://nmav.gnutls.org/2011/12/price-to-pay-for-perfect-forward.html <nowiki>[nmav's Blog, 2011]</nowiki>])<br/> | ||
− | {{ | + | * Prüfen der Cipher-Einstellungen mittels openssl, z.B. Cipher-String 'A': |
+ | {{Top_10_2010:ExampleBeginTemplate|year=2013}} | ||
+ | openssl ciphers -V "DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256"<br> | ||
+ | <nowiki>#</nowiki>add optionally ':!aNULL:!eNULL:!LOW:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:!ADH:!IDEA' to protect older Versions of OpenSSL<br> | ||
+ | <nowiki>#</nowiki>use openssl ciphers -v "..." for openssl < 1.0.1: | ||
+ | <small> | ||
+ | 0x00,0x9F - DHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=DH Au=RSA Enc=AESGCM(256) Mac=AEAD | ||
+ | 0x00,0x9E - DHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=DH Au=RSA Enc=AESGCM(128) Mac=AEAD | ||
+ | 0xC0,0x30 - ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(256) Mac=AEAD | ||
+ | 0xC0,0x2F - ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(128) Mac=AEAD | ||
+ | 0x00,0x6B - DHE-RSA-AES256-SHA256 TLSv1.2 Kx=DH Au=RSA Enc=AES(256) Mac=SHA256 | ||
+ | 0x00,0x67 - DHE-RSA-AES128-SHA256 TLSv1.2 Kx=DH Au=RSA Enc=AES(128) Mac=SHA256 | ||
+ | 0xC0,0x28 - ECDHE-RSA-AES256-SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=AES(256) Mac=SHA384 | ||
+ | 0xC0,0x27 - ECDHE-RSA-AES128-SHA256 TLSv1.2 Kx=ECDH Au=RSA Enc=AES(128) Mac=SHA256 | ||
+ | </small> | ||
+ | {{Top_10_2010:ExampleEndTemplate}} | ||
+ | <b>Achtung/CAUTION</b>: Der Cipher-String wurde nur mit einzelnen, älteren OpenSSL-Versionen getestet, es können ungewollt weitere Cipher-Suiten dadurch benutzt werden. (ONLY tested with some elder Versions of OpenSSL!) | ||
− | Die Sicherheitskonfiguration unter Option | + | <br/> |
+ | <b>sichere Zertifikate</b><br/> | ||
+ | * Nutzen Sie eine vertrauenswürdige Zertifizierungsstelle (CA) für öffentlich erreichbare, verschlüsselte Webserver; Prüfen Sie die Vergabe-Politik der CA. | ||
+ | * zeitgemäße, starke Verfahren mit sicheren Schlüssellängen (vgl. [https://www.bsi.bund.de/DE/Publikationen/TechnischeRichtlinien/tr02102/index_htm.html BSI TR-02102-2 Teil 2]: 2000 bits bzw. (nach 2015:) 3000 bits für RSA), auch für alle Zwischenzertifikate und das Root-Zertifikat der CA. | ||
+ | * Angabe der 'Fully Qualified Names' und bei 'www' auch des Domänennamens im Zertifikat, damit ein Redirekt möglich ist (<nowiki>z.B. von 'https://example.com' zu 'https://www.example.com'</nowiki>). | ||
+ | * Dedizierte Zuertifikate, je Server; <u>keine</u> 'Sammelzertifikate' (Wildcard-Zertifikate, z.B. <span style="color:red;">*.example.com</span>) | ||
+ | * Überwachung der Gültigkeit der Zertifikate | ||
+ | * IP-Adressen in Zertifikaten <u>vermeiden</u>, <u>keine</u> [https://tools.ietf.org/html/rfc1918 RFC 1918]-Adressen (z.B. <span style="color:red;">192.168.1.1</span>)<br/> | ||
+ | * stellen Sie die, zum Verifizieren benötigte Zertifikats-Kette auf dem Webserver zur Verfügung (auch die Zwischenzertifikate) | ||
+ | * Nutzen Sie Ihre Zeritifikate nur für Dienste mit einem vergleichbaren Sicherheitsniveau (vermeiden Sie z.B. das Zertifikat eines Webservers auch für Email-Dienste zu nutzen) | ||
+ | <br/> | ||
+ | <b>Testen der Einstellungen und des Zertifikats:</b> | ||
+ | * [[Testing_for_SSL-TLS_%28OWASP-CM-001%29 | OWASP Testing Guide: Chapter on SSL/TLS Testing]] | ||
+ | * [[O-Saft|OWASP 'O-Saft' (OWASP SSL audit for testers / OWASP SSL advanced forensic tool)]] | ||
+ | * [https://www.ssllabs.com/ssltest SSL LABS Server Test] | ||
+ | * weitere Tools: [[Testing_for_Weak_SSL/TLS_Ciphers,_Insufficient_Transport_Layer_Protection_(OTG-CRYPST-001)#Tools| Testing for Weak SSL/TLS Ciphers, Insufficient Transport Layer Protection (OTG-CRYPST-001)-Tools]] | ||
+ | <br/> | ||
+ | Weitere Details im [[Transport_Layer_Protection_Cheat_Sheet|Transport Layer Protection Cheat Sheet]] und | ||
+ | [[Testing_for_SSL-TLS|OWASP Testing Guide: Chapter on SSL/TLS Testing]].<br/> | ||
+ | Links mit Beispielen für viele Plattformen: | ||
+ | * [https://bettercrypto.org bettercrypto.org:] [https://bettercrypto.org/static/applied-crypto-hardening.pdf 'Applied Crypto Hardening (DRAFT)'] | ||
+ | * [https://wiki.mozilla.org/Security/Server_Side_TLS MozillaWiki: Security/Server Side TLS] | ||
+ | {{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=defOp|position=left|title=2b|risk=6|year=2013|language=de}} | ||
+ | ;Absicherung der Transportschicht (auf dem Webserver - Teil 2) | ||
+ | <b>Wirksamer Schutz gegen Man In The Middle-Angriffe</b><br/> | ||
+ | Die Sicherheitskonfiguration unter Option 2a hat noch eine Schwachstelle, so das MITM (Man In The Middle attack) nicht zuverlässig verhindert wird. MITM erzeugt einen Zertifikatsfehler am Client, der üblicherweise aber (durch den Anwender) ignoriert wird. Deshalb wurde der HTTP-Header "HTTP Strict Transport Security (HSTS)" eingeführt. Damit werden kompatible Browser (Firefox, Chrome, Opera aber bisher NICHT IE) angewiesen, dass | ||
* der Browser den http-Request ausschließlich über https verschickt (auch falls die Seite mit http aufgerufen wird). | * der Browser den http-Request ausschließlich über https verschickt (auch falls die Seite mit http aufgerufen wird). | ||
* der Anwender Zertifikatsfehler im Browser nicht mehr ignorieren kann. | * der Anwender Zertifikatsfehler im Browser nicht mehr ignorieren kann. | ||
− | + | <br/> | |
Konfiguration im Apache: | Konfiguration im Apache: | ||
− | + | {{Top_10_2010:ExampleBeginTemplate|year=2013}} | |
− | + | Header set Strict-Transport-Security | |
+ | : "max-age=16070400; includeSubDomains" | ||
+ | {{Top_10_2010:ExampleEndTemplate}} | ||
+ | <br/> | ||
Da der HSTS-Header nur über https übermittelt wird ist zusätzlich ein Redirect nötig: | Da der HSTS-Header nur über https übermittelt wird ist zusätzlich ein Redirect nötig: | ||
+ | {{Top_10_2010:ExampleBeginTemplate|year=2013}} | ||
+ | : <VirtualHost *:80> | ||
+ | :: ServerAlias * | ||
+ | :: RewriteEngine On | ||
+ | :: <nowiki>RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [redirect=301]</nowiki> | ||
+ | : </VirtualHost> | ||
+ | {{Top_10_2010:ExampleEndTemplate}} | ||
+ | <br/> | ||
+ | ;Quellen: | ||
− | + | [[HTTP_Strict_Transport_Security|HTTP Strict Transport Security]]<br> | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
[http://www.youtube.com/watch?v=zEV3HOuM_Vw&feature=youtube_gdata AppSecTutorial Series - Episode 4] | [http://www.youtube.com/watch?v=zEV3HOuM_Vw&feature=youtube_gdata AppSecTutorial Series - Episode 4] | ||
− | {{ | + | {{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=references|position=right|risk=6|year=2013|language=de}} |
{{Top_10_2010:SubSubsectionOWASPReferencesTemplate}} | {{Top_10_2010:SubSubsectionOWASPReferencesTemplate}} | ||
− | + | * Einen umfangreicheren Überblick über die Anforderungen, gibt es unter [[ASVS|ASVS requirements on Cryptography (V7), Data Protection (V9) und Communications Security (V10)]]. | |
− | Einen umfangreicheren Überblick über die Anforderungen | + | * [[Cryptographic_Storage_Cheat_Sheet|OWASP Cryptographic Storage Cheat Sheet]] |
+ | * [[Password_Storage_Cheat_Sheet|OWASP Password Storage Cheat Sheet]] | ||
+ | * [[Transport_Layer_Protection_Cheat_Sheet|OWASP Transport Layer Protection Cheat Sheet]] | ||
+ | * [[Testing_for_SSL-TLS|OWASP Testing Guide: Chapter on SSL/TLS Testing]] | ||
+ | * [[O-Saft|OWASP SSL Advanced Forensic Tool (O-SAFT)]] | ||
+ | : Älter: | ||
* [[Top_10_2007-Insecure_Cryptographic_Storage | OWASP Top 10-2007 on Insecure Cryptographic Storage]] | * [[Top_10_2007-Insecure_Cryptographic_Storage | OWASP Top 10-2007 on Insecure Cryptographic Storage]] | ||
− | * [ | + | * [[Guide_to_Cryptography#Insecure_transmission_of_secrets|OWASP Development Guide: Chapter on Cryptography]] |
− | |||
* [[Codereview-Cryptography | OWASP Code Review Guide: Chapter on Cryptography]] | * [[Codereview-Cryptography | OWASP Code Review Guide: Chapter on Cryptography]] | ||
− | {{ | + | {{Top_10_2010:SubSubsectionExternalReferencesTemplate|language=de}} |
* [http://cwe.mitre.org/data/definitions/310.html CWE Entry 310 on Cryptographic Issues] | * [http://cwe.mitre.org/data/definitions/310.html CWE Entry 310 on Cryptographic Issues] | ||
* [http://cwe.mitre.org/data/definitions/312.html CWE Entry 312 on Cleartext Storage of Sensitive Information] | * [http://cwe.mitre.org/data/definitions/312.html CWE Entry 312 on Cleartext Storage of Sensitive Information] | ||
+ | * [http://cwe.mitre.org/data/definitions/319.html CWE Entry 319 on Cleartext Transmission of Sensitive Information] | ||
* [http://cwe.mitre.org/data/definitions/326.html CWE Entry 326 on Weak Encryption] | * [http://cwe.mitre.org/data/definitions/326.html CWE Entry 326 on Weak Encryption] | ||
* [http://www.mindrot.org/projects/jBCrypt Reine Java Implementierung von BCrypt] | * [http://www.mindrot.org/projects/jBCrypt Reine Java Implementierung von BCrypt] | ||
* [https://github.com/wg/scrypt Beispielimplementierung von SCrypt] | * [https://github.com/wg/scrypt Beispielimplementierung von SCrypt] | ||
+ | * [https://www.ssllabs.com/projects/best-practices/index.html SSL LABS: 'SSL/TLS Deployment Best Practices'] | ||
+ | * [https://www.bsi.bund.de/DE/Publikationen/TechnischeRichtlinien/tr02102/index_htm.html BSI: 'TR-02102-2 Teil 2'] | ||
+ | * [https://www.enisa.europa.eu/activities/identity-and-trust/library/deliverables/study-on-cryptographic-protocols ENISA: 'Study on cryptographic protocols'] | ||
+ | * [https://bettercrypto.org bettercrypto.org:] [https://bettercrypto.org/static/applied-crypto-hardening.pdf 'Applied Crypto Hardening (DRAFT)'] | ||
+ | * [https://wiki.mozilla.org/Security/Server_Side_TLS MozillaWiki: Security/Server Side TLS] | ||
+ | |||
{{Top_10:SubsectionTableEndTemplate}}{{Top 10 DeveloperEdition:NavigationByHeadertab | {{Top_10:SubsectionTableEndTemplate}}{{Top 10 DeveloperEdition:NavigationByHeadertab | ||
|headertab=JAVA | |headertab=JAVA | ||
− | |useprev=2013PrevHeaderTabDeveloperEdition | + | |useprev=Nothing <!---- 2013PrevHeaderTabDeveloperEdition ---> |
|usenext=2013NextHeaderTabDeveloperEdition | |usenext=2013NextHeaderTabDeveloperEdition | ||
− | |prev= | + | |prev=A6-{{Top_10_2010:ByTheNumbers |
− | | | + | |6 |
|year=2013 | |year=2013 | ||
|language=de}} | |language=de}} | ||
Line 265: | Line 467: | ||
|language=de | |language=de | ||
}} | }} | ||
− | |||
= '''PHP''' = | = '''PHP''' = | ||
− | {{Top_10:SubsectionTableBeginTemplate|type=headertab}} {{ | + | {{taggedSection |
− | Um vorerstellte Hash-Tabellen zu verhindern, kann jedem Datensatz eine zufällige Zeichenfolge hinzugefügt werden, welche als Salt (Deutsch: Salz) bezeichnet wird. Ein Beispiel für die sichere Erstellung eines Hashwerts ist im | + | | type=tbd |
+ | | comment=Bitte senden Sie uns weitere gute Beispiele mit PHP für diesen Abschnitt. | ||
+ | }} | ||
+ | {{Top_10:SubsectionTableBeginTemplate|type=headertab}} {{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=defOp|position=firstLeft|title=2|risk=6|year=2013|language=de}} | ||
+ | Um vorerstellte Hash-Tabellen zu verhindern, kann jedem Datensatz eine zufällige Zeichenfolge hinzugefügt werden, welche als Salt (Deutsch: Salz) bezeichnet wird. Ein Beispiel für die sichere Erstellung eines Hashwerts ist im Folgendemn gegeben. Dafür muss das GIT-Projekt [https://github.com/ircmaxell/password_compat] eingebunden werden, ab PHP-Version 5.5 ist dies im Kern enthalten. | ||
Das Salt wird bspw. bei einem Linuxsystem in der Funktion password_hash() durch Zugriff auf /dev/urandom erstellt. Der Rückgabewert der Funktion ist eine Zeichenkette und beinhaltet u.a. den Hashwert, das Salt und den genutzten Algorithmus. | Das Salt wird bspw. bei einem Linuxsystem in der Funktion password_hash() durch Zugriff auf /dev/urandom erstellt. Der Rückgabewert der Funktion ist eine Zeichenkette und beinhaltet u.a. den Hashwert, das Salt und den genutzten Algorithmus. | ||
Die Kosten, welche die Anzahl der Hash-Iterationen angeben, können über den dritten Parameter festgelegt werden. | Die Kosten, welche die Anzahl der Hash-Iterationen angeben, können über den dritten Parameter festgelegt werden. | ||
− | + | {{Top_10_2010:ExampleBeginTemplate|year=2013}} | |
− | |||
− | |||
$options = [ | $options = [ | ||
− | + | : 'cost' => 12, | |
− | ]; | + | ];<br/> |
− | $inputHash = password_hash($_GET['password'], CRYPT_SHA256, $options); | + | $inputHash = password_hash($_GET['password'], CRYPT_SHA256, $options);<br/> |
− | storeHash($user, $inputHash); // Speichere Hash | + | storeHash($user, $inputHash); // Speichere Hash<br/> |
− | $hash = getHash($user); // Hole Hash aus der Datenbank | + | $hash = getHash($user); // Hole Hash aus der Datenbank<br/> |
− | $isPasswordVerified = password_verify($_GET['password'], $hash); / | + | // Prüfe eingegebenes Passwort gegen gespeichertes Passwort:<br/> |
+ | $isPasswordVerified = password_verify($_GET['password'], $hash);<br/> | ||
if($isPasswordVerified) { | if($isPasswordVerified) { | ||
− | + | : // Password korrekt | |
} else { | } else { | ||
− | + | : throw new PasswordVerificationException(""); | |
} | } | ||
− | + | {{Top_10_2010:ExampleEndTemplate}} | |
− | {{ | + | {{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=references|position=right|risk=6|year=2013|language=de}} |
{{Top_10_2010:SubSubsectionOWASPReferencesTemplate}} | {{Top_10_2010:SubSubsectionOWASPReferencesTemplate}} | ||
− | + | * Einen umfangreicheren Überblick über die Anforderungen, gibt es unter [[ASVS|ASVS requirements on Cryptography (V7), Data Protection (V9) und Communications Security (V10)]]. | |
− | Einen umfangreicheren Überblick über die Anforderungen | + | * [[Cryptographic_Storage_Cheat_Sheet|OWASP Cryptographic Storage Cheat Sheet]] |
+ | * [[Password_Storage_Cheat_Sheet|OWASP Password Storage Cheat Sheet]] | ||
+ | * [[Transport_Layer_Protection_Cheat_Sheet|OWASP Transport Layer Protection Cheat Sheet]] | ||
+ | * [[Testing_for_SSL-TLS|OWASP Testing Guide: Chapter on SSL/TLS Testing]] | ||
+ | * [[O-Saft|OWASP SSL Advanced Forensic Tool (O-SAFT)]] | ||
+ | : Älter: | ||
* [[Top_10_2007-Insecure_Cryptographic_Storage | OWASP Top 10-2007 on Insecure Cryptographic Storage]] | * [[Top_10_2007-Insecure_Cryptographic_Storage | OWASP Top 10-2007 on Insecure Cryptographic Storage]] | ||
− | * [ | + | * [[Guide_to_Cryptography#Insecure_transmission_of_secrets|OWASP Development Guide: Chapter on Cryptography]] |
* [[Codereview-Cryptography | OWASP Code Review Guide: Chapter on Cryptography]] | * [[Codereview-Cryptography | OWASP Code Review Guide: Chapter on Cryptography]] | ||
− | {{ | + | {{Top_10_2010:SubSubsectionExternalReferencesTemplate|language=de}} |
* [http://cwe.mitre.org/data/definitions/310.html CWE Entry 310 on Cryptographic Issues] | * [http://cwe.mitre.org/data/definitions/310.html CWE Entry 310 on Cryptographic Issues] | ||
* [http://cwe.mitre.org/data/definitions/312.html CWE Entry 312 on Cleartext Storage of Sensitive Information] | * [http://cwe.mitre.org/data/definitions/312.html CWE Entry 312 on Cleartext Storage of Sensitive Information] | ||
+ | * [http://cwe.mitre.org/data/definitions/319.html CWE Entry 319 on Cleartext Transmission of Sensitive Information] | ||
* [http://cwe.mitre.org/data/definitions/326.html CWE Entry 326 on Weak Encryption] | * [http://cwe.mitre.org/data/definitions/326.html CWE Entry 326 on Weak Encryption] | ||
* [http://www.php.net/manual/en/function.password-hash.php Funktionsweise der Funktion password_hash] | * [http://www.php.net/manual/en/function.password-hash.php Funktionsweise der Funktion password_hash] | ||
+ | * [https://www.ssllabs.com/projects/best-practices/index.html SSL LABS: 'SSL/TLS Deployment Best Practices'] | ||
+ | * [https://www.bsi.bund.de/DE/Publikationen/TechnischeRichtlinien/tr02102/index_htm.html BSI: 'TR-02102-2 Teil 2'] | ||
+ | * [https://www.enisa.europa.eu/activities/identity-and-trust/library/deliverables/study-on-cryptographic-protocols ENISA: 'Study on cryptographic protocols'] | ||
+ | * [https://bettercrypto.org bettercrypto.org:] [https://bettercrypto.org/static/applied-crypto-hardening.pdf 'Applied Crypto Hardening (DRAFT)'] | ||
+ | * [https://wiki.mozilla.org/Security/Server_Side_TLS MozillaWiki: Security/Server Side TLS] | ||
+ | |||
{{Top_10:SubsectionTableEndTemplate}}{{Top 10 DeveloperEdition:NavigationByHeadertab | {{Top_10:SubsectionTableEndTemplate}}{{Top 10 DeveloperEdition:NavigationByHeadertab | ||
|headertab=PHP | |headertab=PHP | ||
Line 316: | Line 532: | ||
}} | }} | ||
+ | <!-- weitere Programmiersprachen oder evtl Anti-Beispiele --- > | ||
= '''Test''' = | = '''Test''' = | ||
− | + | {{Top_10:SubsectionTableBeginTemplate|type=headertab}} {{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=defOp|position=firstLeft|title=1|risk=6|year=2013|language=de}} | |
− | {{Top_10:SubsectionTableBeginTemplate|type=headertab}} {{ | + | {{Top_10_2010:ExampleBeginTemplate|year=2013}} |
− | {{Top_10_2010:ExampleBeginTemplate}} | + | tbd<br/> |
− | tbd | ||
Text | Text | ||
{{Top_10_2010:ExampleEndTemplate}} | {{Top_10_2010:ExampleEndTemplate}} | ||
− | {{ | + | {{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=defOp|position=right|title=2|risk=6|year=2013|language=de}} |
− | {{Top_10_2010:ExampleBeginTemplate}} | + | {{Top_10_2010:ExampleBeginTemplate|year=2013}} |
− | tbd | + | tbd<br/> |
Text | Text | ||
{{Top_10_2010:ExampleEndTemplate}} | {{Top_10_2010:ExampleEndTemplate}} | ||
− | {{ | + | {{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=defOp|position=whole|title=|risk=6|year=2013|language=de}} |
− | tbd | + | tbd<br/> |
Text | Text | ||
− | {{ | + | {{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=userImpact|position=left|risk=6|year=2013|language=de}} |
− | (ganze Breite) | + | (ganze Breite)<br/> |
Text | Text | ||
− | {{ | + | {{Top_10_2010:SubsectionAdvancedTemplate|type={{Top_10_2010:StyleTemplate}}|subsection=references|position=right|risk=6|year=2013|language=de}} |
{{Top_10:SubsectionTableEndTemplate}}{{Top 10 DeveloperEdition:NavigationByHeadertab | {{Top_10:SubsectionTableEndTemplate}}{{Top 10 DeveloperEdition:NavigationByHeadertab | ||
|headertab=Test | |headertab=Test | ||
Line 354: | Line 570: | ||
|language=de | |language=de | ||
}} | }} | ||
+ | ------------------------------------------------> | ||
<headertabs /> | <headertabs /> | ||
{{Top_10_2013_DeveloperEdition:BottomAdvancedTemplate | {{Top_10_2013_DeveloperEdition:BottomAdvancedTemplate |
Latest revision as of 12:55, 15 September 2017
← A5-Sicherheitsrelevante Fehlkonfiguration | A7-Fehlerhafte Autorisierung auf Anwendungsebene → |
Anwendungs- spezifisch |
Ausnutzbarkeit SCHWIERIG |
Verbreitung SELTEN |
Auffindbarkeit DURCHSCHNITTLICH |
Auswirkung SCHWERWIEGEND |
Anwendungs-/ Geschäftsspezifisch |
Jeder mit Zugriff auf Ihre vertraulichen Daten (Backups inkl.) ist zu betrachten. Das betrifft die Speicherung, die Übertragung und auch die Daten im Browser der Kunden. Externe und interne Bedrohungen sind relevant. | Angreifer brechen i.d.R. nicht die Verschlüsselung selbst. Stattdessen stehlen sie Schlüssel, führen Seiten- oder MITM-Angriffe aus oder stehlen Klartext vom Server, während der Übertragung oder aus dem Browser des Kunden heraus. | Fehlende Verschlüsselung vertraulicher Daten ist die häufigste Schwachstelle. Die Nutzung von Kryptographie erfolgt oft mit schwacher Schlüsselerzeugung und -verwaltung und der Nutzung schwacher Algorithmen, insbesondere für das Password Hashing. Browser Schwachstellen sind verbreitet und leicht zu finden, aber nur schwer auszunutzen. Ein eingeschränkter Zugriff lässt ext. Angreifer Probleme auf dem Server i.d.R. nur schwer finden und ausnutzen. | Fehler kompromittieren regelmäßig vertrauliche Daten. Es handelt sich hierbei oft um sensitive Daten wie personenbezogene Daten, Benutzernamen und Passwörter oder Kreditkarteninformationen. | Betrachten Sie den Wert verlorener Daten und die Auswirkungen auf die Reputation des betroffenen Unternehmens. Hat es ggf. auch juristische Konsequenzen, wenn die Daten bekannt werden? |
Mögliche Angriffsszenarien
Szenario 1: Eine Anwendung verschlüsselt Kreditkartendaten automatisch bei der Speicherung in einer Datenbank. Das bedeutet aber auch durch SQL-Injection erlangte Kreditkartendaten in diesem Fall automatisch entschlüsselt werden. Die Anwendung hätte die Daten mit eine Public Key verschlüsseln sollen und nur nachgelagerte Anwendungen und nicht die Webanwendung selbst hätten die Daten mit dem Private Key entschlüsseln dürfen. |
Wie kann ich 'Verlust der Vertraulichkeit sensibler Daten' verhindern?
Eine Übersicht über alle Tücken unsicherer Kryptografie, SSL-Verwendung und Datensicherheit liegt weit außerhalb der Top 10. Für alle vertraulichen Daten sollten Sie zumindest:
|
JAVA-Teil 1: Kryptografisch unsichere Speicherung
Verteidigungs-Option 1 gegen 'Verlust der Vertraulichkeit sensibler Daten':
Ein einfaches Beispiel für die Veschlüsselung von Texten, hier mit dem AES-128 Algorithmus. Die Auswahl an Verschlüsselungsparametern wie beispielsweise Algorithmus, Ciphermodus oder Schlüssellänge ist groß und kommt immer auf die jeweiligen Daten und die Anwendung an. String plainText = "HelloWorld";
CipherText ciphertext =
|
Verteidigungs-Option 2 gegen 'Verlust der Vertraulichkeit sensibler Daten':
Beispiele für das Hashen von Passwörtern. Um die Sicherheit zu erhöhen sollte jedes Passwort mit einem Zufallswert (Salt) berechnet und gespeichert werden sowie möglichst viele Iterationen beim Hashing genutzt werden. String password = "mypassword";
}
Sicherer ist allerdings die Nutzung einer PBKDF2 (Password-Based Key Derivation Function 2) wie im folgenden Beispiel: public byte[] generatePBKDF2Hash(String password)
}
Eine weiterer empfohlener Algorithmus ist bcrypt, hier bespielsweise unter Verwendung der jBCrypt-Bibliothek (siehe Referenzen). String hashed = BCrypt.hashpw(password, BCrypt.gensalt(12)); Zu bcrypt gibt es mittlerweile eine noch sicherere Variante scrypt, der Link zu einer Beispielimplementierung findet sich bei den Referenzen. |
Verteidigungs-Option 3 gegen 'Verlust der Vertraulichkeit sensibler Daten':
Um geheime Schlüssel sicher, aber auch gleichzeitig einfach zugänglich und austauschbar aufzubewahren empfiehlt sich eine spezielle Schlüsseldatei, wie beispielweise der Java KeyStore. In dieser Datei werden die Schlüssel mit einem Master-Password gesichert, die Datei selbst sollte getrennt von den verschlüsselten Daten abgelegt werden: // Erzeugung eines symmetrischen Schlüssels mittels der vorher beschriebenen PBKDF2
KeyStore.SecretKeyEntry entry = new KeyStore.SecretKeyEntry(mySecretKey); |
Referenzen
OWASP
Andere
|
JAVA-Teil 2: Unzureichende Absicherung der Transportschicht
Verteidigungs-Option 1 gegen 'Verlust der Vertraulichkeit sensibler Daten':
Um die Verschlüsselung auf der Transportebene sollte sich der Entwickler nie selbst kümmern, sondern dies immer dem Webserver überlassen. Im J2EE-Deployment-Descriptor der Anwendung (= web.xml) ist die folgende Konfiguration vorzunehmen, um sicherzustellen, dass nur ausschließlich über https kommuniziert wird: <security-constraint>
</security-constraint>
<session-config>
</session-config>
Header set Cache-Control "no-cache, no store, must-revalidate" Weitere Hinweise im Transport Layer Protection Cheat Sheet |
Verteidigungs-Option 2a gegen 'Verlust der Vertraulichkeit sensibler Daten':
Sichere Verschlüsselung
SSLProtocol +TLSv1.2 # for Cipher-String 'A+', 'A' Anmerkungen: - Der Cipher-String mit den SSL-Cipher-Suites wurde als Whitelist formuliert, um die serverseitige Kompatibilität mit alten Versionen von OpenSSL zu erhöhen.
openssl ciphers -V "DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256" 0x00,0x9F - DHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=DH Au=RSA Enc=AESGCM(256) Mac=AEAD 0x00,0x9E - DHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=DH Au=RSA Enc=AESGCM(128) Mac=AEAD 0xC0,0x30 - ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(256) Mac=AEAD 0xC0,0x2F - ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(128) Mac=AEAD 0x00,0x6B - DHE-RSA-AES256-SHA256 TLSv1.2 Kx=DH Au=RSA Enc=AES(256) Mac=SHA256 0x00,0x67 - DHE-RSA-AES128-SHA256 TLSv1.2 Kx=DH Au=RSA Enc=AES(128) Mac=SHA256 0xC0,0x28 - ECDHE-RSA-AES256-SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=AES(256) Mac=SHA384 0xC0,0x27 - ECDHE-RSA-AES128-SHA256 TLSv1.2 Kx=ECDH Au=RSA Enc=AES(128) Mac=SHA256
Achtung/CAUTION: Der Cipher-String wurde nur mit einzelnen, älteren OpenSSL-Versionen getestet, es können ungewollt weitere Cipher-Suiten dadurch benutzt werden. (ONLY tested with some elder Versions of OpenSSL!)
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Verteidigungs-Option 2b gegen 'Verlust der Vertraulichkeit sensibler Daten':
Wirksamer Schutz gegen Man In The Middle-Angriffe
Header set Strict-Transport-Security
HTTP Strict Transport Security |
Referenzen
OWASP
Andere
|
Comment: Bitte senden Sie uns weitere gute Beispiele mit PHP für diesen Abschnitt.
Verteidigungs-Option 2 gegen 'Verlust der Vertraulichkeit sensibler Daten':
Um vorerstellte Hash-Tabellen zu verhindern, kann jedem Datensatz eine zufällige Zeichenfolge hinzugefügt werden, welche als Salt (Deutsch: Salz) bezeichnet wird. Ein Beispiel für die sichere Erstellung eines Hashwerts ist im Folgendemn gegeben. Dafür muss das GIT-Projekt [4] eingebunden werden, ab PHP-Version 5.5 ist dies im Kern enthalten. Das Salt wird bspw. bei einem Linuxsystem in der Funktion password_hash() durch Zugriff auf /dev/urandom erstellt. Der Rückgabewert der Funktion ist eine Zeichenkette und beinhaltet u.a. den Hashwert, das Salt und den genutzten Algorithmus. Die Kosten, welche die Anzahl der Hash-Iterationen angeben, können über den dritten Parameter festgelegt werden. $options = [
];
} else {
} |
Referenzen
OWASP
Andere
|
← A5-Sicherheitsrelevante Fehlkonfiguration | A7-Fehlerhafte Autorisierung auf Anwendungsebene → |
![CC-by-sa-3 0-88x31.png](/images/6/64/CC-by-sa-3_0-88x31.png)