Konfigurieren der Sicherheit für eine Tomcat-, JBoss- oder Java SE-App in Azure App Service
In diesem Artikel wird erläutert, wie Java-spezifische Sicherheitseinstellungen in App Service konfiguriert werden. Für in App Service ausgeführte Java-Anwendungen gelten dieselben bewährten Sicherheitsmethoden wie für andere Anwendungen.
Azure App Service führt Java-Webanwendungen auf einem vollständig verwalteten Dienst in drei Varianten aus:
- Java SE: Kann eine App ausführen, die als JAR-Paket bereitgestellt wird, das einen eingebetteten Server enthält (z. B. Spring Boot, Dropwizard, Quarkus oder eine App mit einem eingebetteten Tomcat- oder Jetty-Server).
- Tomcat: Der integrierte Tomcat-Server kann eine als WAR-Paket bereitgestellte App ausführen.
- JBoss EAP: Wird nur für Linux-Apps in den Tarifen „Free“, „Premium v3“ und „V2 isoliert“ unterstützt. Der integrierte JBoss EAP-Server kann eine als WAR- oder EAR-Paket bereitgestellte App ausführen.
Hinweis
Für Spring-Anwendungen wird die Verwendung von Azure Spring Apps empfohlen. Sie können Azure App Service jedoch weiterhin als Ziel verwenden. Weitere Informationen finden Sie unter Java-Workload-Zielleitfaden.
Authentifizieren von Benutzern (einfache Authentifizierung)
Richten Sie die App-Authentifizierung im Azure-Portal über die Option Authentifizierung und Autorisierung ein. Von dort aus können Sie die Authentifizierung mithilfe von Azure Active Directory oder sozialen Netzwerke wie Facebook, Google oder GitHub aktivieren. Die Konfiguration des Azure-Portals funktioniert nur, wenn Sie einen einzelnen Authentifizierungsanbieter konfigurieren. Weitere Informationen finden Sie unter Konfigurieren Ihrer App Service-App zur Verwendung der Azure Active Directory-Anmeldung und in den entsprechenden Artikeln für andere Identitätsanbieter. Wenn Sie mehrere Anmeldedatenanbieter aktivieren müssen, folgen Sie den Anweisungen unter Anpassen der An- und Abmeldung.
Spring Boot-Entwickler können die Azure Active Directory-Startoption für Spring Boot verwenden, um Anwendungen mithilfe von vertrauten Spring Security-Anmerkungen und -APIs absichern. Achten Sie darauf, dass Sie die maximale Headergröße in Ihrer application.properties-Datei erhöhen. Wir empfehlen den Wert 16384
.
Ihre Tomcat-Anwendung kann direkt aus dem Servlet auf die Ansprüche des Benutzers zugreifen, indem sie das Principal-Objekt in ein Map-Objekt umwandelt. Das Map
-Objekt ordnet jeden Anspruchstyp einer Sammlung der Ansprüche für diesen Typ zu. Im folgenden Codebeispiel ist request
eine Instanz von HttpServletRequest
.
Map<String, Collection<String>> map = (Map<String, Collection<String>>) request.getUserPrincipal();
Nun können Sie das Map
-Objekt auf bestimmte Ansprüche überprüfen. Der folgende Codeausschnitt durchläuft beispielsweise alle Anspruchstypen und gibt den Inhalt der einzelnen Sammlungen aus.
for (Object key : map.keySet()) {
Object value = map.get(key);
if (value != null && value instanceof Collection {
Collection claims = (Collection) value;
for (Object claim : claims) {
System.out.println(claims);
}
}
}
Um Benutzer abzumelden, verwenden Sie den Pfad /.auth/ext/logout
. Weitere Aktionen finden Sie in der Dokumentation zu Anpassen der An- und Abmeldungen. Es gibt auch eine offizielle Dokumentation zur HttpServletRequest-Schnittstelle von Tomcat und ihren Methoden. Die folgenden Servletmethoden werden auch basierend auf Ihrer App Service-Konfiguration aktualisiert:
public boolean isSecure()
public String getRemoteAddr()
public String getRemoteHost()
public String getScheme()
public int getServerPort()
Um dieses Feature zu deaktivieren, erstellen Sie eine Anwendungseinstellung mit dem Namen WEBSITE_AUTH_SKIP_PRINCIPAL
und dem Wert 1
. Um alle Servletfilter zu deaktivieren, die von App Service hinzugefügt wurden, erstellen Sie eine Einstellung namens WEBSITE_SKIP_FILTERS
mit dem Wert 1
.
Informationen zu JBoss EAP finden Sie auf der Registerkarte „Tomcat“.
Konfigurieren von TLS/SSL
Um ein vorhandenes TLS/SSL-Zertifikat hochzuladen und an den Domänennamen Ihrer Anwendung zu binden, folgen Sie den Anweisungen unter Schützen eines benutzerdefinierten DNS-Namens mit einer TLS/SSL-Bindung in Azure App Service. Sie können die App auch zum Erzwingen von TLS/SSL konfigurieren.
Verwenden von KeyVault-Verweisen
Azure KeyVault bietet eine zentrale Verwaltung von Geheimnissen mit Zugriffsrichtlinien und Überprüfungsverlauf. Sie können in KeyVault Geheimnisse (wie Kennwörter oder Verbindungszeichenfolgen) speichern und über Umgebungsvariablen auf diese Geheimnisse in Ihrer Anwendung zugreifen.
Befolgen Sie zunächst die Anweisungen zum Gewähren des Zugriffs auf einen Schlüsseltresor Ihre App und zum Erstellen eines KeyVault-Verweises auf Ihr Geheimnis in einer Anwendungseinstellung. Sie können überprüfen, ob der Verweis auf das Geheimnis aufgelöst wird, indem Sie die Umgebungsvariable ausgeben, während Sie remote auf das App Service-Terminal zugreifen.
Für Spring-Konfigurationsdateien, siehe diese Dokumentation über externalisierte Konfigurationen.
Um diese Geheimnisse in Ihre Spring-Konfigurationsdatei einzufügen, verwenden Sie die Syntax der Umgebungsvariablen (${MY_ENV_VAR}
).
Um diese Geheimnisse in Ihre Tomcat-Konfigurationsdatei einzufügen, verwenden Sie die Syntax der Umgebungsvariablen (${MY_ENV_VAR}
).
Verwenden des Java-Keystore in Linux
Standardmäßig werden alle öffentlichen oder privaten Zertifikate, die in App Service (Linux) hochgeladen wurden, beim Start des Containers in den jeweiligen Java-Keystore geladen. Nach dem Hochladen Ihres Zertifikats müssen Sie Ihre App Service-Instanz neu starten, damit es in den Java-Keystore geladen wird. Öffentliche Zertifikate werden unter $JRE_HOME/lib/security/cacerts
in den Keystore geladen, und private Zertifikate werden in $JRE_HOME/lib/security/client.jks
gespeichert.
Für die Verschlüsselung Ihrer JDBC-Verbindung (Java Database Connectivity) mit Zertifikaten im Java-Keystore kann eine weitere Konfiguration erforderlich sein. Lesen Sie die Dokumentation für den von Ihnen gewählten JDBC-Treiber.
Initialisieren des Java-Keystore in Linux
Zum Initialisieren des import java.security.KeyStore
-Objekts laden Sie die Schlüsselspeicherdatei mit dem Kennwort. Das Standardkennwort für beide Schlüsselspeicher lautet changeit
.
KeyStore keyStore = KeyStore.getInstance("jks");
keyStore.load(
new FileInputStream(System.getenv("JRE_HOME")+"/lib/security/cacerts"),
"changeit".toCharArray());
KeyStore keyStore = KeyStore.getInstance("pkcs12");
keyStore.load(
new FileInputStream(System.getenv("JRE_HOME")+"/lib/security/client.jks"),
"changeit".toCharArray());
Manuelles Laden des Keystore in Linux
Sie können Zertifikate manuell in den Schlüsselspeicher laden. Erstellen Sie die App-Einstellung SKIP_JAVA_KEYSTORE_LOAD
mit dem Wert 1
, damit die Zertifikate nicht automatisch von App Service in den Keystore geladen werden. Alle öffentlichen Zertifikate, die über das Azure-Portal in App Service hochgeladen werden, werden unter /var/ssl/certs/
gespeichert. Private Zertifikate werden unter /var/ssl/private/
gespeichert.
Sie können mit dem Java-Schlüsseltool interagieren oder Debuggingschritte ausführen, indem Sie eine SSH-Verbindung mit Ihrer App Service-Instanz herstellen und den Befehl keytool
ausführen. Eine Liste mit Befehlen finden Sie in der Dokumentation des Schlüsseltools. Weitere Informationen über die KeyStore-API finden Sie in der offiziellen Dokumentation.
Nächste Schritte
Besuchen Sie das Center Azure für Java-Entwickler, um Azure-Schnellstarts, Tutorials und Java-Referenzdokumentation zu finden.