♨️

AppStream2.0で一時利用できるオペレーション基盤を構築してみた

2024/12/14に公開

はじめに

はじめまして、システム基盤チームでSREをしている森と申します。
日々の業務で取り組んだことについて紹介いたします。

弊社では機密情報を取り扱う業務において、セキュリティポリシーを定めています。
このポリシーに基づき、認証方式や端末、利用場所などさまざまな観点から安全管理措置を徹底しています。

今回、特定条件抽出したデータを他システムに連携したいという相談をマーケティングチームより受けました。
相談を受けた当初の構成は下記の通りでした。

この構成における課題は、既存の共用ファイルサーバーではディレクトリ単位でのIP制限や場所の管理ができないため、当社のセキュリティポリシー(利用場所)に適合できない点です。
従ってセキュリティポリシーを満たす専用の運用基盤を新規に構築する必要がありました。

満たしたいセキュリティ要件

  • 特定のエリアからのみアクセス可能
  • 機密情報ファイルをローカルマシンに保存させない
  • 利用を終えた機密情報ファイルへのアクセスをなくしたい

これらのセキュリティ要件を満たすためにAppStream2.0を使った一時利用できるオペレーション基盤の環境を構築した取り組みについて紹介いたします。

対象読者

  • 機密情報を取り扱う場合のセキュリティ運用について関心がある人
  • AppStream 2.0を使った一時環境の構築に関心がある人

AppStream 2.0について

https://aws.amazon.com/jp/appstream2/

AppStream2.0はAWSが提供するエンドユーザーコンピューティング(EUC)[1]サービスの1つで、アプリケーションのSaaS化を実現します。似たようなサービスにAmazon Workspaces[2]がありますが、こちらは仮想デスクトップインフラストラクチャ (VDI)[3] サービスであり、手元のローカルマシンから遠隔のサーバーへ接続するものになります。

AppStream2.0はデスクトップそのものをSaaS化できますので、デスクトップにデータを残し続けることなく削除できますので、利用を終えた機密情報を消し忘れたというオペレーションミスをなくせる利点があります。

またAWS IAM Identity Center[4]と組み合わせることで特定メンバー、グループのみアクセスポータル画面から起動できるといった制御管理が実現できます。

アーキテクチャ

AppStream2.0を使った一時利用向けの運用基盤のアーキテクチャになります。

機密情報が含まれるデータを一時的にS3へ転送し、AppStream2.0からデータを取得します。
AppStream2.0のデスクトップアプリケーション内でマーケティング施策に使う他システムへ機密情報ファイルをアップロードすることで、ローカルマシンにデータを保存することなく機密情報をマーケティング業務に活用できます。

AppStream2.0とS3間のマウント設定

AppStream2.0とS3間のマウント方法ですが、シンプルにAWS CLIコマンドのs3 sync[5]コマンドを使って機密情報ファイルをAppStream2.0へ転送するようにしています。
AppStream2.0にはIAMロールをアタッチさせることは可能ですが、デフォルトのプロファイルではなく、appstream_machine_roleという専用のプロファイルが自動で生成されるためコマンド実行時に明示的に指定する必要があります。

https://docs.aws.amazon.com/ja_jp/appstream2/latest/developerguide/how-to-use-iam-role-with-streaming-instances.html

aws s3 sync s3://s3-bucket/folder/path destination/copy/path --profile appstream_machine_role

とはいえ、AppStream2.0を起動するたびに毎回コマンドを実行するのは面倒です。
そこで、AppStream2.0には起動時や終了時にスクリプトを自動で実行させるセッションスクリプトを使ってAppStream2.0の起動直前に上記のs3 syncコマンドを実行させて機密情報ファイルをAppStream2.0に自動で転送させるようにします。

https://docs.aws.amazon.com/ja_jp/appstream2/latest/developerguide/use-session-scripts.html

セッションスクリプトの設定ファイルは以下のようなjson形式で記述します。
稼働しているAppStream2.0のインスタンスがWindowsなら C:\AppStream\SessionScripts\、Linuxなら/opt/appstream/SessionScripts/配下に設定ファイルを設置します。

SessionStartが起動時に実行するスクリプトを指定し、SessionTerminationが終了時に実行するスクリプトを指定します。

さきほどのバッチファイルをCドライブ直下のWindowsフォルダ配下に配置させた場合、filenameに実行させたいファイルへの完全パスを以下のように指定しました。

config.json
{
  "SessionStart": {
    "executables": [
      {
        "context": "system",
        "filename": "",
        "arguments": "",
        "s3LogEnabled": true
      },
      {
        "context": "user",
        "filename": "C:\\Windows\\s3_mount.bat",
        "arguments": "",
        "s3LogEnabled": true
      }
    ],
    "waitingTime": 30
  },
  "SessionTermination": {
    "executables": [
      {
        "context": "system",
        "filename": "",
        "arguments": "",
        "s3LogEnabled": true
      },
      {
        "context": "user",
        "filename": "",
        "arguments": "",
        "s3LogEnabled": true
      }
    ],
    "waitingTime": 30
  }
}

AppStream2.0からのファイル持ち出しの制限

AppStream2.0はローカルマシンとインスタンス間でのデータ転送を相互通信を可能にしたり、片方からのみ許可だったり完全無効化などの制御ができます。
AppStream2.0に配置された機密情報ファイルをローカルマシンにコピーされないようにローカルマシンからインスタンスへのデータ貼り付けのみを許可する制限を加えることで機密情報の持ち出しを防ぎます。


クリップボードでリモートへの貼り付けのみ許可する設定

またAppStream2.0からインターネット利用する場合は、AWS NetWork Firewall[6]によるアウトバウンド通信制御で指定されたサイト以外へのアクセスを遮断し、機密情報を外部へ漏洩させないようにします。

