AWS Systems Manager Fleet ManagerのRDP接続に関する小ネタ:コピペ許可とかIAM権限とか

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

技術2課の松田です。こんにちは。

Fleet Managerのリモートデスクトップ(RDP)接続に関する小ネタをいくつかまとめましたのでご紹介します。

Fleet Manager is 何

簡単にまとめると、Fleet ManagerはAWS Systems Manager(以下、SSM)の機能の一つで、SSMのマネージドノード(エージェントツールをインストールしたサーバー)に対しAWSマネジメントコンソールから様々なタスクを実行できるというものです。RDP接続はこの「タスク」に含まれており、これを実行することでWebブラウザ上でのOSログインが可能というわけですね。

具体的には以下に記載されているのですが、超要約すると、本来OSログインしないとできない操作がマネジメントコンソールから可能になるという感じですね。

docs.aws.amazon.com

ちなみにマネージドノードは、SSMのコンソールでは以下の様に表示されます。

RDP接続してみる

Windows OSのEC2インスタンスを対象として、Fleet ManagerからRDP接続してみます。

前提条件

Fleet ManagerからRDP接続するには、以下の前提条件を満たす必要があります。

  • 対象のインスタンスがインターネットにアクセス可能なこと
    • 厳密には「SSMエンドポイントにアクセス可能なこと」
    • インターネットアクセスの代替として、VPCエンドポイント経由でのアクセスも可能(参考
  • 対象のインスタンスにSSM Agentがインストールされていること
    • Windowsインスタンスは基本プリインストール済(参考
    • 蛇足ですが、日本語版の公式ドキュメントだとWindows Server 2022はプリインストールされてないことになっていますが、実際にはプリインストールされています。(2022/07/19時点)
  • 対象のインスタンスに必要なIAMインスタンスプロファイルが適用されていること
    • マネージドポリシーAmazonSSMManagedInstanceCoreを使うのが簡単

事前準備の詳細は以下のドキュメントをご参照ください。

docs.aws.amazon.com

事前準備が完了すると、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": "*"
      }
   ]
}

ちなみに元ネタはこちら。丸パクリですね

docs.aws.amazon.com

サンプルの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月入社。散歩が得意です。