Spring HTTP / HTTPS-Kanalsicherheit

1. Übersicht

Dieses Tutorial zeigt, wie Sie mithilfe von HTTPS die Anmeldeseite Ihrer Anwendung mithilfe der Channel-Sicherheitsfunktion von Spring schützen .

Die Verwendung von HTTPS zur Authentifizierung ist entscheidend, um die Integrität sensibler Daten während des Transports zu schützen.

Der Artikel baut auf dem Spring Security Login-Lernprogramm auf und fügt eine zusätzliche Sicherheitsebene hinzu. Wir heben die Schritte hervor, die zum Sichern der Authentifizierungsdaten erforderlich sind, indem die Anmeldeseite über den codierten HTTPS-Kanal bereitgestellt wird.

2. Ersteinrichtung ohne Kanalsicherheit

Beginnen wir mit der Sicherheitskonfiguration, die im oben genannten Artikel erläutert wird.

Über die Web-App können Benutzer auf Folgendes zugreifen:

  1. /anonymous.html ohne Authentifizierung,
  2. /login.html und
  3. andere Seiten ( /homepage.html ) nach erfolgreicher Anmeldung.

Der Zugriff wird durch die folgende Konfiguration gesteuert:

@Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/anonymous*") .anonymous(); http.authorizeRequests() .antMatchers("/login*") .permitAll(); http.authorizeRequests() .anyRequest() .authenticated(); 

Oder über XML:

Zu diesem Zeitpunkt ist die Anmeldeseite verfügbar unter:

//localhost:8080/spring-security-login/login.html

Benutzer können sich über HTTP authentifizieren. Dies ist jedoch unsicher, da Kennwörter im Klartext gesendet werden.

3. HTTPS-Serverkonfiguration

Um nur die Login - Seite über HTTPS zu liefern - Ihr Web-Server muss in der Lage sein , um HTTPS - Seiten zu dienen . Dies setzt voraus, dass die SSL / TLS-Unterstützung aktiviert ist.

Beachten Sie, dass Sie entweder ein gültiges Zertifikat verwenden oder zu Testzwecken ein eigenes Zertifikat erstellen können.

Angenommen, wir verwenden Tomcat und rollen unser eigenes Zertifikat. Wir müssen zuerst einen Keystore mit einem selbstsignierten Zertifikat erstellen .

Das Generieren des Schlüsselspeichers kann mit dem folgenden Befehl im Terminal erfolgen:

keytool -genkey -alias tomcat -keyalg RSA -storepass changeit -keypass changeit -dname 'CN=tomcat'

Dadurch werden ein privater Schlüssel und ein selbstsigniertes Zertifikat im Standardschlüsselspeicher für Ihr Benutzerprofil in Ihrem Basisordner erstellt.

Der nächste Schritt besteht darin, conf / server.xml so zu bearbeiten , dass es so aussieht:

Das zweite SSL / TLS Das Tag wird normalerweise in der Konfigurationsdatei auskommentiert, sodass nur das Kommentieren und Hinzufügen von Keystore-Informationen erforderlich ist. Weitere Informationen finden Sie in der Dokumentation zu Tomcat.

Mit der HTTPS-Konfiguration kann die Anmeldeseite jetzt auch unter der folgenden URL bereitgestellt werden:

//localhost:8443/spring-security-login/login.html

Andere Webserver als Tomcat würden eine andere, aber wahrscheinlich ähnliche Konfiguration erfordern.

4. Konfigurieren der Kanalsicherheit

Zu diesem Zeitpunkt können wir die Anmeldeseite sowohl unter HTTP als auch unter HTTPS bereitstellen. In diesem Abschnitt wird erläutert, wie die Verwendung von HTTPS vorgeschrieben wird.

Um HTTPS für die Anmeldeseite zu benötigen, ändern Sie Ihre Sicherheitskonfiguration, indem Sie Folgendes hinzufügen:

http.requiresChannel() .antMatchers("/login*").requiresSecure();

Oder fügen Sie Ihrer XML-Konfiguration das Attribut require -channel = "https" hinzu :

