「AppStream 2.0」でSAML 2.0を使ったIDフェデレーションを設定する (Google Cloud Identity編)

企業などでユーザー管理に「Google Cloud Identity」を利用しているのであれば、シングルサインオンでAWS AppStream 2.0を利用できるんです。
2021.07.27

みなさん、こんにちは!
福岡オフィスの青柳です。

Amazon AppStream 2.0では、アプリケーション利用者のユーザー認証方式として以下を用意しています。

  • AppStream 2.0ユーザープール (AppStream 2.0内に閉じたユーザー管理)
  • SAML 2.0を使った外部IDプロバイダーへのフェデレーション (いわゆるシングルサインオン(SSO))

今回は、後者のうち、Googleが提供するIDプロバイダーである「Google Cloud Identity」とのIDフェデレーションを試してみました。

~~~

なお、「Azure Active Directory (Azure AD)」を使ったAppStream 2.0のIDフェデレーションについてもブログ記事にしていますので、併せてご覧ください。

また、Oktaを使う方法のブログ記事もありますので、Oktaを利用される方はこちらを参照してください。

参考にした情報

AppStream 2.0におけるSAML 2.0を使ったIDフェデレーションの汎用的な手順については、AWSドキュメントの下記ページを参照しました。

また、Google Cloud Identityに関する設定手順については、AWSブログを参考にしました。

AWSブログの内容は一部画面などが古い箇所があるため、最新 (2021年7月現在) の手順は本ブログ記事を参考にしてください。

事前準備

IDフェデレーションの設定に入る前に、事前に以下の準備をしておきます。

  • AppStream 2.0でアプリケーションが利用できる状態にする
  • Google Cloud Identityが利用できる状態にする
  • Google Cloud Identityでユーザーを作成する

AppStream 2.0でアプリケーションが利用できる状態にする

Amazon AppStream 2.0: 入門ガイド に従って、AppStream 2.0でアプリケーションが利用できるように設定します。

下記のブログ記事に手順の解説や補足事項がありますので、併せて参照するとよいと思います。

Google Cloud Identityが利用できる状態にする

Google Cloud Identityは、無償版の「Free Edition」、有償版の「Premium Edition」のいずれであっても、SAML 2.0によるIDフェデレーション機能が利用できます。 また、Google Workspace (旧称:G Suite) でも同様にIDフェデレーションが利用できます。

Google Cloud Identity Free Editionを利用開始する手順は下記ブログ記事を参考にしてください。

Google Cloud Identityでユーザーを作成する

具体的な手順は省略しますが、Google Cloud Identityの管理コンソールから「ディレクトリ」→「ユーザー」→「新しいユーザーの追加」でユーザーを作成しておきます。

やってみた

以下の流れで設定して行きます。

  1. [Google Cloud Identity] カスタムSAMLアプリケーションを作成する
  2. [AWS] IAMコンソールでIDプロバイダの設定を行う
  3. [AWS] IDフェデレーション用のIAMロールを作成する
  4. [Google Cloud Identity] ユーザープロフィール定義にカスタム属性を追加する
  5. [Google Cloud Identity] SAMLアプリケーションにSAML属性マッピングを設定する
  6. [Google Cloud Identity] 対象ユーザーにカスタム属性を設定する
  7. [Google Cloud Identity] SAMLアプリケーションをユーザーに割り当てる
  8. 対象ユーザーでGoogleにログインして、AppStream 2.0アプリケーションを利用する

ステップ1: [Google Cloud Identity] カスタムSAMLアプリケーションを作成する

Google Cloud Identityの管理コンソールで、サイドメニューから「アプリ」→「ウェブアプリとモバイルアプリ」を開きます。

上部のメニューから「アプリを追加」→「カスタムSAMLアプリの追加」の順に選択します。

「1 アプリの詳細」画面で情報を入力します。

項目 設定値
アプリ名 SAML for AWS AppStream
アプリのアイコン 任意の画像を指定 (本手順では省略します)

「2 Google IDプロバイダの詳細」画面で「メタデータをダウンロード」ボタンをクリックします。

ファイル「GoogleIDPMetadata.xml」をローカルディスクに保存します。

「3 サービスプロバイダの詳細」画面で情報を入力します。

