AppStream2.0のユーザーをActiveDirectoryで認証する

### ためすこと
前回、AppStream2.0をLinuxフリートインスタンスで試してみました。今回はAppStream2.0のユーザーをActiveDirectoryで認証させることを試してみます。フリート自体はドメイン参加させません。

https://qiita.com/mirutaro/items/a1eee0d6f904f9cf4cfb

### IAM Identity Centerのユーザー認証情報を連携
AWS公式にIAM Identity Centerのユーザー認証情報をAppStream2.0のユーザーにフェでレートする手順の紹介がありますので、参照します。

https://aws.amazon.com/jp/blogs/desktop-and-application-streaming/enable-federation-with-aws-single-sign-on-and-amazon-appstream-2-0/

この記事に記載の９つの手順を実施するようです。
少し残念なことにIAM Identity CenterのことをSSOと読んでいたり、画面が今とかなり異なっていたりと手順が最新になっていないため、この通りにいかない可能性があります。

### 手順確認
それでは１つずつ手順を確認しながら進めていきます。

#### 1) AWS SSO directory options
IAM Identity Center（旧AWS SSO）に接続する方法はいくつかあるようです。今回 AD Connectorを使用します。

#### 2) Connect AWS SSO to an existing directory
IAM Identity Centerをディレクトリサービスに接続します。私の環境は、すでにローカルPCのActiveDirectoryと接続しています。

https://qiita.com/mirutaro/items/14d7861fdbd1b154ad1b

#### 3) Create the AWS SSO Application for AppStream 2.0
IAM Identity Centerのダッシュボードで、新規にSAMLアプリケーションを登録する手順となっています。

IAM Identity Center > アプリケーションへ移動します。「カスタマー管理」タブに移り、「アプリケーションを追加」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/4e8eac28-cf90-257d-a808-2c8901b2fbee.png)

アプリケーション選択の画面になります。記載の手順とだいぶ違う感じです。「カタログからアプリケーションを選択する」を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/680ebde3-5c66-ea0b-1e91-76e2b5dafeac.png)

アプリケーションカタログに「AppStream2.0」があるので選択して、「次」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/5b71bceb-16da-a2d6-936e-073ea104619a.png)

アプリケーションの設定で表示名を入力します。デフォルトがAppStream2.0となっていますが、ここは手順にならってスタック名にします。事前に作成したスタック名と同じにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/cefa6a34-970d-07eb-754d-920375710e1d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/46cc2d22-4e3a-eea2-d2ee-52ccdd23cc34.png)

手順にもあるメタデータセクションです。ファイルをダンロードしておけと書いてありますが、たぶん後でもダウンロードできると思いますので無視します。だめです。ステップ4)ですぐに必要になりますので、「IAM Identity Center SAML メタデータ」ファイルをダウンロードしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/182f677e-3475-7f63-5f6a-a0cfedc02dfd.png)

アプリケーションプロパティセクションです。手順では、アプリケーション開始URLは空白で、リレーステートURLを入力しろとの指示があります。
私の場合、https:// 以降は　appstream2.ap-northeast-1.aws.amazon.com/saml?stack=MyAppStreamStack1&accountId=<アカウントID>としました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/69ae0d06-0381-e8c1-bc62-80fa0a5563de.png)

アプリケーションメタデータセクションでは、すでに必要な値が入力されていましたので、「送信」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/34308095-140f-e4b4-087f-111956e885d3.png)

アプリケーションが追加されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/6eb00d5e-c408-cc7f-9d66-2ecfdde55f87.png)


#### 4) Create AppStream 2.0 identity provider
次にAppStream2.0へID情報を提供するIdPを作成します。マネジメントコンソールのIAM画面より行います。
IAM > ID プロバイダ　へ移動し、「プロバイダを追加」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/395e3f81-00f9-938f-83da-30fe50bd6b67.png)

プロバイダの設定で「SAML」を選択、プロバイダ名を手順にならって入力し、ステップ3)でダウンロードしていたメタデータファイルをアップロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/699e6458-6d6e-6de7-24c1-c38c61847d20.png)

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

IdPが追加されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/d13e0fb9-32be-5b40-2a2c-281c8534033e.png)

#### 5) Create the AppStream 2.0 stack stream access role
次にフェデレーションされたユーザーに割当たるIAM Roleを作成します。

IAM > ロールに移動し、「ロールを作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/83e525a4-5dc7-ad8c-2519-dbd6d47c23de.png)

信頼されたエンティティタイプは「SAML2.0 フェデレーション」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/dd006882-07fc-db46-21ba-df45c0df25b8.png)

SAML2.0 フェデレーションの設定で以下のようにして、「次へ」をクリックします。
ステップ4)で作成したIdPを選択
許可されるアクセスは２つともチェックしない
属性に「SAML:aud」を選択
値に「https://<foo>signin</foo>.aws.amazon.com/saml」を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/6ca5ecbb-8984-759d-882f-7d15c2092816.png)

許可ポリシーでは何も追加せずに、「次へ」をクリックします。

ロール名を入力します。それ以外はデフォルトのまま「ロールを作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/7af8945a-45dd-d902-8168-dc93017b510f.png)

ロールが作成されます。ロールのARNをメモしてください。（ステップ7で使用します）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/0d68ef47-a697-1030-81e4-187cbb229048.png)


