企業では、より安全な認証方法と優れたユーザー体験を両立する手段が求められています。同時に、別のIdentity Provider(IDP)にユーザー資格情報や認可情報を複製することなく、認証・認可を一元管理する仕組みも欠かせません。
本記事では、既存の社内Active Directoryと連携したSAML 2.0プロバイダーとしてAuth0を構成し、シングルサインオン(SSO)でAmazon WorkSpacesをストリーミング配信する方法をご紹介します。
Auth0のID管理プラットフォームは、きめ細かい制御性と高度なセキュリティ、そして使いやすさを兼ね備えています。エンタープライズフェデレーション、ソーシャルサインイン、従来のユーザー名・パスワード認証など、さまざまな方式でSSOを実現できるため、ユーザーは一度サインインするだけで利用可能なすべてのアプリケーションにアクセスできます。
全体アーキテクチャ
今回構築する環境の概要は以下のとおりです。構成をシンプルにするため、すべてを1つのVPC内にまとめています。
- プライベートサブネット内のドメインコントローラー
- AD Connectorを使ったAWS Directory Serviceの構成
- ドメインコントローラーがAuth0と通信できるよう、パブリックサブネットにNATゲートウェイを配置
- プライベートサブネット内にAmazon WorkSpacesを配置
手順の概要
構成は以下の6ステップで完了します。
- Auth0でアプリを作成し、メタデータマニフェストを生成する
- AWS Identity and Access Management(IAM)でSAML IDプロバイダーを作成する
- SAML 2.0フェデレーション用のIAMロールとIAMポリシーを作成する
- Auth0とSAMLアサーションを設定する
- WorkSpacesディレクトリでSAML 2.0連携を有効化する
- 構成をテストする
前提条件
- Active Directoryコネクタを設定済みのAuth0アカウント
- AWS Directory Service向けのActive Directory Connectorが設定済みであること
- 同じディレクトリ内にプロビジョニング済みのAmazon WorkSpace
ステップ1:Auth0でアプリを作成し、メタデータマニフェストを生成する
- Auth0のManagement Dashboardにサインインし、新しいApplicationを作成します。
- Addonsタブで、SAML2 Web Appアドオンを有効にします。
- SAML2 Web Appを有効にすると表示されるポップアップから、このアドオンを設定します。SettingsタブのApplication Callback URLにhttps://signin.aws.amazon.com/samlを入力し、Settings欄に以下のSAML設定コード(JSON形式)を貼り付けます。
{
"audience": "https://signin.aws.amazon.com/saml",
"mappings": {
"email": "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/sAMAccountName",
"name": "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name"
},
"createUpnClaim": false,
"passthroughClaimsWithNoMapping": false,
"mapUnknownClaimsAsIs": false,
"mapIdentities": false,
"nameIdentifierFormat": "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent",
"nameIdentifierProbes": [\
"http://schemas.auth0.com/sAMAccountName"\
]
}

- 画面下部までスクロールし、Enableをクリックします。
- Usageタブを開いて、メタデータマニフェストファイルをダウンロードします。このファイルは次のステップで使用します。

