UserLAnd/UbuntuへのSSHログインにおいてパスワード認証を無効化して公開鍵認証のみに絞る方法

UserLAnd/UbuntuへのSSHログインにおいてパスワード認証を無効化して公開鍵認証のみに絞る方法
Page content

パスワード認証は晒したくない

物理キーボードが付いたAndroid端末「Gemini PDA」上のLinux環境として、これまではTermuxを使っていたが、UserLAndへ乗り換えしようと思う。

しかしながらデフォルトだとSSHログインに関してやや問題があるようだ。UserLAndアプリ内で選択できるUbuntuを起動した後のデフォルト状態では、dropbearというSSHサーバが「rootログインとパスワード認証が有効な設定」で2022/tcpにて待ち受けている。Gemini PDAのLAN内ローカルIPアドレスを「192.168.1.XXX」とすると、次のコマンドでパスワード認証が有効だと確認できる。

$ nmap -p 2022 192.168.1.XXX
(snip)
PORT     STATE  SERVICE
2022/tcp open   down

$ ssh -o PreferredAuthentications=password -p 2022 userland@192.168.1.XXX
userland@192.168.1.XXX's password: # パスワードが聞かれる、つまり有効

この状態では、Gemini PDAを接続したWi-Fiネットワーク等からのSSHログインのパスワード試行攻撃が成功してしまう可能性がゼロではなさそうなので、SSHログインを公開鍵認証のみに限定する設定方法を模索した。

なお、上記設定を行うことにより、UserLAndに内蔵のターミナルアプリからUbuntu環境へログインすることも不可能になる (このログインはパスワード認証を用いているからだろうと推測)。Gemini PDAから直接にUbuntu環境へログインする方法は、別途JuiceSSHなどのターミナルアプリをGemini PDAへインストールして、公開鍵認証でlocalhostへSSHログインする形へと変わる。セキュアになるのと引き換えに、少々ややこしくなることに注意。

設定手順

種類名称バージョン等
ハードウェアGemini PDAAndroid 8.1.0
アプリUserLAnd3.0.0 (2022-06-30)
アプリ上の環境Ubuntu20.04.4 LTS (Focal Fossa)
アプリJuiceSSH3.2.2 (2021-02-04)

以下、「Ubuntu環境」とはUserLAndの上に構築するUbuntu環境を指す。

1) Ubuntu環境の用意と初期設定

  1. UserLAndを起動し、[Distribution] で「Ubuntu」をタップ→「Connection Type: Terminal」を選択してSessionを追加する
  2. [Sessions] で「ubuntu → apps」をタップしてセッションを起動する
Welcome to Ubuntu in UserLAnd!
userland@localhost:~$ 
  1. 現在のIPアドレスを確認しておく
## Android 12以前 (追記 2023-01-21)
sudo apt update
sudo apt install iproute2 vim
ip a | grep wlan0 # 現在のIPアドレス(192.168.1.XXX)を確認する

## Android 13以降 (追記 2023-01-21)
sudo apt update
sudo apt install net-tools vim
ifconfig | grep -A 1 wlan0 # 現在のIPアドレス(192.168.1.XXX)を確認する

2) Ubuntu環境に別マシンの公開鍵を登録しておく

  1. 別マシンの公開鍵~/.ssh/id_ecdsa.pudを次のように登録する
mkdir ~/.ssh && chmod 700 ~/.ssh
vim ~/.ssh/authorized_keys # 別マシンの公開鍵(ed25519は非対応, rsaやecdsaは対応)を追記する
chmod 600 ~/.ssh/authorized_keys
  1. 追加した公開鍵のペアの秘密鍵を用いて、別マシンからSSHログインできることを確認する
ssh -o PreferredAuthentications=publickey -i ~/.ssh/id_ecdsa -p 2022 -l userland 192.168.1.XXX

3) JuiceSSHから公開鍵認証でのログインを試す

  1. JuiceSSHで [Manage Connections] を選択し、[認証情報] にてecdsa形式の秘密鍵を作成する
    項目内容
    ニックネーム(任意)
    ユーザ名userland
    パスワード
    プライベートキーKey Format = ECDSA, キー強度: 384bit (初期値のまま), パスフレーズ: 任意のもの
  2. 作成された認証情報をロングタップし、ペアの公開鍵をエクスポートする (クリップボードにコピーなど好きな手段でOK)
  3. 公開鍵テキストを別マシンを経由して、2) と同様にUbuntu環境の~/.ssh/authorized_keysに追記する
  4. JuiceSSHの [接続] にて、次の内容の接続を作成する
    項目内容
    ニックネームUserLAnd@localhost
    アドレス127.0.0.1
    認証情報上記で作成したecdsa形式のものを選択
    ポート2022
  5. 接続「UserLAnd@localhost」を実行し、Ubuntu環境へ公開鍵認証でログインできることを確認する

4) Ubuntu環境へのSSHのパスワードログインとrootログインを無効化する

本項の手順を実施すると、Ubuntu環境へ、UserLAndに内蔵のターミナルアプリからログインできなくなることに注意。

  1. Ubuntu環境でdropbearを起動しているファイル/support/startSSHServer.shを編集する
$ cd /support/
$ sudo cp -a ./startSSHServer.sh{,.original}

## 下記のdiffのようにdropbearの実行部分を編集する
$ sudo vim ./startSSHServer.sh

## 「-w Disallow root logins」「-s Disable password logins」を有効化
$ diff ./startSSHServer.sh{.original,}
12c12,13
< dropbear -E -p 2022
---
> #dropbear -E -p 2022
> dropbear -Ews -p 2022
  1. UserLAndの [Sessions] で「ubuntu → apps」をタップして [Stop Session] を選択する
  2. UserLAndの [Sessions] で「ubuntu → apps」をタップしてセッションを起動する
  3. [Process completed (code 1) - press Enter]と出るがこれはパスワード認証が無効化されたことによるもので意図通り。Enterを押す

5) 設定反映を確認

  1. 別マシンからUbuntu環境へSSHログインを試し、パスワード認証が無効になったことを確認する
$ ssh -o PreferredAuthentications=password -p 2022 userland@192.168.1.XXX
userland@192.168.1.XXX: Permission denied (publickey). # パスワード認証が受け付けられない
  1. 別マシンからUbuntu環境へSSHログインを試し、公開鍵認証が引き続き有効であることを確認する
$ ssh -o PreferredAuthentications=publickey -i ~/.ssh/id_ecdsa -p 2022 userland@192.168.1.XXX
userland@localhost:~$ # 公開鍵認証ではログインできる

おまけ: その他の環境整備

sudo apt update && sudo apt upgrade
sudo dpkg-reconfigure tzdata # タイムゾーンをAsia/Tokyoに設定する
sudo apt install bash-completion neofetch nmap openssh-client # お好みのもの

参考リンク