PostgreSQL での認証に Microsoft Entra ID を使用する

適用対象: Azure Database for PostgreSQL - 単一サーバー

重要

Azure Database for PostgreSQL - シングル サーバーは廃止パスにあります。 Azure Database for PostgreSQL - フレキシブル サーバーにアップグレードすることを強くお勧めします。 Azure Database for PostgreSQL - フレキシブル サーバーへの移行の詳細については、Azure Database for PostgreSQL 単一サーバーの現状に関するページを参照してください。

この記事では、Azure Database for PostgreSQL を使用して Microsoft Entra ID アクセスを構成する方法と、Microsoft Entra ID トークンを使用して接続する方法について説明します。

Microsoft Entra 管理者ユーザーの設定

Microsoft Entra ID ベースの認証用にユーザーを作成/有効化できるのは、Microsoft Entra 管理者ユーザーだけです。 Microsoft Entra 管理者は、管理者特権 (CREATEDB など) を持つため、通常のデータベース操作には使用しないことをお勧めします。

Microsoft Entra 管理者 (ユーザーまたはグループを使用できます) を設定するには、次の手順に従ってください。

  1. Azure portal で、Microsoft Entra ID に対して有効にする Azure Database for PostgreSQL のインスタンスを選択します。
  2. [設定] で、[Active Directory 管理者] を選択します。

Microsoft Entra 管理者を設定します

  1. 顧客テナントで有効な Microsoft Entra ユーザーを Microsoft Entra 管理者として選択します。

重要

管理者を設定すると、管理者の完全なアクセス許可を持つ新しいユーザーが Azure Database for PostgreSQL サーバーに追加されます。 Azure Database for PostgreSQL の Microsoft Entra 管理者ユーザーはロール azure_ad_admin を担います。 作成できる Microsoft Entra 管理者は、PostgreSQL サーバーあたり 1 人だけです。別の管理者を選択すると、そのサーバーに構成されている既存の Microsoft Entra 管理者が上書きされます。 個々のユーザーではなく、Microsoft Entra グループを指定して、複数の管理者を持つことができます。

作成できる Microsoft Entra 管理者は、PostgreSQL サーバーあたり 1 人だけです。別の管理者を選択すると、そのサーバーに構成されている既存の Microsoft Entra 管理者が上書きされます。 個々のユーザーではなく、Microsoft Entra グループを指定して、複数の管理者を持つことができます。 その後、管理目的には、グループ名を使用してサインインすることに注意してください。

Microsoft Entra ID を使用して Azure Database for PostgreSQL に接続する

次の概要図は、Azure Database for PostgreSQL で Microsoft Entra 認証を使用するワークフローをまとめたものです。

認証フロー

Microsoft Entra 統合は、psql などの一般的な PostgreSQL ツールと連携するように設計されています。これらのツールは Microsoft Entra 対応ではなく、PostgreSQL に接続するときにユーザー名とパスワードを指定することのみをサポートしています。 上の図に示されているように、Microsoft Entra トークンをパスワードとして渡します。

現在、次のクライアントがテストされています。

  • psql commandline (PGPASSWORD 変数を使用してトークンを渡す。詳細については、手順 3 を参照)
  • Azure Data Studio (PostgreSQL 拡張機能を使用)
  • その他の libpq ベースのクライアント (例: 一般的なアプリケーション フレームワークと ORM)
  • PgAdmin (サーバーの作成時に [今すぐ接続] をオフにする。詳細は手順 4 を参照)

ユーザー/アプリケーションで Microsoft Entra ID を使用して認証を行う必要がある手順を次に示します。

前提条件

Azure Cloud Shell、Azure VM、またはお使いのローカル コンピューター上で、次の手順を実行できます。 Azure CLI がインストールされていることを確認します。

単一ユーザーとして Microsoft Entra ID を使った認証

手順 1: ユーザーの Azure サブスクリプションにログインする

最初に、Azure CLI ツールを使用して Microsoft Entra ID による認証を行います。 この手順は、Azure Cloud Shell では必要ありません。

az login

このコマンドを実行すると、ブラウザー ウィンドウが開き、Microsoft Entra 認証ページが表示されます。 Microsoft Entra のユーザー ID とパスワードを入力するように求められます。

手順 2: Microsoft Entra アクセス トークンを取得する

Azure CLI ツールを起動して、手順 1 で認証された Microsoft Entra ユーザーのアクセス トークンを取得し、Azure Database for PostgreSQL にアクセスします。

例 (パブリック クラウドの場合):

az account get-access-token --resource https://ossrdbms-aad.database.windows.net

