共用方式為


在 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 - 僅支持免費、進階 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 物件會將每個宣告類型對應到該類型的宣告集合。 在下列程式碼範例中,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 中儲存秘密 (例如密碼或連接字串),並透過環境變數在應用程式中存取這些秘密。

首先,請依照說明授與應用程式對金鑰保存庫的存取權限,並在應用程式設定中建立對祕密的 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 參考文件。