⛳

WSLからUbuntuPCに公開鍵認証でSSHログイン

に公開

はじめに

タイトルの通りですが
これまでは Linux の学習用として不要 PC に Ubuntu を入れ以下の .ttl ファイルを使って TeraTerm から SSH 接続していました。

;#######################################################################
; 接続先情報
HOSTADDR = 'xxx.xxx.xx.xx'
USERNAME = 'yyyyyyyyyy'
PASSWORD = 'zzzzzzzzzz'
;######################################################################

;######################################################################
; ssh接続処理
COMMAND = HOSTADDR
strconcat COMMAND ':22 /ssh /2 /auth=password /user='
strconcat COMMAND USERNAME
strconcat COMMAND ' /passwd='
strconcat COMMAND PASSWORD
;######################################################################

; 接続
connect COMMAND

しかし、X である投稿を見かけたことをきっかけに、
内心、要件さえ満たしてればなんでもいいと思いつつも、
せっかくなので WSL から公開鍵認証で SSH 接続する方式に切り替えてみることにしたので
備忘録も兼ねて、その手順を簡単にまとめておきます。

公開鍵認証でのSSH接続

1. WSL での作業(鍵の生成)

$ ssh-keygen -t ed25519 -C "ubuntu-local"
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/dev/.ssh/id_ed25519): /home/dev/.ssh/ubuntu

※/home/dev/.ssh/ubuntuとしていますので以降もその想定です。デフォルトの場合はファイルパスは違いますので読み替えてください。

公開鍵の内容をコピーする

$ cat ~/.ssh/ubuntu.pub

2. Ubuntu での作業(公開鍵の登録)

今回はすでに TeraTerm から SSH 接続できているので、
そのまま TeraTerm でSSHログインし、以下の作業を行います。

# ディレクトリ権限の調整
$ sudo chmod 700 ~/.ssh

# 公開鍵を登録
$ echo "事前にコピーしていた公開鍵" >> ~/.ssh/authorized_keys
# ファイル権限の調整
$ sudo chmod 600 ~/.ssh/authorized_keys

# SSHサーバーの設定確認
sudo grep -E "PubkeyAuthentication|AuthorizedKeysFile" /etc/ssh/sshd_config
#PubkeyAuthentication yes
#AuthorizedKeysFile     .ssh/authorized_keys .ssh/authorized_keys2

# 上記コメントアウトされているためコメントインする
sudo vim /etc/ssh/sshd_config

# SSHデーモンの状態確認→再起動→状態確認
$ sudo systemctl status ssh
$ sudo systemctl start ssh
$ sudo systemctl status ssh

3. WSL から SSH 接続をテストする(鍵認証)

# ユーザー名、IPアドレスはUbuntu側のもの
$ ssh -i ~/.ssh/秘密鍵ファイル名 ユーザー名@IPアドレス

無事秘密鍵を使ってログインできるようになりました。

公開鍵はもうWSL側には不要なのでここで消します。

# ubuntuにログイン中の場合は先に exit でWSLに戻る
$ rm .ssh/ubuntu.pub

では次に、毎回こんな長いコマンドを打ちたくないので
~/.ssh/config に設定を記述し、ssh ubuntu のように短いコマンドでログインできるようにしていきます。

SSH configファイルの適用

1. WSL での作業

私は ~/.ssh/configs 配下に複数の設定ファイルを用意し、~/.ssh/config をシンボリックリンクで切り替える運用にしています。
そのため以下の手順は少し特殊です。個人用の手順と、一般向けの手順を分けて記載します。

個人用
# まず config と configs の状況を確認
$ ls -l ~/.ssh/config ~/.ssh/configs
lrwxrwxrwx 1 dev dev   34 Sep 22 10:53 /home/dev/.ssh/config -> /home/dev/.ssh/configs/config_wzmn

/home/dev/.ssh/configs:
total 20
-rw-r--r-- 1 root root 81 Dec  8  2024 config_main
-rw-r--r-- 1 root root 67 Dec  8  2024 config_oldmain
-rw-r--r-- 1 root root 70 Dec  8  2024 config_test
-rw-r--r-- 1 root root 99 Dec  8  2024 config_work

common_configを作成

