こんにちは。 エンタープライズクラウド部の本田です。
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