AppStreamとAWS SSOを連携! VPC内にプライベートIPアドレスを使って公開している管理用サイトをAppStreamから見れるようにして AWS Single Sign-On を使ってユーザーを管理してみた

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

こんにちは!😁 山が好きな山本です
好きな山は仙ノ倉山(せんのくらやま)と瑞牆山(みずがきやま)です
最近は仙ノ倉山の紅葉を見てきました f:id:swx-yamamoto:20211029112859j:plain

この記事に書くこと

AWS Single Sign-On サービスを体験してみるために
以下の仕組みを作ってみることにしました

  • 目的はVPC内にプライベートIPアドレスを使って公開している管理用サイトをインターネットから閲覧すること
    • 閲覧には AppStream (の提供する WEBブラウザ) を利用する
      • WEBブラウザは日本語入力ができること
      • 一旦 FireFox とする
    • AppStream へのログインユーザーは AWS Single Sign-On のユーザーとなる
      • AWS Single Sign-Onにてログインユーザーを管理する
    • AWS Single Sign-On の ログイン認証には ユーザーID/パスワードおよび多要素認証(トークン)を利用する
      • AppStream のユーザープールには多要素認証機能が無いため AWS Single Sign-On を利用して補う

構成図は以下になります

f:id:swx-yamamoto:20211027134416p:plain
構成図

補足
構成図においてはAWS Single Sign-On (以下 AWS SSO) と AppStream の AWS アカウントは異なります
しかし1つのAWS アカウントに作成しても構いません

同じようなことをする人が世の中にいるかもしれないため
手順を画像付きで残していきます
長くなります😁
ご容赦ください

目次

  1. AppStream の日本語版イメージ(提供アプリ=FireFox)を作成
  2. AppStream の Fleet を作成
  3. AppStream の Stack を作成
  4. AWS SSO にて 多要素認証を必須化
  5. AWS SSO にグループを作成しユーザーを追加
  6. AWS SSO と AppStream を連携
  7. AWS SSO にログインし 管理用サイトに接続可能なことを確認

1. AppStream の日本語版イメージ(提供アプリ=FireFox)を作成

ネットワーク周り

こちらのみ画像は割愛します

  • VPC を 1つ作成してください
    • 既存のVPCを使用する場合は作成しなくて大丈夫です
  • プライベートサブネットを1つ作成してください
    • マルチAZ にする場合は AZ を変えて2つ作成してください
  • 管理サイトをホストするEC2 のセキュリティグループにおいて 作成したサブネットのCidrからの http/https 接続を許可してください
    • 管理サイトをホストするEC2が別のVPCにある場合はルーティング追加もお願いします
    • 上の構成図は同じVPC内の別サブネットに管理サイトをホストするEC2を配置している想定です

Image Builderの作成

AppStream のある AWSアカウントに権限のあるユーザーにログインください (権限については省略 時間あったら追記します)
AppStream のサービス画面から Launch Image Builder を押します

f:id:swx-yamamoto:20211027144249p:plain

Step 1: Choose Image
管理サイトを閲覧する用途のため General Purpose の Windows Server 2019 を選択

  • AppStream-WinServer2019-10-08-2021 f:id:swx-yamamoto:20211027221059p:plain

Step 2: Configure Image Builder

  • Name, Display Name に任意の値を入力
  • Instance Type は 以下を選択
    • stream.standard.small
  • 他はそのまま

f:id:swx-yamamoto:20211027145616p:plain

Step 3: Configure Network
作成した VPC , Subnet を選択
セキュリティグループは Outbound 通信をすべて許可するルールがあるものを選択してください (defaultも可)
f:id:swx-yamamoto:20211027151256p:plain

Step 4: Review
特に変更なし f:id:swx-yamamoto:20211027151403p:plain

15-20 分くらいで Running 状態になります

f:id:swx-yamamoto:20211027153930p:plain

日本語化

作成したイメージビルダーを選択して[connect]を押します