複数の設定ファイルすべてから参照できる共通設定ファイルを作成します。
今回は今後の拡張も考慮し、専用ディレクトリを切っています。

$ mkdir ~/.ssh/configs/common
$ sudo vim ~/.ssh/configs/common/config
# 記述する内容は以下
Host ubuntu
    HostName xxx.xxx.xx.xx
    User yyyyyyyyyy
    IdentityFile ~/.ssh/ubuntu
    Port 22

次に、各 config_* に Include ~/.ssh/configs/common/config を記述することで、
どの設定ファイルに切り替えても共通設定を読み込めるようにします。

# 対象ファイルの確認(念のためもう一回)
$ ls -l ~/.ssh/configs/config_*
-rw-r--r-- 1 root root 81 Dec  8  2024 /home/dev/.ssh/configs/config_main
-rw-r--r-- 1 root root 67 Dec  8  2024 /home/dev/.ssh/configs/config_oldmain
-rw-r--r-- 1 root root 70 Dec  8  2024 /home/dev/.ssh/configs/config_test
-rw-r--r-- 1 root root 99 Dec  8  2024 /home/dev/.ssh/configs/config_work

# 頻繁には使わないため以下のスクリプトで1回きりの実行で済ませています(ChatGPTありがとう)
for f in ~/.ssh/configs/config_*; do
  # 既存の include 行をすべて削除
  sed -i '/Include ~/.ssh\/configs\/common\/config/d' "$f"

  # ファイル先頭に挿入
  sed -i "1i Include ~/.ssh/configs/common/config" "$f"

  echo "[updated] $f"
done

接続確認

ssh ubuntu

接続できました!

一般向け

ここからは、私のように複数 config を切り替える運用ではなく、
WSL の ~/.ssh/config を 1 ファイルで管理している一般的な環境向けの手順です。

単一ファイルで完結するので、よりシンプルです。

複雑な設定は不要で、1ファイルにまとめて書けば OK です。

config ファイルを作成(または開く)

$ vim ~/.ssh/config
# Ubuntu への接続設定を記述(以下サンプル)
Host ubuntu
    HostName xxx.xxx.xx.xx
    User yyyyyyyyyy
    IdentityFile ~/.ssh/ubuntu
    Port 22

config の権限を整える(重要)

$ chmod 600 ~/.ssh/config

接続確認

configに記載したHost名でログインが可能になります。

$ ssh ubuntu

パスワードログインの無効化

最後にこれまでパスワード認証でログインしていましたがこのタイミングでUbuntu側の設定をいじってOFFにしようと思います。

Ubuntuにログイン(鍵認証でログインできることの確認も含んでいます)

WSLにて以下実行

$ ssh ubuntu

SSH の設定ファイルを開く

$ sudo vim /etc/ssh/sshd_config

以下の設定を追加 or 修正

ファイル内を探して、以下の項目を no に設定する
既に書かれていたら # を外して no に変更。そもそも記述がなければ追記しても OK です。

PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no

意味

  • PasswordAuthentication no
    • パスワードログイン禁止(最重要)
  • ChallengeResponseAuthentication no
    • キーボードインタラクティブ認証禁止
  • UsePAM no
    • PAM によるパスワード認証も無効化

実際の sshd_config では以下のような状態でした:

  • # PasswordAuthentication yes(コメントアウトされたまま存在)
  • ChallengeResponseAuthentication の記述はそもそも無し
  • UsePAM yes が少し離れた位置に記載されている状態

最終的には、手順に沿って no に変更し、下記画像のように保存しました。

SSHサーバーの再起動

$ sudo systemctl restart ssh

これまで通りのパスワード認証でのログイン実行


エラーです。期待通りです。

秘密鍵でのSSH接続

$ ssh ubuntu

接続できました!これも期待通りです。

これで以下が完了しました。

  • 秘密鍵を使った SSH 接続が可能になった
  • ~/.ssh/config の設定により、短いコマンドでアクセスできるようになった
  • これまでのパスワード認証方式は無効化された

ひとまず、セキュアで快適な SSH 環境への移行は完了?です✨
インフラについてはまだ知見が浅いので、この環境を使って遊びながら、少しずつ理解を深めていければと思います。

Discussion