それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

rbash で制限付きのシェルを作って安全を確保する

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>

参考資料