組込みLinux Beaglebone blackでやってみる その9 Telnet、軽量SSH DropbearをBusyBoxに組込む

『その9』では、Telnetを立ち上げ方や確認の仕方はやってみる価値があると思います。 DropbearはClientとしてuBuntuのopenSSHに接続出来ましたが、Serverとしては接続が出来ませんでした。 今後、BuildrootでopenSSHを組み込めたので、ここではTelnetだけで、Dropbearは読み飛ばしてもいいと思いますが、今後のデバッグ等の参考にもなると思うので、Dropbearの組み込み方と仕組みや起動方法など参考いただければと思います。 

まずTelnet

telnet使用

最初にroot設定

  • BusyBoxを最初に入れた時は、rootも何もユーザーがないので、まずrootだけ作ります。
  • root含め全てのユーザーを管理するため、/etc/passwdを作ります。(/etc/shadowも作ったほうが良い)
  • rootユーザー設定を/etc/passwdに書き込みます。
  • /etc/passwdに誰でもアクセス出来るように権限設定。
  • これでpasswd rootでパスワードが設定出来るようになったのでパスワードを設定。

telnetd準備

  • telnetdの仮想シェルをマウントする/dev/ptsを作ります。
  • devptsを/dev/ptsにマウントすます。
  • telnetdを起動します。
  • これでuBuntuからTelnetでアクセス出来ました。 因みに、telnetコマンドはIPアドレスだけを付けます。 sshコマンドは、ログイン名も付けるところがちょっと異なります。
uBuntu
$ sudo mkdir -p /root/.ssh //BBBで作ると起動時毎回作成必要で、保存していたAuthorized_kyesも消えるので、予め作っておく。
$ sudo mkdir -p /etc/default         // 今回必要ないが、一応dropbearの環境設定ファイル用に作っておく
$ touch /etc/default/dropbear   // 同上
  • まずログインするrootユーザーとrootパスワードを作ります
  • そのためには各種ファイルが必要なので作っておきます。
  • そして、telnetやsshで接続した時に表示される様に/dev/ptsにdevptsをマウントしておきます。
BBB
# touch /etc/passwd
# touch /etc/shadow
# touch /etc/group
# chmod 644 /etc/passwd
# chmod 644 /etc/shadow
# chmod 644 /etc/group
# echo root:x:0:0:root:/root:/bin/sh > /etc/passwd  //busyboxにはshしかなく、Bashなどはありません。
# echo root::11376:0:99999:7::: > /etc/shadow
# adduser root -u 0
# passwd root

# mkdir -p /dev/pts  //これはルートFSで作っておかないと起動時毎回必要
# mkdir -p /root/.ssh //これもルートFSで作っておかないと起動時毎回必要。 また保存していたAuthorized_kyesも消える。
# cd /root
# chmod 700 .ssh
# mount -t devpts none /dev/pts    //起動時毎回必要

# telnetd allow add ALL
# ps | grep telnetd  // これでプロセスが表示されれば起動しています。
// # kill -9 process_id      // psで確認したプロセス番号指定してtelnetdを終了できます。 終了すると接続出来ません。

これでuBuntu側から接続できます

BBB
$ telnet 192.168.27.2
// ログインを聞いてくるので、rootとしてパスワードを聞いてくるので、先程作ったパスワードを入れると接続出来ます。
//telnet接続終了時は、exit
$ exit

SSH (Secure SHell)

ではDropbearのSSHをする前に、いろいろな表現があるので前提となる用語を明確にしておきます。

SSH関連を調べた時、理解を困難にしているのは、AIや他の技術の時と同様で同じ意味の事をいろいろ異なった単語で呼ぶ人たちが多いですね。 また、SSHクライアントが公開鍵で接続するのか、秘密鍵を使って接続するのかの2通りがあり、更に、どちらをSSHクライアントにするのかということもあるので、理解するのをややこしくしていますね。 まず、ここではuBuntuをOpenSSHのクライアントにして、BBBをDropbear SSHサーバーにします。

  • サーバー=ホスト=リモートホスト (接続を待つ側:今回BBB)
  • クライアント (sshコマンドで接続を試みる側:今回uBuntu)
  • 鍵をサーバーで作る場合は、公開鍵を複数のクライアントに送る。 一つの秘密鍵で複数接続。(SSL/TSLの時はこの形)
  • 鍵をクライアントで作る場合は、秘密鍵をクライアントに置き、公開鍵はサーバーに置く。 一つの秘密鍵で1つの接続。(セキュリティー的に高い)
  • 秘密鍵はクライアントに置く
  • 公開鍵はサーバーに置く
  • 秘密鍵=非公開鍵=private key=secret key(日本人の呼び方):使う人によってバラバラだけど同じ意味。 公開鍵を使って通信する場合の自分だけが持っている鍵。
  • 公開鍵=public key
  • DSSとDSAは同じ意味
  • OpenSSHの~/.ssh/authorized_keys クライアントの公開鍵をリストアップしておくところ。 Permissionが600でないといけない。 サーバーには公開鍵は不要。
  • 動作しているsshは、systemctl status sshで確認可能。uBuntu 20.04はOpenBSD SSH

