一部のユーザで、特定のコマンドのみを利用できるようにして、そのほかのコマンドは実行できないようにしたい。
そんなときは、対象のユーザのログインシェルを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: 制限されています: `/' をコマンド名の中に指定できません
ちゃんと実行できないようになっているようだ。