EC2 上で稼動する Windows Server に向けて、公開鍵認証で SSH 接続するまでの設定手順を解説します。
執筆背景
EC2 上で稼働する Windows Server に接続したい場合は、「リモートデスクトップ(RDP)」が第一候補です。
RDP 接続により、リモートサーバに対して「使い慣れた Windows 画面での GUI 操作」が可能です。また、そのセッション内にて「PowerShell や CommandPrompt の起動、コマンド実行」も可能なため、aws-cli の ssm
で接続するよりも直感的に操作できます。
「人が直接操作する」のであれば RDP で十分ですが、システム運用状況によっては「Windows Server へ定期的に接続して対応する処理(ex. 定常業務)」も発生します。その自動化ニーズが発生することを踏まえると「Windows Server での CLI 操作」についても、一通りの知見を身に着けておくことが望ましいのではないでしょうか。
AWS が提供する Windows Server 用の AMIs には、デフォルトで SSM Agent がプリインストール されています。そのため、適切な IAM インスタンスプロファイルが付与されていれば、ssm
によるリモート接続が可能です。ただし、サーバ内の sshd service
はデフォルトでオフとなっているため、もし ssh
でリモート接続したい場合には、サーバ内での事前準備が必要となります。
本ブログでは、EC2 上の Windows Server に向けて、SSH で接続するまでの流れを解説します。
前提
本ブログの内容は、以下環境にて実行したものです。
1 | # EC2 の AMI |
Windows Server への SSH 接続に向けて、以下の流れで説明します。
- リモートデスクトップ(RDP)で Windows Server に接続し、sshd を立てる
- Windows Server に向けて、SSH で接続する
また、本手順では Windows Server 内部での設定のみを説明対象としているため、EC2 に紐づくセキュリティグループやサブネットのルートテーブルは、予め適切に設定されていることとします。
作業途中のトラブルシューティング用に「tips」を記載していますので、必要に応じて参照してください。
Windows Server に sshd を立てる
Windows Server に RDP(リモートデスクトップ)で接続して、サーバ内に sshd を立てるまでの流れを説明します。
RDP クライアントには、管理者権限を持つ Administrator を利用します。
OpenSSH.Server をインストールする
まず、RDP でサーバに接続したら、PowerShell を管理者権限で起動します。
以下コマンドを実行して、OpenSSH のインストール状況を確認します。
1 | Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*' |
EC2 立ち上げ直後の筆者環境(Windows_Server-2022-English-Full-Base-2024.01.16
)では、以下出力が得られました。
1 | Name : OpenSSH.Client~~~~0.0.1.0 |
State
の値により OpenSSH.Server のインストール有無を確認し、NotPresent
であれば、以下のインストールコマンドを実行します。
1 | # Server |
インストールコマンドの実行後、OpenSSH.Server の State
値が Installed
と表示されていれば、インストール作業は完了です。
1 | $ Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*' |
sshd service を起動する
管理者権限で Powershell を起動した状態で、以下のコマンドを実行します。
1 | # sshd の起動 |
サービスの起動状況は、Get-Service <サービス名>
により確認できます。
1 | $ Get-Service sshd |
続いて、ファイアウォールの設定に移ります。
以下コマンドにより、OpenSSH-Server-In-TCP
の設定状況を確認してください。
1 | Get-NetFirewallRule -Name "OpenSSH-Server-In-TCP" -ErrorAction SilentlyContinue |
ルールを設定済みであれば、以下の出力が得られます。OpenSSH-Server-In-TCP
が表示され、かつ、Enabled
の値は True
であれば、ルール追加は不要です。
1 | $ Get-NetFirewallRule -Name "OpenSSH-Server-In-TCP" -ErrorAction SilentlyContinue |
確認コマンドの実行後、以下の出力が得られた場合には、ルールを再作成してください。
Get-NetFirewallRule
にてOpenSSH-Server-In-TCP
のルールが表示されないOpenSSH-Server-In-TCP
のルールは表示されるが、Enabled
の値は異なる
1 | # ルールの削除 |
ルールの再作成後、以下の出力が得られたら、ファイアウォールルールの設定作業は完了です。
1 | $ Get-NetFirewallRule -Name "OpenSSH-Server-In-TCP" -ErrorAction SilentlyContinue | Select-Object Name, Enabled |
以上で sshd service の起動が完了しました。
Windows Server へ SSH で接続する
パスワード認証での接続
Windows Server にて sshd を起動済みのため、通常の ssh コマンドにて接続可能です。
1 | ssh Administrator@<windows server ip> |
公開鍵認証での接続
(オプション)公開鍵/秘密鍵のペアを作成する
※本ブログでは、説明の都合上「ログイン先サーバ(Windows Server)で生成した 秘密鍵 を、ログイン元サーバに scp
で複製する」という手順を説明しております。しかし、実運用においては「ログイン元サーバで生成した 公開鍵 を、ログイン先サーバに scp
で複製する」という方法を利用してください。
以下、Windows Server 内にて、公開鍵/秘密鍵のペアを作成する手順を説明します。
RDP により Windows Server へ接続後、PowerShell を起動します。
以下コマンドを実行して、公開鍵認証用のキーペアを作成してください。
1 | $ ssh-keygen.exe |
1 | $ ls ~/.ssh |
scp
等により秘密鍵(id_rsa
)をログイン元のサーバへ複製した後、Windows Server 内からは削除してください。
1 | # ex. Windows Server -> Linux に向けて、 scp により秘密鍵を複製する場合 |
1 | # 秘密鍵を Windows Server 内から削除する |
公開鍵認証を有効にする
Windows Server 内の sshd_config
ファイル内の設定項目を編集して、公開鍵認証をオンに変更します。
このファイルは、デフォルトでは C:\ProgramData\ssh\
配下に配置されています。
RDP によりサーバへ接続後、メモ帳などで sshd_config
を開き、関連項目を編集してください。
以下項目が、公開鍵認証の有効化・無効化に対応しています。
1 | #PubkeyAuthentication yes |
パスワード認証が不要であれば、次の項目で設定可能です。
1 | #PasswordAuthentication yes |
変更内容を反映させるために、sshd を再起動します。
1 | Restart-Service sshd |
administrators_authorized_keys
に公開鍵を登録する
Administrator
などの「管理ユーザ」を利用して、公開鍵認証により SSH 接続する場合、C:\ProgramData\ssh\
配下の administrators_authorized_keys
に公開鍵を登録する必要があります。
RDP により接続後、PowerShell にて administrators_authorized_keys
を作成し、公開鍵を登録します。
1 | # ローカル変数 $authorizedKey に、公開鍵(id_rsa.pub)の値を登録 |
administrators_authorized_keys
の権限が、上記ログの通りに表示されていれば、公開鍵の登録は完了です。
公開鍵の登録後、SSH による接続を確認します。
1 | # ex. Linux -> Windows Server に向けた公開鍵認証による SSH 接続 |
以上で、Windows Server に向けた、公開鍵認証による SSH 接続設定は完了です。
tips
SSH 接続の動作検証時に役立つ tips を紹介します。
SSH 接続で起動するシェルを「PowerShell」にする
Windows Server への SSH 接続時、デフォルトでは「CommandPrompt(cmd.exe
)」が起動します。
管理者特権で起動した PowerShell にて以下コマンドを実行することで、SSH 接続時に起動するシェルを「PowerShell(powershell.exe
)」に変更できます。
1 | $ New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force |
sshd のログ確認
sshd_config
に記載された「# Logging」を編集することで、sshd ログの「出力内容」と「出力場所」を変更できます。
デフォルトでは以下内容が記載されています。
1 | # Logging |
#(コメントアウト)
を外して以下設定に変更することで、sshd がより詳細なログを出力するようになります。
1 | SyslogFacility LOCAL0 |
SyslogFacility LOCAL0
- デフォルトの値は
AUTH
です LOCAL0
を指定すると、ログの出力先がC:\ProgramData\ssh\logs\
になります
LogLevel DEBUG3
- デフォルトの値は
INFO
です - パラメータは複数あり、右側の値ほどログ出力内容が詳細になります
1 | # LogLevel のパラメータ一覧 |
sshd
を再起動すると、sshd_config
に指定したログが出力されるようになります。