こんにちは。 エンタープライズクラウド部の本田です。
AWS IAM Identity Centerを使用してAmazon Redshift Serverlessへシングルサインオンする設定を検証しましたのでご紹介します。
はじめに
はじめに、サービスについて簡単に記載いたします。
AWS IAM Identity Center
旧サービス名は「AWS SSO」であり、当サービスを用いることでAWSアカウントやアプリケーションへのシングルサインオンを提供し、アクセスの一元管理を行うことができます。 また、IDデータソースは AWS IAM Identity Center自身のほか、Microsoft ADや、外部IdPを使用してAzure ADやOktaとも連携することができます。
Amazon Redshift Serverless
その名のとおり、 Amazon Redshiftのサーバーレスサービスとなります。 Amazon Redshiftと比較して必要なノード数やインスタンスタイプを見積もってクラスターを構成する必要がなく、クエリの実行状況によって自動でリソースをプロビジョニングをしてくれます。
詳細は以下のブログをご参照ください。
構成図と設定概要

設定概要は以下のようになります。
- 割り当てたい権限ごとにAWS IAM Identity Centerのグループを作成しユーザーを所属させる
- 作成したグループごとにIAM Identity Centerカスタムアプリケーションを作成する
- Redshiftへのアクセス権限を持つIAM RoleおよびIAM Policyを作成する
- カスタムアプリケーションとRedshiftアカウントのIAM RoleをSAML連携する
- Redshiftでグループを作成し必要なスキーマ権限を付与する
設定手順
前提条件として、IAM Identity Centerで割り当てたい権限ごとにグループの作成とユーザーの追加が完了していることとします。

1.IAM Identity Centeカスタムアプリケーションを作成する
IAM Identity Centerにてカスタムアプリケーションを追加します。

表示名と説明文を必要に応じて編集し、SAMLメタデータをダウンロードしておきます。

アプリケーションメタデータに以下の値を入力し、カスタムアプリケーションを作成します。
| 項目 | 値 |
|---|---|
| Application ACS URL | http://localhost:7890/redshift/ |
| Application SAML audience | urn:amazon:webservices:redshift |

作成したカスタムアプリケーションにグループをアサインします。
今回は「analysts_group」をアサインしました。

2.IDプロバイダを設定する
Redshift Serverless側のアカウントに移動し、IAMコンソールからIDプロバイダを設定します。
メタデータドキュメントは1でダウンロードしたSAMLメタデータをアップロードします。

後の属性マッピング設定で使用するため、作成したIDプロバイダのARNをコピーして控えておきます。

3.IAM Policyを作成する
引き続きRedshift Serverless側のアカウントにて、Redshift ServerlessにアクセスするためのIAM Policyが必要となるため、ポリシーの作成を行います。
ポリシーは以下の内容で作成を行いますが、ご利用の際には「WorkgroupName」に権限を付与したいRedshift Serverlessの「Workgroup名」を振り替えてご利用ください。
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"redshift:GetClusterCredentials",
"redshift:CreateClusterUser"
],
"Resource": [
"arn:aws:redshift:<AWSRegion>:<AccountID>:cluster:redshift-serverless-<WorkgroupName>",
"arn:aws:redshift:<AWSRegion>:<AccountID>:dbname:redshift-serverless-<WorkgroupName>/dev",
"arn:aws:redshift:<AWSRegion>:<AccountID>:dbuser:redshift-serverless-<WorkgroupName>/*"
],
"Effect": "Allow"
},
{
"Action": [
"redshift:JoinGroup"
],
"Resource": [
"arn:aws:redshift:<AWSRegion>:<AccountID>:dbgroup:redshift-serverless-<WorkgroupName>/*"
],
"Effect": "Allow"
},
{
"Action": [
"redshift:DescribeClusters",
"iam:ListRoles"
],
"Resource": "*",
"Effect": "Allow"
}
]
}
4.IAM Roleを作成する
引き続きRedshift Serverless側のアカウントにて、Redshift ServerlessにアクセスするためのIAM Roleを作成します。
信頼されたエンティティタイプはSAML 2.0 フェデレーションを選択します。

SAML 2.0 ベースのプロバイダーに2で設定したIDプロバイダを指定し、以下の値を入力します。
| 属性 | 値 |
|---|---|
| SAML:aud | http://localhost:7890/redshift/ |

3で作成したポリシーをアタッチします。

任意のロール名を入力し作成します。

後の属性マッピング設定で使用するため、作成したIAM RoleのARNをコピーして控えておきます。

