0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

WSL2のLinuxマシンへ外部からsshログインするための設定

Posted at

概要

WSL2のLinuxマシンをサーバマシンのように、外部のクライアント端末からsshログインして利用できるようにするための設定。

設定方針

この記事での設定方針は以下の通り。

  • Windowsホスト上とWLS2上の両方にSSHサーバをインストールする
  • クライアント端末からはWindowsホスト経由のトンネリング接続によりWSL2マシンへsshログインを行う
  • トンネリング接続の設定はクライアント端末側で設定する

WSL2上へsshログインするための設定にはこれ以外にも方法はあるが、今回この方針とした理由は以下。

  • Windowsホスト上へもsshログインできるようにしたいため
  • 特別な処理をするスクリプト等が不要で、一般的なssh設定の範囲で実現できるため
  • WSL2上で自分の個人作業用のサービスや試験用のサーバを一時的に起動して接続したいため

前提環境

今回の環境は以下の通り。これ以外の環境でも必要に応じて読み替えれば大丈夫のはず。

  • Windowsホスト: Windows 11
  • WSL2マシン: AlmaLinux-9
  • クライアント端末: macOS Ventura (OpenSSH_9.0p1)

設定手順

Windowsホスト上の設定

Windows 11 OpenSSH サービスの有効化

以下の流れで Windows 11上の OpenSSHサービスを有効化する。詳細は Microsoft の公式ドキュメントを参照。

  • (1) 「設定」「システム」「オプション機能」から「OpenSSHサーバー」をインストールする
  • (2) サービスパネル(services.msc)から「OpenSSH SSH Server」を自動起動、開始を設定する
  • (3) 「セキュリティが強化されたWindows Defender ファイヤウォール」(wf.msc)から「受信の規則」「新しい規則」「ポート」「22」を追加する (※)

※標準で「OpenSSH SSH Server (sshd)」という名前のルールが存在するが、これは「プライベート」プロファイルのみの許可であり自分の環境の「パブリック(推奨)」プロファイルでは接続できないため、ここでは専用に個別のルールを追加する方法をとった。

参照URL

ssh 鍵認証の設定

管理者権限があるユーザでログインするため、「管理ユーザー」用の設定を行う。

  • (1) 接続元クライアント端末から、公開鍵ファイル(id_ecdsa.pub)をWindows側へ一旦パスワード認証でコピーする
scp -p ./.ssh/id_ecdsa.pub user@windows:
(パスワード入力で認証)
  • (2) Windowsホスト上で管理者権限で PowerShell を開く
  • (3) 公開鍵の内容を管理ユーザ用認証キーファイル administrators_authorized_keys へ追記する
Add-Content -Force -Path $env:ProgramData\ssh\administrators_authorized_keys -Value (Get-Content -Path .\id_ecdsa.pub)
  • (4) administrators_authorized_keys のパーミッションを設定する
icacls.exe "$env:ProgramData\ssh\administrators_authorized_keys" /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"
  • (5) 接続元クライアント端末からssh鍵認証でログインできることを確認する
参照URL

備忘録: パーミッション設定前後の状態確認例

  • 設定前の状態
icacls.exe $env:ProgramData\ssh\administrators_authorized_keys
C:\ProgramData\ssh\administrators_authorized_keys NT AUTHORITY\SYSTEM:(I)(F)
                                                  BUILTIN\Administrators:(I)(F)
                                                  NT AUTHORITY\Authenticated Users:(I)(RX)
  • 設定後の状態
icacls.exe $env:ProgramData\ssh\administrators_authorized_keys
C:\ProgramData\ssh\administrators_authorized_keys NT AUTHORITY\SYSTEM:(F)
                                                  BUILTIN\Administrators:(F)

Windowsホスト ssh ログインシェルの変更

Windowsホスト上での作業用に、ssh ログイン時のシェルを powershell.exe へ変更する。

  • (1) 管理者権限で PowerShell を開く
  • (2) powershell.exe のパスの確認
> (Get-Command powershell.exe).Source
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
  • (3) レジストリを変更しログインシェルを変更する
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value (Get-Command powershell.exe).Source -PropertyType String -Force
参照URL

その他の Windows ホストの設定

スリープ状態の抑止

Windows ホストがスリープ状態にならないようにWindows電源設定を行う

WSL2の自動起動

WSL2へ常にsshログインできるようにするため、Windows ホストを起動後、常に WSL2 を起動しておく。


WSL2 Linux の設定

WSL2 ssh サービス有効化

AlmaLinux-9 での手順

sudo dnf install openssh-server
sudo systemctl start sshd.service

sshクライアント端末の設定

クライアント端末から、Windows ホストを踏み台として WSL2 マシンへ ssh コマンド一発でログインできるようにするための設定。

設定手順

  • ~/.ssh/config 設定(クライアント端末の設定)
Host windows
   HostName WindowsマシンIPアドレス
   User Windowsユーザ名
   IdentityFile ~/.ssh/id_ecdsa
