技術2課の松田です。こんにちは。
Fleet Managerのリモートデスクトップ(RDP)接続に関する小ネタをいくつかまとめましたのでご紹介します。
Fleet Manager is 何
簡単にまとめると、Fleet ManagerはAWS Systems Manager(以下、SSM)の機能の一つで、SSMのマネージドノード(エージェントツールをインストールしたサーバー)に対しAWSマネジメントコンソールから様々なタスクを実行できるというものです。RDP接続はこの「タスク」に含まれており、これを実行することでWebブラウザ上でのOSログインが可能というわけですね。
具体的には以下に記載されているのですが、超要約すると、本来OSログインしないとできない操作がマネジメントコンソールから可能になるという感じですね。
ちなみにマネージドノードは、SSMのコンソールでは以下の様に表示されます。
RDP接続してみる
Windows OSのEC2インスタンスを対象として、Fleet ManagerからRDP接続してみます。
前提条件
Fleet ManagerからRDP接続するには、以下の前提条件を満たす必要があります。
- 対象のインスタンスがインターネットにアクセス可能なこと
- 厳密には「SSMエンドポイントにアクセス可能なこと」
- インターネットアクセスの代替として、VPCエンドポイント経由でのアクセスも可能(参考)
- 対象のインスタンスにSSM Agentがインストールされていること
- Windowsインスタンスは基本プリインストール済(参考)
- 蛇足ですが、日本語版の公式ドキュメントだとWindows Server 2022はプリインストールされてないことになっていますが、実際にはプリインストールされています。(2022/07/19時点)
- 対象のインスタンスに必要なIAMインスタンスプロファイルが適用されていること
- マネージドポリシー
AmazonSSMManagedInstanceCore
を使うのが簡単
- マネージドポリシー
事前準備の詳細は以下のドキュメントをご参照ください。
事前準備が完了すると、Fleet ManagerのManaged nodesにインスタンスが表示されるようになります。
接続してみる
RDP接続したいインスタンスを選択し、「Node actions」→「Connect with Remote Desktop」→ID/パスワードかキーペアを選択して「Connect」とするとインスタンスに接続できます。
という感じで、無事にRDP接続できました。
さて長くなってしまいましたが、ここまでが前置きになります。いよいよ本題に入りますが、小ネタなのでサクッと終わってしまってもご容赦ください。
コピペができない問題の対処方法
無事にRDP接続した後は、当然ですがOS上で何らかの作業を行うと思います。ここで重要なのが、「ローカル→リモートサーバーへのコピペができるかどうか」です。
例えばですが、Powershellをゴリゴリ使う作業で、いざサーバーにRDP接続したら手元の端末で準備したスクリプトがコピペできない...なんてことになるとだいぶ悲惨です。
そんな時はブラウザの設定を変更してみます。Chromeの場合、以下を試してみてください。
chrome://settings/content
にアクセス→「すべてのサイトに保存されている権限とデータを表示」→「サイト」でap-northeast-1.console.aws.amazon.com
とかを選択→「クリップボード」を「許可」に変更
Chrome以外のブラウザに関しても、「Firefox クリップボード 許可」とかでググれば出てくるんじゃないかと思います(ぶん投げ
リモートデスクトップ接続に必要なIAM権限
こちらの公式ドキュメントにある通り、Fleet ManagerからRDP接続を行うには、以下のアクションを許可する必要があります。
Systems Manager および Session Manager に必要な AWS Identity and Access Management (IAM) アクセス許可に加えて、コンソールへのアクセスに使用するユーザーまたはロールは、以下のアクションも許可している必要があります。
ssm-guiconnect:CancelConnection
ssm-guiconnect:GetConnection
ssm-guiconnect:StartConnection
調べてみて知ったのですが、RDP接続のためのアクションは「ssm
ではなくssm-guiconnect
サービスに属する」扱いとなっています。
IAMポリシーのビジュアルエディタを見てみると、「GUI Connect」がサービスという括りで用意されています。
これはつまりRDP接続に必要なアクションがssm:*
に含まれないことを意味しますので、AWS管理ポリシーであるAmazonSSMFullAccess
を付与されたユーザーでも、Fleet ManagerからのRDP接続はできないということになります。
ただし今後のアップデートで改修される可能性も十分にありますので、あくまで本記事執筆時点(2022年7月)での情報とご理解ください。
サンプルのIAMポリシー①
RDP接続を含むFleet Managerの利用権限を付与するIAMポリシーのサンプルです。
{ "Version":"2012-10-17", "Statement":[ { "Sid":"EC2", "Effect":"Allow", "Action":[ "ec2:CreateTags", "ec2:DeleteTags", "ec2:DescribeInstances", "ec2:DescribeTags" ], "Resource":"*" }, { "Sid":"General", "Effect":"Allow", "Action":[ "ssm:AddTagsToResource", "ssm:DescribeInstanceAssociationsStatus", "ssm:DescribeInstancePatches", "ssm:DescribeInstancePatchStates", "ssm:DescribeInstanceProperties", "ssm:GetCommandInvocation", "ssm:GetServiceSetting", "ssm:GetInventorySchema", "ssm:ListComplianceItems", "ssm:ListInventoryEntries", "ssm:ListTagsForResource", "ssm:ListCommandInvocations", "ssm:ListAssociations", "ssm:RemoveTagsFromResource" ], "Resource":"*" }, { "Sid":"SendCommand", "Effect":"Allow", "Action":[ "ssm:GetDocument", "ssm:SendCommand", "ssm:StartSession" ], "Resource":[ "arn:aws:ec2:*:account-id:instance/*", "arn:aws:ssm:*:account-id:managed-instance/*", "arn:aws:ssm:*:account-id:document/SSM-SessionManagerRunShell", "arn:aws:ssm:*:*:document/AWS-PasswordReset", "arn:aws:ssm:*:*:document/AWSFleetManager-AddUsersToGroups", "arn:aws:ssm:*:*:document/AWSFleetManager-CreateGroup", "arn:aws:ssm:*:*:document/AWSFleetManager-CreateUser", "arn:aws:ssm:*:*:document/AWSFleetManager-CreateUserInteractive", "arn:aws:ssm:*:*:document/AWSFleetManager-CreateWindowsRegistryKey", "arn:aws:ssm:*:*:document/AWSFleetManager-DeleteGroup", "arn:aws:ssm:*:*:document/AWSFleetManager-DeleteUser", "arn:aws:ssm:*:*:document/AWSFleetManager-DeleteWindowsRegistryKey", "arn:aws:ssm:*:*:document/AWSFleetManager-DeleteWindowsRegistryValue", "arn:aws:ssm:*:*:document/AWSFleetManager-GetFileContent", "arn:aws:ssm:*:*:document/AWSFleetManager-GetFileSystemContent", "arn:aws:ssm:*:*:document/AWSFleetManager-GetGroups", "arn:aws:ssm:*:*:document/AWSFleetManager-GetPerformanceCounters", "arn:aws:ssm:*:*:document/AWSFleetManager-GetUsers", "arn:aws:ssm:*:*:document/AWSFleetManager-GetWindowsEvents", "arn:aws:ssm:*:*:document/AWSFleetManager-GetWindowsRegistryContent", "arn:aws:ssm:*:*:document/AWSFleetManager-RemoveUsersFromGroups", "arn:aws:ssm:*:*:document/AWSFleetManager-SetWindowsRegistryValue" ], "Condition":{ "BoolIfExists":{ "ssm:SessionDocumentAccessCheck":"true" } } }, { "Sid":"TerminateSession", "Effect":"Allow", "Action":[ "ssm:TerminateSession" ], "Resource":"*", "Condition":{ "StringLike":{ "ssm:resourceTag/aws:ssmmessages:session-id":[ "${aws:userid}" ] } } }, { "Sid":"KMS", "Effect":"Allow", "Action":[ "kms:GenerateDataKey" ], "Resource":[ "arn:aws:kms:region:account-id:key/key-name" ] }, { "Sid":"RDP", "Effect": "Allow", "Action": [ "ssm-guiconnect:CancelConnection", "ssm-guiconnect:GetConnection", "ssm-guiconnect:StartConnection" ], "Resource": "*" } ] }
ちなみに元ネタはこちら。丸パクリですね
サンプルのIAMポリシー②
AWS管理ポリシーであるAmazonSSMFullAccess
にRDP接続の権限を追加したものです。需要無さそう
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "cloudwatch:PutMetricData", "ds:CreateComputer", "ds:DescribeDirectories", "ec2:DescribeInstanceStatus", "logs:*", "ssm:*", "ec2messages:*" ], "Resource": "*" }, { "Effect": "Allow", "Action": "iam:CreateServiceLinkedRole", "Resource": "arn:aws:iam::*:role/aws-service-role/ssm.amazonaws.com/AWSServiceRoleForAmazonSSM*", "Condition": { "StringLike": { "iam:AWSServiceName": "ssm.amazonaws.com" } } }, { "Effect": "Allow", "Action": [ "iam:DeleteServiceLinkedRole", "iam:GetServiceLinkedRoleDeletionStatus" ], "Resource": "arn:aws:iam::*:role/aws-service-role/ssm.amazonaws.com/AWSServiceRoleForAmazonSSM*" }, { "Effect": "Allow", "Action": [ "ssmmessages:CreateControlChannel", "ssmmessages:CreateDataChannel", "ssmmessages:OpenControlChannel", "ssmmessages:OpenDataChannel" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "ssm-guiconnect:CancelConnection", "ssm-guiconnect:GetConnection", "ssm-guiconnect:StartConnection" ], "Resource": "*" } ] }
サンプルのIAMポリシー③
RDP接続以外何もいらねえ!という潔い人向け。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssm-guiconnect:CancelConnection", "ssm-guiconnect:GetConnection", "ssm-guiconnect:StartConnection", "ssm:ResumeSession", "ssm:DescribeSessions", "ssm:TerminateSession", "ssm:StartSession", "ssm:DescribeInstanceProperties", "ssm:GetInventorySchema", "ssm:ListInstanceAssociations", "ec2:describeInstances", "ec2:GetPasswordData" ], "Resource": "*" } ] }
おわりに
ssm-guiconnect
の存在は初めて知ったのでへえ~って感じでした。IAM設計をするときは、知らないと案外ハマりポイントになるかもしれませんね。
ということで、ややニッチなネタですが紹介でした。
松田 渓(記事一覧)
2021年10月入社。所属はエンタープライズクラウド部技術1課。
最近普通二輪免許を取得しました。