#### 6) Attach an inline policy to the AppStream 2.0 Stream access role
5)で作成したロールにインラインポリシーを追加します。手順ではインラインポリシーになっていますが、カスタムポリシーを別に作成してアタッチしてもよいと思います。

許可を追加より、「インラインポリシーを作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/876a4ad2-9a52-d1c2-ad18-ccbfa71979d7.png)

以下のポリシーを追加します。
※手順の画像では、Condition句に"saml:sub_type": "persistent" もStringEqualsの条件に追加されていますが、リンク先ではこの記述がなかったため、記述なしを使用しています。
``` JSON:inlinepolicy
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "appstream:Stream",
      "Resource": "arn:aws:appstream:ap-northeast-1:<アカウントID>:stack/MyAppStreamStack1",
      "Condition": {
          "StringEquals": {
              "appstream:userId": "${saml:sub}"           
          }
        }
    }
  ]
}
```

ポリシー名を入力して、「ポリシーの作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/a9be81e5-9267-0971-5550-b02aba8e4d0b.png)

インラインポリシーが追加されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/661a7fe4-f328-806e-7d9e-ffee54c5f5b7.png)



#### 7) Create AWS SSO attribute mappings
今度はIAM Identity Centerのアプリケーションの設定画面に戻り、属性マッピングの設定を行います。このステップの手順ではフリートがドメイン参加している場合の説明になっています。フリートがドメイン参加していない場合（LinuxOSなど）、属性マッピングが利用できるか不明です。

IAM Identity Center > アプリケーション > MyAppStreamStack1へ移動し、アクションから「属性マッピングを編集」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/c294d066-62cc-7bde-4fb5-8eca1da467e5.png)

手順にならって入力~~します。１行目と２行目はデフォルトで入力されていたため、３行目だけ追加しました。~~　すると、ステップ8のテストで403 forbiddenエラーになってしまいました。１行目と2行目の値を、${user:subject}に変更し、3行目を追加しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/dff47a70-bf0c-3f57-15a8-4567f9b1d409.png)

|行数|属性名|値|形式|
|-----|-----|------|------|
|1|Subject|${user:subject}|persistent|
|2|https://<foo>aws</foo>.amazon.com/SAML/Attributes/RoleSessionName|${user:subject}|unspecified|
|3| https://<foo>aws</foo>.amazon.com/SAML/Attributes/Role|arn:aws:iam::012345678910:role/ExampleStack,arn:aws:iam:: 012345678910:saml-provider/AWS_SSO_ExampleStack| unspecified|

値は、ステップ5で作成したIAM RoleのARNと、ステップ4で作成したIDプロバイダのARNをカンマで繋いだ文字列になっています。


#### 8) Assign users and test
最後の調整です。IAM Identity Centerのアプリケーションにユーザーを割当ます。

IAM Identity Center > アプリケーション > MyAppStreamStack1へ移動し、「ユーザーとグループを割り当てる」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/c40ceb56-3f6b-83d2-21a1-2508ff268a96.png)

AD Connectorで取得したADユーザが表示されています。ユーザーを選択して、「ユーザーを割り当て」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/2c4748f3-2dcb-4179-d5cb-3cb7d685d617.png)

ユーザーが割り当てられました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/779c0f5d-41db-9ef7-9012-1b39f240854f.png)

それではAppStreamへADユーザーでログインできるかテストします。
IAM Identity Centerのサインインページへアクセスします。
割り当てしたADユーザーでログインします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/20c74ecc-8d79-2f6e-70ae-7e4bd9019537.png)

サインインすると、登録したアプリケーションが表示されています。MyAppStreamStack1をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/647d7640-34e5-c11a-a8e8-c230e88348ca.png)

残念ながら、エラーになってしまいました。なにか権限が必要そうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/0bc9b187-e897-1456-a83f-bd413f26704a.png)

※どうやら属性マッピングの指定に問題があったようです。
ステップ7は修正済みです。
こちらはIAM Identity Centerからみたユーザーのプロファイル情報ですが、手順の設定では「プライマリEメール」の値を利用するようになっていたため、うまくいかなかったようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/aa8d6441-26c3-e2f8-8685-73e59e1a2009.png)

属性マッピングの指定を修正後、MyAppStreamStack1を起動すると、AppStreamのアプリを選択する画面に遷移しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/6b7cea25-797d-dd5e-54ee-3d441e5e5884.png)

アプリのストリーミングも問題なくできました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636209/4815e4dd-b75c-4700-15b7-a2f68aec857c.png)



ステップ8の残りの手順ではADのセキュリティグループを利用して、そのメンバーのユーザーでも利用できることを確認していますが、ここでは省略させていただきます。

#### 9) Using the AWS SSO Directory to manage user access to AppStream 2.0
最後のステップは、ActiveDirectoryではなく、IAM Identity Center自体のディレクトリを利用する内容となっていたため、今回試す要件がないため、ここまでとなります。

### まとめ
AppStream2.0のユーザーをIAM Identity Centerで認証させることができました。そのソースをActiveDirectoryとすることで、ActiveDirectoryのユーザーを使用して認証させることができました。属性マッピングについては理解できていないことが多いので、いつか整理してみたいと思います。