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 PDA | Android 8.1.0 |
アプリ | UserLAnd | 3.0.0 (2022-06-30) |
アプリ上の環境 | Ubuntu | 20.04.4 LTS (Focal Fossa) |
アプリ | JuiceSSH | 3.2.2 (2021-02-04) |
以下、「Ubuntu環境」とはUserLAndの上に構築するUbuntu環境を指す。
1) Ubuntu環境の用意と初期設定
- UserLAndを起動し、[Distribution] で「Ubuntu」をタップ→「Connection Type: Terminal」を選択してSessionを追加する
- [Sessions] で「ubuntu → apps」をタップしてセッションを起動する
Welcome to Ubuntu in UserLAnd!
userland@localhost:~$
- 現在の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環境に別マシンの公開鍵を登録しておく
- 別マシンの公開鍵
~/.ssh/id_ecdsa.pud
を次のように登録する
mkdir ~/.ssh && chmod 700 ~/.ssh
vim ~/.ssh/authorized_keys # 別マシンの公開鍵(ed25519は非対応, rsaやecdsaは対応)を追記する
chmod 600 ~/.ssh/authorized_keys
- 追加した公開鍵のペアの秘密鍵を用いて、別マシンからSSHログインできることを確認する
ssh -o PreferredAuthentications=publickey -i ~/.ssh/id_ecdsa -p 2022 -l userland 192.168.1.XXX
3) JuiceSSHから公開鍵認証でのログインを試す
- JuiceSSHで [Manage Connections] を選択し、[認証情報] にてecdsa形式の秘密鍵を作成する
項目 内容 ニックネーム (任意) ユーザ名 userland パスワード プライベートキー Key Format = ECDSA, キー強度: 384bit (初期値のまま), パスフレーズ: 任意のもの - 作成された認証情報をロングタップし、ペアの公開鍵をエクスポートする (クリップボードにコピーなど好きな手段でOK)
- 公開鍵テキストを別マシンを経由して、2) と同様にUbuntu環境の
~/.ssh/authorized_keys
に追記する - JuiceSSHの [接続] にて、次の内容の接続を作成する
項目 内容 ニックネーム UserLAnd@localhost アドレス 127.0.0.1 認証情報 上記で作成したecdsa形式のものを選択 ポート 2022 - 接続「UserLAnd@localhost」を実行し、Ubuntu環境へ公開鍵認証でログインできることを確認する
4) Ubuntu環境へのSSHのパスワードログインとrootログインを無効化する
本項の手順を実施すると、Ubuntu環境へ、UserLAndに内蔵のターミナルアプリからログインできなくなることに注意。
- 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
- UserLAndの [Sessions] で「ubuntu → apps」をタップして [Stop Session] を選択する
- UserLAndの [Sessions] で「ubuntu → apps」をタップしてセッションを起動する
[Process completed (code 1) - press Enter]
と出るがこれはパスワード認証が無効化されたことによるもので意図通り。Enterを押す
5) 設定反映を確認
- 別マシンからUbuntu環境へSSHログインを試し、パスワード認証が無効になったことを確認する
$ ssh -o PreferredAuthentications=password -p 2022 userland@192.168.1.XXX
userland@192.168.1.XXX: Permission denied (publickey). # パスワード認証が受け付けられない
- 別マシンから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 # お好みのもの