NOBTAの気ままにITブログ

Azure全般 / SQL Serverに関する情報を発信していきます。

【第9回】基本から始める Azure Database for PostgreSQL 【Azure AD認証による接続方法】


スポンサーリンク

第8回では、Azure Database for PostgreSQL フレキシブル サーバーを日本語ロケール設定に変更する方法に関する内容をまとめてみました。

今回は、Azure Database for PostgreSQL に対して、特定のAzure 仮想マシンからAzure AD認証によって接続する方法について、自分の整理も兼ねて、まとめてみようと思います。

※ Azure Database for PostgreSQL シングル サーバー 11, フレキシブル サーバー バージョン 13.3 を使用して検証

 

 

 

Azure AD 認証による Azure Database for PostgreSQL への接続方法

Active Directory 管理者設定

1) Azure ポータルに接続し、「Azure Database for PostgreSQL」- 特定の Azure Database for PostgreSQL サーバーを選択します。

2) 「設定」-「Active Directory 管理者」を選択します。

f:id:nobtak:20211002213501p:plain

3) 「管理者の設定」- Active Directory 管理者に指定する Azure Active Directory ユーザーを選択後、「保存」を選択します。

f:id:nobtak:20211002213558p:plain

 

f:id:nobtak:20211002213743p:plain

 

f:id:nobtak:20211002214039p:plain

※ Azure Active Directory 管理者に登録された Azure AD ユーザーに、Azure Database for PostgreSQL ”azure_ad_admin” ロールが割り当てられます。

 

ユーザー 割り当て マネージド ID 作成 および Azure仮想マシンへの紐づけ設定

1) Azure ポータルに接続し、「マネージド ID」を選択します。

f:id:nobtak:20211002220531p:plain

2) 「作成」を選択します。

f:id:nobtak:20211002220732p:plain

3) 「Name」欄に 任意のユーザー 割り当て マネージド ID 名 などを入力後、「確認および作成」を選択後、「作成」を選択し、ユーザー 割り当て マネージド ID を作成します。

f:id:nobtak:20211002220945p:plain

4) ユーザー 割り当て マネージド ID 名 を作成後、クライアント ID の値をメモ帳などに控えます。

f:id:nobtak:20211002221946p:plain

5) Azure ポータルから Azure Database for PostgreSQL への接続元Azure仮想マシン -「設定」-「ID」-「ユーザー割り当て済み」-「追加」を選択します。

f:id:nobtak:20211002222155p:plain

6) Azure ポータルから Azure Database for PostgreSQL への接続元Azure仮想マシン -「設定」-「ID」-「ユーザー割り当て済み」-「追加」を選択します。

f:id:nobtak:20211002222925p:plain

※ ユーザー 割り当て マネージド ID に紐づくロール (ユーザー) を Azure Database for PostgreSQL 上に作成することで、該当の ユーザー 割り当て マネージド ID に紐づく Azure 仮想マシン から 認証用アクセストークンの取得が可能となり、Azure AD 認証により、該当の Azure Database for PostgreSQL サーバー上のデータベースに接続することが可能となります。

Azure Database for PostgreSQL 上に ユーザー割り当てマネージドIDに紐づくロール(ユーザー)を作成

[事前準備]

作業を実施する Azure 仮想マシン 上に以下のツールをインストールします。

  • Azure CLI のインストール

  • Azure Database for PostgreSQL 接続ツール "psql" のインストール

 

1) 接続元Azure仮想マシンにログインし、PowerShell を起動します。

 

2)「az login」コマンドを実行し、サインインを実施します。

>az login

※ サインインに指定する ユーザーが複数のアクティブな Azure AD テナントに紐づいている場合、「az login --tenant」コマンドにより、明示的に Azure AD テナント ID を指定してサインインを実施します。

 

3)「az account get-access-token」コマンドを実行し、Azure AD アクセス トークンを取得後、環境変数「PGPASSWORD」に挿入します。

※ psql ツールで Azure Database for PostgreSQL へ接続する際に使用します。

$env:PGPASSWORD=$(az account get-access-token --resource=https://ossrdbms-aad.database.windows.net --query accessToken --output tsv)

 

4) psql ツール から Azure AD アクセス トークンを使用し、Azure Database for PostgreSQL へ接続します。

# シングル サーバーの場合

.\psql.exe "host=<Azure DB for PostgreSQL サーバー名>.postgres.database.azure.com port=5432 dbname=postgres user=<Azure AD 管理者ユーザー>@<Azure DB for PostgreSQL サーバー名> sslmode=require"

# フレキシブル サーバーの場合

.\psql.exe "host=<Azure DB for PostgreSQL サーバー名>.postgres.database.azure.com port=5432 dbname=postgres user=<Azure AD 管理者ユーザー> sslmode=require"

 

[コマンド実行例] (シングル サーバー)