弊社ドメインは許可しているのでサイト表示できますが、許可していないBingはこのようにサイトが閲覧できなくなっております。

Network Firewallのルールグループでドメイン制御している

AppStream2.0へのアクセス制御

冒頭でもお伝えしたとおりAppStream2.0はIAM Identity Centerと連携することで特定グループ、ユーザーのみ利用できるようにアクセス制御を管理できます。

このようにAWSアクセスポータルからAppStream2.0を起動できますので、AWSに慣れてない人でもすぐにオペレーション環境へ入れます。


私のアカウント権限では本番環境へ起動できないためstg環境のみ表示されています

AppStream2.0とIAM Identity Centerの連携方法については公式の手順を御覧ください。
https://static.global.sso.amazonaws.com/app-eb7f4060188865be/instructions/index.htm

また本番環境へアクセスできるエリアに対しても制限をかけており、機密情報を扱うセキュリティエリアでは私達が普段使うオフィスのVPNとは異なるものを使用しています。
セキュリティエリアのVPN接続のみ許可するようにすることで、自宅や別エリアからアクセスさせないようにしています。


動作確認時に検証した接続失敗画面

EntraIDによる一時認証利用

ここまでで機密情報を扱うオペレーション環境へのアクセス制限について紹介しましたが、より厳しくするならセキュリティエリア内とは言え無断で本番環境へアクセスして、機密情報を勝手に閲覧することを防ぐことも必要です。
弊社はEntra ID[7]を使ってAWSなどのシステム認証を管理していますが、特権管理ID(PIM)を使うことで事前承認された時間帯にてAppStream2.0を一時利用できるようにしています。

https://www.microsoft.com/ja-jp/security/business/identity-access/microsoft-entra-privileged-identity-management-pim

AppStream2.0起動希望者がEntra IDから申請事項と希望時間を記載して、承認者へ申請します。


申請者側のEntraID画面

申請者から承認がきましたら承認者は内容を確認し、承認することで決まった時間帯のみにオペレーション環境へアクセスできるようになります。

承認者側のEntraID画面

コストについて

AppStream2.0を使った環境基盤のコスト面について説明します。AppStream2.0は常時稼働するalwaysタイプと利用時のみ稼働するオンデマンドタイプがあり、オンデマンドタイプなら利用していないときはコストがかかりません。オートスケールにも対応しており、CPU使用率の稼働状況に応じてスケールアウト・インして自動で台数を調整できます。
参考までに同じくらいのコンピューティングスペックでWorkSpacesと比較したところ約11倍ほど差がありました。[8]

AppStream2.0 WorkSpaces
月額コスト $4.19 $45.00

WorkSpaces Poolsはどうなの?

2024年6月にAWSからWorkSpacesの新機能としてWorkSpaces Poolsが発表されました。
https://aws.amazon.com/jp/about-aws/whats-new/2024/06/amazon-workspaces-pools-amazon-workspaces/

WorkSpaces Poolもオートスケールが可能、内部に永続領域を持たず終了時にデータを削除するなどAppStream2.0同様のことができます。ただAppStream2.0はImage Builderで提供されているベースイメージを基としたカスタムイメージの作成ができる分、今回のように起動時に自動実行するスクリプトセッションをセットするなどの要件があるならAppStream2.0を使ったほうが構築しやすいと思います。

所感

AppStream2.0を活用した一時利用オペレーション環境の構築について紹介しました。機密情報を扱う業務については一段と厳しいセキュリティ要件が求められます。
依頼が来たときは引き渡しまであまり時間がない中構築しましたが、AppStream2.0を使うことで、運用環境の恒常的なメンテナンスが不要になり、利用できる制限についても元々あったセキュリティ要件を満たせるものになりましたので個人的には満足のいくものを作れたと思いました。

AppStream2.0は別プロジェクトでも現在活用を進めており、完成できましたらまたブログでご紹介したいと思います。

採用宣伝

📣ウェルスナビでは一緒に働く仲間を募集しています📣

https://hrmos.co/pages/wealthnavi/jobs?category=1999277254822936577

https://recruit.wealthnavi.com/

参考文献

https://dev.classmethod.jp/articles/web-access-workspaces-vs-appstream-2-0/
https://aws.amazon.com/jp/blogs/psa/apn-ambassadors-blog-004/
https://tech.layerx.co.jp/entry/2024/05/01/111747
https://dev.classmethod.jp/articles/amazon-workspaces-supports-workspaces-pools/

プロフィール

森 祐太朗
システム基盤グループ システム基盤チーム所属
新卒の会社で金融機関のシステム運用を経験。その後複数の転職を経てウェルスナビ株式会社にSREとして入社。現在は資産運用サービスや新規プロダクトのインフラ環境構築を中心にサービス運用改善、監視運用、IaC開発などを担当しています。

脚注
  1. https://aws.amazon.com/jp/what-is/end-user-computing/ ↩︎

  2. https://aws.amazon.com/jp/workspaces-family/workspaces/ ↩︎

  3. https://business.ntt-east.co.jp/content/cloudsolution/column-310.html ↩︎

  4. https://aws.amazon.com/jp/iam/identity-center/ ↩︎

  5. https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3/sync.html ↩︎

  6. https://aws.amazon.com/jp/network-firewall/ ↩︎

  7. https://www.microsoft.com/ja-jp/security/business/identity-access/microsoft-entra-id ↩︎

  8. AWS pricing calculatorより算出(https://calculator.aws/#/) ↩︎

  9. AppStream2.0はstream.standard.medium、WorkSpacesはStandardを選択 ↩︎

GitHubで編集を提案
WealthNavi Engineering Blog

Discussion