rbashで一部のユーザが実行できるコマンドを制限する(特定コマンドしか実行できないようにする)

一部のユーザで、特定のコマンドのみを利用できるようにして、そのほかのコマンドは実行できないようにしたい。
そんなときは、対象のユーザのログインシェルをrbashというシンボリックリンクにしてやることで実現可能だ。

まず、bashのシンボリックリンクとしてrbashを「/opt/bin」配下に作成する。

mkdir /opt/bin
ln -s /bin/bash /opt/bin/rbash

次に、rbash用のユーザを作成する。

useradd rbash_test -s /opt/bin/rbash
passwd rbash_test

rbash用のユーザが利用できるコマンド(シンボリックリンク)のみを格納したディレクトリを作成する。
ここでは、ping、lsのみを許可してみる。

mkdir /opt/bin/rbash_test/
ln -s $(which ping | grep bin) /opt/bin/rbash_test/
ln -s $(which ls | grep bin) /opt/bin/rbash_test/

最後に、.bash_profileを書き換えてPATHに先ほど作成したディレクトリのみを指定する。

chown root:root /home/rbash_test/.bash_profile
chmod 755 /home/rbash_test/.bash_profile
sed -i '/^PATH=/cPATH=/opt/bin/rbash_test/' /home/rbash_test/.bash_profile

あとはログインするだけだ。
対象のユーザでログインしてみよう。

Last login: Sun Sep 25 09:19:23 2016 from XXX.XXX.XXX.XXX
[rbash_test@BS-PUB-CENT7-02 ~]$ ls -la
合計 16
drwx------. 2 rbash_test rbash_test  79  9月 25 09:18 .
drwxr-xr-x. 3 root       root        23  9月 25 09:16 ..
-rw-------. 1 rbash_test rbash_test 128  9月 25 09:19 .bash_history
-rw-r--r--. 1 rbash_test rbash_test  18  8月  3 01:00 .bash_logout
-rwxr-xr-x. 1 root       root       181  9月 25 09:18 .bash_profile
-rw-r--r--. 1 rbash_test rbash_test 231  8月  3 01:00 .bashrc
[rbash_test@BS-PUB-CENT7-02 ~]$ ls -la /opt/
合計 4
drwxr-xr-x.  3 root root   16  9月 25 09:16 .
dr-xr-xr-x. 17 root root 4096  1月  2  2016 ..
drwxr-xr-x.  3 root root   35  9月 25 09:17 bin
[rbash_test@BS-PUB-CENT7-02 ~]$ cd
-rbash: cd: 制限されています
[rbash_test@BS-PUB-CENT7-02 ~]$ ping -c 1 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=58 time=117 ms

--- 8.8.8.8 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 117.210/117.210/117.210/0.000 ms

確かにcdはできないし、制限はできてるようだ。
ただまぁ、chrootを行っているわけではないので、/homeより上は見えるようだ。ということはPATHを書き換えたり、「/bin」配下のコマンドを直接実行できるのか?というと

[rbash_test@BS-PUB-CENT7-02 ~]$ PATH=$PATH:/bin
-rbash: PATH: 読み取り専用の変数です
[rbash_test@BS-PUB-CENT7-02 ~]$ /bin/touch aaa
-rbash: /bin/touch: 制限されています:  `/' をコマンド名の中に指定できません

ちゃんと実行できないようになっているようだ。