Java アプリケーションを移行して、Azure SQL Database とのパスワードなしの接続を使用する

この記事では、従来の認証方法から、Azure SQL Database とのより安全なパスワードレス接続に移行する方法について説明します。

Azure SQL Database に対するアプリケーション要求は、認証される必要があります。 Azure SQL Database には、アプリが安全に接続するためのさまざまな方法が用意されています。 パスワードを使用する方法の 1 つ。 ただしアプリケーションには、可能であればパスワードレス接続を優先的に使用することをお勧めします。

認証オプションを比較する

アプリケーションが Azure SQL Database で認証されると、データベースに接続するためのユーザー名とパスワードのペアが提供されます。 ID の格納場所に応じて、Microsoft Entra 認証と Azure SQL Database 認証の 2 種類の認証があります。

Microsoft Entra 認証

Microsoft Entra 認証は、Microsoft Entra ID で定義されている ID を使用して Azure SQL Database に接続するためのメカニズムです。 Microsoft Entra 認証を使用すると、データベース ユーザーの ID や他の Microsoft サービスを一元管理でき、アクセス許可の管理が容易になります。

認証に Microsoft Entra ID を使用すると、次の利点があります。

  • 一様な方法で Azure Services 全体のユーザーを認証します。
  • パスワード ポリシーとパスワード ローテーションの一元管理。
  • Microsoft Entra ID でサポートされる複数の形式の認証により、パスワードを格納する必要がなくなります。
  • お客様は、外部の (Microsoft Entra ID) グループを使用してデータベースのアクセス許可を管理できます。
  • Microsoft Entra 認証では、Azure SQL データベース ユーザーを使用して、データベース レベルで ID を認証します。
  • Azure SQL Database に接続するアプリケーションに対するトークンベースの認証のサポート。

Azure SQL Database 認証

Azure SQL Database でアカウントを作成できます。 アカウントの資格情報としてパスワードを使用することを選択した場合、これらの資格情報は sys.database_principals テーブルに格納されます。 これらのパスワードは Azure SQL Database に格納されるため、パスワードのローテーションを自分で管理する必要があります。

パスワードを使用して Azure SQL Database に接続することはできますが、慎重に使用する必要があります。 セキュリティで保護されていない場所でパスワードを公開することは絶対にしないでください。 パスワードにアクセスできるユーザーは誰でも認証できます。 たとえば、悪意のあるユーザーが、接続文字列が誤ってソース管理にチェックインされたり、セキュリティで保護されていないメールを通じて送信されたり、間違ったチャットに貼り付けたり、アクセス許可を持たないユーザーによって表示されたりした場合に、アプリケーションにアクセスするリスクがあります。 アプリケーションを更新してパスワードレス接続に置き換えることを検討してください。

パスワードレス接続の概要

パスワードなしの接続を使用すると、アプリケーション コード、その構成ファイル、または環境変数に資格情報を格納することなく、Azure サービスに接続できます。

多くの Azure サービスでは、たとえば Azure マネージド ID を使用したパスワードレス接続がサポートされています。 これらの手法により、Azure Identity クライアント ライブラリから DefaultAzureCredential を使用して実装できる堅牢なセキュリティ機能が提供されます。 このチュートリアルでは、接続文字列などの代替手段ではなく、既存のアプリケーションを更新して使用DefaultAzureCredentialする方法について説明します。

DefaultAzureCredential は複数の認証方法をサポートしており、どの方法が使用されるかは実行時に決定されます。 このアプローチを採用すると、環境固有のコードを実装することなく、異なる環境 (ローカル開発環境と運用環境) で異なる認証方法をアプリに使用できます。

資格情報を検索するDefaultAzureCredential順序と場所については、Azure ID ライブラリの概要参照してください。 たとえば、ローカルで作業する場合は、通常、 DefaultAzureCredential 開発者が Visual Studio へのサインインに使用したアカウントを使用して認証を行います。 アプリを Azure にデプロイすると、DefaultAzureCredential が自動的に切り替わってマネージド ID が使用されるようになります。 この移行のためにコードを変更する必要はありません。

