Termuxに公開鍵暗号でログイン

サーバ

 Termuxではユーザ名がほぼ固定であり、推測されやすいことから、公開鍵暗号方式でしかログインできないようにします。
 秘密鍵を持っている端末からしかリモートログインできないようにし、PowerShellとWinSCPから接続できるようにしました。

現在の環境

 サーバ スマートフォン上のtermux
   OpenSSH_10.0p2
 クライアント Windows11 Home
   PowerShell
   WinSCP
 ※パスワードによるリモートログインができる状態

# PowerShell パスワードログインができる状態
$ > ssh u0_a445@192.168.0.244 -p 8022
u0_a445@192.168.0.244's password: ********

Welcome to Termux
$ >

公開鍵による接続

①鍵ペアを発行する

 WindowsPCがクライアントになるので、WindowsPC上で鍵を発行します。
 すでに鍵ペアがあれば、id_ed25519.pubの内容をコピーするだけでいいです。
  ※フォルダ C:\Users\ユーザ名\.ssh\
   に id_ed25519 & id_ed25519.pub があればすでに鍵ペアができています。

# PowerShell(鍵ペアがなければ実行)

# 鍵ペアの生成(ed25519は、RSA256よりセキュアな暗号方式)
$ > ssh-keygen -t ed25519

# ここでさらにセキュリティ強度を高めたければ、ピンパスワードも指定できます

# 以下に鍵ペアが生成されます
# C:\Users\ユーザ名\.ssh\id_ed25519 → 秘密鍵(誰にも教えない、ほかのサーバに移さない)
# C:\Users\ユーザ名\.ssh\id_ed25519.pub → 公開鍵(ログイン先のサーバにコピーする)

# cat C:\Users\username\.ssh\id_ed25519.pub
ssh-ed25519 A**************************************ZM9 username@hostname
# ↑この行をコピーしてメモ帳に張り付けておく

②公開鍵をサーバに登録する

 Termuxにログインし、鍵を登録する場所があるか確認します。
 authorized_keys ファイルがなければ作成して公開鍵を張り付ける
 authorized_keys ファイルがあれば一番下に公開鍵を張り付ける

# Termux
Welcome to Termux
$ > cd ~/.ssh
$ > ls -l
-rw-------. 1 u0_a445 u0_a445   94 May  7 15:36 authorized_keys # ←このファイルがあるか
-rw-------. 1 u0_a445 u0_a445  411 May  7 15:29 id_ed25519
-rw-------. 1 u0_a445 u0_a445   99 May  7 15:29 id_ed25519.pub

# ① authorized_keys がない場合 ファイルを作る
$ > touch ~/.ssh/authorized_keys
$ > chmod 600 ~/.ssh/authorized_keys

# ② authorized_keys がある場合 authorized_keysを作った後
$ > nano ~/.ssh/authorized_keys
# Windowsのメモ帳に張り付けておいたテキスト
# ssh-ed25519 A**************************************ZM9 username@hostname
# を一番下に張り付ける(余分なスペース、改行を入れないこと)
# Ctrl+s ,Ctrl+x を忘れない

③公開鍵で接続できるか確認

 Termuxを終了させて、Windowsから接続しなおします。
 パスワードの要求がなければ公開鍵で接続ができています。

# Termux 
$ > exit

↓

# PowerShell
# 一度ログアウトしてから再度接続
$ > 
$ > ssh u0_a445@192.168.0.244 -p 8022
# ピンパスワードを指定していれば、ここで入力する

Welcome to Termux

# パスワードの要求がなければ成功

パスワードでログインできないようにする

 今回の目的はセキュリティ強度を上げることですので、ここからパスワードによるログインができないようにします。
 秘密鍵を持っているPCからしか接続できなければ、FIDO2認証と同程度のセキュリティ強度になると考えています。
 Termuxから次のコマンドを使い、パスワードログインができないように設定しました。

# Termux

# sshdの設定ファイルを修正する(パスワードログインを拒否する)
$ > nano /data/data/com.termux/files/usr/etc/ssh/sshd_config
# nano $PREFIX/etc/ssh/sshd_config でも可能

#PasswordAuthentication yes
↓
PasswordAuthentication no
# このように変更して保存
sshd_configを開いた様子

 設定の変更が終わったので、termux上のsshdサーバを再起動させます。
 再起動コマンドがないので、pkillによる強制再起動を行います。

# Termux
$ > pkill sshd
# sshd を強制終了

$ > sshd
# sshd を起動

プロセスの再起動を繰り返していると、Termuxの挙動がおかしくなる時があります。
私はスマホを再起動させたところ治りました。

 パスワードログインができなくなったことを確認するために、WinSCPからTermuxに接続し、パスワード認証が失敗することを確認。(WinSCPは今までパスワードログインで使用していました) 

WinSCPからパスワードログインができなくなった様子

WinSCPから公開鍵でログインできるようにする

 既にIPやユーザ名、ポート番号は入っているものとして割愛します。
 WinSCPの「ログイン」から「編集」を開きます。

次は「設定」を開きます。

「SSH」から「認証」を選択し、秘密鍵の「…」ボタンを押します。

フォルダの場所 c:\Users\username\.ssh
ファイルの種類 「全てのファイル」 ← に変更する
ファイルの選択 id_ed25519 を選択
「開く」ボタンを押下します。

秘密鍵を専用ファイルに変換してくれるので、「OK」を選択します。

この設定を保存して、ログインすると公開鍵暗号方式でWinSCPでも接続できるようになります。

感想

 以上の設定で、パスワードによるログインができないようにして公開鍵暗号方式でのみログインできるようにしました。
 ユーザIDがほぼ漏えいしているようなものなので、TermuxにSSHDを入れている人は、このくらいの設定にしておけば現実的に大丈夫だと思います。
 出先でスマホにリモートログインしたくなったらどうしようかと思案中。
 id_ed25519.pubを持ち歩くべきか。うーん