Amazon Quick SightとOktaをSAMLフェデレーションで連携してみた
データ事業本部のueharaです。
今回は、Amazon Quick SightとOktaをSAMLフェデレーションで連携してみたいと思います。
はじめに
Amazon QuickのコアコンポーネントであるAmazon Quick Sightは(組織インスタンス/アカウントインスタンス共に)IAM Identity Centerと統合されているため、基本的に外部IdP連携をしたい場合は IAM Identity Center の利用が推奨されます。(参考)
※IAM Identity Centerを利用するとSCIM連携をネイティブサポートしているためユーザーの同期設定が容易で、その点でも優位性があります。(ただし、OktaでSCIM連携をしたい場合は契約プランに Lifecycle Management の利用が含まれている必要があります)
一方、従来までの SAMLフェデレーション(IAM経由) についても引き続き利用は可能です。
既存のQuick Sightのサブスクリプションを維持しつつOktaを利用したSSOを実現したい場合や、何らかの理由でIAM Identity Centerの利用を採用できない場合にはそちらが選択肢になるかと思います。
※途中でQuick Sightの認証方法を別の方式からIAM Identity Center方式に変更することはできないので、既存のQuick Sightのサブスクリプションの解除&再登録が必要になります。
今回は、必要なAWSリソースを定義したCloudFormationテンプレートを用意し、SAMLフェデレーション(IAM経由)を比較的簡単に設定する方法をご紹介します。
やってみた
(Okta)アプリケーションの追加
まず、OktaのOIN(Okta Integration Network)からインテグレーションを追加するため、『アプリケーション』から『アプリカタログを参照』を選択します。

検索バーに『aws』と入力し、『AWSアカウントフェデレーション』を選択します。

『統合を追加』を選択します。

アプリケーションラベルは『Amazon Quick Sight』とし、『次へ』に進みます。

サインオンオプションでは『SAML 2.0』を選択し、デフォルトのリレー状態は「 https://quicksight.aws.amazon.com 」を設定します。

ここでメールアドレスをQuick Sight側に連携するための、属性情報の設定も行っておきます。
『属性(任意)』を開き、以下を設定します。
- 名前:
https://aws.amazon.com/SAML/Attributes/PrincipalTag:Email - 属性:
URI参照 - 値:
user.email

この設定をしておくことで、Okta経由でQuick Sightに初回ログインする際にメールアドレスが自動で連携され、メールアドレスの入力画面をSkipすることができます。
次に『IDプロバイダーのメタデータ』を右クリックして、リンク先を保存します。(中身はxmlファイルになっており、後で使用するので分かり易いところに保存しておいて下さい)

最後に『完了』ボタンを押すと、アプリが追加されます。