接続がパスワードレスであることを確認するには、ローカル開発と運用環境の両方を考慮する必要があります。 いずれかの場所で接続文字列が必要な場合、アプリケーションはパスワードレスになりません。

ローカル開発環境では、Visual Studio Code または IntelliJ 用の Azure CLI、Azure PowerShell、Visual Studio、または Azure プラグインを使用して認証できます。 この場合、プロパティを構成する代わりに、アプリケーションでその資格情報を使用できます。

仮想マシンなどの Azure ホスティング環境にアプリケーションをデプロイする場合は、その環境でマネージド ID を割り当てることができます。 その後、Azure サービスに接続するために資格情報を指定する必要はありません。

Note

マネージド ID は、アプリまたはサービスを表すセキュリティ ID を提供します。 ID は Azure プラットフォームによって管理され、ユーザーがシークレットをプロビジョニングまたはローテーションする必要はありません。 マネージド ID の詳細については、概要ドキュメントを参照してください。

Note

Azure SQL Database 用 JDBC ドライバーでは、ローカル環境からのパスワードレス接続はまだサポートされていないため、この記事では、Azure ホスティング環境にデプロイされたアプリケーションと、パスワードレス接続を使用するように移行する方法にのみ焦点を当てます。

パスワードレス接続を使用するように既存のアプリケーションを移行する

次の手順では、パスワードベースのソリューションではなく、パスワードレス接続を使用するように既存のアプリケーションを移行する方法について説明します。

0) 作業環境の準備

まず、次のコマンドを使用して、いくつかの環境変数を設定します。

export AZ_RESOURCE_GROUP=<YOUR_RESOURCE_GROUP>
export AZ_DATABASE_SERVER_NAME=<YOUR_DATABASE_SERVER_NAME>
export AZ_DATABASE_NAME=demo
export CURRENT_USERNAME=$(az ad signed-in-user show --query userPrincipalName --output tsv)
export CURRENT_USER_OBJECTID=$(az ad signed-in-user show --query id --output tsv)

プレースホルダーは、この記事全体で使用される次の値に置き換えてください。

  • <YOUR_RESOURCE_GROUP>: リソースが存在するリソース グループの名前。
  • <YOUR_DATABASE_SERVER_NAME>:Azure SQL Database サーバーの名前。 Azure 全体で一意である必要があります。

1) Azure SQL Database を構成する

1.1) Microsoft Entra ID ベースの認証を有効にする

Azure SQL Database で Microsoft Entra ID アクセスを使用するには、まず Microsoft Entra 管理者ユーザーを設定する必要があります。 Microsoft Entra ID ベースの認証用にユーザーを作成/有効化できるのは、Microsoft Entra 管理者ユーザーだけです。

Azure CLI を使用する場合は、次のコマンドを実行して、十分なアクセス許可があることを確認します。

az login --scope https://graph.microsoft.com/.default

次に、次のコマンドを実行して、Microsoft Entra 管理者を設定します。

az sql server ad-admin create \
    --resource-group $AZ_RESOURCE_GROUP \
    --server $AZ_DATABASE_SERVER_NAME \
    --display-name $CURRENT_USERNAME \
    --object-id $CURRENT_USER_OBJECTID

このコマンドにより、Microsoft Entra 管理者が現在サインインしているユーザーに設定されます。

Note

Azure SQL Database サーバーごとに作成できる Microsoft Entra 管理者は 1 つだけです。 別の管理者を選択すると、サーバー用に構成された既存の Microsoft Entra 管理者が上書きされます。

2) パスワードレス接続を使用するようにアプリ コードを移行する

