🐬

公開鍵認証を用いたssh接続のすすめ

2024/11/08に公開

はじめに

WSL上のubuntuに対して、ホストOS(Windows11)からSSHで接続するまでになります。
OS:Windows11
接続先:ubuntu(WSL)

sshdインストール~パスワード認証でのログインまで

sshで接続できるようにubuntu側で設定します。

sshサーバ(ubuntu)がインストールされているか確認

以下のコマンドを実行してインストールされているか確認します。

# sudo systemctl status ssh

次のように表示された場合は、インストールする必要があります。

Unit ssh.service could not be found.

以下のように表示された場合にはすでにインストールされていますので、次の「sshサーバのインストール」はスキップしてください。

#すでにインストールされていた場合
● ssh.service - OpenBSD Secure Shell server
     Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2024-11-08 17:30:55 JST; 49s ago
       Docs: man:sshd(8)
             man:sshd_config(5)
   Main PID: 1293 (sshd)
      Tasks: 1 (limit: 18445)
     Memory: 1.8M
     CGroup: /system.slice/ssh.service
             └─1293 "sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"

sshサーバ(ubuntu)のインストール

not be found.で見つからないとのことですので、openssh-serverをインストールします。

sudo apt install openssh-server

再度systemctl status sshを実行して、以下のように表示されれば、インストール完了です。

● ssh.service - OpenBSD Secure Shell server
     Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2024-11-08 17:30:55 JST; 49s ago
       Docs: man:sshd(8)
             man:sshd_config(5)
   Main PID: 1293 (sshd)
      Tasks: 1 (limit: 18445)
     Memory: 1.8M
     CGroup: /system.slice/ssh.service
             └─1293 "sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"

もし、以下のように表示された場合には、sudo apt updateでリポジトリを更新してください。

E: Failed to fetch http://archive.ubuntu.com/ubuntu/pool/main/o/openssh/openssh-sftp-server_8.9p1-3ubuntu0.4_amd64.deb  404  Not Found [IP: 185.125.190.83 80]
E: Failed to fetch http://archive.ubuntu.com/ubuntu/pool/main/o/openssh/openssh-server_8.9p1-3ubuntu0.4_amd64.deb  404  Not Found [IP: 185.125.190.83 80]

ここまでで、sshサーバをインストールできたので、windows側で接続できるか確認します。

Windows側でsshの接続確認(パスワード認証)

好みのターミナルソフトでsshで接続してみましょう!!
今回は、標準のpowershellから接続してみました。

# #フォーマット:ssh UserName@IPアドレス
# ssh admin@172.31.66.129

以下のようにプロンプトが更新されて、linuxのコマンドが実行できれば成功です。

# uname -a
Linux DESKTOP-CTSPM2I 5.15.153.1-microsoft-standard-WSL2 #1 SMP Fri Mar 29 23:14:13 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux

もし、sshサーバ(ubuntu)側のipアドレスがわからない場合は、ip aコマンドでIPアドレスを確認して、接続してください。以下、実行例

# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet 10.255.255.254/32 brd 10.255.255.254 scope global lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:15:5d:ec:fa:fe brd ff:ff:ff:ff:ff:ff
    inet 172.31.66.129/20 brd 172.31.79.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::215:5dff:feec:fafe/64 scope link
       valid_lft forever preferred_lft forever

公開鍵認証でのログイン

外部公開を行うわけではないので、パスワード認証でもよいのですが、毎度パスワードを入力することは手間になりますので、公開鍵認証でログインできるように行います。

公開鍵の作成

Windows側で認証に使用する公開鍵をコマンドプロンプトで作成します。

ssh-keygen -t ed25519 -C "端末名"

-tオプションで暗号化方式を指定します。今回は、ed25519を使用します。
https://ja.wikipedia.org/wiki/エドワーズ曲線デジタル署名アルゴリズム
-cオプションでコメントを記載できます。複数の端末を利用する場合、見分けをつけるために記載しておくと便利です。
そのほか、オプションは以下のページを参照ください。
https://nxmnpg.lemoda.net/ja/1/ssh-keygen

sshサーバ(ubuntu)へ公開鍵のコピー

scpコマンドを用いて、先ほど作成した公開鍵をubuntu側へコピーします。
まず、ubuntu側でコピー先のディレクトリを作成します。

# cd
# mkdir .ssh
# ls -la

ls -laの実行結果に、.sshができていれば成功です。

次に、以下のコマンドをWindows側で実行します。

# #ユーザ名のフォルダへ移行
# cd ~
# #公開鍵のコピー
# #フォーマット:scp 公開鍵ファイルパス hoge@IPアドレス(ubuntu):/home/ユーザ名/.ssh/
# scp ./.ssh/id_ed25519.pub hoge@172.31.66.129:/home/hoge/.ssh/

ubuntu側で正常にコピーが完了したか確認します。

# ls -la

ls -laの実行結果に、公開鍵ファイルが格納されていれば正常にコピーできています。

authorized_keysへ公開鍵の登録

公開鍵をauthorized_keysへ登録とパーミッションの変更を行います。

# #フォーマット:cat 公開鍵ファイル >> authorized_keys
# cat id_ed25519.pub >> authorized_keys
# chmod 600 authorized_keys

Windows側でsshの接続確認(公開鍵認証)

# #フォーマット:ssh ユーザ名@IPアドレス(ubuntu) -i 秘密鍵ファイルパス
# ssh admin@172.31.66.129 -i .\.ssh\id_ed25519

ubuntuのプロンプトができればOKです。

おわりに

外部インタネットから接続できる場合には、パスワード認証の拒否設定やポートの変更をしてください。ポートスキャンやブルートフォースアタックの対策になります。
これで、環境構築ができたので、permission denied (publickey)になるときの挙動を次回は調べていきます。

参考

SSHを使用したGitHubへの接続(github公式)
https://docs.github.com/ja/authentication/connecting-to-github-with-ssh

ed25519について(RFC)
https://datatracker.ietf.org/doc/html/rfc8032

ed25519について(RFC日本語訳)
https://tex2e.github.io/rfc-translater/html/rfc8032.html

Discussion