Azure App Service で Tomcat、JBoss、または Java SE アプリのセキュリティを構成する

この記事では、App Service で Java 固有のセキュリティ設定を構成する方法について説明します。 App Service で実行される Java アプリケーションには、他のアプリケーションと同じ セキュリティのベスト プラクティス のセットがあります。

Azure App Service は、フル マネージド サービスで次の 3 種類の Java Web アプリケーションを実行します。

  • Java Standard Edition (SE)。 Java SE では、Spring Boot、Quarkus、Dropwizard などの埋め込みサーバーを含む Java アーカイブ (JAR) パッケージとしてデプロイされたアプリ、または Tomcat または Jetty サーバーが埋め込まれたアプリを実行できます。
  • Tomcat。 組み込みの Tomcat サーバーは、Web アプリケーション アーカイブ (WAR) パッケージとしてデプロイされたアプリを実行できます。
  • JBoss Enterprise Application Platform (EAP): 組み込みの JBoss EAP サーバーは、WAR またはエンタープライズ アーカイブ (EAR) パッケージとしてデプロイされたアプリを実行できます。 このオプションは、Free、Premium v3、Isolated v2 を含む一連の価格レベルの Linux アプリでサポートされています。

JBoss EAP on App Service は、ライセンス持ち込み (BYOL) 課金をサポートするようになりました。 BYOL を使用すると、既存の Red Hat サブスクリプションをお持ちのお客様は、これらのライセンスを Azure App Service 上の JBoss EAP デプロイに直接適用できます。 詳細については、 App Service での JBoss EAP の BYOL サポートを参照してください。

ユーザーを認証する (Easy Auth)

[認証/承認] オプションを使用して、Azure portal でアプリ認証を設定します。 そこから、Microsoft Entra ID、または Facebook、Google、GitHub などのソーシャル サインインを使用して、認証を有効にすることができます。 Azure portal の構成は、1 つの認証プロバイダーを構成するときにのみ機能します。 詳細については、「Microsoft Entra サインインを使用するよう App Service アプリを構成する」と、他の ID プロバイダーの関連記事を参照してください。 複数のサインイン プロバイダーを有効にする必要がある場合は、「 サインインとサインアウトのカスタマイズ」を参照してください。

Spring Boot 開発者は、Microsoft Entra Spring Boot スターターを使用して、使い慣れた Spring Security の注釈と API を使用してアプリケーションをセキュリティで保護することができます。 application.properties ファイルで最大ヘッダー サイズを大きくしてください。 16384 の値をお勧めします。

Tomcat アプリケーションでは、Principal オブジェクトを Map オブジェクトにキャストすることで、サーブレットから直接ユーザーの要求にアクセスできます。 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 インターフェイスとそのメソッドに関する公式ドキュメントもあります。 次のサーブレット メソッドも、ご利用の App Service 構成に基づいてハイドレートされます。

public boolean isSecure()
public String getRemoteAddr()
public String getRemoteHost()
public String getScheme()
public int getServerPort()

この機能を無効にするには、WEBSITE_AUTH_SKIP_PRINCIPAL の値で 1 という名前のアプリケーション設定を作成します。 App Service によって追加されるすべてのサーブレット フィルターを無効にするには、WEBSITE_SKIP_FILTERS の値を含む 1 という名前の設定を作成します。

JBoss EAP については、Tomcat のタブを参照してください。

TLS の構成

既存の TLS 証明書をアップロードしてアプリケーションのドメイン名にバインドするには、「 Azure App Service でカスタム ドメインの HTTPS を有効にする」を参照してください。 TLS を適用するようにアプリを構成することもできます。

Azure Key Vault リファレンスを使用する

Azure Key Vault は、アクセス ポリシーと監査履歴を使用して一元化されたシークレット管理を提供します。 キー コンテナーには、パスワードや接続文字列などのシークレットを格納できます。 環境変数を使用して、アプリケーション内のこれらのシークレットにアクセスできます。

まず、 アプリにキー コンテナーへのアクセス権を付与 し、 アプリケーション設定でシークレットへの 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 portal を使用して App Service にアップロードされたすべてのパブリック証明書は、 /var/ssl/certs/に格納されます。 プライベート証明書は /var/ssl/private/ に格納されます。

Java キー ツールを操作またはデバッグするには、App Service への SSH 接続を開 き、コマンド keytoolを実行します。 コマンドの一覧については、キー ツールのドキュメントを参照してください。 KeyStore API の詳細については、「 KeyStore クラス」を参照してください。

Java 開発者向けの Azure センターにアクセスして、Azure クイック スタート、チュートリアル、および Java リファレンス ドキュメントを入手してください。