f:id:swx-yamamoto:20211027154113p:plain

Administrator にログインします f:id:swx-yamamoto:20211027180714p:plain

Settings から言語設定を変えていきます
[Time & Language]を押します f:id:swx-yamamoto:20211028013739p:plain

真ん中にある[Add a language] ("+"マーク) を押します f:id:swx-yamamoto:20211027155122p:plain

[日本語]を選択して[Next]を押します f:id:swx-yamamoto:20211027155311p:plain

[Install]を押します ※ You're currently offline ...というエラーはあるものの気にしないで大丈夫です f:id:swx-yamamoto:20211028013053p:plain

[Windows Display Language] (表示言語)を 日本語にします
また [Preferred languages] の一番上が日本語になるようにします
f:id:swx-yamamoto:20211028013438p:plain

[Administrative language settings] を確認します f:id:swx-yamamoto:20211027175653p:plain

[Change system locale]を押します f:id:swx-yamamoto:20211028054138p:plain

Japanese(Japan) を選択し[OK]を押します
f:id:swx-yamamoto:20211028054220p:plain

[Restart now] を押します ※ 実際に再起動はかかりません f:id:swx-yamamoto:20211028060317p:plain

[Copy settings...]を押します f:id:swx-yamamoto:20211028054555p:plain

2つチェックを入れ[OK]を押します f:id:swx-yamamoto:20211028054643p:plain

[Restart now] を押します ※ 実際に再起動はかかりません f:id:swx-yamamoto:20211028054722p:plain

[Date, time, & regional formatting]を押します f:id:swx-yamamoto:20211028055102p:plain

[Country or region] を Japan に設定します f:id:swx-yamamoto:20211028055249p:plain

言語設定を反映させるため再起動します
再起動するためには最初にセッションを切ります f:id:swx-yamamoto:20211027183225p:plain

マネジメントコンソールから Stop します f:id:swx-yamamoto:20211027183324p:plain

Stopping から Stopped になったら Start します f:id:swx-yamamoto:20211027183508p:plain

日本時間設定

再起動したイメージビルダーに [connect]し
Administrator にログインします f:id:swx-yamamoto:20211027180714p:plain

Powershell を起動します f:id:swx-yamamoto:20211027181510p:plain

以下のコマンドレットを打ちます

Set-TimeZone -Id "Tokyo Standard Time"

f:id:swx-yamamoto:20211027181710p:plain

時刻が JST に変わります (Template User, Test User も変わります)

アプリケーション追加

Administrator にログインします f:id:swx-yamamoto:20211027183855p:plain

デスクトップの Image Assistant を起動します f:id:swx-yamamoto:20211027184301p:plain

[Add App]を押し WEBブラウザ(FireFox)を選択します ※ C:\Program Files (x86)\Mozilla Firefox\ 配下に存在 f:id:swx-yamamoto:20211027184404p:plain

[Launch Parameters] に 管理サイトの URL を配置し[Save]を押します f:id:swx-yamamoto:20211027184716p:plain

[Next]を押します f:id:swx-yamamoto:20211027184948p:plain

[Switch User] を押し Template User にスイッチします f:id:swx-yamamoto:20211027185124p:plain

f:id:swx-yamamoto:20211027191004p:plain

Image Assistant を起動し FireFox を起動します
f:id:swx-yamamoto:20211027185318p:plain

テスト用管理サイトが出てくることを確認し「x」で閉じます f:id:swx-yamamoto:20211028143549p:plain

[Switch User] を押し Administrator に戻ります f:id:swx-yamamoto:20211027185816p:plain

f:id:swx-yamamoto:20211027191253p:plain

[Save Settings] を押したあとに[Next]を押します f:id:swx-yamamoto:20211027185931p:plain

[Switch User] を押し Test User にスイッチします f:id:swx-yamamoto:20211027190026p:plain

f:id:swx-yamamoto:20211027191348p:plain

