AppStreamクライアントでADFSのURLにログインする方法

目的・やりたいこと

前の[技術検証]AppStreamで表示させるアプリの制御検証に追記しようとも思いましたが、長くなりそうなので新たに記事を追加することにしました。
最後にやったAppStreamクライアントの起動を、ADFSサーバーのURLを貼っても接続するようにしたい。

もしくは、リダイレクトしたURLからClientが起動できたらいい。
・パターン1
 ClientにURL入力→ADFS→ADログイン→AppStream起動
・パターン2
 ADFS→ADログイン→AppStream(Client起動)
ADログイン後にAppStream(Client起動)させるのが難しそうなので、パターン2はおそらく無理
というかそもそも「amazonappstream:」というプレフィックスを受け付けてなかった(https://〜 じゃないとダメ)

対象となる技術

  • AppStream 2.0
  • ADFS

背景

そもそもの背景として、ADドメイン参加したスタックからストリーミングURLを作成できないというのがあった

そもそもこのドメイン参加したスタックを作成するのが大変だったので、まずこれをドキュメント化しておきます。

1.Directory Configの作成
まずドメイン結合するための構成が必要ということで、Directory Configを作成します。


Service Account Name:ドメイン名の一部(.comとかがないもの)\adminユーザー名
OU:DC=lab,DC=localだけではダメだったので、OU=Domain Controllersも追加

2.イメージのドメイン参加
最初、Launch Image builderでイメージを作成するときのConfigure networkのオプション[Active Directory domain]で指定してドメイン参加しようとしていた。

ところがどうしてもドメイン参加できない。

それもそのはず。そういやDNSサーバをADに指定してないのにどうやってドメイン参加するのかなと思ってたら案の定・・
Amazon AppStream 2.0 で Active Directoryを利用することに対する私見

どうやらActive Directoryを利用するにあたりフリートインスタンスDNS設定はDHCPオプションセットを使う前提の様です。
DHCPオプションセットは適用範囲がVPC全体しかないため、環境によっては設定を変えることができずAppStream 2.0 ドメイン結合の採用を断念せざるを得ない可能性があります。
一応DNSサーバーの設定を変えたカスタムイメージを作ってAppStream 2.0 ドメイン結合を実現することはできましたが、これが公式にサポートされている手順かは未確認であり、オフィシャルなドキュメントを見つけることもできませんでした。

3.DNS指定したカスタムイメージの作成
そこで Image builderでまずはドメイン非参加のイメージをいったん作成し、Connectでイメージにログインして、ネットワークインターフェースのIPv4DNSサーバをADサーバのIPアドレスで指定することにしました。
問題はDNS設定変更後、そのイメージをどうやってオリジナルイメージとして保存するのか全然方法が見つからなかったが、このImage Assistantを使うことがわかった。

4.Fleetのドメイン参加
Fleet作成時に3.で作成したカスタムイメージを指定

また、オプションのActive Directory domainで今度こそDirectory Configを指定し、ドメイン参加させる。

5.Stackの作成
4.で作成したドメイン参加したFleetを指定してStackを作成
これでようやくドメイン参加したStackを作成できた

このドメイン参加したスタックからは[Create Streaming URL]をしようとすると、このようにエラーが起きる

背景がわかったところで、本題のAppStreamクライアントからADFSサーバーのURLを貼って接続する検証に入ります。

参考URL

Install the AppStream 2.0 Client And Customize the Client Experience for Your Users

検証手順

接続したいURL:https://adfs.lab.local/adfs/ls/idpinitiatedsignon.aspx

ところが参考URLに記載の通り、AppStreamクライアントはAppStream 2.0 ドメイン、または接続を有効にする DNS TXT レコードを含むドメインを含む URL にのみ接続できる。このため、このURLを入れてもまず[Connect]ボタンがアクティブにならない。

これをアクティブにする方法は3つある。

  • StartURL レジストリ値を設定して、組織のログイン ポータルの URL など、ユーザーがアクセスできるカスタム URL を指定
  • TrustedDomains レジストリ値を設定して、ユーザーがアクセスできる信頼できるドメインを指定
  • AS2TrustedDomains DNS TXT レコードを作成して、ユーザーがアクセスできる信頼できるドメインを指定

最初の2つはいずれもクライアント側のレジストリの変更が伴い、実運用で全クライアント端末のレジストリを変更させるのは現実的ではない。よって自動的に3番目の選択肢しか残りません。この方法により、レジストリの変更を回避できます。
しかもやり方もすごく簡単。Route 53のTXTレコード値に「AS2TrustedDomains=ドメイン名」と入れるだけです。

ここでは「adfs.lab.local」に接続させたいため、まずlab.localのプライベートゾーンを作成し、AppStreamクライアントを起動させるWindowsのEC2がいるVPCに関連づけます。
次に、次のようにTXTレコードを作成します。


ここで注意すべきはレコード名で、自分は最初「adfs.lab.local」と入れていたため、TXTを問い合わせてもなぜかSOXが返ってくる状態でした。
(最初WireSharkで見てましたが、あまりにわかりづらいのでここは素直にコマンドプロンプトで普通に問い合わせた方が早いです)

C:\Users\Administrator>nslookup -type=TXT lab.local
サーバー:  ip-10-0-0-2.ap-northeast-1.compute.internal
Address:  10.0.0.2

lab.local
        primary name server = ns-1536.awsdns-00.co.uk
        responsible mail addr = awsdns-hostmaster.amazon.com
        serial  = 1
        refresh = 7200 (2 hours)
        retry   = 900 (15 mins)
        expire  = 1209600 (14 days)
        default TTL = 86400 (1 day)

C:\Users\Administrator>nslookup -type=TXT adfs.lab.local
サーバー:  ip-10-0-0-2.ap-northeast-1.compute.internal
Address:  10.0.0.2

権限のない回答:
adfs.lab.local  text =

        "AS2TrustedDomains=adfs.lab.local"

adfs.lab.localを問い合わせてTXTレコードが返ってきていますが、そうではなくlab.localを問い合わせてTXTレコードが返ってくるようにしないとダメ
なのでレコード名の入力欄は空欄(=lab.local)にしないとダメ
こうなるのが正解

C:\Users\Administrator>nslookup -type=TXT lab.local
サーバー:  ip-10-0-0-2.ap-northeast-1.compute.internal
Address:  10.0.0.2

権限のない回答:
lab.local       text =

        "AS2TrustedDomains=adfs.lab.local"

こうすることで、目的のURLを入れてようやく[Connect]ボタンがアクティブになるところまでいきました。

実際は接続させてもこのような接続エラーが出てしまうため、おそらく自己署名でhttps接続してるのが原因かなと思う。

最初、AppStreamに繋がるURLじゃないとクライアントから接続拒否される仕様なのかなとも思ったが、実際「amazon.co.jp」をプライベートゾーンで作成してみたら普通にアマゾンショップが開いたので

所要時間

30分
自分はレコード名の指定をミスってハマりましたが、慣れてる人ならこのくらいの時間で終わると思います。

ユースケース

ADFSへの接続をAppStreamクライアント経由にしたい場合