Share via


Azure Database for PostgreSQL との間でパスワードレス接続を使うようにアプリケーションを移行する

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

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

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

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

Microsoft Entra 認証

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

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

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

PostgreSQL 認証

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

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

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

パスワードレス接続を使用すると、アプリケーション コード、その構成ファイル、または環境変数に資格情報を格納することなく、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 サービスに接続するために資格情報を指定する必要はありません。

注意

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

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

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

0) 作業環境の整備

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

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

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

  • <YOUR_RESOURCE_GROUP>: リソースが含まれているリソース グループの名前。
  • <YOUR_DATABASE_SERVER_NAME>:PostgreSQL サーバーの名前。 Azure 全体で一意である必要があります。
  • <YOUR_AZURE_AD_NON_ADMIN_USER_DISPLAY_NAME>: Microsoft Entra管理者以外のユーザーの表示名。 名前がMicrosoft Entra テナント内の有効なユーザーであることを確認します。
  • <YOUR_LOCAL_IP_ADDRESS>:ローカル コンピューターの IP アドレス。そこから、Spring Boot アプリケーションを実行します。 これを見つける簡単な方法は、ブラウザーで whatismyip.akamai.com にアクセスすることです。

1) Azure Database for PostgreSQLを構成する

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

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

サーバーの作成後にMicrosoft Entra管理者を設定するには、「Azure Database for PostgreSQL - フレキシブル サーバーでMicrosoft Entraロールを管理する」の手順に従います。

注意

PostgreSQL フレキシブル サーバーでは、複数のMicrosoft Entra管理者を作成できます。

2) ローカル開発用にAzure Database for PostgreSQLを構成する

2.1) ローカル IP のファイアウォール規則を構成する

Azure Database for PostgreSQL インスタンスは、既定でセキュリティ保護されています。 受信接続を一切許可しないファイアウォールがあります。 データベースを使用できるようにするには、データベース サーバーにアクセスするためのローカル IP アドレスを許可するファイアウォール規則を追加する必要があります。

この記事の冒頭でローカル IP アドレスを構成したので、次のコマンドを実行してサーバーのファイアウォールを開くことができます。

az postgres flexible-server firewall-rule create \
    --resource-group $AZ_RESOURCE_GROUP \
    --name $AZ_DATABASE_SERVER_NAME \
    --rule-name $AZ_DATABASE_SERVER_NAME-database-allow-local-ip \
    --start-ip-address $AZ_LOCAL_IP_ADDRESS \
    --end-ip-address $AZ_LOCAL_IP_ADDRESS \
    --output tsv

Windows コンピューター上の Linux 用 Windows サブシステム (WSL) から PostgreSQL サーバーに接続する場合は、WSL ホスト ID をファイアウォールに追加する必要があります。

WSL で以下のコマンドを実行して、ホスト マシンの IP アドレスを取得します。

cat /etc/resolv.conf

nameserver の後に続く IP アドレスをコピーし、次のコマンドで WSL の IP アドレスを環境変数に設定します。

export AZ_WSL_IP_ADDRESS=<the-copied-IP-address>

次に、以下のコマンドを使って、サーバーのファイアウォールを WSL ベースのアプリに開放します。

az postgres flexible-server firewall-rule create \
    --resource-group $AZ_RESOURCE_GROUP \
    --name $AZ_DATABASE_SERVER_NAME \
    --rule-name $AZ_DATABASE_SERVER_NAME-database-allow-local-ip \
    --start-ip-address $AZ_WSL_IP_ADDRESS \
    --end-ip-address $AZ_WSL_IP_ADDRESS \
    --output tsv

2.2) PostgreSQL の管理者以外のユーザーを作成し、アクセス許可を付与する

次に、管理者以外のMicrosoft Entraユーザーを作成し、データベースに対するすべてのアクセス許可を$AZ_DATABASE_NAME付与します。 ニーズに合わせてデータベース名 $AZ_DATABASE_NAME を変更できます。

