WindowsのpwshからsshでWSL2に接続


手元で試した環境

クライアント(接続元)
  • Windows10 2004
  • pwsh: PowerShell 7 LTS
  • ssh: OpenSSH_7.7p1
サーバ(接続先)
  • WSL2: Ubuntu20.04
  • ssh: OpenSSH_7.6p1

以下、windows側のユーザ名をclient、wsl側のユーザ名をserverと表記。


サーバ側のssh設定

公式ページではいろいろやっているが、もう面倒くさいのでwslのopensshを丸ごと新調する。

server$ sudo apt purge openssh-server
server$ sudo apt install openssh-server

wslのsshd_configを以下のように編集。

server$ sudo vim /etc/ssh/sshd_config

~~~
Port 22 # 22番ポートは慣習的にssh接続用で利用される
~~~
ListenAddress 127.0.0.1 # localhost for IPv4
#ListenAddress :: # for IPv6
~~~
PermitRootLogin no # 基本的には一切のrootログインを禁止するべき

設定を変更したのでsshdを再起動。

server$ sudo service ssh restart

ssh接続

クライアントからサーバにssh接続する。

client> ssh server@localhost
The authenticity of host 'localhost (127.0.0.1)' can't be established.
ECDSA key fingerprint is <hogehoge>
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
server@localhost's password: <bar>
Last login: <xxx>
server$ # 接続成功

パスワード認証から公開鍵認証に切り替える

注意: 公開鍵認証に切り替えたものの、server@localhost: Permission denied (publickey).と返され接続できなかった。原因は不明。一応、作業メモだけは残しておく。
つうかchmod 700 .sshとかやっても機能してる気配ないんすけど。
原因がわかった。wsl上のubuntuのホームディレクトリを変更していたので、NTFS(windowsのファイルシステム)にまきこまれ権限変更ができなかった。ubuntuを再インストールすることで対応。

現在の設定ではssh接続でログインした際にパスワードを入力するパスワード認証が用いられているが、これは危険なので公開鍵認証に切り替える。
まずクライアント側で公開鍵・秘密鍵を生成する。

client> cd $HOME\.ssh
client> ssh-keygen -t ecdsa # 先程ssh接続した際にECDSA方式の暗号化が用いられていたので、なんとなくそれに合わせる
Generating public/private ecdsa key pair.
Enter file in which to save the key (C:\Users\client/.ssh/id_ecdsa)
Enter passphrase (empty for no passphrase): <ssh-pass>
Enter same passphrase again: <ssh-pass>
Your identification has been saved in C:\Users\client/.ssh/id_ecdsa.
Your public key has been saved in C:\Users\client/.ssh/id_ecdsa.pub.
The key fingerprint is:
SHA256:<fingerprint> client@<hostname>
The key's randomart image is:
<hoge>

次に生成した公開鍵をサーバに登録する。
何らかの方法でid_ecdsa.pubをサーバに転送する。ここではせっかくなのでscpを使ってコピーする。

client> scp .\id_ecdsa.pub server@localhost:.ssh/
server@localhost's password: <login-pass>

サーバ側でクライアントの公開鍵ファイルの内容をauthorized_keysに追記することで、登録されたことになる。

server$ cd $HOME/.ssh
server$ cat id_ecdsa.pub >> authorized_keys

ssh関係のファイルの権限を厳しくする。これをしないとssh接続がはじかれる。

server$ chmod 700 $HOME/.ssh # ファイル所有者のみ読み書き実行可能
server$ chmod 600 $HOME/.ssh/authorized_keys # ファイル所有者のみ読み書き可能

そして公開鍵認証に切り替えるため、sshd_configを以下のように編集する。

server$ sudo vim /etc/ssh/sshd_config

~~~
PasswordAuthntication no
~~~
ChallengeResponseAuthentication no
~~~
PubkeyAuthentication yes

22番ポートも開いておく。

server$ sudo ufw allow 22
server$ sudo ufw reload

設定を変更したのでsshdを再起動。

server$ sudo service ssh restart

これで準備は整った。クライアントからssh接続する前に、サーバの公開鍵の指紋(fingerprint)を確認しておく。

server$ ssh-keygen -l -f /etc/ssh/ssh_host_ecdsa_key.pub
256 SHA256:<fingerprint> root@<hostname> (ECDSA)

いよいよssh接続する。サーバから送られてきた公開鍵の指紋が先程確認したものと同じであれば、なりすましされていないということなのでOK。

client> ssh client@localhost
The authenticity of host 'localhost (127.0.0.1)' can't be established.
ECDSA key fingerprint is <fingerprint>
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
Enter passphrase for key 'C:\Users\client/.ssh/id_ecdsa': <ssh-pass> # このパスワードはネット通信に流れない
~~~
Last login: <xxx>
server$ # 接続成功

感想

sshなんもわからん。あとwslのホームディレクトリを変更するのはやめよう。


参考リンク