Raspbianで最小限のコマンドのみ実行できるユーザの作成をしようとChrootのことを丸一日調べてやっと思い通りになってきたので共有します。
やったこと
- 指定したコマンドのみが実行できる
- カラフルなターミナルを表示
- lsコマンドで最小限のユーザ名とグループ名を表示
- 日本語のファイル名を表示
bashの配置
今回作成したユーザーのディレクトリ構成です。カレントはChrootで絞ったルートディレクトリ(sshd_configのChrootDirectoryの値)です。
tree -L 2 . ├── bin │ ├── bash │ ├── ls │ ├── mkdir │ ├── rm │ └── touch ├── disk ├── etc │ ├── group │ ├── passwd │ └── profile └── lib ├── ld-linux-armhf.so.3 ├── libarmmem-v7l.so ├── libc.so.6 ├── libdl.so.2 ├── libnss_files.so.2 ├── libpcre.so.3 ├── libpthread.so.0 ├── libselinux.so.1 ├── libtinfo.so.6 └── terminfo
lddで依存ライブラリを検索します。
pi@raspberrypi:~ $ ldd /bin/bash linux-vdso.so.1 (0xbefa6000) /usr/lib/arm-linux-gnueabihf/libarmmem-${PLATFORM}.so => /usr/lib/arm-linux-gnueabihf/libarmmem-v7l.so (0xb6f03000) libtinfo.so.6 => /lib/arm-linux-gnueabihf/libtinfo.so.6 (0xb6ed2000) libdl.so.2 => /lib/arm-linux-gnueabihf/libdl.so.2 (0xb6ebf000) libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0xb6d71000)
これらをちまちまlibにコピーし、いざsshで接続
MacBook:~ nkhnd$ ssh chroot@raspberrypi.local Linux raspberrypi 4.19.75-v7l+ #1270 SMP Tue Sep 24 18:51:41 BST 2019 armv7l The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Sun Dec 29 00:26:17 2019 from 192.168.0.101 -bash-5.0$
表示がpi@rapsberrypi:~ $になってくれません。
bashは開幕/etc/profile
を参照して設定しているようです。設定します。
pi@raspberrypi:~ $ sudo mkdir ./etc/ pi@raspberrypi:~ $ sudo vi profile PATH="/bin" export PATH #Chroot以下で利用するパスを通す PS1="\[\e[1;32m\]$USER@\h\[\e[1;37m\]:\[\e[1;34m\]\W \$ \[\e[m\]" # export PS1 #ターミナルをカラフルに # カラフルにlsコマンドを実行 alias ls='ls --color=auto' alias ll='ls -l'
lsコマンドを入力した時ディレクトリの色分けをしてくれるように、このスクリプト内でaliasを設定しておきます。
また、ターミナルの文字列はPS1で設定できるようです。¥uで指定しようとするとユーザ名がないよ!と怒られたので環境変数から呼び込みます。
MacBook:~ nkhnd$ ssh chroot@raspberrypi.local Linux raspberrypi 4.19.75-v7l+ #1270 SMP Tue Sep 24 18:51:41 BST 2019 armv7l The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Sun Dec 29 00:26:17 2019 from 192.168.0.101 pi@rapsberrypi:~ $
最後の行が色付きで表示されました。
backspaceキーの有効化
backspaceを押しても反応がないので調べていたらterminfoたるファイルが必要とのこと。
参考: [CHROOT] Backspace issue (solved)
コピーして持っていきます。
pi@raspberrypi:~ $ sudo mkdir ./lib/terminfo pi@raspberrypi:~ $ sudo cp -p /lib/terminfo ./lib/terminfo
シンボリックリンクがいくらかあるので、(Chrootの都合上)もしかすると機能しない動作があるかもしれませんが、今の所不自由はしていません。
任意のコマンドの配置
bashと同じ要領でやります。bashといくらか重複しているファイルなどもあります。
pi@raspberrypi:~ $ ldd ls linux-vdso.so.1 (0xbef4b000) /usr/lib/arm-linux-gnueabihf/libarmmem-${PLATFORM}.so => /usr/lib/arm-linux-gnueabihf/libarmmem-v7l.so (0xb6fa9000) libselinux.so.1 => /lib/arm-linux-gnueabihf/libselinux.so.1 (0xb6f77000) libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0xb6e29000) /lib/ld-linux-armhf.so.3 (0xb6fbe000) libpcre.so.3 => /lib/arm-linux-gnueabihf/libpcre.so.3 (0xb6db2000) libdl.so.2 => /lib/arm-linux-gnueabihf/libdl.so.2 (0xb6d9f000) libpthread.so.0 => /lib/arm-linux-gnueabihf/libpthread.so.0 (0xb6d75000)
いろいろできるようにしちゃうと多分全てコピーするのと変わりなくなってしまうのではと思うので、ユーザの用途に合わせて必要最低限に絞ります。
今回はls
rm
mkdir
touch
くらいが使えればよかったのでライブラリも少なくてすみました。
lsのグループ名/ユーザー表示
必要なライブラリを全部コピーしたのにグループ名もユーザ名も数字です。
pi@raspberrypi:~ $ ll drwxr-xr-x 2 0 0 4096 Dec 28 05:19 bin drwxr-xr-x 2 1001 1001 4096 Dec 21 11:35 disk drwxr-xr-x 2 0 0 4096 Dec 28 15:24 etc drwxr-xr-x 17 0 0 4096 Dec 8 05:28 lib
/etc/passwdと/etc/groupを配置するだけで読み込んでくれたりはしなかったので調べた所、lddでは表示されないライブラリlibnss_files.so
が必要でした。
省略しましたが、./etc/passwdと./etc/groupはダミーで良いので適当に記述し、Chroot下のetcに保存します。
pi@raspberrypi:~ $ sudo cp -p /lib/arm-linux-gnueabihf/libnss_files.so.2 ./lib pi@raspberrypi:~ $ ll drwxr-xr-x 2 root root 4096 Dec 28 17:04 bin drwxr-xr-x 2 pi pi 4096 Dec 21 11:35 disk drwxr-xr-x 2 root root 4096 Dec 28 18:19 etc drwxr-xr-x 3 root root 4096 Dec 28 16:39 lib
日本語のファイル名を表示
全ての設定が終わったかと思いきや、日本語表示ができませんでした。
pi@raspberrypi:~ $ ll total 0 -rw-r--r-- 1 root root 0 Dec 30 06:42 'Raspi'$'\345\217\202\350\200\203\350\263\207\346\226\231' -rw-r--r-- 1 root root 0 Dec 30 06:42 ''$'\344\275\223\345\210\266\350\241\250''.pdf' -rw-r--r-- 1 root root 0 Dec 30 06:41 ''$'\345\213\244\346\200\240\345\240\261\345\221\212''.xml'
localeの設定ファイルを持ち込む必要がある模様。
qiita.com
丸々コピーでも良いのですが、せっかくなのでmount -Bでやる方法も記載しておきます。
mount -Bの場合、再起動するとアンマウントされるので、再度マウントするか、fstabに登録すると永続化できます。
pi@raspberrypi:~ $ mkdir -p usr/lib/local pi@raspberrypi:~ $ sudo mount -B /usr/lib/local ~/usr/lib/local
これできちんとターミナルが日本語になります。
etc/locale.conf等が必要ないのはRasbianの仕様でしょうか。
動いたのでヨシ!
mount -B <紐付け元> <紐付け先>
でディレクトリをマウントすることができます。この方法ならChroot下でもシンボリックリンクの挙動に近いことができます。
fstabの書き間違えに注意。特に/bin/
や/lib/
はシステム根幹部分なので、間違えると起動しなくなります。
そうなった場合はSDカードをext4で読み書きできるOS(Ubuntu)などで編集し、修正してあげると復旧します。 nkhnd.hatenablog.jp
ユーザ制御するとなんかサーバやってる感が出ていいですね。