Image Assistant を起動し FireFox を起動します (1クリック) f:id:swx-yamamoto:20211027190143p:plain

管理サイトが立ち上がり日本語も入力可能になっていることを確認します
「x」で閉じます f:id:swx-yamamoto:20211027190256p:plain

[Switch User] を押し Administrator に戻ります f:id:swx-yamamoto:20211027190522p:plain

f:id:swx-yamamoto:20211027190833p:plain

[Next]を押します f:id:swx-yamamoto:20211027191509p:plain

右上の[Launch]を押します f:id:swx-yamamoto:20211027191545p:plain

ポップアップの[Continue]を押します f:id:swx-yamamoto:20211027191638p:plain

最適化のためにアプリケーションが起動してきます
「x」で閉じます f:id:swx-yamamoto:20211027191757p:plain

イメージに任意の名前をつけます f:id:swx-yamamoto:20211027191940p:plain

[Disconnect & Create Image]を押します f:id:swx-yamamoto:20211027192042p:plain

コネクションが切れます f:id:swx-yamamoto:20211027192121p:plain

AWSマネジメントコンソール上でイメージビルダーの Status が Snapshotting になります ※ 30分くらい待ちます
作成が終わると Stopped 状態になります
f:id:swx-yamamoto:20211027192739p:plain

AWSマネジメントコンソールの[Image Registry]タブで[Private and shared with others]の中に作成したイメージができます
f:id:swx-yamamoto:20211027194847p:plain

f:id:swx-yamamoto:20211027195127p:plain

ようやく日本語のイメージ(FireFox)が出来ました \(^o^)/にっこり

2. AppStream の Fleet を作成

AppStream のサービス画面から[Fleets]枠内の[Create Fleet]を押します
f:id:swx-yamamoto:20211027202837p:plain

任意の名前を付けて [Next]を押します (イメージと同じ名前にしました)

  • kanri-site-20211027

f:id:swx-yamamoto:20211027202951p:plain

作成したイメージを選択して[Next]を押します

  • kanri-site-20211027

f:id:swx-yamamoto:20211027220953p:plain

  • Fleet type
    • On-Demand
  • instance type
    • stream.standard.small

を選択して[Next]を押します

f:id:swx-yamamoto:20211027203458p:plain

VPC ,サブネット, セキュリティグループを選択して [Next]を押します
マルチAZ にする場合は サブネットを 2つ選んでください
f:id:swx-yamamoto:20211027203744p:plain

設定内容を確認して[Create]を押します
f:id:swx-yamamoto:20211027203930p:plain

料金がかかるという警告が出るため同意して [Create]を押します
10分くらいかかるため
その間に Stack を作ることも可能です
f:id:swx-yamamoto:20211027204054p:plain

作成完了すると Running 状態になります
f:id:swx-yamamoto:20211027210025p:plain

3. AppStream の Stack を作成

AppStream のサービス画面から[Stacks]枠内の[Create Stack]を押します f:id:swx-yamamoto:20211027204455p:plain

Name, Display Name, Descriptionに任意の値を入力します
イメージ名、フリート名と同じ名前にしました (kanri-site-20211027)
Fleet は先程作成したものを選択します
[Next]を押します
f:id:swx-yamamoto:20211027204624p:plain

ストレージは使用しないのでチェックを全て外し[Next]を押します
f:id:swx-yamamoto:20211028181928p:plain

セキュリティ要件に応じて以下を設定します

  • クリップボード連携の有無(Clipboard)
  • ファイル連携の有無(File transfer)
  • プリンタ連携の有無(Print to local device)

SSO と連携するため以下は Enabled にします

  • Password sign in for Active Directory

以下は disabled にします

  • Smart card sign in for Active Directory

他 はそのまま[Next]を押します
f:id:swx-yamamoto:20211027205037p:plain

内容を確認し [Create]を押します f:id:swx-yamamoto:20211027205934p:plain