(AWS)リソース作成
次に、AWS側のリソースを作成します。
以下のCloudFormationテンプレート QuickSight_Okta_Federation.yaml を用意します。
QuickSight_Okta_Federation.yaml
AWSTemplateFormatVersion: '2010-09-09'
Description: >
CloudFormation template to create IAM resources (SAML provider, policies, roles, and IAM user)
required for SAML federation between Amazon QuickSight and Okta.
# ============================================================
# Parameters
# ============================================================
Parameters:
OktaSAMLMetadataDocument:
Type: String
Description: >
Paste the contents of the SAML metadata XML file downloaded when creating the Okta application.
NoEcho: false
# ============================================================
# Resources
# ============================================================
Resources:
# ----------------------------------------------------------
# SAML Identity Provider (Okta)
# ----------------------------------------------------------
OktaSAMLProvider:
Type: AWS::IAM::SAMLProvider
Properties:
Name: Okta
SamlMetadataDocument: !Ref OktaSAMLMetadataDocument
# ----------------------------------------------------------
# IAM Managed Policies
# ----------------------------------------------------------
QuickSightOktaCreateAdminPolicy:
Type: AWS::IAM::ManagedPolicy
Properties:
ManagedPolicyName: QuickSightOktaCreateAdminPolicy
Description: Allows federated Okta users to be provisioned as QuickSight Admin users
PolicyDocument:
Version: '2012-10-17'
Statement:
- Sid: VisualEditor0
Effect: Allow
Action: quicksight:CreateAdmin
Resource: '*'
QuickSightOktaCreateAuthorPolicy:
Type: AWS::IAM::ManagedPolicy
Properties:
ManagedPolicyName: QuickSightOktaCreateAuthorPolicy
Description: Allows federated Okta users to be provisioned as QuickSight Author users
PolicyDocument:
Version: '2012-10-17'
Statement:
- Sid: VisualEditor0
Effect: Allow
Action: quicksight:CreateUser
Resource: '*'
QuickSightOktaCreateReaderPolicy:
Type: AWS::IAM::ManagedPolicy
Properties:
ManagedPolicyName: QuickSightOktaCreateReaderPolicy
Description: Allows federated Okta users to be provisioned as QuickSight Reader users
PolicyDocument:
Version: '2012-10-17'
Statement:
- Sid: VisualEditor0
Effect: Allow
Action: quicksight:CreateReader
Resource: '*'
# ----------------------------------------------------------
# IAM resources for Okta API integration
# Required for Okta to retrieve the list of IAM roles from AWS.
# Ref: https://docs.aws.amazon.com/quicksight/latest/user/tutorial-okta-quicksight.html
# ----------------------------------------------------------
OktaListRolesPolicy:
Type: AWS::IAM::ManagedPolicy
Properties:
ManagedPolicyName: OktaListRolesPolicy
Description: 'Allows Okta to list IAM roles and account aliases. Used when configuring API integration on the Provisioning tab of the Okta app.'
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action:
- iam:ListRoles
- iam:ListAccountAliases
Resource: '*'
OktaSSOUser:
Type: AWS::IAM::User
Properties:
UserName: OktaSSOUser
ManagedPolicyArns:
- !Ref OktaListRolesPolicy
# ----------------------------------------------------------
# IAM Roles (SAML 2.0 Federation)
# ----------------------------------------------------------
QuickSightOktaAdminRole:
Type: AWS::IAM::Role
Properties:
RoleName: QuickSightOktaAdminRole
Description: IAM role for Okta-federated QuickSight Admin users
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Federated: !Ref OktaSAMLProvider
Action: sts:AssumeRoleWithSAML
Condition:
StringEquals:
SAML:aud: 'https://signin.aws.amazon.com/saml'
- Effect: Allow
Principal:
Federated: !Ref OktaSAMLProvider
Action: sts:TagSession
Condition:
StringLike:
aws:RequestTag/Email: '*'
ManagedPolicyArns:
- !Ref QuickSightOktaCreateAdminPolicy
QuickSightOktaAuthorRole:
Type: AWS::IAM::Role
Properties:
RoleName: QuickSightOktaAuthorRole
Description: IAM role for Okta-federated QuickSight Author users
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Federated: !Ref OktaSAMLProvider
Action: sts:AssumeRoleWithSAML
Condition:
StringEquals:
SAML:aud: 'https://signin.aws.amazon.com/saml'
- Effect: Allow
Principal:
Federated: !Ref OktaSAMLProvider
Action: sts:TagSession
Condition:
StringLike:
aws:RequestTag/Email: '*'
ManagedPolicyArns:
- !Ref QuickSightOktaCreateAuthorPolicy
QuickSightOktaReaderRole:
Type: AWS::IAM::Role
Properties:
RoleName: QuickSightOktaReaderRole
Description: IAM role for Okta-federated QuickSight Reader users
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Federated: !Ref OktaSAMLProvider
Action: sts:AssumeRoleWithSAML
Condition:
StringEquals:
SAML:aud: 'https://signin.aws.amazon.com/saml'
- Effect: Allow
Principal:
Federated: !Ref OktaSAMLProvider
Action: sts:TagSession
Condition:
StringLike:
aws:RequestTag/Email: '*'
ManagedPolicyArns:
- !Ref QuickSightOktaCreateReaderPolicy
# ============================================================
# Outputs
# ============================================================
Outputs:
OktaSAMLProviderArn:
Description: 'ARN of the Okta SAML provider. Enter this value in the "Identity Provider ARN" field of the Okta application settings.'
Value: !GetAtt OktaSAMLProvider.Arn
Export:
Name: !Sub '${AWS::StackName}-OktaSAMLProviderArn'
QuickSightOktaAdminRoleArn:
Description: ARN of the QuickSight Okta Admin role
Value: !GetAtt QuickSightOktaAdminRole.Arn
Export:
Name: !Sub '${AWS::StackName}-AdminRoleArn'
QuickSightOktaAuthorRoleArn:
Description: ARN of the QuickSight Okta Author role
Value: !GetAtt QuickSightOktaAuthorRole.Arn
Export:
Name: !Sub '${AWS::StackName}-AuthorRoleArn'
QuickSightOktaReaderRoleArn:
Description: ARN of the QuickSight Okta Reader role
Value: !GetAtt QuickSightOktaReaderRole.Arn
Export:
Name: !Sub '${AWS::StackName}-ReaderRoleArn'
上記テンプレートで、以下のリソースが作成されます。
Okta(IAM SAMLプロバイダー)- OktaをAWSのSAML 2.0 IDプロバイダーとして登録する
- Quick Sightへのフェデレーションログインの信頼関係の起点となる
QuickSightOktaCreateAdminPolicy(IAMポリシー)- Okta経由でログインしてきたユーザーをQuick Sightの Admin として自動プロビジョニングする権限
QuickSightOktaCreateAuthorPolicy(IAMポリシー)- Okta経由でログインしてきたユーザーをQuick Sightの Author として自動プロビジョニングする権限
QuickSightOktaCreateReaderPolicy(IAMポリシー)- Okta経由でログインしてきたユーザーをQuick Sightの Reader として自動プロビジョニングする権限
OktaListRolesPolicy(IAMポリシー)- Oktaがプロビジョニング設定時に対象のAWSアカウントのIAMロールの一覧・アカウントエイリアスを取得するための権限
OktaSSOUser(IAMユーザー)- OktaのAPI連携に使用する専用ユーザー
- このユーザーのアクセスキーを後にOktaアプリのプロビジョニングタブで設定する
- (※アクセスキーは後の手順で発行する)
QuickSightOktaAdminRole(IAMロール)- Admin権限でQuick SightにアクセスするOktaユーザー向けのロール
- OktaからのSAMLアサーションを信頼し、
QuickSightOktaCreateAdminPolicyがアタッチされている
QuickSightOktaAuthorRole(IAMロール)- Author権限でQuick SightにアクセスするOktaユーザー向けのロール
- OktaからのSAML アサーションを信頼し、
QuickSightOktaCreateAuthorPolicyがアタッチされている
QuickSightOktaReaderRole(IAMロール)- Reader権限でQuick SightにアクセスするOktaユーザー向けのロール
- OktaからのSAMLアサーションを信頼し、
QuickSightOktaCreateReaderPolicyがアタッチされている
テンプレート適用のため、AWSマネジメントコンソールのCloudFormationのサービスページからスタックの作成を行います。