上記のリソース値は、示されているとおりに正確に指定する必要があります。 他のクラウドの場合、リソース値は次を使用して検索できます。

az cloud show

Azure CLI バージョン 2.0.71 以降では、すべてのクラウドに対して、次のより便利なバージョンでコマンドを指定できます。

az account get-access-token --resource-type oss-rdbms

認証が成功すると、Microsoft Entra ID は次のアクセス トークンを返します。

{
  "accessToken": "TOKEN",
  "expiresOn": "...",
  "subscription": "...",
  "tenant": "...",
  "tokenType": "Bearer"
}

トークンは、認証されたユーザーに関するすべての情報をエンコードする Base 64 文字列であり、Azure Database for PostgreSQL サービスをターゲットとしています。

手順 3: クライアント psql でログインするためのパスワードとしてトークンを使用する

接続時には、PostgreSQL ユーザー パスワードとしてアクセス トークンを使用する必要があります。

psql コマンド ライン クライアントを使用する場合は、PGPASSWORD 環境変数を介してアクセス トークンを渡す必要があります。これは、アクセス トークンが、psql が直接受け入れることができるパスワードの長さを超えているためです。

Windows の例:

set PGPASSWORD=<copy/pasted TOKEN value from step 2>
$env:PGPASSWORD='<copy/pasted TOKEN value from step 2>'

Linux/macOS の例:

export PGPASSWORD=<copy/pasted TOKEN value from step 2>

これで、通常行っているように、Azure Database for PostgreSQL との接続を開始できるようになりました。

psql "host=mydb.postgres... user=user@tenant.onmicrosoft.com@mydb dbname=postgres sslmode=require"

手順 4: PgAdmin でログインするためのパスワードとしてトークンを使用する

pgAdmin で Microsoft Entra トークンを使用して接続するには、次の手順に従う必要があります。

  1. サーバーの作成時に [今すぐ接続] オプションをオフにします。
  2. [接続] タブにサーバーの詳細を入力し、保存します。
  3. ブラウザー メニューの [Azure Database for PostgreSQL サーバーに接続する] を選択します
  4. メッセージが表示されたら、AD トークンのパスワードを入力します。

接続時の重要な考慮事項:

  • user@tenant.onmicrosoft.com は、Microsoft Entra ユーザーの名前です
  • Azure ユーザーの名前は正確なスペルで入力してください。Microsoft Entra のユーザー名とグループ名は大文字と小文字が区別されます。
  • 名前にスペースが含まれている場合は、各スペースの前に \ を使用してエスケープします。
  • アクセス トークンの有効性は、5 分から 60 分の範囲内です。 アクセス トークンは、Azure Database for PostgreSQL へのログインを開始する直前に取得することをお勧めします。

これで、Microsoft Entra 認証を使用して Azure Database for PostgreSQL サーバーに対して認証されました。

グループ メンバーとして Microsoft Entra ID を使った認証

手順 1: Azure Database for PostgreSQLで Microsoft Entra グループを作成する

Microsoft Entra グループがデータベースにアクセスできるようにするには、ユーザーの場合と同じメカニズムを使用しますが、代わりにグループ名を指定します。

例:

CREATE USER <new_user> IN ROLE azure_ad_user;

ログインするときに、グループのメンバーは自分の個人用アクセス トークンを使用しますが、ユーザー名として指定されたグループ名でサインインします。

手順 2: ユーザーの Azure サブスクリプションにログインする

Azure CLI ツールを使用して Microsoft Entra ID による認証を行います。 この手順は、Azure Cloud Shell では必要ありません。 ユーザーは、Microsoft Entra グループのメンバーである必要があります。

az login

手順 3: Microsoft Entra アクセス トークンを取得する

Azure CLI ツールを起動して、手順 2 で認証された Microsoft Entra ユーザーのアクセス トークンを取得し、Azure Database for PostgreSQL にアクセスします。

例 (パブリック クラウドの場合):

az account get-access-token --resource https://ossrdbms-aad.database.windows.net

上記のリソース値は、示されているとおりに正確に指定する必要があります。 他のクラウドの場合、リソース値は次を使用して検索できます。

az cloud show

Azure CLI バージョン 2.0.71 以降では、すべてのクラウドに対して、次のより便利なバージョンでコマンドを指定できます。

az account get-access-token --resource-type oss-rdbms

認証が成功すると、Microsoft Entra ID は次のアクセス トークンを返します。

{
  "accessToken": "TOKEN",
  "expiresOn": "...",
  "subscription": "...",
  "tenant": "...",
  "tokenType": "Bearer"
}

