この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。
こんにちは、協栄情報のきおかです。
今回は、Windowsを実行しているEC2インスタンスをGUI操作する方法をご紹介します。
具体的な方法としては、AWS Systems Managerのノード管理サービスの一つであるFleet Managerを利用します。
背景
WindowsノードにSession Managerで接続すると、CUIがデフォルトになっています。CUI初心者や非技術者用にGUI操作を設定したいです。
WindowsをGUI操作するメリット
AWSのWindowsノードでGUI操作を使うと、直感的な操作でタスクやソフトウェアのインストール・管理を実行できます。
また、マルチタスクやシステムの状態・進行中のタスクの進行状況も視覚的に把握できます。
以上から、例えば初心者や非技術者が利用する際に、相対的にメリットが多そうです。
Fleet Managerを利用するメリット
WindowsノードをGUI操作する方法は、RDP(Remote Desktop Protocol)での接続とFleet Managerでの接続、そしてSession Managerのポートフォワードを利用したRDP接続の3つがあります。今回は前の2つに集中したいと思います。
大まかな違いは以下に記載しています。
RDP | Fleet Manager | |
---|---|---|
操作性 | Windowsのリモートデスクトップ機能 | (GUI操作する場合は)ブラウザ |
設定 | セキュリティグループで3389ポートのインバウンド通信を許可 | ①SSM Agentのインストール ②IAMポリシーで AmazonSSMManagedInstanceCore の許可 |
危険性 | 3389ポート露出や認証周りのセキュリティ対策不足によるブルートフォースアタックやパスワードスプレーのリスク | AmazonSSMManagedInstanceCore (AWSマネージドポリシー)とSSM Agentに依存するため、直接的な接続リスクやアクセス権限周りのリスクが低い。 |
参考資料
こちらのAWS公式ドキュメントを参考にして、ハンズオンを作成しています。
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/fleet-rdp.html
下準備
今回の目的は、Windowsを実行しているEC2インスタンスをFleet ManagerでGUI操作することです。
なので構成はシンプルにパブリックサブネットにEC2インスタンスを配置するだけにします。
ちなみにプライベートサブネットに置いてFleet Managerでアクセスすることも可能ですが、VPCエンドポイントを設定する必要があります。今回の目的とは逸れるのでここでは割愛します。
VPC作成
まずVPCを作成します。
AZ | パブリックサブネット | プライベートサブネット |
---|---|---|
1個 | 1個 | 0個 |
セキュリティグループ作成
次にセキュリティグループ作成ですが、インバウンドの設定は不要です。
アウトバウンドですが、Fleet ManagerひいてはSystems ManagerではHTTPS通信が許可されている必要があります。
今回はデフォルトのまま、全てのアウトバウンドを許可しておきます。
IAMの作成とアタッチ
次にIAMコンソール画面からロールを作成します。以下2つのポリシーをアタッチします。
ポリシー名 | 目的 | 設定方法 |
---|---|---|
AmazonSSMManagedInstanceCore |
Systems Managerを使用するため(※)。 | AmazonSSMManagedInstanceCore はAWSマネージドポリシーなので、IAMポリシーの設定画面で検索すれば出てくるはずです。 |
任意の名前 | リモートデスクトップ(GUI操作)を許可するため | 下記で設定してください。詳しくはこちらのAWS公式ドキュメントをご参考ください。 |
リモートデスクトップを許可するポリシーの作成とアタッチ
以下はAWS公式ドキュメントが出している、「リモートデスクトップとのさまざまなタイプの対話を許可するためにユーザーまたはロールにアタッチできる IAM ポリシーの例」です。
下記コードのうち、Sid
がSSMStartSession
のResource
のarnのそれぞれのaccount-id
をご自身のアカウントIDに変更してください。コンソール画面の右上にある12ケタの数字です。ハイフンは不要です。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "EC2",
"Effect": "Allow",
"Action": [
"ec2:DescribeInstances",
"ec2:GetPasswordData"
],
"Resource": "*"
},
{
"Sid": "SSM",
"Effect": "Allow",
"Action": [
"ssm:DescribeInstanceProperties",
"ssm:GetCommandInvocation",
"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": "*"
}
]
}
EC2インスタンス作成
普段通り、EC2インスタンス作成をしてください。その中で特に今回の検証に必要な設定を下記に記載しました。
設定項目 | 設定値 | 説明 |
---|---|---|
AMI | Microsoft Windows Server 2022 Base (64ビット(x86) | 今回の検証対象です。AWS公式ドキュメント曰く、Windows Server 2012 RTM以降を実行しているインスタンスであればリモートデスクトップを使えるようです。 |
キーペア(ログイン) | ご自身のキーペア | キーペアがない方はこちらのAWS公式ドキュメントを参考に作成してください。 |
セキュリティグループ | 先ほど作成したセキュリティグループか、もしくはセキュリティグループを作成する でインバウンドRDPを削除。 |
Fleet Managerはインバウンドのポート開放は必要ありません。 |
IAM | 先ほど作成したロール | SSM Agentとリモートデスクトップに必要な許可を付与したIAMロールです。 |
ここまで設定出来たら作成してください。
EC2インスタンスにSession Managerで接続
まずはSession ManagerでEC2インスタンスに接続します。作成後に時間をおくとSession Managerで接続できるようになります。
以下の画面で接続
をクリックします。
SSM Agent(AWS Systems Manager Agent)がインストールされているか確認
Fleet Managerを利用するにあたって、3.0.222.0 以降のバージョンのSSM Agentをインストールしている必要があります。
以下のコマンドを実行してください。
& "C:\Program Files\Amazon\SSM\amazon-ssm-agent.exe" -version
私の場合、以下が出力されました。
SSM Agent version: 3.2.985.0
3.0.222.0 以降であれば大丈夫です。
PSReadLine 2.2.2以上をインストール
PSReadlineとは、接続先のPowershellで接続元のキーボード入力を正しく機能させるために必要なモジュールです。
Windows Server 2022では2.2.2以降が必要みたいです。他の世代のものではどうなのかの検証はまた別の機会に行います。
以下のコマンドで、どのバージョンがインストールされているかを確認します。
ls 'C:\Program Files\WindowsPowerShell\Modules\PSReadline\'
私のインスタンスでの出力結果は以下です。2.0.0でした。
PS C:\> ls 'C:\Program Files\WindowsPowerShell\Modules\PSReadline\'
Directory: C:\Program Files\WindowsPowerShell\Modules\PSReadline
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 5/8/2021 9:35 AM 2.0.0
それでは下記コマンドでPSReadlineモジュールの最新バージョンをインストールします。こちらのコマンドはMicrosoft公式ドキュメントより引用したものです。必要なリポジトリを聞かれたらYes
と答えてインストールしてもらいます。
Install-Module -Name PSReadLine -AllowClobber -Force
インストール時の画面は以下です。
PS C:\Windows\system32> Install-Module -Name PSReadLine -AllowClobber -Force
NuGet provider is required to continue
PowerShellGet requires NuGet provider version '2.8.5.201' or newer to interact with NuGet-based repositories. The NuGet provider must be available in 'C:\Program Files\PackageManagement\ProviderAssemblies' or
'C:\Windows\system32\config\systemprofile\AppData\Local\PackageManagement\ProviderAssemblies'. You can also install the NuGet provider by running 'Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force'. Do you want
PowerShellGet to install and import the NuGet provider now?
[Y] Yes [N] No [S] Suspend [?] Help (default is "Y"): Y
ではインストールできたか確認します。
PS C:\> ls 'C:\Program Files\WindowsPowerShell\Modules\PSReadline\'
Directory: C:\Program Files\WindowsPowerShell\Modules\PSReadline
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 5/8/2021 9:35 AM 2.0.0
d----- 5/27/2023 6:12 AM 2.2.6
以上で下準備は完了です。上記までの条件を満たした上で、リモートデスクトップ接続を行っていきます。
手順
Fleet Managerで接続する
EC2の接続画面からRDPクライアント
を選択して、Fleet Managerを使用して接続する
を選択します(※)。
※ちなみにAWS Systems Managerコンソール画面のFleet Manager
から対象のノードを選択するところからも接続可能です。今回は省略します。
では、Fleet Manager Remote Desktop
をクリックしてください。新しいタブでリモートデスクトップ接続する画面が開かれます。
Fleet Managerのキーペア設定
次に、キーペア
を選択して、参照
をクリックします。
指示に従ってキーペアを設定してください。設定したらConnect
を押して接続します。
リモートデスクトップ接続後の画面
接続が完了すると下記のような画面になります。
PowerShellの動作確認
最後に、PowerShellを開いてキーボード入力が認識されるか確認してください。確認できれば今回の検証は完了です。
まとめ
今回はWindowsを実行しているインスタンスに、WindowsをFleet Managerを使ってGUI操作する方法をご紹介しました。
今回の検証では、Fleet Managerを使えば、ポート開放せず安全な接続でWindowsノードをGUI操作できることがわかりました。
引き続きSSMは学んでいきたいです。
ではまた。