- SAML2 Web Appのウィンドウを閉じてConnectionsをクリックし、Enterpriseの中から該当するActive Directory/LDAPコネクタを選択します。
ステップ2:AWS Identity and Access Management(IAM)でSAML IDプロバイダーを作成する
- AWSアカウントにサインインし、IAMコンソールを開きます。
- ナビゲーションペインでIdentity Providersをクリックし、続いてAdd Providerをクリックします。
- Provider TypeでSAMLを選択し、わかりやすい名前を入力したうえで、必要に応じてタグを追加します。Metadata DocumentでChoose Fileをクリックし、前のステップでダウンロードしたSAMLメタデータドキュメントを指定してOpenをクリックします。完了したら、画面下部のAdd Providerをクリックします。
- 入力した内容を確認し、Createをクリックします。
- このプロバイダーのARNはステップ4で必要になるため、控えておいてください。
ステップ3:SAML 2.0フェデレーション用のIAMロールとIAMポリシーを作成する
- ナビゲーションペインでRolesをクリックし、続いてCreate Roleをクリックします。
- Role typeでSAML 2.0 federationを選択します。
- 前のステップで作成したSAMLプロバイダーを選択します。
- AttributeにSAML:sub_typeを選び、Valueにpersistentと入力します。これにより、値がpersistentのSAMLサブジェクトタイプアサーションを含むSAMLユーザーストリーミングリクエストにのみ、ロールへのアクセスが制限されます。
- SAML 2.0の信頼情報を確認し、信頼するエンティティと条件が正しいことをチェックしたうえで、Next: Permissionsを選択します。
- Attach permissions policiesページではNext: Tagsを選択します。
- 完了したらNext: Reviewを選択します。インラインポリシーは後ほど作成して、このロールに埋め込みます。
- Role nameには、ロールの目的が一目でわかる名前を入力します。複数のエンティティから参照される可能性があるため、ロール名は作成後に変更できません。
- (任意)Role descriptionに、新しいロールの説明を入力します。
- ロールの内容を確認し、Create roleを選択します。
- 作成したロールを選択し、Trust relationshipsを開いてEdit trust relationshipをクリックします。
- Actionを更新して、sts:TagSessionを許可します。
ポリシーは以下のようになります。
{
"Version": "2012-10-17",
"Statement": [\
{\
"Effect": "Allow",\
"Principal": {\
"Federated": "arn:aws:iam:::saml-provider/name"\
},\
"Action": [\
"sts:AssumeRoleWithSAML",\
"sts:TagSession"\
],\
"Condition": {\
"StringEquals": {\
"SAML:sub_type": "persistent"\
}\
}\
}\
]
}
続いて、作成したロールにインラインポリシーを埋め込みます。
- 作成したIAMロールを選択し、PermissionsタブでAdd Permissions→Create Inline Policyをクリックします。
- JSONタブを選び、以下のポリシーを貼り付けます。region、Account ID、directory IDはご自身の環境に合わせて書き換えてください。
{
"Version": "2012-10-17",
"Statement": [\
{\
"Effect": "Allow",\
"Action": "workspaces:Stream",\
"Resource": "arn:aws:workspaces:<region>:<account-id>:directory/<directory-id>",\
"Condition": {\
"StringEquals": {\
"workspaces:userId": "${saml:sub}"\
}\
}\
}\
]
}
region、account ID、directory IDの書き換えを忘れないようにしてください。
- 完了したらNextをクリックし、ポリシー名を入力してCreate Policyをクリックします。
ステップ4:Auth0とSAMLアサーションを設定する
- Auth0のManagement Dashboardにサインインし、Actions→Library→Build Customに進みます。
- 名前を入力し、TriggerはLogin/Post Login、RuntimeはNode 18のままにしてCreateをクリックします。

- 次の画面で以下のコードをコピー&ペーストし、Deployをクリックします。
exports.onExecutePostLogin = async (event, api) => {
if (event.client.name === "APP_NAME") {
const awsRole = 'IAM_arn,saml_provider_arn';
const awsRoleSession = event.user.sAMAccountName;
const email = event.user.emails[0];
api.samlResponse.setDestination('https://signin.aws.amazon.com/saml');
api.samlResponse.setAttribute('https://aws.amazon.com/SAML/Attributes/Role', awsRole)
api.samlResponse.setAttribute('https://aws.amazon.com/SAML/Attributes/RoleSessionName', awsRoleSession)
api.samlResponse.setAttribute('https://aws.amazon.com/SAML/Attributes/PrincipalTag:Email', email)
}
return;
};
App_Nameは、ステップ1で作成したAuth0アプリの名前に置き換えてください。さらに、IAM_arnをステップ3で作成したIAMロールのARNに、saml_provider_arnをステップ2で作成したSAMLプロバイダーのARNに置き換えます。
- 完了したらActions→Library→Flowsに進み、Loginをクリックします。
- 右側のペインのAdd Actionの下にあるCustomをクリックし、作成したアクションをStartとCompleteの間に配置します。

- Applyをクリックします。
ステップ5:WorkSpacesディレクトリでSAML 2.0連携を有効化する
構成を仕上げる最後のステップです。
- AWSマネジメントコンソールにサインインし、WorkSpaces→Directoriesに進みます。
- WorkSpacesで使用しているディレクトリをクリックします。
- Edit Authenticationをクリックします。
- 認証編集画面でEdit SAML 2.0 Identity Providerをクリックします。
- Enable SAML 2.0 Authenticationをクリックし、User Access URLにIDプロバイダーのログインURLを入力します。IdP deep link parameter nameは「RelayState」のままで構いません。
ステップ6:構成をテストする
- Amazon WorkSpacesクライアントを起動し、登録コードを入力して構成をテストします。以下のような画面が表示されるはずです。
- ContinueをクリックしてWorkSpacesにサインインすると、以下のようなIDPのサインインページにリダイレクトされます。
- ADのユーザー名とパスワードでサインインします。認証に成功すると、以下のような画面が表示されます。
- Open Workspacesをクリックすると、ユーザー名が入力済みのサインイン画面が表示されます。
- パスワードを入力すると、WorkSpaceの起動が始まります。
- WorkSpaceが起動すると、デスクトップが読み込まれます。