パラメーターとして先ほどOktaアプリの設定時に保存したメタデータ(xmlファイル)の値を入力できるようにしているので、そこにxmlの中身をコピー&ペーストします。

確認画面ではIAM関連リソースの作成を承認して、『次へ』に進みます。

最後の画面で『送信』ボタンを押すとスタックが作成され、以下のようにリソースが作成されるかと思います。

(AWS)アクセスキーの払い出し
先ほどのCloudFormationテンプレートで作成された OktaSSOUser のアクセスキーを払い出します。

説明は適当なものを入力し『アクセスキーを作成』を選択します。

アクセスキーは後ほど利用するので、適切に管理して下さい。

(Okta)アプリケーションの設定
Oktaの画面に戻り、アプリケーションの設定から『サインオン』タブを選択し、『編集』を押します。

「IDプロバイダーのARN(SAML SSOの場合のみ必要)」で先ほどCloudFormationで作成したプロバイダーのARNを指定します。

画面下部に進み『保存』ボタンを押下して完了します。
次に『プロビジョニング』タブに移動して、『API統合を構成』を選択します。

『API統合を有効化』にチェックを入れ、『アクセスキー』と『秘密鍵』にそれぞれ先ほど払い出したアクセスキーIDとシークレットアクセスキーを入力します。