Nach diesem Zeitpunkt konnten sich Benutzer nur noch über HTTPS anmelden. Alle relativen Links, z. B. eine Weiterleitung an /homepage.html , erben das Protokoll der ursprünglichen Anforderung und werden unter HTTPS bereitgestellt .

Wenn Sie HTTP- und HTTPS-Anforderungen in einer einzelnen Webanwendung mischen, müssen Sie zusätzliche Aspekte berücksichtigen, die einer weiteren Konfiguration bedürfen.

5. Mischen von HTTP und HTTPS

Aus Sicherheitsgründen ist es eine gute Praxis und ein solides Ziel, alles über HTTPS bereitzustellen.

Wenn die ausschließliche Verwendung von HTTPS jedoch keine Option ist, können Sie Spring für die Verwendung von HTTP konfigurieren, indem Sie Folgendes an die Konfiguration anhängen:

http.requiresChannel() .anyRequest().requiresInsecure();

Oder fügen Sie dem XML die Attribute require-channel = "http" hinzu :

Dadurch wird Spring angewiesen, HTTP für alle Anforderungen zu verwenden, die nicht explizit für die Verwendung von HTTPS konfiguriert sind, aber gleichzeitig den ursprünglichen Anmeldemechanismus unterbrechen. In den folgenden Abschnitten wird die zugrunde liegende Ursache erläutert.

5.1. Eine benutzerdefinierte Anmeldeverarbeitungs-URL über HTTPS

Die Sicherheitskonfiguration im ursprünglichen Sicherheits-Tutorial enthält Folgendes:

Ohne / perform_login zur Verwendung von HTTPS zu zwingen, würde eine Umleitung zur HTTP-Variante erfolgen, wobei die mit der ursprünglichen Anforderung gesendeten Anmeldeinformationen verloren gehen .

Um dies zu überwinden, müssen wir Spring so konfigurieren, dass HTTPS für die Verarbeitungs-URL verwendet wird:

http.requiresChannel() .antMatchers("/login*", "/perform_login");

Notice the extra argument /perform_login passed to the antMatchers method.

The equivalent in the XML configuration requires adding a new <intercept-url> element to the config:

If your own application is using the default login-processing-url (which is /login) you don't need to configure this explicitly as the /login* pattern already covers that.

With the configuration in place, users are able to login, but not to access authenticated pages e.g. /homepage.html under the HTTP protocol, because of Spring's session fixation protection feature.

5.2. Disabling session-fixation-protection

Session fixation is a problem which can't be avoided when switching between HTTP and HTTPS.

By default Spring creates a new session-id after a successful login. When a user loads the HTTPS login page the user's session-id cookie will be marked as secure. After logging in, the context will switch to HTTP and the cookie will be lost as HTTP is insecure.

To avoid this setting session-fixation-protection to none is required.

http.sessionManagement() .sessionFixation() .none();

Or via XML:

Disabling session fixation protection might have security implications, therefore you need to weigh the pros and cons if you're concerned about session fixation based attacks.

6. Test

After applying all these configuration changes accessing /anonymous.html without logging in (using either // or //) will forward you to the page through HTTP.

Opening other pages directly like /homepage.html should get you forwarded to the login page via HTTPS and after login you will be forwarded back to /homepage.html using HTTP.

7. Conclusion

In diesem Tutorial haben wir uns mit der Konfiguration einer Spring-Webanwendung befasst, die mit Ausnahme des Anmeldemechanismus über HTTP kommuniziert. Doch neue , moderne Web-Anwendungen sollten fast immer HTTPS verwenden ausschließlich als Kommunikationsprotokoll. Das Verringern der Sicherheitsstufe oder das Deaktivieren von Sicherheitsfunktionen (wie z. B. Sitzungsfixierungsschutz ) ist niemals eine gute Idee.

Dieses Tutorial basiert auf der auf GitHub verfügbaren Codebasis. Die Kanalsicherheitskonfiguration kann aktiviert werden, indem https als aktives Spring-Profil aufgelistet wird.