Techfirm Cloud Architect Blog

テックファーム株式会社クラウドインフラグループのブログ

Amazon EC2で稼働するWindows Serverにセッションマネージャで接続する

はじめに

社内の回線メンテナンスがあり、急ぎWindows環境を用意する必要があったため、Amazon EC2上にWindowsサーバの構築を行いました。こちらの手順は以前、Amazon EC2でWindows Serverを構築し、リモートデスクトップで接続するという記事にしました。この時は、Windowsサーバに直接EIPを割り当てて、リモートデスクトップ接続する方法を取りました。セキュリティグループでアクセス元は制限するものの、セキュリティを考慮すると直接グローバルIPアドレスを割り当てることは避けたいため、今回の記事ではグローバルIPアドレスの割り当ては行わずに、セッションマネージャーでWindowsサーバにアクセスする方法について説明します。

前提

今回の記事では、Windowsサーバの構築は行わないので、前回記事Amazon EC2でWindows Serverを構築し、リモートデスクトップで接続するを参考にWindowsサーバの構築を行ってください。

ネットワーク構成

Windowsサーバを構築するにあたり、配置するサブネットが必要になります。今回は外部からのアクセスを受け付けないサブネットにWindowsサーバを配置するため、maintenance-private1という名前でサブネットを作成しています。maintenance-private1のルートテーブルは、ローカルネットワークへのルーティングだけを登録しています。 ネットワーク構成
※本記事では、Windowsサーバから外部ネットワークへの通信環境の構築については説明していません。外部ネットワークと通信を行う場合は、NATゲートウェイの構築とプライベートサブネットのルートテーブルにNATゲートウェイへのルーティングを追加してください。

Windowsサーバの構築

前提で記載したとおり、本記事ではWindowsサーバの構築については記載しません。以前配信したAmazon EC2でWindows Serverを構築し、リモートデスクトップで接続するを参考に、Windowsサーバを構築してください。前回説明時からの変更点は以下の通りです。

  • ネットワーク設定でWindowsサーバを配置するサブネットは、maintenance-private1を選択しています。
  • セキュリティグループも一緒に作成しており、インバウンドルールに0.0.0.0/0からのHTTPSへのアクセスを許可します。
    ※本記事では、Windowsサーバと後述するエンドポイントに適用するセキュリティグループを同じものを適用しています。その為、0.0.0.0/0からのHTTPSへのアクセスを許可していますが、Windowsサーバとエンドポイントでセキュリティグループを分ける場合は、Windowsサーバに適用するインバウンドルールは無し、アウトバウンドルールは、エンドポイントに対するHTTPS通信が許可されていれば問題ありません。

IAMロールの作成

ここまでの手順でWindowsサーバの構築まで完了しました。ただし、プライベートネットワークにサーバを配置しているため、この状態ではサーバにアクセスすることはできません。まずは、AWS Systems Managerのフリートマネージャーを用いてリモートデスクトップでサーバにアクセスできるように設定してみます。必要な作業は、以下の4点となります。

  • IAMロールの作成
  • 作成したIAMロールをWindowsサーバにアタッチする
  • エンドポイントの作成
  • サーバ再起動

それではIAMロールから作成します。

  1. IAMダッシュボード画面の左メニューから、ロールをクリックします。

  2. 信頼されたエンティティを選択画面に遷移後、信頼されたエンティティタイプAWSのサービスをクリックします。

  3. 続いてサービスまたはユースケースでEC2を選択し、次へをクリックします。
  4. 許可を追加画面では、AmazonSSMManagedInstanceCoreを選択し、次へをクリックします。
  5. 名前、確認、および作成画面でロール名を入力します。ここでは、ec2-ssm-roleとしています。ロール名入力後、ロールを作成をクリックします。

これでIAMロールの作成は完了です。

IAMロールのアタッチ

続いて作成したIAMロールをWindowsサーバにアタッチします。

  1. EC2ダッシュボード画面の左メニューから、インスタンスをクリックします。
  2. インスタンス一覧の画面から先ほど構築したWindowsサーバを選択し、画面上部のアクション→セキュリティ→IAMロールを変更をクリックします。
  3. IAMロールを変更画面でWindowsサーバにアタッチするIAMロールを選択します。今回は先ほど作成したec2-ssm-roleを選択します。選択後、IAMロールの更新をクリックします。

以上の作業で、WindowsサーバにIAMロールがアタッチされました。

エンドポイントの作成

WindowsサーバからSystems Managerへのアクセス経路を作成するために以下のエンドポイントを作成します。

  • com.amazonaws.ap-northeast-1.ec2messages
  • com.amazonaws.ap-northeast-1.ssm
  • com.amazonaws.ap-northeast-1.ssmmessages