すぐに Active 状態になります f:id:swx-yamamoto:20211027210152p:plain

Stack で使用する Fleet が Runnning 状態になっていたら日本語のWEBブラウザ(FireFox)が使用可能になります \(^o^)/にっこり f:id:swx-yamamoto:20211027210025p:plain

4. AWS SSO にて 多要素認証を必須化

AWS SSO を有効化している AWS アカウントにログインします

AWS SSO のサービス画面を開きます
Settings の [Multi-factor authentication] 内の [configure] を押します

f:id:swx-yamamoto:20211028045447p:plain

以下の 2箇所にチェックし[Save changes]を押します

  • Every time they sign in (always-on)
  • Require them to register an MFA device at sign in

f:id:swx-yamamoto:20211028045722p:plain

5. AWS SSO にグループを作成しユーザーを追加

[Groups]枠内の [Create Group]を押します f:id:swx-yamamoto:20211027212836p:plain

任意のグループ名を入力し グループを作成します
イメージ名、フリート名、スタック名と同じ名前にしました (kanri-site-20211027)
f:id:swx-yamamoto:20211027212946p:plain

[Users]枠内の [Add User]を押します
f:id:swx-yamamoto:20211027213126p:plain

ユーザー名とメールアドレスを入力し
右下の[Next: Groups]を押します
f:id:swx-yamamoto:20211027213702p:plain

作成したグループにチェックを入れ右下の [Add User]を押します
f:id:swx-yamamoto:20211027213824p:plain

グループにユーザーが入りました
f:id:swx-yamamoto:20211027221608p:plain

ユーザー登録したメールアドレスにメールが届いています [Accept Invitation]をクリックします f:id:swx-yamamoto:20211027221415p:plain

新しいパスワードを登録します f:id:swx-yamamoto:20211027215435p:plain

メールに記載のユーザー名と変更後のパスワードを入力します f:id:swx-yamamoto:20211027220131p:plain

f:id:swx-yamamoto:20211027220218p:plain

多要素認証アプリの設定をしログインします f:id:swx-yamamoto:20211028050052p:plain

f:id:swx-yamamoto:20211028050210p:plain

今はアプリケーションを割り当てていないため以下のような画面になります
一旦はここまで確認しておきます
f:id:swx-yamamoto:20211027220310p:plain

メール認証すると AWSマネジメントコンソール で ユーザーの Status が Enabled になります f:id:swx-yamamoto:20211028025307p:plain

6. AWS SSO と AppStream を連携

AWS SSO を有効化している AWS アカウントにログインします

AWS SSO の [Application] 枠内にある[Add a new application]を押します f:id:swx-yamamoto:20211027221651p:plain

[Add a custom SAML 2.0 application]を押します f:id:swx-yamamoto:20211027222004p:plain

Display name と Description に任意の値を入力します
イメージ名、フリート名、スタック名と同じ名前にしました (kanri-site-20211027)
Relay state に以下を入力します
※「AWSアカウント番号12桁ハイフン無し」と「AppStreamのスタック名」は読み替えましょう