Dropbear 軽量ssh

  • OpenSSHをフォークしている。
  • dropbear_xxxx_host_keyは秘密鍵。 秘密鍵はOpenSSHとフォーマットが異なる。 dropbearconvertでOpenSSH用に変換できる。
  • 公開鍵はdropbear_xxxx_host_keyから取り出せる。 公開鍵はOpenSSHと同じフォーマット。
  • なので、公開鍵を取り出して、クライアント(uBuntu)の~/.ssh.authorized_keyに追加しておけば良いはず。 これでクライアント側から公開鍵を使って接続出来るはずです。

Dropbearダウンロード

以下から、好きなバージョンをダウンロード。 私は、dropbear-2022.83.tar.bz2 をダウンロードしました。 古いバージョンは、現状で最強のed25519暗号化が使えません。(しかし、2022.83バージョンと私のLinux&BusyBoxの組み合わせでは、uBuntuからログイン出来ませんでした。 2022.12現在)

Index of /dropbear/releases

解凍

ダウンロードしたdropbear-2022.83.tar.bz2ファイルを、~/BBB_Workspace/Downloads/に入れ、解凍しました。

$ cd ~/BBB_Workspace/Downloads/
$ tar -jxvf dropbear-2022.83.tar.bz2

ビルド用の設定

CFLAGS=-DDEBUG_TRACE dropbear -vvv が使えるようになって、エラー解析に役立ちます。

$ cd ~/BBB_Workspace/Downloads/dropbear-2022.83
$ make clean
$ ./configure --host=arm-linux-gnueabihf --disable-zlib --prefix=/home/ichiri/BBB_Workspace/Downloads/dropbear-2022.83/ CC=arm-linux-gnueabihf-gcc CFLAGS=-DDEBUG_TRACE

コンパイルとインストール

  • staticでバイナリファイルにコンパイル
  • 生成された 指定したバイナリファイルをインストール
$ cd ~/BBB_Workspace/Downloads/dropbear-2022.83
$ make PROGRAMS="dropbear dropbearkey dbclient scp dropbearconvert" STATIC=1
$ make PROGRAMS="dropbear dropbearkey dbclient scp dropbearconvert" install DESTDIR=/srv/nfs/bbb/

これで以下のファイルが出来ました、インストールで、/bin, /sbin /shareに必要なファイルがコピーされました。

  • dropbear-2022.83/
    • dropbear —Dropbear ssh server
    • scp — Secure copy (sshでつながれば使えます)
    • dropbearkey —Dropbearの秘密鍵を生成、また秘密鍵から公開鍵を取り出す
    • dbclient —Dropbear ssh client
    • dropbearconvert —Dropbearフォーマットの秘密鍵をOpenSSHフォーマットに変換する

DESTDIRを使わなければ、dropbear-2022.83ディレクトリ下のbinそれのディレクトリをnfsサーバーディレクトリにコピーする。

~/BBB_Workspace/Download/dropbear-2022.83/bin, /share を/srv/nfs/bbb/にコピーする
$ cd ~/BBB_Workspace/Download/dropbear-2022.83
$ cp -r ./bin /srv/nfs/bbb/          // dbclient, scp, dropbearkey, dropbearconvert
$ cp -r ./sbin /srv/nfs/bbb/         // dropbear 
$ cp -r ./share /srv/nfs/bbb/        //マニュアルが入っているので、最悪コピーしなくても良い

BBB側でed25519暗号化秘密鍵を生成

  • /binでキーを生成
  • キーを/etc/dropbear/に入れる
  • -t  暗号化
  • -f ファイルの場所
  • (-N パスフレーズ)openSSHでは使えるが、dropbearでは不明。