それではエンドポイントを作成します。

  1. VPCダッシュボード画面の左メニューから、エンドポイントをクリックします。
  2. エンドポイント一覧画面に遷移後、画面右上にあるエンドポイントを作成をクリックします。
  3. エンドポイントを作成画面に遷移したら、以下の項目を入力、選択し、エンドポイントを作成をクリックします。

 ・ タイプは、AWSのサービスを選択します
 ・ サービス一覧からcom.amazonaws.ap-northeast-1.ec2messagesを選択します
 ・ ネットワーク設定で、VPCはエンドポイントを利用するVPC(今回は、maintenance-vpc)を選択
 ・ DNS名を有効化にチェックが入っていること、DNSレコードのIPタイプがIPv4が選択されていることを確認
 ・ サブネットは、Windowsサーバが配置されているサブネット(今回は、maintenance-private1)を選択
 ・ セキュリティグループはエンドポイントへのHTTPSが許可されたもの(今回は、maintenance-private-sg)を選択

com.amazonaws.ap-northeast-1.ssmcom.amazonaws.ap-northeast-1.ssmmessagesについても同様に作成します。

エンドポイントの作成が完了したらWindowsサーバを再起動します。

以上で、接続の準備は完了します。

フリートマネージャーでリモートデスクトップ接続

この状態で、セッションマネージャーからWindowsサーバに接続すると、PowerShellのコンソールに接続します。 PowerShell

ただし、今回はリモートデスクトップで接続したいため、リモートデスクトップでのアクセスを試してみます。
リモートデスクトップで接続する方法として、AWS Systems Managerのフリートマネージャーを使用します。

  1. EC2一覧画面で先ほど構築したWindowsサーバを選択し、画面上部の接続をクリック
  2. インスタンスに接続画面でRDPクライアントタブをクリックし、画面内でFleet Managerを使用して接続するを選択し、Fleet Manager Remote Desktopをクリックします。
  3. リモートデスクトップ画面に遷移するので、認証タイプにユーザー認証情報を選択した状態で、以下の情報を入力し、接続をクリックします。

 ・ ユーザ名:Administrator
 ・ パスワード:キーペアから取得したパスワード
  ※パスワードの詳細は、前回記事のWindowsパスワードの項目を参照

以上の手順でWindowsサーバにリモートデスクトップ接続できます。 リモートデスクトップ

【補足】
フリートマネージャーからの接続は、AWS Systems Manager→フリートマネージャーで、フリートマネージャー一覧画面に遷移後、マネージドノードからリモートデスクトップする対象を選択し、ノードアクション→接続→リモートデスクトップで接続からでも実施できます。

PCからのリモートデスクトップ

これまで説明した手順は、AWSマネジメントコンソールからリモートデスクトップする手順となります。ここからは、普段利用しているPCからリモートデスクトップする手順について説明します。PCからリモートデスクトップするためには、セッションマネージャーでポートフォワードする必要があります。

IAM関連作業

PCからリモートデスクトップを行うために以下の作業を行います。

  1. IAMポリシーの作成
  2. IAMポリシーのアタッチ
IAMポリシーの作成

それではPCからAWS Systems Managerの利用とポートフォワードを許可するためにIAMポリシーを作成します。

  1. IAMダッシュボード画面の左メニューから、ポリシーをクリックします。
  2. ポリシー画面の右上にある、ポリシーの作成をクリックします。
  3. アクセス許可を指定画面に遷移するので、ポリシーエディターをJSONに変更します。
  4. ポリシーエディターにIAMポリシーを記載します。今回記載するIAMポリシーは、AWS公式が用意しているサンプルポリシーをベースに作成を行います。

サンプルのIAMポリシーから以下を変更しています。
※変更点については、Appendixに記載した過去記事を参考にしています。

変更点:

  • EC2コンソールから接続するためにssm:DescribeInstanceInformationを追加
  • KMSキーによるセッションデータの暗号化はデフォルトで無効化状態のため、該当する部分を削除
  • ポートフォワードを行うためにAction:"ssm:StartSession"のブロックに、Resource:"arn:aws:ssm:ap-northeast-1::document/AWS-StartPortForwardingSession"を追加
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:StartSession"
            ],
            "Resource": [
                "arn:aws:ec2:ap-northeast-1:<AWSアカウントID>:instance/<WindowsサーバのインスタンスID>",
                "arn:aws:ssm:ap-northeast-1:<AWSアカウントID>:document/SSM-SessionManagerRunShell",
                "arn:aws:ssm:ap-northeast-1::document/AWS-StartPortForwardingSession"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ssm:DescribeSessions",
                "ssm:GetConnectionStatus",
                "ssm:DescribeInstanceProperties",
                "ssm:DescribeInstanceInformation",
                "ec2:DescribeInstances"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ssm:TerminateSession",
                "ssm:ResumeSession"
            ],
            "Resource": [
                "arn:aws:ssm:*:*:session/${aws:userid}-*"
            ]
        }
    ]
}

 
5. ポリシーエディターでエラーが出ていないことを確認して次へをクリックします。
6. 確認して作成画面に遷移するのでポリシー名を入力し、ポリシーの作成をクリックします。今回はポリシー名をssm-user-policyとしています。

