bash で何でもされるのが怖い?なら rbashはどうですか?
rbash は bash の機能の一つで 「機能制限をされたbash」を提供するためのものです。
rbash とは、制限付きのシェル(RESTRICTED SHELL) の略です。
rbash の正体 bash -r
rbash
コマンドは /usr/bin/rbash
で提供されていて。bash へのエイリアスになっています。
ls -l /usr/bin/rbash lrwxrwxrwx 1 root root 4 Jan 6 16:23 /usr/bin/rbash -> bash
rbash で制限付きのシェルを使う
とにかくまずは、rbash を使ってみよう
実験環境の準備
サクッと lxc でubuntuを起動して実験環境を作ります。
NAME=rbash-test lxc launch ubuntu:22.04 $NAME lxc exec $NAME -- adduser takuya lxc exec $NAME -- usermod -aG sudo takuya lxc exec $NAME -- sudo --login --user takuya
lxc に通常ログイン(bash)する
ログインの代わりにシェルを起動して代替とします。
通常であれば、bashを起動します。
lxc exec $NAME --cwd /home/takuya --user $uid --cwd /home/takuya -- bash
docker で同じようなことをするのであれば、こんな感じですよね。
docker run --rm -it ubuntu bash
lxc に制限ログインする(rbash)
通常であれば bashを起動するところが rbashになるだけです。
lxc exec $NAME --cwd /home/takuya --user $uid --cwd /home/takuya -- rbash
docker で同じようなことをするのであれば、こんな感じですよね。
docker run --rm -it ubuntu -- rbash
rbash は制限シェル
rbashでLinuxを使ってみます。
lxc exec $NAME --cwd /home/takuya --user $uid --cwd /home/takuya -- rbash --norc
cd やコマンドが制限されています。PATH変数は固定化されています。 /tmp
は書き込めるようです。
rbash-5.1$ echo $SHELL /bin/bash rbash-5.1$ cd / rbash: cd: restricted rbash-5.1$ touch /tmp/a rbash-5.1$ mkdir .bin rbash-5.1$ export PATH=$PATH:~/.bin rbash: PATH: readonly variable
rbash は起動したディレクトリより上のディレクトリには移動できません。
例
lxc exec $NAME --cwd /home/takuya --user $uid --cwd /home/takuya/.bin -- rbash --norc rbash-5.1$ rbash-5.1$ pwd /home/takuya/.bin rbash-5.1$ cd .. rbash: cd: restricted rbash-5.1$
LXCで試しているので少しややこしいですが、rbash をexecするときに cwd=/home/takuya/.bin で起動しています。その中にchroot状態になりますが、chrootではありません。
参照もできるし、ファイルも扱うことができます。
/home/takuya/.bin rbash-5.1$ cd .. rbash: cd: restricted rbash-5.1$ ls / bin dev home lib32 libx32 mnt proc run snap sys usr boot etc lib lib64 media opt root sbin srv tmp var rbash-5.1$ echo ~ /home/takuya rbash-5.1$ touch ~/in-home rbash-5.1$
rbashの特徴
rbash の制限機能は man に書いてある通りなんだけど
- PATH環境変数が読み取り専用。
- フルパス指定でコマンド実行はできない
- リダイレクトはできない。
- 制限モードを解除できない
もう少し詳しく書くと、次のとおりです。
- 環境変数が読み取り専用になっています。
- PATHはデフォルトで読み取り専用です。
- リードオンリにする変数は自由に設定可能です。
- フルパス指定でコマンド実行ができません
- PATHにあるものは実行できる
- /bin/bash のような指定はできない。
- リダイレクトが使えません。
- パイプは使えるが、リダイレクトはできない
- 制限モードを解除できません。
- PATHにbashが含まれない場合に限る
シンプルに表現すれば「PATHに書いたコマンドだけに制限するのがrbash」です。
PATHによる制限が基本機能なので /bin/bashがPATHに含まれていると、制限モードは解除されたbashが起動します。
人によってはrbashでシェルは実行できないと書いてますが、bash /ruby / python などがパスに含まれているとハッキリ何でも出来ちゃいます。
rbash を使うときは PATHにはスクリプトやバイナリを設置して、自由な記述をできるようなインタプリタを設置しないほうがいいと思います。
rbashでの制限の使わせ方
最初にPATHを用意する。PATHを用意して、「使っていいコマンド」を列挙する
rbash の便利な使い方
SSH の authorized_keys に書く。 ログインシェルに指定する
ということです。
ただし、~/.profile や ~/.bashrc が動いていまうと台無しになることがあるので --norc
や --noprofile
を使って起動するほうが無難っぽい
rbash まとめ
このように、rbash は システムの運用者に渡して少し安心できるシェルです。フル機能ではありませんが、だいたいのことはできます 。
ただし、PATHに十分に配慮すること。
コマンドを使わせるだけなら、ssh の authorized_keys でコマンド制限したほうが速いと思います。
システムコーンソールにログインする場合などには有効だと思いますが、シリアルコンソールや直接マシンにアクセスさせるくらいなら、 ssh 経由が安全だし、sshのauthorized_keysに同じような機能があるの出番はあまりないかも難しいかもしれません。
ファイルを扱うときにrbashはいいかもしれません。
シェルスクリプトを実行時にrbash実行したり、スクリプトから呼び出せば、「うっかりミス」を防ぐという意味では大活躍できると思います。
たとえば、次のようにしておけば、、、、少しは安心はできるのかもしれない。。。。
cd ~/.bin PATH=~/.bin rbash my-mis-script.sh
rbash の主なオプション
詳しくは man bash (man rbash ではない)を見れば書いてある。
GNU bash, version 5.1.16(1)-release-(x86_64-pc-linux-gnu) Usage: rbash [GNU long option] [option] ... rbash [GNU long option] [option] script-file ... GNU long options: --debug --debugger --dump-po-strings --dump-strings --help --init-file --login --noediting --noprofile --norc --posix --pretty-print --rcfile --restricted --verbose --version Shell options: -ilrsD or -c command or -O shopt_option (invocation only) -abefhkmnptuvxBCHP or -o option Type `rbash -c "help set"' for more information about shell options. Type `rbash -c help' for more information about shell builtin commands. Use the `bashbug' command to report bugs. bash home page: <http://www.gnu.org/software/bash>