5.Amazon Redshift Serverlessをセットアップする
Redshiftでグループを作成し、グループに対し必要なスキーマ権限を付与します。
次のコマンドではAnalystsユーザー用のグループ「analysts_group」とスキーマ「analysts_schema」を作成し、「analysts_group」に「analysts_schema」へ権限を付与しています。
ここで作成するグループ名「analysts_group」は後の属性マッピング設定で使用します。
CREATE GROUP analysts_group; CREATE SCHEMA IF NOT EXISTS analysts_schema; GRANT USAGE ON SCHEMA analysts_schema TO GROUP analysts_group; ALTER DEFAULT PRIVILEGES IN SCHEMA analysts_schema GRANT SELECT ON TABLES TO GROUP analysts_group; GRANT SELECT ON ALL TABLES IN SCHEMA analysts_schema TO GROUP analysts_group;
今回はRedshiftのクエリエディタからAdministratorユーザーでログインし設定しました。

6.IAM Identity Centerカスタムアプリケーションに属性マッピングを設定する
IAM Identity Center側のアカウントに移動し、1で作成したカスタムアプリケーションに属性マッピングを設定します。

以下の値を入力して保存します。
| User attribute in the application | Maps to this string value or user attribute in IAM Identity Center | 備考 |
|---|---|---|
| Subject | ${user:email} | |
| https://aws.amazon.com/SAML/Attributes/Role | arn:aws:iam::[Account ID]:role/[IAM RoleName],arn:aws:iam::[Account ID]:saml-provider/[SAML ProviderName] | IAM RoleとSAML IdPのARN |
| https://aws.amazon.com/SAML/Attributes/RoleSessionName | ${user:email} | |
| https://redshift.amazon.com/SAML/Attributes/AutoCreate | True | |
| https://redshift.amazon.com/SAML/Attributes/DbGroups | [RedshiftDbGroupName] | マッピングしたいRedshiftのグループ |
| https://redshift.amazon.com/SAML/Attributes/DbUser | ${user:email} |

7.カスタムアプリケーションのログインURLを取得する
Amazon Redshift Serverlessに接続する際に必要になるため、カスタムアプリケーションのログインURLを取得して控えておきます。
IAM Identity CenterからAWS アクセスポータルの URLにアクセスし、ユーザー ポータルのログイン ページを起動します。

作成したカスタムアプリケーションにアサインしたグループのユーザーでログインします。
ログインすると、カスタムアプリケーションが表示されますので、右クリックしリンク アドレスをコピーして控えておきます。

8.Amazon Redshift Serverlessに接続する
IAM Identity Centerのユーザー情報で Amazon Redshift Serverlessに接続します。
今回はSQL Workbench/J クライアントから接続します。
※クライアントにRedshiftDiverがインストールされていない場合は事前にクライアントにインストールしておく必要があります。
docs.aws.amazon.com
以下の値を入力し「OK」をクリックします。
| 項目 | 値 |
|---|---|
| Driver | [RedshiftDiver]| |
| URL | jdbc:redshift:iam://redshift-serverless-[WorkgroupName]:[Region]/[DatebaseName] |
| login_url | [7でコピーしたカスタムアプリケーションのURL] |
| plugin_name | com.amazon.redshift.plugin.BrowserSamlCredentialsProvider |
| idp_response_timeout | 120 ※任意のタイムアウト時間 |

ブラウザで認証画面が開きますので、IAM Identity Centerのユーザー名とパスワードを入力します。

認証が成功するとブラウザで以下の画面が表示されます。
こちらでRedshift Serverlessへの接続完了です。

※認証時にSQL Workbench/J側でパスワードの入力が求められる場合は、こちらは認証には関係ないようなので任意の文字列を入力し「OK」をクリックします。

9.動作確認
コマンドを実行してユーザーを確認してみます。
IAM Identity Centerのユーザーでログインできていることを確認できました。

グループも確認してみます。
グループ情報がマッピングされ、「analysts_group」でログインできていることを確認できました。

注意点
Redshift Serverless 接続時に利用するURL
Redshift Serverless 接続時に利用するエンドポイントURLは次のように設定する必要があります。
【正】
jdbc:redshift:iam://redshift-serverless-[WorkgroupName]:[Region]/[DatebaseName]
Redshift Serverlessのコンソール画面で確認できる以下のエンドポイントURLとは異なるためご注意ください。
こちらのエンドポイントURLでも接続自体は可能なのですが、SAMLの属性マッピング設定で使用しているdbUser、dbGroup および auto-create のカスタマイズがサポートされていないため、グループの情報までマッピングされません。
【誤】
jdbc:redshift:iam://[WorkgroupName].[AccountID].[Region].redshift-serverless.amazonaws.com:5439/[DatebaseName]

さいごに
ユーザーも自動でプロビジョニングしてくれて、Redshift側で個別にユーザーを管理する必要がなくなため、運用上のメリットを感じました。
最初にRedshift側でグループとスキーマの権限を紐づけておけば、運用の中ではIAM Identity Center側(環境によってはAzureADなど)でグループへのユーザー追加削除の管理だけで済みます。
ただ、Redshift側のユーザー削除までは同期されないため、一度プロビジョニング後、必要ないユーザーが発生した場合はRedshift側で個別に削除してあげる必要がありそうです。
【参考AWSブログ】 aws.amazon.com