在 Azure App Service 中設定 Tomcat、JBoss 或 Java SE 應用程式的安全性
本文說明如何在 App Service 中設定 Java 特定的安全性設定。 在 App Service 中執行的 Java 應用程式會有一組與其他應用程式相同的安全性最佳做法。
Azure App Service 會以三種變體在完全受控的服務上執行 Java Web 應用程式:
- Java SE - 可以執行部署為包含內嵌伺服器的 JAR 套件的應用程式 (例如 Spring Boot、Dropwizard、Quarkus 或具有內嵌 Tomcat 或 Jetty 伺服器的應用程式)。
- Tomcat - 內建 Tomcat 伺服器可以執行部署為 WAR 套件的應用程式。
- JBoss EAP - 僅支援 Premium v3 和隔離 v2 定價層中的 Linux 應用程式。 內建 JBoss EAP 伺服器可以執行部署為 WAR 或 EAR 套件的應用程式。
注意
針對 Spring 應用程式,我們建議使用 Azure Spring 應用程式。 不過,您仍然可以使用 Azure App Service 作為目的地。 如需建議,請參閱 Java 工作負載目的地指導。
驗證使用者 (簡單驗證)
使用 [驗證與授權] 選項,設定 Azure 入口網站中的應用程式驗證。 從該處,您可以使用 Microsoft Entra ID 或社交登入 (例如 Facebook、Google 或 GitHub) 來啟用驗證。 只有在設定單一驗證提供者時,Azure 入口網站設定才會運作。 如需詳細資訊,請參閱設定 App Service 應用程式使用 Azure Microsoft Entra 登入,以及其他識別提供者的相關文章。 如果您需要啟用多個登入提供者,請遵循自訂登入和登出中的指示。
Spring Boot 開發人員可以使用 Microsoft Entra Spring Boot 簡易版,以利用熟悉的 Spring Security 註釋和 API 來保護應用程式。 請務必要在 application.properties 檔案中增加標頭大小上限。 建議值為 16384
。
Tomcat 應用程式可以藉由將 Principal 物件轉換成 Map 物件,直接從 servlet 存取使用者的宣告。 Map
物件會將每個宣告類型對應到該類型的宣告集合。 在下列程式碼範例中,request
是 HttpServletRequest
的執行個體。
Map<String, Collection<String>> map = (Map<String, Collection<String>>) request.getUserPrincipal();
現在您可以檢查 Map
物件是否有任何特定的宣告。 例如,下列程式碼片段會逐一查看所有宣告類型,並列印每個集合的內容。
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);
}
}
}
若要登出使用者,請使用 /.auth/ext/logout
路徑。 若要執行其他動作,請參閱關於自訂登入和登出的文件。 另外,您也可以參閱有關 Tomcat HttpServletRequest 介面及其方法的官方文件。 下列 servlet 方法也是根據 App Service 設定來更新:
public boolean isSecure()
public String getRemoteAddr()
public String getRemoteHost()
public String getScheme()
public int getServerPort()
若要停用此功能,請建立名為 WEBSITE_AUTH_SKIP_PRINCIPAL
的應用程式設定,其值為 1
。 若要停用 App Service 新增的所有 servlet 篩選條件,請建立名為 WEBSITE_SKIP_FILTERS
的設定,其值為 1
。
針對 JBoss EAP,請參閱 Tomcat 索引標籤。
設定 TLS/SSL
若要上傳現有的 TLS/SSL 憑證,並將其繫結至您應用程式的網域名稱,請遵循使用 Azure App Service 中的 TLS/SSL 繫結保護自訂 DNS 名稱中的指示。 您也可以將應用程式設定為強制執行 TLS/SSL。
使用 KeyVault 參考
Azure KeyVault 透過存取原則和稽核歷程記錄提供集中式祕密管理。 您可以在 KeyVault 中儲存秘密 (例如密碼或連接字串),並透過環境變數在應用程式中存取這些秘密。
首先,請依照說明授與應用程式對金鑰保存庫的存取權限,並在應用程式設定中建立對祕密的 KeyVault 參考。 您可以在遠端存取 App Service 終端機時,列印環境變數,來驗證參考是否會解析為秘密。
如需 Spring 設定檔,請參閱有關外部化設定的文件。
若要將這些祕密插入 Spring 組態檔中,請使用環境變數插入語法 (${MY_ENV_VAR}
)。
若要將這些祕密插入 Tomcat 組態檔中,請使用環境變數插入語法 (${MY_ENV_VAR}
)。
在 Linux 中使用 Java 金鑰存放區
根據預設,系統會在容器啟動時將任何上傳至 App Service Linux 的公開憑證或私人憑證載入個別的 JAVA 金鑰存放區。 上傳憑證後,您必須重新啟動 App Service,才能將其載入 Java 金鑰存放區。 系統會將公開憑證載入位於 $JRE_HOME/lib/security/cacerts
的金鑰存放區,而私人憑證則儲存在 $JRE_HOME/lib/security/client.jks
中。
您可能需要進行更多設定,才能使用 Java 金鑰存放區中的憑證來加密 JDBC 連線。 請參閱您所選 JDBC 驅動程式的文件。
在 Linux 中初始化 Java 金鑰存放區
若要初始化 import java.security.KeyStore
物件,請使用密碼載入金鑰儲存區檔案。 這兩個金鑰存放區的預設密碼為 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());
在 Linux 中手動載入金鑰存放區
您可以手動將憑證載入金鑰存放區。 建立應用程式設定 SKIP_JAVA_KEYSTORE_LOAD
,並將值設為 1
,以停用 App Service 自動將憑證載入金鑰存放區。 透過 Azure 入口網站上傳至 App Service 的所有公開憑證都會儲存在 /var/ssl/certs/
。 私人憑證會儲存在 /var/ssl/private/
下。
您可以開啟 App Service 的 SSH 連線,然後執行命令 keytool
,來互動或偵錯 JAVA 金鑰工具。 如需命令清單,請參閱金鑰工具文件。 如需金鑰儲存區 API 的詳細資訊,請參閱官方文件。
下一步
瀏覽適用於 Java 開發人員的 Azure 中心,以找出 Azure 快速入門、教學課程和 Java 參考文件。