管理者以外のユーザーを作成するために 、create_ad_user_local.sql という SQL スクリプトを作成します。 次の内容を追加し、ローカルに保存します。

cat << EOF > create_ad_user_local.sql
select * from pgaadauth_create_principal('$AZ_POSTGRESQL_AD_NON_ADMIN_USERNAME', false, false);
EOF

次に、次のコマンドを使用して SQL スクリプトを実行し、管理者以外のユーザー Microsoft Entra作成します。

psql "host=$AZ_DATABASE_SERVER_NAME.postgres.database.azure.com user=$CURRENT_USERNAME dbname=postgres port=5432 password=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken) sslmode=require" < create_ad_user_local.sql

ここで、次のコマンドを使用して、一時 SQL スクリプト ファイルを削除します。

rm create_ad_user_local.sql

注意

PostgreSQL ユーザーの作成の詳細については、Azure Database for PostgreSQL でのユーザーの作成に関するページを参照してください。

3) サインインし、パスワードレス接続を使用するようにアプリ コードを移行する

ローカル開発の場合は、PostgreSQL でロールを割り当てたのと同じMicrosoft Entra アカウントで認証されていることを確認します。 認証には、Azure CLI、Visual Studio、Azure PowerShell のほか、IntelliJ などのツールを使用できます。

次のコマンドを使用して、Azure CLI を使用して Azure にサインインします。

az login

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

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

    <dependency>
        <groupId>com.azure</groupId>
        <artifactId>azure-identity-extensions</artifactId>
        <version>1.0.0</version>
    </dependency>
    
  2. JDBC URL で Azure PostgreSQL 認証プラグインを有効にします。 Azure Database for PostgreSQLに接続するための を現在作成しているコード内のjava.sql.Connection場所を特定します。 application.properties ファイルの と user を更新urlして、次の値に一致させます。

    url=jdbc:postgresql://$AZ_DATABASE_SERVER_NAME.postgres.database.azure.com:5432/$AZ_DATABASE_NAME?sslmode=require&authenticationPluginClassName=com.azure.identity.extensions.jdbc.postgresql.AzurePostgresqlAuthenticationPlugin
    user=$AZ_POSTGRESQL_AD_NON_ADMIN_USERNAME
    
  3. $AZ_POSTGRESQL_AD_NON_ADMIN_USERNAMEと の 2 つの$AZ_DATABASE_SERVER_NAME変数を、この記事の冒頭で構成した値に置き換えます。

アプリをローカルで実行する

これらの変更をコードに対して行った後、アプリケーションをローカルで実行します。 互換性のある IDE またはコマンド ライン ツール (Azure CLI、Visual Studio、IntelliJ など) にサインインしている場合は、新しい構成でローカル資格情報を取得する必要があります。 アプリは、Azure のローカル開発ユーザーに割り当てられたロールを使用して、Azure サービスにローカルから接続できます。

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

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

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

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

注意

Azure には Service Connector も用意されています。これは、ホスティング サービスを PostgreSQL に接続するのに役立ちます。 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 App Service インスタンスのメイン概要ページで、ナビゲーション ウィンドウから [ID] を選択します。

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

    [システム割り当て] タブが表示され、[状態] フィールドが強調表示されているApp Service リソースの [Azure portal ID] ページのスクリーンショット。

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

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

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

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

次に、PostgreSQL インスタンスにアクセスするために割り当てたマネージド ID にアクセス許可を付与します。

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

アプリをテストする

アプリをホスティング環境にデプロイする前に、アプリケーションがマネージド ID 用に作成されたユーザーを使用して PostgreSQL に接続するため、コードをもう 1 つ変更する必要があります。

マネージド ID 用に作成されたユーザーを使用するようにコードを更新します。

注意

Service Connector コマンドを使用した場合は、この手順をスキップします。

properties.put("user", "$AZ_POSTGRESQL_AD_MI_USERNAME");

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

次の手順

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

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