項目 設定値
ACSのURL https://signin.aws.amazon.com/saml
エンティティID urn:amazon:webservices
開始URL AppStream 2.0スタックの「リレーステートURL」を入力 (欄外参照)
署名付き応答 チェックしない
名前IDの形式 「PERSISTENT」を選択
名前ID 「Basic Information > Primary email」を選択

「リレーステートURL」は以下のように指定します。
<リレーステートエンドポイント>?stack=<スタック名>&accountId=<AWSアカウントID>

「リレーステートエンドポイント」はリージョン毎に用意されています。 該当するリージョンのリレーステートエンドポイントは下記リンク先で確認してください。
SAML のセットアップ - フェデレーションのリレーステートを設定する

例えば、AppStream 2.0のリージョンが「東京」、スタック名が「DemoStack」、AWSアカウントIDが「123456789012」である場合、リレーステートURLは以下のようになります。
https://appstream2.ap-northeast-1.aws.amazon.com/saml?stack=DemoStack&accountId=123456789012

「4 属性のマッピング」はここでは設定しません。 「完了」をクリックします。

SAMLアプリケーションが作成されたことを確認します。

ステップ2: [AWS] IAMコンソールでIDプロバイダの設定を行う

AWSマネジメントコンソールで、「IAM」→「IDプロバイダ」を開き、「プロバイダの追加」をクリックします。

以下の通り情報を入力します。

項目 設定値
プロバイダのタイプ 「SAML」を選択
プロバイダ名 GoogleCloud-IdP

入力後、「メタデータドキュメント」の「ファイルを選択」をクリックして、ステップ1でダウンロードしたGoogle Cloud Identityのメタデータファイル (GoogleIDPMetadata.xml) を指定します。

ファイルのアップロードに成功し、以下のように緑色のチェックマークが表示されることを確認します。

確認後、「プロバイダを追加」をクリックします。

IDプロバイダが追加されたことを確認します。

ステップ3: [AWS] IDフェデレーション用のIAMロールを作成する

AWSマネジメントコンソールで、「IAM」→「ロール」を開き、「ロールを作成」をクリックします。

以下の通り情報を入力します。

項目 設定値
信頼されたエンティティの種類を選択 「SAML 2.0フェデレーション」を選択
SAMLプロバイダー 前ステップで作成したプロバイダ「GoogleCloud-IdP」を選択
アクセスの種類 「プログラムによるアクセスのみを許可する」「プログラムによるアクセスと AWS マネジメントコンソールによるアクセスを許可する」のいずれも選択しないでください
(選択してしまった場合は、一旦キャンセルしてやり直してください)
属性 「SAML:sub_type」を選択
「persistent」と入力
条件 設定しない

アクセス権限ポリシーは何もアタッチせず、次へ進みます。

必要に応じてタグを追加します。

ロール名およびロールの説明 (任意) を入力します。

項目 設定値
ロール名 AppStream_GoogleCloud-IdP
ロールの説明 必要に応じて設定

「ロールの作成」をクリックして、ロールの作成を完了します。

作成したロールの「信頼関係」タブを開き、「信頼されたエンティティ」と「条件」が下図の通りに設定されていることを確認します。

「アクセス権限」タブを選択し、「インラインポリシーの追加」をクリックします。

以下のようにポリシードキュメントを入力します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "appstream:Stream",
            "Resource": "arn:aws:appstream:ap-northeast-1:123456789012:stack/DemoStack",
            "Condition": {
                "StringEquals": {
                    "appstream:userId": "${saml:sub}"
                }
            }
        }
    ]
}

「Resource」に記述するAppStream 2.0スタックのARNは、「リージョン」「AWSアカウントID」「スタック名」を適宜指定してください。

ポリシー名を「AppStream」と入力して、インラインポリシーの作成を完了します。

ステップ4: [Google Cloud Identity] ユーザープロフィール定義にカスタム属性を追加する

Google Cloud Identityの管理コンソールで、サイドメニューから「ディレクトリ」→「ユーザー」を開きます。

上部のメニューから「その他」→「カスタム属性を管理します」の順に選択します。

右上の「カスタム属性を追加」をクリックします。

以下の通り情報を入力します。

項目 設定値
カテゴリ SAML-USER-ATTRIBUTES
説明 Attributes that will be sent in the SAML request to AWS

「カスタムフィールド」に以下の通り入力します。