.\psql.exe "host=azpostgre.postgres.database.azure.com port=5432 dbname=postgres user=user1@azdomain.com@azpostgre sslmode=require"

[コマンド実行例] (フレキシブル サーバー)

.\psql.exe "host=azpostgre.postgres.database.azure.com port=5432 dbname=postgres user=user1@azdomain.com sslmode=require"

 

psql ツールの詳細なオプションについては、以下の URL を参照。

 

5) psql ツール から Azure Database for PostgreSQL への接続が正常に完了したことを確認します。

f:id:nobtak:20211004010254p:plain


6) 以下のコマンドを実行し、Azure Database for PostgreSQL 上に ユーザー割り当てマネージドIDに紐づくロール(ユーザー)を作成します。

SET aad_validate_oids_in_tenant = off;
CREATE ROLE aaduser WITH LOGIN PASSWORD '<ユーザー 割り当て マネージド ID の クライアント ID>' IN ROLE azure_ad_user;

 

[コマンド実行例]

f:id:nobtak:20211004011349p:plain

 

参考情報

 

[補足]

ユーザー割り当てマネージドIDに紐づくロール(ユーザー)に対して管理者権限を付与したい場合、以下のコマンドを実行します。

GRANT azure_pg_admin TO <ロール(ユーザー)名>;

 

[コマンド実行例]

f:id:nobtak:20211016151912p:plain

 

ユーザー割り当てマネージドIDに紐づくロール(ユーザー)からAzure Database for PostgreSQL への接続 (PowerShell)

[事前準備]

作業を実施する Azure 仮想マシン上に以下のツールをインストールします。

  • jq ツールのインストール

 

1) 接続元Azure仮想マシンにログインし、PowerShell を起動します。

2) 以下のコマンドを実行し、Azure AD アクセス トークンを取得後、環境変数「PGPASSWORD」に挿入します。

 

$env:PGPASSWORD=curl.exe -s "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://ossrdbms-aad.database.windows.net&client_id=<クライアントID>" -H Metadata:true | jq-win64 -r .access_token

 

上記のコマンドでは、Instance Metadata Service 用の Azure リソース エンドポイント 「h t t p://169.254.169.254/metadata/identity/oauth2/token」経由で、Azure AD アクセス トークンを取得しています。

Instance Metadata Service 用の Azure リソース エンドポイントは、Azure 仮想マシンからのみアクセス可能なエンドポイントであり、Azure 仮想マシン から インターネット網へのアクセスを拒否していたとしても、Azure AD アクセス トークンを取得することが可能になります。

<クライアントID> には、「ユーザー 割り当て マネージド ID 作成 および Azure仮想マシンへの紐づけ設定」 4) の手順でメモ帳に控えた ユーザー 割り当て マネージド ID の クライアント ID を指定します。

 

3) psql ツール から 2) で取得した Azure AD アクセス トークンを使用し、Azure Database for PostgreSQL へ ユーザー割り当てマネージドIDに紐づくロール(ユーザー) を使用して接続します。

# シングル サーバーの場合

.\psql.exe "host=<Azure DB for PostgreSQL サーバー名>.postgres.database.azure.com port=5432 dbname=postgres user=<ユーザー割り当てマネージドIDに紐づくロール(ユーザー)>@<Azure DB for PostgreSQL サーバー名> sslmode=require"

# フレキシブル サーバーの場合

.\psql.exe "host=<Azure DB for PostgreSQL サーバー名>.postgres.database.azure.com port=5432 dbname=postgres user=<ユーザー割り当てマネージドIDに紐づくロール(ユーザー)> sslmode=require"

 

[コマンド例]

f:id:nobtak:20211016154337p:plain

※ psql ツールで パスワードを指定せず、取得した Azure AD アクセス トークンにより、Azure Database for PostgreSQL へのログインが完了していることが確認できます。

 

参考情報

 

まとめ

今回は、Azure Database for PostgreSQL に対して、特定のAzure 仮想マシンからAzure AD認証によって接続する方法について、自分の整理も兼ねて、まとめてみました。

Azure AD 認証を使用することで、スクリプト上にパスワードを記載する必要がなくなり、また、特定の環境からのみ Azure Database for PostgreSQL へ接続が可能となるため、セキュリティを高めることができます。

今回は、スクリプトから psql ツールを起動し、Azure AD 認証でAzure Database for PostgreSQLに接続しましたが、同様な方法で アプリケーション上から Azure AD アクセス トークンを取得し、Azure AD 認証でAzure Database for PostgreSQLに接続することも可能です。

なお、アプリケーション上から Azure AD アクセス トークンを取得する場合、アクセス トークンには有効期限 (既定では 60分) が存在するため、アクセス トークンをメモリ上に保持して再利用する場合は注意してもらえればと思います。

 

【第10回】基本から始める Azure Database for PostgreSQL 【シングル サーバー、フレキシブル サーバー比較】 へ

 

 

※ 2022年7月現在