AWS IAM Identity Centerを使用したAmazon Redshift ServerlessへのSSO

記事タイトルとURLをコピーする

こんにちは。 エンタープライズクラウド部の本田です。

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と比較して必要なノード数やインスタンスタイプを見積もってクラスターを構成する必要がなく、クエリの実行状況によって自動でリソースをプロビジョニングをしてくれます。

詳細は以下のブログをご参照ください。

blog.serverworks.co.jp

構成図と設定概要

設定概要は以下のようになります。

  • 割り当てたい権限ごとに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]

docs.aws.amazon.com

さいごに

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

【参考AWSブログ】 aws.amazon.com