【Amazon AppStream】ADFSでフェデレーション認証する方法(小ネタ編)

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

基本の設定については前後編に分けて別ブログで解説しました。
基本設定について知りたい場合はこちら(前編 後編)をご覧ください。

今回はクライアントアプリから接続したい、使用できるアプリケーションを制限したいなど、特定の要件を実現する方法をまとめました。

クライアントアプリから接続する方法

クライアントアプリから接続したい場合はDNSにTXTレコードを登録する必要があります。
TXTレコードがないと、クライアントアプリにURLを入れても[Connect]ボタンが活性化しません。

  • レコード名:(空欄)
  • テキスト:AS2TrustedDomains=<federation_service_name>

アプリケーションの制限

ユーザが利用できるアプリを制限したい場合があると思います。
ユーザにデスクトップを提供する場合と個々のアプリケーションを提供する場合で方法が異なるため、分けて解説します。

デスクトップを提供する場合

デスクトップを提供する場合は、環境ごとにイメージを作成します。
スタックもイメージ分作成し、スタックごとにIAMポリシー、IAMロール、接続URLを作成します。

アプリケーションを提供する場合

アプリケーションを提供する場合は、スタックは同一のものを使用できます。
スタックの設定でApplication Entitlementsを作成します。

  • Name:任意の名称
  • Attribute Name:groups
  • Attribute Value:group-[任意の名称]
  • Application options:対象のアプリケーションを選択


上記で設定したグループ名をSAMLのレスポンスに追加する必要があります。

まずは、IAMポリシーを修正し、Actionに「sts:TagSession」を追加します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::[accountID]:saml-provider/[provider_name]"
            },
            "Action": [
                "sts:AssumeRoleWithSAML",
                "sts:TagSession"
            ],
            "Condition": {
                "StringEquals": {
                    "SAML:aud": "https://signin.aws.amazon.com/saml"
                }
            }
        }
    ]
}


次に、ADのセキュリティグループを作成し、ユーザを追加します。
セキュリティグループ名は、appstream-gp-[任意の名称]で作成しました。
※[任意の名称]の部分はApplication EntitlementsのAttribute Valueの[任意の名称]と同一にします。
最後に、クレームルールを1つ追加します。

  • Claim rule name:Groups
  • Rule template:Send Claims Using a Custom Rule
  • Custom Rule:下記を設定
c:[Type == "http://temp/variable", Value =~ "(?i)^appstream-gp-"]
 => issue(Type = "https://aws.amazon.com/SAML/Attributes/PrincipalTag:groups", Value = RegExReplace(c.Value, "appstream-gp-", "group-"));


本設定を入れた上で接続すると、許可されたアプリケーションだけが利用できるようになります。
ユーザに「appstream-gp-」で始まるセキュリティグループを複数つけてしまうとうまく動作しなくなりますので、ご注意ください。

AppStreamに接続する端末を制限する方法

証明書が端末にインポートされていないとADFSで認証できないため、ある程度は制限されます。
IPでも制限したいという場合はIAMロールでIPを指定することでも制限が可能です。

接続時にスタックを指定しない方法

スタックを複数作成した場合でも同一のURLで接続したい場合もあるかと思います。
その場合はIAMポリシーとURLを以下のように修正します。

まず、IAMポリシーを修正します。
Resouceでスタック名を指定していたところを*に変更します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Allow",
            "Action": [
                "appstream:Stream"
            ],
            "Resource": [
                "arn:aws:appstream:us-east-1:[accountID]:stack/*"
            ],
            "Condition": {
                "StringEquals": {
                    "appstream:userId": "${saml:sub}",
                    "saml:sub_type": "persistent"
                }
            }
        }
    ]
}


次に、接続用URLからスタック名を削除します。
URLを見ると、「stack%253D[stack_name]」になっているところが見つかるかと思います。
ここからスタック名を削除します。

これで接続すると、スタックが選択できるようになります。

まとめ

今回は運用でありそうな要件を実現する方法をいくつか挙げてみました。
アプリの制限に関しては他にもやり方があるため、試してみてください!