# mkdir -p /etc/dropbear
# cd /etc/dropbear
# /bin/dropbearkey -t ed25519 -f dropbear_ed25519_host_key

// 以下は他の暗号を使う時の参考
// /bin/dropbearkey -t dss -f dropbear_dss_host_key
// /bin/dropbearkey -t rsa -f dropbear_rsa_host_key
// /bin/dropbearkey -t ecdsa -f dropbear_ecdsa_host_key

BBBで公開鍵の抜き出し

BBB
# cd /bin
# dropbearkey -y -f /etc/dropbear/dropbear_ed25519_host_key |grep "^ssh-ed25519 " >> "dropbear.pub"

// 以下は他の暗号を使う時の参考
// dropbearkey -y -f /etc/dropbear/dropbear_rsa_host_key |grep "^ssh-rsa " >> "dropbear.pub"
// dropbearkey -y -f /etc/dropbear/dropbear_dss_host_key |grep "^ssh-dss " >> "dropbear.pub"
// dropbearkey -y -f /etc/dropbear/dropbear_ecdsa_host_key |grep "^ecdsa-sha2-nistp256 " >> "dropbear.pub"

抜き出した公開鍵をuBuntu側に登録

uBuntuの~/.ssh/authorized_keysに公開鍵を設定。

uBuntu
$ cd /srv/nfs/bbb/etc/dropbear
$ cat dropbear.pub >> ~/.ssh/authorized_keys

Dropbearの起動

-rで秘密鍵を指定しています。  指定しなくても良いはずですが、何故か、Dropbearが勝手にRSA形式やDSS形式やECDSA形式を読み込もとして、not found warningが表示され、uBuntuからも接続出来ていなかったこともあり、秘密鍵をed25519形式だけに特定したかったので指定しています。 他の形式も試しましたがだめでした。

BBB
# dropbear -r /etc/dropbear/dropbear_ed25519_host_key -vvv       //-vvvはデバッグ用
// 参考 dropbear -r /etc/dropbear/dropbear_ed25519_host_key -i inetd -vvv
# ps | grep dropbear  // 起動しているか確認
// # kill -9 process_id  // dropbearを終了する時は、psで起動しているdropbearのプロセス番号を確認して、kill。 -9は強制実行。

// dropbear -p 10022  // 変則ポート番号指定して起動。 指定しない場合は、ポート番号は22。

dropbear起動時オプション

  • -b bannerfile ユーザーログイン前にファイルバナーの内容表示
  • -d dsskey 初期値はDSS host key
  • -t  pubkey & password required
  • -r  hostkeyfile
  • -e  サーバー環境を子プロセスに引き渡す
  • -w rootログイン禁止
  • -s パスワードログイン禁止
  • -g パスワードでのrootログイン禁止
  • -j ローカルポートフォワーディング禁止
  • -k リモートポートフォワーディング禁止
  • -p ポート番号(初期値:22)
  • -i サービスプログラムモード(inetd、tcpsvd、tcpserver等)
  • -F シェルを乗っ取って、dropbearの詳細メッセージ表示。 デバッグ時に良い。 Ctrl+Zで停止。
  • -vvv Verbose表示—詳細メッセージ

がある。

