共用方式為


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

本文說明如何在 App Service 中設定 Java 特定的安全性設定。 在 App Service 中執行的 Java 應用程式與其他應用程式具有相同的安全性 最佳做法 集。

Azure App Service 會以三種變體在完全受控的服務上執行 Java Web 應用程式:

  • Java Standard Edition (SE):可以執行部署為 Java Archive (JAR) 套件的應用程式,其中包含內嵌伺服器(例如 Spring Boot、Quarkus、Dropwizard 或具有內嵌 Tomcat 或 Jetty 伺服器的應用程式)。
  • Tomcat:內建 Tomcat 伺服器可以執行部署為 Web 應用程式封存 (WAR) 套件的應用程式。
  • JBoss 企業應用程式平臺 (EAP):內建的 JBoss EAP 伺服器可以執行部署為 WAR 或企業封存 (EAR) 套件的應用程式。 支援 Linux 應用程式中包括免費、進階 v3 和隔離式方案 v2.gti 的一系列價格層。

備註

App Service 上的 JBoss EAP 現在支援「自備授權」(BYOL) 計費,這可讓擁有現有 Red Hat 訂用帳戶的客戶將這些授權直接套用至 Azure 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 物件會將每個宣告類型對應到該類型的宣告集合。 在下列程式碼範例中,requestHttpServletRequest 的執行個體。

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 中儲存秘密 (例如密碼或連接字串),並透過環境變數在應用程式中存取這些秘密。

首先,請遵循指示,將 金鑰保存庫的存取權授予您的應用程式 ,並在 應用程式設定中將秘密參考至金鑰保存庫。 您可以在遠端存取 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 金鑰工具。 如需命令清單,請參閱 密鑰工具檔 。 如需 KeyStore API 的詳細資訊,請參閱 官方檔

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