『API資格情報をテスト』で接続検証できたら『保存』ボタンを押下します。

完了したら、『プロビジョニング』タブの『編集』を押して、『ユーザーを作成』の『有効化』にチェックを入れて保存をします。

(Okta)グループの作成と割り当て
Oktaの左側のタブから『ディレクトリ > グループ』と進み、『グループを追加』を選択します。

ここで、以下の3グループ作ります。
- Amazon-QuickSight-Admin
- Amazon-QuickSight-Author
- Amazon-QuickSight-Reader

作成が、完了したら以下のようになるかと思います。

作成したグループに適当にユーザーを割り当てます。
Amazon-QuickSight-Readerグループを選択し、『ユーザーを割り当て』を選択します。

任意のユーザーをグループに追加します。

グループにユーザーが追加されたことを確認します。

今度は作成したグループをアプリケーションに割り当てます。
AWSのアプリケーション設定に戻り、『割り当て』タブから『割り当て』ボタンの『グループに割り当て』を選択します。

まずはAmazon-QuickSight-Adminグループの『割り当て』を選択します。

『SAML User Roles』に QuickSightOktaAdminRole を指定して、『保存して戻る』を選択します。

同様に、Amazon-QuickSight-Authorグループには QuickSightOktaAuthorRole を指定し、Amazon-QuickSight-Readerグループには QuickSightOktaReaderRole を指定して、割り当てを完了します。

無事設定ができれば以下のようになっているかと思います。

(Okta)Quick Sightへのログイン確認
準備ができたら、先程Amazon-QuickSight-Readerグループに割り当てたユーザーでOktaのダッシュボードにログインします。
すると、以下のように『マイアプリ』にAmazon Quick Sightが追加されているのが分かります。

アプリに進むと、自動でプロビジョニングが進み、Amazon Quickの画面が表示されることを確認しました。

念のためAmazon Quickの管理コンソールも確認してみると、Readerロールでユーザーが作成されていることが分かります。

補足
補足として、ここまでで作成したOktaのグループやIAMロールの関係を図で簡単に示すと、以下のようになります。

つまり流れとしては下記の通りです。
Oktaユーザー
↓ SAML アサーション
AWS STS(AssumeRoleWithSAML)
↓ 一時認証情報(quicksight:CreateReader等の権限を持つ)
Quick Sightサービス
↓ 初回アクセス時、一時認証情報の権限を使ってユーザーを自動登録
Quick Sightユーザーとして登録完了
2回目以降のログインでは、ユーザーが既に存在するため作成はスキップされ、認証のみ行われます。
ちなみに、ユーザーがOktaグループを移動した場合(例:Reader → Author)の動作は以下のようになります。
| タイミング | 動作 |
|---|---|
| Readerグループ在籍時(初回ログイン) | QuickSightOktaReaderRole/user@example.com として作成 |
| Authorグループに移動後(移動後初回ログイン) | QuickSightOktaAuthorRole/user@example.com として新規作成 |
SCIM連携ではないので、グループ移動前に作成されたReaderユーザーはQuick Sight上に残ったままになります。(ゴーストユーザーとして、ライセンスが消費され続けて恐れがあります)
これはOkta側でユーザーが削除された場合でも同じで、Okta側のユーザーが削除されたからといってQuick Sight上のユーザーも自動で削除されるわけではありません。
この辺りは手動(ないしスクリプト化&定期実行)で対応する必要があり、運用負荷を踏まえると、やはりユーザーの削除にも追従できるIAM Identity Centerを利用したSCIM連携に優位性があると感じます。
最後に
今回は、Amazon Quick SightとOktaをSAMLフェデレーションで連携してみました。
参考になりましたら幸いです。






