Azure App Service で Tomcat、JBoss、または Java SE アプリのセキュリティを構成する
この記事では、App Service で Java 固有のセキュリティ設定を構成する方法について説明します。 App Service で実行される Java アプリケーションは、他のアプリケーションと同じ一連のセキュリティのベスト プラクティスを備えています。
Azure App Service は、次の 3 つのバリエーションのフル マネージド サービスで Java Web アプリケーションを実行します。
- Java SE - 埋め込みサーバー (Spring Boot、Dropwizard、Quarkus、埋め込み Tomcat または Jetty サーバーを含むものなど) を含む JAR パッケージとしてデプロイされたアプリを実行できます。
- Tomcat - 組み込みの Tomcat サーバーは、WAR パッケージとしてデプロイされたアプリを実行できます。
- JBoss EAP - Free、Premium v3、Isolated v2 価格レベルの Linux アプリでのみサポートされます。 組み込みの JBoss EAP サーバーは、WAR または EAR パッケージとしてデプロイされたアプリを実行できます。
Note
Spring アプリケーションの場合は、Azure Spring Apps を使用することをお勧めします。 ただし、Azure App Service は引き続き宛先として使用できます。 アドバイスについてはJava ワークロード宛先ガイダンスに関する記事を参照してください。
ユーザーを認証する (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
オブジェクトによって、各要求の種類がその種類の要求のコレクションにマップされます。 次のコード例では、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 インターフェイスとそのメソッドに関する公式ドキュメントもあります。 次のサーブレット メソッドも、ご利用の App Service 構成に基づいてハイドレートされます。
public boolean isSecure()
public String getRemoteAddr()
public String getRemoteHost()
public String getScheme()
public int getServerPort()
この機能を無効にするには、1
の値で WEBSITE_AUTH_SKIP_PRINCIPAL
という名前のアプリケーション設定を作成します。 App Service によって追加されるすべてのサーブレット フィルターを無効にするには、1
の値を含む WEBSITE_SKIP_FILTERS
という名前の設定を作成します。
JBoss EAP については、Tomcat のタブを参照してください。
TLS/SSL を構成する
既存の TLS/SSL 証明書をアップロードし、アプリケーションのドメイン名にバインドするには、「Azure App Service で TLS/SSL バインドを使用してカスタム DNS 名をセキュリティで保護する」の手順に従います。 TLS/SSL を適用するようにアプリを構成することもできます。
KeyVault 参照を使用する
Azure Key Vault では、アクセス ポリシーと監査履歴を使用した一元的なシークレット管理を提供しています。 シークレット (パスワードや接続文字列など) を 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 portal 経由で App Service にアップロードされたすべてのパブリック証明書は /var/ssl/certs/
に格納されます。 プライベート証明書は /var/ssl/private/
に格納されます。
App Service への SSH 接続を開き、コマンド keytool
を実行することで、Java キー ツールと対話することやデバッグを行うことができます。 コマンドの一覧については、キー ツールのドキュメントを参照してください。 キー ストア API の詳細については、公式ドキュメントを参照してください。
次のステップ
Java 開発者向けの Azure センターにアクセスして、Azure クイック スタート、チュートリアル、および Java リファレンス ドキュメントを入手してください。