はじめに
社内の回線メンテナンスがあり、急ぎ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ロールから作成します。
IAMダッシュボード画面の左メニューから、
ロール
をクリックします。信頼されたエンティティを選択
画面に遷移後、信頼されたエンティティタイプAWSのサービス
をクリックします。- 続いてサービスまたはユースケースで
EC2
を選択し、次へをクリックします。 許可を追加
画面では、AmazonSSMManagedInstanceCore
を選択し、次へをクリックします。名前、確認、および作成
画面でロール名を入力します。ここでは、ec2-ssm-role
としています。ロール名入力後、ロールを作成をクリックします。
これでIAMロールの作成は完了です。
IAMロールのアタッチ
続いて作成したIAMロールをWindowsサーバにアタッチします。
- EC2ダッシュボード画面の左メニューから、
インスタンス
をクリックします。 - インスタンス一覧の画面から先ほど構築したWindowsサーバを選択し、画面上部のアクション→セキュリティ→
IAMロールを変更
をクリックします。 - 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
それではエンドポイントを作成します。
- VPCダッシュボード画面の左メニューから、
エンドポイント
をクリックします。 - エンドポイント一覧画面に遷移後、画面右上にある
エンドポイントを作成
をクリックします。 - エンドポイントを作成画面に遷移したら、以下の項目を入力、選択し、エンドポイントを作成をクリックします。
・ タイプは、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.ssm
、com.amazonaws.ap-northeast-1.ssmmessages
についても同様に作成します。
エンドポイントの作成が完了したらWindowsサーバを再起動します。
以上で、接続の準備は完了します。
フリートマネージャーでリモートデスクトップ接続
この状態で、セッションマネージャーからWindowsサーバに接続すると、PowerShellのコンソールに接続します。
ただし、今回はリモートデスクトップで接続したいため、リモートデスクトップでのアクセスを試してみます。
リモートデスクトップで接続する方法として、AWS Systems Managerのフリートマネージャー
を使用します。
- EC2一覧画面で先ほど構築したWindowsサーバを選択し、画面上部の
接続
をクリック - インスタンスに接続画面で
RDPクライアント
タブをクリックし、画面内でFleet Managerを使用して接続する
を選択し、Fleet Manager Remote Desktop
をクリックします。 - リモートデスクトップ画面に遷移するので、認証タイプに
ユーザー認証情報
を選択した状態で、以下の情報を入力し、接続をクリックします。
・ ユーザ名:Administrator
・ パスワード:キーペアから取得したパスワード
※パスワードの詳細は、前回記事のWindowsパスワード
の項目を参照
以上の手順でWindowsサーバにリモートデスクトップ接続できます。
【補足】
フリートマネージャーからの接続は、AWS Systems Manager→フリートマネージャーで、フリートマネージャー一覧画面に遷移後、マネージドノードからリモートデスクトップする対象を選択し、ノードアクション→接続→リモートデスクトップで接続からでも実施できます。
PCからのリモートデスクトップ
これまで説明した手順は、AWSマネジメントコンソールからリモートデスクトップする手順となります。ここからは、普段利用しているPCからリモートデスクトップする手順について説明します。PCからリモートデスクトップするためには、セッションマネージャーでポートフォワードする必要があります。
IAM関連作業
PCからリモートデスクトップを行うために以下の作業を行います。
- IAMポリシーの作成
- IAMポリシーのアタッチ
IAMポリシーの作成
それではPCからAWS Systems Managerの利用とポートフォワードを許可するためにIAMポリシーを作成します。
- IAMダッシュボード画面の左メニューから、
ポリシー
をクリックします。 - ポリシー画面の右上にある、
ポリシーの作成
をクリックします。 - アクセス許可を指定画面に遷移するので、ポリシーエディターを
JSON
に変更します。 - ポリシーエディターに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ポリシーをアタッチした方が管理しやすいと思います。
- IAMダッシュボード画面の左メニューから、
ユーザ
をクリックします。 - ユーザー画面の右上にある、
ユーザーの作成
をクリックします。 - ユーザーの詳細を指定画面に遷移するので、ユーザ名を入力し、次へをクリックします。今回は、ユーザ名を
maintenance-user
、AWSマネジメントコンソールへの接続は想定していないため、AWSマネジメントコンソールへのユーザーアクセスを提供する
オプションにチェックを入れずに進めています。 - 許可を設定画面で
ポリシーを直接アタッチする
を選択し、先ほど作成したssm-user-policy
とAmazonSSMFullAccess
を選択し、次へをクリックします。 確認して作成画面で、ユーザ名とアタッチするポリシー名を確認して、
ユーザーの作成
をクリックします。これでmaintenance-userが作成されます。
続いてPCからAWS Systems Managerに接続するために、アクセスキーの作成を行います。
- ユーザー画面で作成したmaintenance-userをクリックします。
- maintenance-userの詳細画面に遷移後、
セキュリティ認証情報
タブをクリックします。 - アクセスキーの項目から
アクセスキーを作成
をクリックします。 主要なベストプラクティスと代替案にアクセスする
画面のユースケースからコマンドラインインターフェイス(CLI)
を選択し、上記のレコメンデーションを理解し、アクセスキーを作成します。
にチェックを入れ、次へをクリックします。説明タグを設定
画面に遷移するので、アクセスキーの作成
をクリックします。- アクセスキーが作成されるので、
.csvファイルをダウンロード
をクリックし、アクセスキーの情報を取得後、完了をクリックします。
以上でIAMポリシーのアタッチに関連する作業は完了です。
※ダウンロードしたアクセスキーをPCに設定する必要があります。設定方法については、Appendixに記載した【AWS】SSMを使ったポートフォワードで、Windows端末からEC2に接続
の設定手順を参考に行ってください。
リモートデスクトップ接続
リモートデスクトップで接続するためには、以下の順番で作業を行います。
- AWS Systems Managerでポートフォワードを実行
- リモートデスクトップ接続
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サーバを運用できます。設定は簡単なのでぜひ試してください。