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のホームディレクトリを変更するのはやめよう。
参考リンク
- WSLのトラブルシューティング
- MicroSoft公式の解説。
- まんがでわかるLinux シス管系女子 3
- いつもお世話になっております。3巻はネット関係を中心に解説している。
- 入門OpenSSH
- sshについて非常に丁寧に解説している。古めのページだが、基本的な知識は使えるだろう。雑にsshを把握したあとに参考するとよいかもしれない。