💻

VPN環境で安全な初心者向けハンズオンを作ってみた

2023/03/31に公開

はじめに

AWS初心者向けのハンズオンで構築するEC2は、インターネット接続が可能な場合が多いと思います。
一時的なAWSアカウントでハンズオンを実施する場合は気にならないかもしれませんが、
普段から使用中のAWSアカウントで初心者でも安全に進められるセキュアな環境が必要とされたりします。
今回は、安全な初心者向けハンズオン環境を作成してみました。

ハンズオンの目的

AWSを使えば開発環境を準備することが容易であることを体験することを目的としました。

要件

  1. AWS上の開発環境はWindowsを想定
  2. WindowsにはTomcatがインストールされている
  3. AWSに全く触ったことがない受講者もいる
  4. VPN環境はポート番号3389のリモートデスクトップ接続禁止
  5. 受講者のPCはシンクライアントでツールのインストールは不可(ブラウザを使ったHTTPS接続は可能)

どんな環境にしたか

要件1, 2について

  • あらかじめWindowsにTomcatをインストールしたAMIを用意する。

要件3について

  • Tomcatを起動すると、デフォルトで8080ポートで待ち受ける。
    これを全世界に公開するのはセキュリティ上好ましくないし、AWS初心者がセキュリティの設定をするのは難易度が高い。
    →プライベートサブネットでEC2インスタンスを作成・起動するようにする。

要件4, 5について

  • Widowsのデスクトップにアクセスできるようにしたい。
    →Fleet Managerを使ってみる。

Fleet Managerとは

AWS Systems Managerの中の一つの機能であり、リモートデスクトッププロトコル(RDP)でWindowsのインスタンスに接続することができます。
デスクトップがブラウザで表示されるので、ブラウザでHTTPS接続ができる環境であれば、制約の多いVPN環境でも使うことができます。

ハンズオン環境構成図

次のような構成にしました。
VPCやSystems Managerなど、ネットワーク関連のリソースは事前に構築しておき、
受講者がAMIを使ってEC2インスタンスの作成→起動→停止→削除ができるようにします。

権限の設定

受講者用のIAMユーザを作成し、ポリシーをアタッチします。
AmazonEC2FullAccessの他に、Fleet Managerが使えるように次のポリシーを追加しました。

Fleet Managerのポリシー
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "EC2",
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeInstances",
                "ec2:GetPasswordData"
            ],
            "Resource": "*"
        },
        {
            "Sid": "IAM",
            "Effect": "Allow",
            "Action": [
                "iam:ListInstanceProfiles",
                "iam:PassRole"
            ],
            "Resource": "*"
        },
        {
            "Sid": "SSM",
            "Effect": "Allow",
            "Action": [
                "ssm:DescribeInstanceProperties",
                "ssm:DescribeInstanceInformation",
                "ssm:GetCommandInvocation",
                "ssm:GetConnectionStatus",
                "ssm:GetInventorySchema"
            ],
            "Resource": "*"
        },
        {
            "Sid": "TerminateSession",
            "Effect": "Allow",
            "Action": [
                "ssm:TerminateSession"
            ],
            "Resource": "*",
            "Condition": {
                "StringLike": {
                    "ssm:resourceTag/aws:ssmmessages:session-id": [
                        "${aws:userid}"
                    ]
                }
            }
        },
        {
            "Sid": "SSMStartSession",
            "Effect": "Allow",
            "Action": [
                "ssm:StartSession"
            ],
            "Resource": [
                "arn:aws:ec2:*:account-id:instance/*",
                "arn:aws:ssm:*:account-id:managed-instance/*",
                "arn:aws:ssm:*::document/AWS-StartPortForwardingSession"
            ],
            "Condition": {
                "BoolIfExists": {
                    "ssm:SessionDocumentAccessCheck": "true"
                }
            }
        },
        {
            "Sid": "GuiConnect",
            "Effect": "Allow",
            "Action": [
                "ssm-guiconnect:CancelConnection",
                "ssm-guiconnect:GetConnection",
                "ssm-guiconnect:StartConnection"
            ],
            "Resource": "*"
        }
    ]
}

マネージメントコンソールで初心者の方が権限エラーに遭遇して焦らないように、
Fleet Managerの標準ポリシーの他、以下のアクションを追加しています。(上記のポリシーに含んでいます。)

  • iam:ListInstanceProfiles
  • iam:PassRole
  • ssm:DescribeInstanceInformation
  • ssm:GetConnectionStatus

RDPの同時接続数

1つのAWSアカウントにおいて、RDPの同時接続数の上限がリージョンごとに設定されています。
同時にハンズオンを実施する受講者が多いと、上限に到達してしまう可能性があります。
下記、公式ドキュメントの抜粋です。必要に応じて上限緩和申請を出しましょう。

デフォルトでは、同じ AWS アカウント と AWS リージョン で最大 5 つの同時 Fleet Manager RDP 接続を設定できます。Service Quotas コンソールを使用して、最大 25 の同時 RDP 接続の Service Quotas の引き上げをリクエストできます。詳細については、「Service Quotas ユーザーガイド」の「クォータ引き上げのリクエスト」を参照してください。

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/fleet-rdp.html

まとめ

今回は、ハンズオン環境の概要を説明しました。
またの機会に、ハンズオン環境の構築について記事を書いてみたいと思います。

Discussion