uBuntu PCからssh接続

  • 最初に接続する際、fingerprintを聞かれるので、yesと入れるか、表示されたSHA256からピリオドを除いた最後の文字(この場合w)までをコピーして貼り付ける。 するとknown_hostsのListに追加される。(結果的に常にPermission deniedで接続出来なかったので、yesでいいのかfinber printを貼り付けないといけないかは不明でした。 しかし、yesと入れても、known_hostsにfinger printが保存されたので、yesでいいはずです。)
  • パスワードを聞かれるので、rootの設定したパスワードを入れると接続するはずです。(私はここでPermission Deniedになりました。
uBuntu
$ ssh root@192.168.7.2
The authenticity of host '192.168.27.1 (192.168.27.1)' can't be established.
ECDSA key fingerprint is SHA256:P4ClQHdz9tAMx1DVb68GuvdY9IBcrRIQhTLdQLV2yNw.
Are you sure you want to continue connecting (yes/no/[fingerprint])? SHA256:P4ClQHdz9tAMx1DVb68GuvdY9IBcrRIQhTLdQLV2yNw
Warning: Permanently added '192.168.27.1' (ECDSA) to the list of known hosts.
ichiri@192.168.27.1's password: 

接続出来なかった (エラーメッセージ)

dropbear -vvvで起動したのでメッセージが出ていますが、多分Login attempt for nonexistent userとなるので、Login出来ないのだと思います。何故、nonexistentとなるのか解りません。 Telnetではログインできるので、BusyBoxの設定は正しいと思います。 DropbearにはRootLogin禁止やパスワードログイン禁止のオプションを付けていないので、Rootログインもパスワードログインも出来るはずです。 多分、2022.83バージョンのバグで、内部でRootLoginが禁止になっているのではと思ってます。 いろいろ試しました。

  • uBuntu側に何も設定せず、パスワード認証の方法
  • uBuntuに公開鍵を~/.ssh?authorized_keysに設定して、BBBにはdropbear_ed25519_host_keyの秘密鍵で認証の方法
  • dropbear_ed25519_host_keyをssh用の秘密鍵に変換して、id_ed25519というファイル名に変更して、~/.sshに保存。 BBBにはdropbear_ed25519_host_keyから公開鍵を抜き出して、BBBの/root/.ssh/authorized_keyに入れて、dropbear_ed25519_host_keyも残したまま、ssh root@192.168.27.2 -i ~/.ssh/id_ed25519 -vvv で認証の方法
BBB
Jan 1 00:25:59 192 authpriv.info dropbear[248]: Child connection from 192.168.27.1:43072<br>[248] Jan 01 00:25:59 Child connection from 192.168.27.1:43072<br>TRACE1 (248) 0.000000: remoteident: SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.5<br>Jan 1 00:26:00 192 authpriv.warn dropbear[248]: Login attempt for nonexistent user<br>[248] Jan 01 00:26:00 Login attempt for nonexistent user<br>Jan 1 00:26:07 192 authpriv.info dropbear[248]: Exit before auth from &lt;192.168.27.1:43072&gt;: Exited normally

nonexistentとならない解決方法を知っている方がいたら教えてくいただけないでしょうか?

BBBからのssh接続

dbclientで簡単に接続できました。(Dropbear clientです。 OpenSSHではsshがクライアントで、sshdがサーバーですね。)

BBB
# dbclient ichiri@192.168.27.1

接続できない場合は、uBuntuのsshd(サーバー)が動作しているかどうか確認してください。していなければ、start/restartしてください。

uBuntu
$ systemctl status sshd
$ sudo systemctl start sshd

トラブル対策

REMOTE HOST IDENTIFICATION HAS CHANGED!

BBBのrootパスワードを変更したらアクセス出来なくなりました。 ここに書いている通り、~/.ssh/known_hostsに新しいfinger print書き込まないといけないのですが、古いfinger printをssh-keygenでまず消します。

uBuntu
$ ssh root@192.168.27.2
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
SHA256:e3gkMDpJJ87BoGwKEKvWW6MGXz17ExtPkOw96oZRmLw.
Please contact your system administrator.
Add correct host key in /home/ichiri/.ssh/known_hosts to get rid of this message.
Offending RSA key in /home/ichiri/.ssh/known_hosts:2
  remove with:
  ssh-keygen -f "/home/ichiri/.ssh/known_hosts" -R "[192.168.27.2]"
RSA host key for [192.168.27.2] has changed and you have requested strict checking.
Host key verification failed.

$ ssh-keygen -f "/home/ichiri/.ssh/known_hosts" -R "192.168.27.2"

OpenSSHの詳細メッセージ表示

クライアント用

sshコマンドに-vvvを付ける。 これで実行時何処でエラーが出ているかわかりやすくなる。 『receive packet: type 51』と表示されるのは失敗しているからだそうです。

uBuntu
$ ssh root@192.168.27.2 -vvv

サーバー用

  1. /etc/ssh/sshd_configのSyslogFacilityとLogLevelがコメントとならないようにして、LogLevel DEBUGとする。
  2. sshdを再起動
uBuntu
//以下設定は、uBuntu側のOpenSSHのLogの設定
$ sudo vi /etc/ssh/sshd_config
SyslogFacility AUTH
LogLevel DEBUG     <-----ここを変更
$ sudo systemctl restart sshd

ログ検索

  1. /var/log/auth.logか/var/log/syslogの中身を見てみる。
    • 最新のログを見るには、tail -100 /var/log/auth.log でみると、最新の100行が見れます。
  2. 或いは、dropbearと出てくるlogファイルを全てリストアップしてみてみる。(*journalは見れません。 非常にながいので、Ctrl+Zで中断しました。)
uBuntu
$ sudo grep -ilr dropbear /var/log/*

// sshしてもauth.logが更新されなかったので 640から変更しましたが結果は同じでした。
$ sudo chmod 666 /var/log/auth.log
$ sudo chmod 666 /var/log/syslog
 tail -20 /var/log/auth.log

//以下はログの一部切り出し例。 しかし、失敗して時のログが取れていません。
//signal 15は SIGTERMの事。 Restartしたから一旦SIGTERMが発行されただけなのでこれは正常。
Dec 13 18:25:15 ichiri-VPCF128FJ sudo: pam_unix(sudo:session): session closed for user root
Dec 13 18:25:29 ichiri-VPCF128FJ sudo:   ichiri : TTY=pts/2 ; PWD=/srv/nfs/bbb ; USER=root ; COMMAND=/usr/bin/systemctl restart sshd5; terminating.
Dec 13 18:25:30 ichiri-VPCF128FJ sshd[41073]: debug1: Set /proc/self/oom_score_adj from 0 to -1000
Dec 13 18:25:30 ichiri-VPCF128FJ sshd[41073]: debug1: Bind to port 22 on 0.0.0.0.
Dec 13 18:25:30 ichiri-VPCF128FJ sshd[41073]: Server listening on 0.0.0.0 port 22.
Dec 13 18:25:30 ichiri-VPCF128FJ sshd[41073]: debug1: Bind to port 22 on ::.
Dec 13 18:25:30 ichiri-VPCF128FJ sshd[41073]: Server listening on :: port 22.
Dec 13 18:25:30 ichiri-VPCF128FJ sudo: pam_unix(sudo:session): session closed for user root

fexecve エラーの時

~/.ssh/authorized_keysに全ての暗号化の公開鍵を入れていたら、dropbearのメッセージでfexecveのエラーが出ました。 必要な公開鍵だけにしたら、このエラーはなくなりました。

receive packet: type 51

sshのメッセージでこれがでていたら、そこでは送ったpacketが受け付けられなかったということだそうです。

ログイン確認

BBBの rootで設定したパスワードでログインできるかどうか確認。 これはちゃんとログインできました。 Telnetでも同じパスワードでログインできました。 何故Dropbearにはログインできないのか?

BBB
# exec /bin/login root

その他試した事

色んなサイトを見て試してみました。

// $ chmod 777 /srv/nfs/bbb/root/.ssh/*     各種ファイルやディレクトリの権限変えてみたが改善せず
// $ sudo ssh root @192.168.27.2 -vvv
// $ ssh-copy-id root@192.168.27.2 <file_path> ssh接続と同じエラーでつながらない
// libnss*.so* ファイルがないから? 
// # dropbear -A -N root -U 0 -G 0 -C rootpassword  これで起動してみたが改善せず
// 以下を書き込んでみた。 psで確認したら、inetdは起動したが、dropbearは起動しなかった。
# vi /etc/inetd.conf
ssh     stream  tcp     nowait  root    /usr/local/sbin/dropbear dropbear -i

Dropbearの設定ファイル

いろいろ書かれているけど、Dropbearの作者Matt Johnstonは2021年にconfigファイルを作るつもりはないと言っていますね。(https://lists.ucc.gu.uwa.edu.au/pipermail/dropbear/2021q1/002281.html) configファイルなしで、全て引数で設定するようです。 しかし、以下はdropbearのconfigファイル名があると言っているいろいろなサイトで書かれていた、ファイル名と場所です。 しかし、私の場合はJohnstonさんが言っている様に、環境設定ファイルはありませんでした。

//場所はいろいろあるようです。
/etc/default/dropbear    //これが一般的のようです。
rootからのログイン、パスワードログインを防止するために/etc/default/dropbearのファイルに以下の行を加える。
DROPBEAR_EXTRA_ARGS="-w"
DROPBEAR_EXTRA_ARGS="-s"
DROPBEAR_EXTRA_ARGS="-g"

/etc/config/dropbear   //openWrt使用時

/etc/conf.d/dropbear
DROPBEAR_OPTS="-w"

/etc/init.d/dropbear
//ファイルを開いてport=22となっている場所(Ctrl+F、portで探してください)を好きな番号(0~65535の中に納まる値)

コメント