AWS Systems Manager セッションマネージャーで Windows 10 でSSH・SCPしてみた
しばたです。
先日Developers.IOで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クライアント環境でも恩恵を受けることができますので是非活用してみてください。
少し細かい話をすると今は https://github.com/PowerShell/Win32-OpenSSH から https://github.com/PowerShell/openssh-portable にリポジトリが移行されています。 ↩︎
記事公開時はLinux向け手順しかありませんでした... ↩︎