次に、次の手順を使用して、パスワードなしの接続を使用するようにコードを更新します。 概念的には似ていますが、各言語では異なる実装の詳細が使用されます。

  1. プロジェクト内で、次の参照をパッケージに azure-identity 追加します。 このライブラリには、パスワードレス接続を実装するために必要なすべてのエンティティが含まれています。

    <dependency>
         <groupId>com.azure</groupId>
         <artifactId>azure-identity</artifactId>
         <version>1.5.4</version>
    </dependency>
    
  2. JDBC URL.v で Microsoft Entra マネージド ID 認証を有効にします。Azure SQL Database に接続するための場所を現在作成 java.sql.Connection しているコード内の場所を識別します。 次の例に合わせてコードを更新します。

    String url = "jdbc:sqlserver://$AZ_DATABASE_SERVER_NAME.database.windows.net:1433;databaseName=$AZ_DATABASE_NAME;authentication=ActiveDirectoryMSI;"   
    Connection con = DriverManager.getConnection(url);
    
  3. 2 つの $AZ_DATABASE_SERVER_NAME 変数と 1 つの $AZ_DATABASE_NAME 変数を、この記事の冒頭で構成した値に置き換えます。

  4. JDBC URL を user 削除します password

3) Azure ホスティング環境を構成する

パスワードなしの接続を使用するようにアプリケーションを構成した後、Azure にデプロイされた後、同じコードを Azure サービスに対して認証できます。 たとえば、マネージド ID が割り当てられている Azure アプリ Service インスタンスにデプロイされたアプリケーションは、Azure Storage に接続できます。

このセクションでは、2 つの手順を実行して、アプリケーションをパスワードなしの方法で Azure ホスティング環境で実行できるようにします。

  • Azure ホスティング環境のマネージド ID を割り当てます。
  • マネージド ID にロールを割り当てます。

Note

Azure には Service Connector も用意されています。これは、ホスティング サービスを SQL Server に接続するのに役立ちます。 Service Connector を使用してホスティング環境を構成すると、Service Connector によって自動的に行われるため、マネージド ID にロールを割り当てる手順を省略できます。 次のセクションでは、2 つの方法で Azure ホスティング環境を構成する方法について説明します。1 つは Service Connector 経由で、もう 1 つは各ホスティング環境を直接構成することです。

重要

Service Connector のコマンドには、Azure CLI 2.41.0 以降が必要です。

Azure portal を使用してマネージド ID を割り当てる

次の手順では、さまざまな Web ホスティング サービスにシステム割り当てマネージド ID を割り当てる方法を示します。 マネージド ID は、前に設定したアプリ構成を使用して、他の Azure サービスに安全に接続できます。

  1. Azure アプリ サービス インスタンスのメイン概要ページで、ナビゲーション ウィンドウから [ID] を選択します。

  2. [システム割り当て済み] タブで、[ステータス] フィールドをオン設定します。 システム割り当て ID は Azure によって内部的に管理され、この ID によって管理タスクが自動的に処理されます。 ID の詳細と ID がコードで公開されることはありません。

Azure CLI を使用して、Azure ホスティング環境でマネージド ID を割り当てることもできます。

次の例に示すように、az webapp identity assign コマンドを使用して、マネージド ID を Azure アプリ Service インスタンスに割り当てることができます。

export AZ_MI_OBJECT_ID=$(az webapp identity assign \
    --resource-group $AZ_RESOURCE_GROUP \
    --name <service-instance-name> \
    --query principalId \
    --output tsv)

マネージド ID にロールを割り当てる

次に、SQL データベースにアクセスするために作成したマネージド ID にアクセス許可を付与します。

Service Connector を使用してサービスを接続した場合は、前の手順のコマンドでロールが既に割り当てられているため、この手順は省略できます。

アプリをテストする

これらのコードを変更した後、アプリケーションをビルドして再デプロイできます。 次に、ブラウザーでホストされているアプリケーションを参照します。 アプリは Azure SQL データベースに正常に接続できる必要があります。 Azure 環境にロールの割り当てが反映されるまでに数分かかる場合があることに留意してください。 これでローカル環境と運用環境のどちらでも動作するようにアプリケーションが構成されました。開発者がアプリケーション自体でシークレットを管理する必要はありません。

次の手順

このチュートリアルでは、アプリケーションをパスワードレス接続に移行する方法について説明しました。

この記事で説明されている概念の詳細については、次のリソースを参照してください。