[If you don't have a metadata file, you can manually type your metadata values.]を押します
Application ACS URL に以下を入力します

Application SAML audience に以下を入力します

  • urn:amazon:webservices

[Save Changes]を押します f:id:swx-yamamoto:20211027223033p:plain

[AWS SSO SAML metadata] を [Download] を押してダウンロードします
f:id:swx-yamamoto:20211027223905p:plain

AppStream の AWS アカウントにログインします

IAMのサービス画面にて IDプロバイダを作成します
命名規則に注視して作成してください

  • プロバイダ名
    • AWS_SSO_<AppStreamスタック名>
      • 例:AWS_SSO_kanri-site-20211027

また
AWS SSO のアプリケーション作成時にダウンロードしたメタデータファイルをアップロードしてください
その後に[プロバイダを追加]を押します
f:id:swx-yamamoto:20211028035023p:plain

作成したら IDプロバイダ の ARN をメモしておきます
そのあと [ロールの割当て]を押します
f:id:swx-yamamoto:20211028035517p:plain

[新しいロールを割当て]を選択します
f:id:swx-yamamoto:20211028035705p:plain

以下を入力し[次のステップ...]を押します

  • 属性:SAML:sub_type
  • 値:persistent

f:id:swx-yamamoto:20211028040002p:plain

ポリシーは何も付けません f:id:swx-yamamoto:20211028040157p:plain

タグも付けず
任意の名前でロールを作成します
ロールのARN をメモします f:id:swx-yamamoto:20211028040248p:plain

ロールにインラインポリシーを1つ付けます
名前は任意
※「AWSアカウント番号12桁ハイフン無し」と「AppStreamのスタック名」は読み替えましょう

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "appstream:Stream",
            "Resource": "arn:aws:appstream:ap-northeast-1:AWSアカウント番号12桁ハイフン無し:stack/AppStreamのスタック名",
            "Condition": {
                "StringEquals": {
                    "appstream:userId": "${saml:sub}"
                }
            }
        }
    ]
}

f:id:swx-yamamoto:20211028040809p:plain

AWS SSO を有効化している AWS アカウントにログインします

AWS SSO のサービス画面を開きます
AWS SSO の [Application] 枠内にある作成したアプリケーションを選択し
[Attribute mappings]タブを開きます f:id:swx-yamamoto:20211028042055p:plain

以下の値を入力していきます

※メモしたロールのARNとID プロバイダのARN
[Save Changes]を押します
f:id:swx-yamamoto:20211028042306p:plain

[Assigned Users]タブに移動します
[Assign Users]を押します
f:id:swx-yamamoto:20211028042607p:plain 作成したグループをチェックし[Assign Users]を押します
f:id:swx-yamamoto:20211028042720p:plain

7. AWS SSO にログインし 管理用サイトに接続可能なことを確認

AWS SSO の User portal URLにアクセスします f:id:swx-yamamoto:20211027211834p:plain

ユーザー名を入力します f:id:swx-yamamoto:20211028050526p:plain

パスワードを入力します f:id:swx-yamamoto:20211028050636p:plain

MFAコード(トークン)を入力します f:id:swx-yamamoto:20211028050712p:plain

f:id:swx-yamamoto:20211028050804p:plain

アプリケーションを押します f:id:swx-yamamoto:20211028050911p:plain

AppStream 内の FireFox のアイコンを押します f:id:swx-yamamoto:20211028051036p:plain

On-Demand モードなので起動時間の2-3分待ちます
デフォルトでは 15分間までセッションを保持するため
15分以内の接続はこの起動待ちが無くなります
後から保持期間を長くすることも出来ます (その分料金に跳ねます) f:id:swx-yamamoto:20211028051143p:plain

ロードが始まります f:id:swx-yamamoto:20211028051342p:plain

管理用サイトを表示していることを確認します
「デフォルトのブラウザにしますか?」というポップアップはどうしても出てしまうようです ^^; f:id:swx-yamamoto:20211028115052p:plain

アドレスバーに検索文字列を入れてみます
→インターネットには出れません(VPC内通信のみ)
f:id:swx-yamamoto:20211028052914p:plain

画面右上の[LOG OUT]ボタンを使い ログアウトします f:id:swx-yamamoto:20211028115134p:plain

ようやくできました\(^o^)/にっこり
あとはユーザーが増えたら AWS SSO のグループに追加していけば良さそうです
AppStream のスケールは必要に応じて実施という感じですね
なにかの参考になると幸いです!

参考情報

社内のAppStreamブログ

blog.serverworks.co.jp

blog.serverworks.co.jp

AWSのドキュメント aws.amazon.com

山本 哲也 (記事一覧)

カスタマーサクセス部のエンジニア(一応)

好きなサービス:ECS、ALB

趣味:トレラン、登山(たまに)