[初心者向け?] Windows環境でOpenSSHクライアント(ssh.exe)を使う時に気を付けるべきこと

2022.07.03

しばたです。

Windows 10ではWindows 10 Fall Creators Update(1709)よりOS標準機能としてOpenSSH Clientが組み込まれる様になり、SSHクライアント(ssh.exe)が使える様になっています。
導入当時の経緯は過去に個人ブログに書いてますので参考にしてください。

で、このssh.exeについてですが、基本的には非Windows環境向けのものと同様に扱えますがWindows環境に起因する違いもあるため本記事で簡単に説明していきます。

検証環境

本記事は私の開発用クライアント(64bit版 Windows 10 Pro 21H1)で動作確認しています。
最新のクライアントOSというわけではないですがバージョン依存の話はしない予定です。

ちなみにSSHクライアントのバージョンはVer.8.1でした。

PS C:\> Get-ComputerInfo | Select-Object OSVersion, OSName
OsVersion  OsName
---------  ------
10.0.19043 Microsoft Windows 10 Pro

PS C:\> ssh -V
OpenSSH_for_Windows_8.1p1, LibreSSL 3.0.2

1. コマンドプロンプトを使うかPowerShellを使うか

ssh.exeはコマンドプロンプトとPowerShell (Windows PowerShellおよびPowerShell 7)のどちら上でも動作しますので好きな環境で動かすと良いでしょう。
私はPowerShellおじさんなのでPowerShell 7を常用しています。

ただWindows PowerShellだと多くの環境で背景色が青色ですので少し見にくいかもしれません。
予め背景色を変えておくかWindows Terminalを使うと良いでしょう。

またシェルからの起動ではなくWindows Terminalのプロファイルにssh.exeを登録してWindows Terminalから直接利用することも可能です。
Windows Teminalの具体的な設定方法については以下のドキュメントを参考にしてください。

2. Windowsでは ホームディレクトリ = ユーザープロファイル

非Windows環境ではSSHに関連する各種ファイルをホームディレクトリ(~)配下の~/.ssh/配下に保存しますが、Windowsでホームディレクトリに相当するのはユーザープロファイルとなります。

ユーザープロファイルは通常C:\Users\[ユーザー名]\となりますが、環境によっては別のフォルダに変更されている可能性もあります。
厳密にはUSERPROFILE環境変数の値を確認してください。

とはいえ、とりあえず現時点では

  • ~/.ssh/ = C:\Users\[ユーザー名]\.ssh\

と雑に覚えておくと良いでしょう。

なおPowerShell上であれば~をそのまま使うことができます。
(コマンドプロンプトは不可)

# 環境変数 USERPROFILE を参照
PS C:\> $env:USERPROFILE
C:\Users\shibata

# Windows 環境で ~/.ssh/ に相当するフォルダを参照
PS C:\> dir "$env:USERPROFILE\.ssh\"

# PowerShellなら ~ をそのまま使えるしパス区切りに / も使える
PS C:\> dir ~/.ssh/

3. .sshディレクトリのアクセス権

非Windows環境では~/.ssh/ディレクトリのアクセス権を以下の様にする必要があります。

パス アクセス権 説明
~/.ssh/ ディレクトリ 700 (rwx------) オーナーのみ読み、書き、実行可能
~/.ssh/ 配下のファイル(秘密鍵) 600 (rw-------) オーナーのみ読み、書き可能

対してWindows環境の場合は「必要なユーザー(またはグループ)のみに権限を与え、その他のユーザー権限を削除する」ことを求められます。
私の調べた限りですが、以下の条件を求められる様です。

パス アクセス権 説明
$env:USERPROFILE\.ssh\ フォルダ SYSTEM, Administrators, 自分 個々のユーザーはFull Control権限で良い
$env:USERPROFILE\.ssh\ 配下のファイル(秘密鍵) SYSTEM, Administrators, 自分 個々のユーザーはFull Control権限で良い

GUI上でざっくりこんな感じになっていれば大丈夫です。

ちなみに$env:USERPROFILE\.ssh\フォルダはSSHの初期設定を行うと自動で作成されるのでその時の権限に任せておけば基本的に大丈夫です。

秘密鍵を別のフォルダに置いて管理する場合にアクセス権エラーになることがあるのでご注意ください。
こんなエラーメッセージが表示された時はアクセス権エラーです。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions for 'C:\\temp\\test-rsa-key.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "C:\\temp\\test-rsa-key.pem": bad permissions
ec2-user@xx.xx.xx.xx: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

補足 : Microsoftアカウントを使っている場合のアクセス権設定

ファイルやフォルダのアクセス権はエクスプローラーの「プロパティ」から行いますが、ログインユーザーにMicrosoftアカウントのユーザーを使っている場合はこの方法が使えません。

現時点のWindows 10環境ではフォルダやファイルのアクセス権を設定するGUI上でMicrosoftアカウントのユーザーをリストアップすることができず、リストアップできないので当然アクセス権を設定することもできません。

Microsoftアカウントのユーザーを使っている場合はicaclsコマンドなどを使いCUIから権限設定する必要があります。

例としてPowerShellコンソールで以下の様なコマンドを実行すると指定したファイルのアクセス権を「自分(Microsoftアカウント)、Administrators、SYSTEMのみフルコントロール」にすることができます。

# 親フォルダからの継承を削除 (/inheritancelevel:r)
# Systemユーザー、Administrators、対象ユーザー のみにFull Controlを与える
$keyFilePath   = "<アクセス権を設定したいファイルパス>"
$msAccountName = "<Microsoftアカウント名>"
icacls $keyFilePath /inheritancelevel:r /grant:r ${msAccountName}:F /grant:r Administrators:F /grant:r SYSTEM:F

# 変更後権限の確認
icacls $keyFilePath

Windows 11で問題が改善されているかどうかは不明です。

場合によってはWSLを使った方がよいかも

ここまで書いておいてアレですが、非Windows環境に慣れている方であればWSL環境を用意してWSL内部のOpenSSHクライアントを使う方が手っ取り早いかもしれません。
特にWSL 2であれば完全なLinux環境ですのでWindowsに起因する問題は一切起きません。

自分の経験上ではProxyCommandなどで複雑な設定を必要とする場合にSSHクライアント以外の周辺ツールがWindowsに対応しておらずWSL環境でないとやりたいことを実現できないという事象がありました。

最後に

簡単ですが以上となります。

ハマりやすい内容の割には意外とWEB上で情報を見つけることができなかったの記事にしてみました。
本記事が皆さんの役に立てば幸いです。