名前 情報の種類 公開設定 値の数
FederationRole テキスト ユーザーと管理者が閲覧可能 単一の値
SessionDuration テキスト ユーザーと管理者が閲覧可能 単一の値

※ 「ユーザーと管理者が閲覧可能」の「ユーザー」は自分自身のことを指しており、「全ユーザーから閲覧可能」という意味ではありません。

入力後、「追加」をクリックして設定を保存します。

ステップ5: [Google Cloud Identity] SAMLアプリケーションにSAML属性マッピングを設定する

Google Cloud Identityの管理コンソールで、サイドメニューから「アプリ」→「ウェブアプリとモバイルアプリ」を開いて、SAMLアプリケーション「SAML for AWS AppStream」を開きます。

「SAML属性のマッピングを設定」をクリックします。

「マッピングを追加」をクリックします。

以下の通り入力します。

Google Directoryの属性 アプリの属性
SAML-USER-ATTRIBUTES > FederationRole https://aws.amazon.com/SAML/Attributes/Role
SAML-USER-ATTRIBUTES > SessionDuration https://aws.amazon.com/SAML/Attributes/SessionDuration
Basic Information > Primary email https://aws.amazon.com/SAML/Attributes/RoleSessionName

入力後、「保存」をクリックして設定を保存します。

ステップ6: [Google Cloud Identity] 対象ユーザーにカスタム属性を設定する

Google Cloud Identityの管理コンソールで、サイドメニューから「ディレクトリ」→「ユーザー」を開きます。

対象ユーザーをクリックします。

右側の「ユーザー情報」を下にスクロールして「SAML-USER-ATTRIBUTES」の右上の鉛筆マークをクリックします。

以下の通り入力します。

名前 情報の種類
FederationRole フェデレーション先の「IdP定義」「ロール」を示す文字列を入力 (欄外参照)
SessionDuration 3600

「IdP定義」「ロール」を示す文字列は、以下のように2種類のARNをカンマで区切って指定します。
<AWS IAM Identity ProviderのARN>,<IAM RoleのARN>

各ARNは、AWSマネジメントコンソールの画面で確認してください。

「AWS IAM Identity Provider」のARN

「IAM Role」のARN

入力例は以下のようになります。
arn:aws:iam::123456789012:saml-provider/GoogleCloud-IdP,arn:aws:iam::123456789012:role/AppStream_GoogleCloud-IdP

入力後、「保存」をクリックして設定を保存します。

ステップ7: [Google Cloud Identity] SAMLアプリケーションをユーザーに割り当てる

Google Cloud Identityの管理コンソールで、サイドメニューから「アプリ」→「ウェブアプリとモバイルアプリ」を開いて、SAMLアプリケーション「SAML for AWS AppStream」を開きます。

「ユーザーアクセス」をクリックします。

SAMLアプリケーションの割り当ては「全ユーザー」「組織単位」で設定が行えますが、ここでは「全ユーザー」に対して設定します。

「サービスのステータス」を「オン (すべてのユーザー)」に設定して「保存」をクリックします。

ステップ8: 対象ユーザーでGoogleにログインして、AppStream 2.0アプリケーションを利用する

これで全ての設定が終わりましたので、実際にGoogle Cloud Identityのユーザーでログインして、AppStream 2.0アプリケーションが利用できることを確認しましょう。

Webブラウザをプライベートモードやゲストモードで起動して、対象のGoogle Cloud Identityユーザーでログインします。

Googleトップページでアプリ一覧を表示すると、「SAML for AWS AppStream」というアイコンが表示されていると思います。

アイコンをクリックすると、SAML 2.0によるIDフェデレーションが行われ、AWS AppStream 2.0のカタログページへ遷移します。

アプリケーションのアイコンをクリックして、Webブラウザ内でAppStream 2.0アプリケーションが利用できることを確認します。

おわりに

SAML 2.0によるIDフェデレーションを利用する際には、IDプロバイダ (Google Cloud Identity)、SAMLアプリケーション (AWS AppStream 2.0) それぞれの画面を行ったり来たりして、複数個所で設定を行う必要があります。

設定を間違えたり飛ばしたりすると認証時に「403エラー」などが発生して接続に失敗しますので、1ステップ1ステップ確実に設定するのがポイントです。

もしエラーになった際は、前の手順に戻って設定内容を確認したり、どうしても上手く行かない時には最初からやり直したりするのが、結果的に早く解決する道だと思います。