猫の手なら貸せる

いろいろ共有できたらいいなとおもってます

一部のコマンドだけ使えるユーザの作成

Raspbianで最小限のコマンドのみ実行できるユーザの作成をしようとChrootのことを丸一日調べてやっと思い通りになってきたので共有します。

やったこと

  1. 指定したコマンドのみが実行できる
  2. カラフルターミナルを表示
  3. lsコマンドで最小限のユーザ名とグループ名を表示
  4. 日本語のファイル名を表示

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


ユーザ制御するとなんかサーバやってる感が出ていいですね。