#    LocalForward 7860 127.0.0.1:7860 # WSL2内へポートフォワードを行う場合の設定例

Host wsl
   HostName localhost
   User WSL2ユーザ名
   IdentityFile ~/.ssh/id_ecdsa
   HostKeyAlias windows-wsl
   ProxyJump windows
  • 認証鍵の登録(クライアント端末から実行)
ssh-copy-id ~/.ssh/id_ecdsa.pub
(パスワード入力)
  • sshログイン (クライアント端末から実行)
ssh wsl

ここまで動作確認できれば設定完了。

補足

  • ホスト名 windows wsl は任意。適宜変更すること
  • HostKeyAlias はクライアント端末の localhost ホスト鍵との衝突を回避するために必要(設定しないとWSL2マシンのホスト鍵が localhost で登録されてしまう)
  • LocalForward で転送するサービスがIPv4のみの場合はIPアドレス127.0.0.1で指定する(localhostと書くとIPv6::1での接続となる)

注意点: wsl.exeが起動してないときのエラー

WSL2マシンが起動していないときにクライアント端末から ssh ログインしようとした場合、以下のエラーメッセージとなるので驚かないように注意。落ち着いて Windows ホスト上で wsl.exe を起動してから再度 ssh ログインすれば良い。

$ ssh wsl
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ED25519 key sent by the remote host is
SHA256:XXXXXXXXXXXXXXX.
Please contact your system administrator.
Add correct host key in /Users/XXX/.ssh/known_hosts to get rid of this message.
Offending ED25519 key in /Users/XXX/.ssh/known_hosts:XX
Host key for windows-wsl has changed and you have requested strict checking.
Host key verification failed.
$

WSL2マシンが起動してないと、WindowsホストからWindowsホスト自身のSSHサーバへ接続しようとするためこのようなエラーになる。


WSL2 Linux 追加設定

Windows PATHの有効化

Windows 上から wsl.exe を起動すると bash の PATH 環境変数には Windows 上の PATH も設定される(appendWindowsPath=true設定 )が、ssh ログインした場合は設定されない。

ssh ログインしたときも wsl.exe 起動時と同じ PATH を設定するため、以下のファイルを作成する(自分の場合 powershell.exevagrant.exe などを WSL2から実行する使い方をしたいため)。

  • /etc/profile.d/wslpath.sh
/etc/profile.d/wslpath.sh
# enable PATH added by WSL2 appendWindowsPath in other sessions such as SSH

# run only once in a same session
if [ -z "$WSLPATH" ]; then
    # check if this session is in wsl.exe
    if [ -n "$WSL_INTEROP" ]; then
        echo "WSLPATH='${PATH}'; export WSLPATH" > $HOME/.wslpath
        [ -r $HOME/.wslpath ] && . $HOME/.wslpath
    else
        # replace the PATH
        [ -r $HOME/.wslpath ] && . $HOME/.wslpath
        [ -n "$WSLPATH" ] && PATH="${WSLPATH}"
    fi
fi

ファイル作成後一度 wsl.exe を実行することで以降の ssh ログインセッションの PATH 環境変数に反映される。また Windows側のPATH設定が変更された場合でも再度 wsl.exe を実行すれば設定が反映される。


参考メモ

他のssh接続方式との比較

WSL2へ ssh ログインできるようにする方法はこの記事で記載した以外にもあるので、違いをメモしておく。

方式として少なくとも以下の方法がある。(方式名は便宜上つけた名前なので一般に使われているわけではない)

  • (1) トンネル接続方式 (本記事の方式)
    • Windows ホストのSSHサーバを踏み台にしてWSL2へssh接続する方式
  • (2) Windowsシェル変更方式
    • Windows ホストの SSH ログインシェルをwsl.exeにすることでWSL2を利用する方式
  • (3) ポート転送方式
    • Windows の portproxy 機能を利用して WSL2 へssh接続する方式
  • (4) ミラーモード方式
    • WSL2 の networkingMode=mirrored 設定を利用する方式

それぞれの方式のメリット・デメリットを主観でざっくり書いてみると以下の通り

  • (1) トンネル接続方式 (本記事の方式)
    • メリット
      • 特別なスクリプト等は不要
      • 公開ポートは必要最低限(sshポート)のみ
      • WSL2内の他のサービスへの接続もトンネル設定で簡単に追加できる
    • デメリット
      • Windowsホストと WSL2内両方に SSHサーバの設定が必要
  • (2) Windowsシェル変更方式
  • (3) ポート転送方式
  • (4) ミラーモード方式
    • メリット
      • 設定が最もシンプル
    • デメリット
      • 比較的新しい機能であり、まだ不具合や制約がある(最新状況では改善できているかも)
      • WindowsホストへのSSHログインと同居するにはポート変更等の設定が必要
    • 参考サイト

今の自分の使い方には(1)が一番合っているためこの方式を使っているが、将来的には(4)を検討しても良いかもしれない。

以上

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?