以上でIAMポリシーの作成は完了です。

IAMポリシーのアタッチ

続いて作成したIAMポリシーをアタッチします。今回はメンテナンス用のIAMユーザを作成し、直接IAMポリシーをアタッチします。またAWS Systems Managerを実行するためにAmazonSSMFullAccessもアタッチします。
※複数ユーザがリモートデスクトップを利用する場合は、IAMグループにIAMポリシーをアタッチした方が管理しやすいと思います。

  1. IAMダッシュボード画面の左メニューから、ユーザをクリックします。
  2. ユーザー画面の右上にある、ユーザーの作成をクリックします。
  3. ユーザーの詳細を指定画面に遷移するので、ユーザ名を入力し、次へをクリックします。今回は、ユーザ名をmaintenance-user、AWSマネジメントコンソールへの接続は想定していないため、AWSマネジメントコンソールへのユーザーアクセスを提供するオプションにチェックを入れずに進めています。
  4. 許可を設定画面でポリシーを直接アタッチするを選択し、先ほど作成したssm-user-policyAmazonSSMFullAccessを選択し、次へをクリックします。
  5. 確認して作成画面で、ユーザ名とアタッチするポリシー名を確認して、ユーザーの作成をクリックします。

    これでmaintenance-userが作成されます。

続いてPCからAWS Systems Managerに接続するために、アクセスキーの作成を行います。

  1. ユーザー画面で作成したmaintenance-userをクリックします。
  2. maintenance-userの詳細画面に遷移後、セキュリティ認証情報タブをクリックします。
  3. アクセスキーの項目からアクセスキーを作成をクリックします。
  4. 主要なベストプラクティスと代替案にアクセスする画面のユースケースからコマンドラインインターフェイス(CLI)を選択し、上記のレコメンデーションを理解し、アクセスキーを作成します。にチェックを入れ、次へをクリックします。
  5. 説明タグを設定画面に遷移するので、アクセスキーの作成をクリックします。
  6. アクセスキーが作成されるので、.csvファイルをダウンロードをクリックし、アクセスキーの情報を取得後、完了をクリックします。

以上でIAMポリシーのアタッチに関連する作業は完了です。

※ダウンロードしたアクセスキーをPCに設定する必要があります。設定方法については、Appendixに記載した【AWS】SSMを使ったポートフォワードで、Windows端末からEC2に接続の設定手順を参考に行ってください。

リモートデスクトップ接続

リモートデスクトップで接続するためには、以下の順番で作業を行います。

  1. AWS Systems Managerでポートフォワードを実行
  2. リモートデスクトップ接続

AWS Systems Managerでポートフォワードを実行

リモートデスクトップで接続する前に、AWS Systems Managerでポートフォワードを実行します。コマンドプロンプトを起動し、以下のコマンドを実行します。

aws ssm start-session --profile プロファイル名 --target i-xxxxxxxxxxxxxxxxx --document-name AWS-StartPortForwardingSession --parameters "portNumber=3389, localPortNumber=13389"

※筆者の環境では、複数の接続先が登録されているため、プロファイルとしてmaintenance-rdpという名で登録してあります。
※--targetでは、リモートデスクトップで接続するWindowsサーバのインスタンスIDを指定します。
※PCの13389番ポートに繋ぐことでWindowsサーバの3389番ポート(リモートデスクトップで使用するポート)にポートフォワードされるようにコマンドを実行しています。

コマンド実行すると以下のようなメッセージが表示され、接続を待ちます。

Starting session with SessionId: maintenance-user-xxxxxxxxxxxxxxxxxxxxxxxxxx
Port 13389 opened for sessionId maintenance-user-xxxxxxxxxxxxxxxxxxxxxxxxxx.
Waiting for connections..

リモートデスクトップ接続

13389番ポートで接続待ちの状態になったら、リモートデスクトップで接続を行います。
リモートデスクトップを起動し、以下のように入力を行います。

コンピューター:localhost:13389 リモートデスクトップ接続

localhost:13389と入力したら、接続をクリックします。
Administratorのパスワード入力画面が表示されるので、パスワードを入れてOKをクリックするとWindowsサーバにログインできます。

まとめ

今回紹介した方法で、インターネットへのアクセス経路がないWindowsサーバにログインできます。インターネットに面していないことで安全にWindowsサーバを運用できます。設定は簡単なのでぜひ試してください。

Appendix

【AWS】EC2の起動・停止を自動化する

【AWS】AWSマネジメントコンソールから、セッションマネージャーを使ってEC2に接続