在 Azure App Service 中設定 Tomcat、JBoss 或 Java SE 應用程式的安全性

本文說明如何在 App Service 中設定 Java 特定的安全性設定。 在 App Service 中運行的 Java 應用程式擁有與其他應用程式相同的 安全最佳實務 。

Azure App Service 在完全託管的服務上執行三種類型的 Java 網頁應用程式:

  • Java 標準版(SE)。 Java SE 可執行以 Java 壓縮包(JAR)套件部署的應用程式,該套件包含嵌入式伺服器,例如 Spring Boot、Quarkus、Dropwizard,或是內建 Tomcat 或 Jetty 伺服器的應用程式。
  • Tomcat。 內建的 Tomcat 伺服器可執行以網頁應用程式壓縮套件(WAR)部署的應用程式。
  • JBoss 企業應用程式平臺 (EAP):內建的 JBoss EAP 伺服器可以執行部署為 WAR 或企業封存 (EAR) 套件的應用程式。 此選項支援 Linux 應用程式,包含免費、Premium v3 及 Isolated v2 等價格層級。

備註

JBoss EAP 現在在 App Service 上支援「自備授權」(Bring Your Own License,BYOL)計費。 BYOL 允許擁有現有 Red Hat 訂閱的客戶,直接將這些授權套用到 Azure App Service 上的 JBoss EAP 部署。 欲了解更多資訊,請參閱 BYOL 對 App Service 上 JBoss EAP 的支援。

驗證使用者 (簡單驗證)

使用 [驗證與授權] 選項,設定 Azure 入口網站中的應用程式驗證。 從該處,您可以使用 Microsoft Entra ID 或社交登入 (例如 Facebook、Google 或 GitHub) 來啟用驗證。 只有在設定單一驗證提供者時,Azure 入口網站設定才會運作。 如需詳細資訊,請參閱 設定 App Service 應用程式以使用 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

若要上傳現有的 TLS 憑證並將其綁定到你應用程式的網域名稱,請參考 Azure App Service 中啟用自訂網域的 HTTPS。 你也可以設定應用程式強制執行 TLS。

使用 Azure Key Vault 參考

Azure Key Vault 提供集中式的秘密管理,包含存取政策與稽核歷史。 你可以將秘密資料,例如密碼或連線字串,存放在金鑰庫中。 你可以透過環境變數在你的應用程式中存取這些秘密。

首先,授權你的應用程式存取金鑰庫,然後在 應用程式設定中建立指向你的秘密的金鑰庫參考。 您可以在遠端存取 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 連線:

在 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 中手動載入金鑰存放區

您可以手動將憑證載入金鑰存放區。 若要停用 App Service 自動將憑證載入金鑰儲存,請建立一個應用程式設定, SKIP_JAVA_KEYSTORE_LOAD值為 1。 所有透過 Azure 入口網站上傳到 App Service 的公開憑證都儲存在 /var/ssl/certs/。 私人憑證會儲存在 /var/ssl/private/ 下。

若要互動或除錯 Java 金鑰工具,請 開啟 SSH 連線 至你的應用程式服務並執行指令 keytool。 如需命令清單,請參閱 密鑰工具檔 。 欲了解更多 KeyStore API 資訊,請參閱 Class KeyStore。

請流覽 適用於 Java 開發人員的 Azure 中心,以尋找 Azure 快速入門、教學課程和 Java 參考檔。