手順 4: psql または PgAdmin でログインするためのパスワードとしてトークンを使用する (ユーザー接続については、上記の手順を参照)

グループ メンバーとして接続するときの重要な考慮事項:

  • groupname@mydb は、接続に使用しようとしている Microsoft Entra グループの名前です
  • Microsoft Entra ユーザー/グループ名の後には常にサーバー名を付加してください (@mydb) など)
  • Microsoft Entra グループの名前は正確なスペルで入力してください。
  • Microsoft Entra ユーザーおよびグループの名前では、大文字と小文字が区別されます
  • グループとして接続する場合は、グループ メンバーのエイリアスではなく、グループ名のみを使用します (GroupName@mydb など)。
  • 名前にスペースが含まれている場合は、各スペースの前に \ を使用してエスケープします。
  • アクセス トークンの有効性は、5 分から 60 分の範囲内です。 アクセス トークンは、Azure Database for PostgreSQL へのログインを開始する直前に取得することをお勧めします。

これで、Microsoft Entra 認証を使用して PostgreSQL サーバーに対して認証されました。

Azure Database for PostgreSQL で Microsoft Entra ユーザーを作成する

Azure Database for PostgreSQL データベースに Microsoft Entra ユーザーを追加するには、接続後に次の手順を実行します (接続方法については、後述のセクションを参照してください)。

  1. まず、Microsoft Entra ユーザー <user>@yourtenant.onmicrosoft.com が Microsoft Entra テナントの有効なユーザーであることを確認します。
  2. Microsoft Entra 管理者ユーザーとして Azure Database for PostgreSQL インスタンスにサインインします。
  3. Azure Database for PostgreSQL でロール <user>@yourtenant.onmicrosoft.com を作成します。
  4. <user>@yourtenant.onmicrosoft.com をロール azure_ad_user のメンバーにします。 これは、Microsoft Entra ユーザーのみに指定する必要があります。

例:

CREATE USER "user1@yourtenant.onmicrosoft.com" IN ROLE azure_ad_user;

Note

Microsoft Entra ID を通じてユーザーを認証しても、Azure Database for PostgreSQL データベース内のオブジェクトにアクセスするためのアクセス許可はユーザーに付与されません。 必要なアクセス許可をユーザーに手動で付与する必要があります。

トークンの検証

Azure Database for PostgreSQL での Microsoft Entra 認証により、ユーザーが PostgreSQL サーバーに存在することが保証され、トークンの内容を検証することによってトークンの有効性がチェックされます。 次のトークンの検証手順が実行されます。

  • トークンが Microsoft Entra ID によって署名されていて、改ざんされていないこと
  • トークンがサーバーに関連付けられているテナントの Microsoft Entra ID によって発行されたこと
  • トークンの有効期限が切れていないこと
  • トークンが (別の Azure リソースではなく) Azure Database for PostgreSQL リソース用であること

既存の PostgreSQL ユーザーを Microsoft Entra ID ベースの認証に移行すること

既存のユーザーに対して Microsoft Entra 認証を有効にすることができます。 考慮すべきケースが 2 つあります。

ケース 1: PostgreSQL ユーザー名が Azure AD のユーザー プリンシパル名と一致している

まれなケースで既存のユーザーが Microsoft Entra のユーザー名と既に一致している場合は、そのユーザーに Microsoft Entra 認証を有効にするために azure_ad_user ロールを付与することができます。

GRANT azure_ad_user TO "existinguser@yourtenant.onmicrosoft.com";

これで、以前に構成した PostgreSQL ユーザー パスワードを使用するのではなく、Microsoft Entra の資格情報でサインインできるようになります。

ケース 2: PostgreSQL ユーザー名が Microsoft Entra のユーザー プリンシパル名と異なっている

PostgreSQL ユーザーが Microsoft Entra ID に存在しない場合、または別のユーザー名を持っている場合は、Microsoft Entra グループを使用して、この PostgreSQL ユーザーとして認証することができます。 既存の Azure Database for PostgreSQL ユーザーを Microsoft Entra ID に移行するには、PostgreSQL ユーザーと一致する名前を持つ Microsoft Entra グループを作成し、既存の PostgreSQL ユーザーにロール azure_ad_user を付与します。

GRANT azure_ad_user TO <new_user>;

これは、Microsoft Entra ID に "DBReadUser" というグループが作成されていることを前提としています。 これで、そのグループに属するユーザーが、このユーザーとしてデータベースにサインインできるようになります。

次のステップ