AWS Systems Manager セッションマネージャーで Windows 10 でSSH・SCPしてみた

2019.07.18

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

しばたです。 先日Developers.IOでAWS Systems Manager セッションマネージャーでSSH・SCPできるようになりましたという記事が公開されました。

AWS Systems Manager セッションマネージャーでSSH・SCPできるようになりました

非常に便利なアップデートですね。

Windows 10はWindows 10 Fall Creators Update(1709)からOSに標準でOpenSSHのポートであるWin32-OpenSSHが組み込まれる様になっています。 *1 というわけで、本記事ではWindows 10に標準で搭載されているSSHクライアントを使いこの機能を試してみました。

クライアント環境

今回試すクライアント環境は以下となります。

  • 64bit版 Windows 10 May 2019 Update (1903)

このバージョンではデフォルトでSSHクライアント(ssh.exe)が利用可能です。

その他のバージョンでは機能の有効化などが必要になる場合があります。 詳細は私が以前書いた個人ブログの記事をご覧ください。

また、Windows 10以外のOSについては別途SSHクライアントをインストールしても良いでしょう。

サーバー環境

サーバー環境については先述の記事と同じにします。 (SSM Agentの更新手順については先述の記事の通りですので割愛します)

  • 最新のSSM Agent(Ver.2.3.672.0)をインストールしたAmazon Linux 2
  • AmazonSSMManagedInstanceCoreのポリシーを持つIAMロールをアタッチ済み
  • SSHのポート(TCP 22)は外部に公開しない
  • ただし、インスタンスからインターネット経由またはVPCエンドポイント経由でSSMのエンドポイントにアクセス可能である必要があります

クライアントの準備

SSMを使いSSH・SCPを行うにはSSHクライアント(ssh.exe)とは別に

  • AWS CLI
  • 非常に残念なのですが現時点ではAWS Tools for PowerShellは駄目でAWS CLIが必須です
  • Session Manager Plugin for the AWS CLI
  • SSHのProxyCommandで連携する際に必要です

が必要になります。

AWS CLIのインストール

Windowsに対してAWS CLIをインストールするにはいくつか方法がありますが、今回は64bit版 MSIインストーラーからインストールしました。

インストールオプションはすべてデフォルトのままとしました。 一応インストーラーのスクリーンショットを載せておきます。

aws configureといった初期設定は環境に応じて行ってください。

Session Manager Plugin for the AWS CLIのインストール

Session Manager Plugin for the AWS CLIのインストール手順は以下にあり、

Windowsでは専用のインストーラー(SessionManagerPluginSetup.exe)を使いインストールします。

こちらもインストーラーの指示に従うだけですが、スクリーンショットを載せておきます。

こちらはインストール後の設定は不要です。 最終的にインストールが終わった後の環境は以下の通りです。

SSHの設定

WindowsのSSHクライアントでもconfigファイルの保存先は変わらず~/.ssh/config([ユーザープロファイル]\.ssh\config)になります。

ここでSSHのProxyCommandの設定にaws ssm start-sessionコマンドを設定すれば良いのですがWindows環境ですので以下の様にC:\Program Files\Amazon\AWSCLI\bin\aws.exeとaws.exeのフルパスを記載してやります。 その他のパラメーターについては環境に応じて適宜変更してください。 (私の場合は前述の記事に対し--profileパラメーターを追加で指定しています)

# SSH over Session Manager
host i-* mi-*
    ProxyCommand C:\Program Files\Amazon\AWSCLI\bin\aws.exe ssm start-session --target %h --document-name AWS-StartSSHSession --parameters "portNumber=%p" --profile your-profile

また、SSHの鍵ファイルについては適切なアクセス権にしておいてください。

以上でクライアント環境の設定はすべて完了となります。 全体の構成図としては以下のイメージになります。

追記 : AWS公式ドキュメントとの違い

後日気が付いたのですが、AWS公式ドキュメントでも新たにWindows向けの手順が追記され *2以下の様にpowershell.exe経由でAWS CLI(aws ssm start-sessionコマンド)を呼び出す記述となっています。

# AWS公式ドキュメントではpowershell.exe経由でAWS CLIを実行している
host i-* mi-*
    ProxyCommand C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters portNumber=%p --profile your-profile"

最初に記述したAWS CLIを直接呼び出す形でもなんら問題は起きておらず、私としてはどちらでも大丈夫だと思っています。
ただ、公式の手順ではAWS CLIに対するPATHの解決をPowerShellに任せる形となっており、たとえばAWS CLIをデフォルト以外の場所にインストールした場合でも使えるメリットがありそうです。

試してみた

それでは実際に試していきます。

EC2 インスタンスに SSH

SSHコマンドで接続先ホストに該当EC2インスタンスのインスタンスIDを指定して接続してみます。

ssh -i [EC2キーペア].pem ec2-user@i-1234567890 -v

Windowsからでも無事接続できました。

SCP でファイル転送

続けてSCPでローカルファイルをアップロードしてみます。

# ファイル転送
scp -i [EC2キーペア].pem C:\temp\sample.txt ec2-user@i-1234567890:~/

# 転送結果の確認
ssh -i [EC2キーペア].pem ec2-user@i-1234567890 ls -al

ファイル転送もうまくいきました。

ポートフォワードしてWindows ServerにRDP接続する

前述の記事ではポートフォーワードでRDSに接続していましたが、本記事ではRDPをポートフォーワードして同一セグメントにあるWindows Server 2019に接続してみます。

構成としては上図の様になり、Windows Serverの設定はLinuxサーバーからRDPで接続可能にセキュリティグループを設定した事以外に特別な設定はしていません。

# ローカルホストは13389番ポートで受け、指定EC2の3389番ポートに転送
ssh -i  [EC2キーペア].pem ec2-user@i-1234567890 -L 13389:[Windows EC2のIPアドレス]:3389

この状態でローカルホストの13389番ポートに対してRDP接続をすると、

無事ポートフォーワード経由でRDP接続できました。

最後に

以上となります。 セッションマネージャーでSSH・SCPが可能になったアップデートですが、Windowsクライアント環境でも恩恵を受けることができますので是非活用してみてください。

脚注

  1. 少し細かい話をすると今はWin32-OpenSSHからopenssh-portableにリポジトリが移行されています。
  2. 記事公開時はLinux向け手順しかありませんでした...