Linuxをサーバとして複数人で利用する際、ssh接続するアカウント事に使用できるコマンドを制限したいことがある。 そのような場合には、以下のような手法が用意されている。

1. ログインシェルをrbashにする

前にここでも触れているのだが、rbashというbashのシンボリックリンクを作成して、それをログインシェルにすることで、特定のコマンドのみを実行可能なユーザを作成できる。 bashのシンボリックリンクなので、別にコマンドのバイナリを用意したりとかしなくてもいい。 また、PATHを直接指定してのコマンド実行も行えないようになっているのもよい。

おそらく、一番手軽な設定方法ではないだろうか。

2. chrootでルートディレクトリを変更する

chrootでルートディレクトリを変更することで、コマンドのPATHなどを参照できなくさせて実現する方法。 この方法であれば、そもそもchrootで設定・定義したディレクトリより上は見ることもできない。

ただ、厄介なのが"そもそも見れない"せいで、chrootより上を参照するシンボリックリンクは機能しないという点。 このためコマンドのバイナリなどを別にコピーして配置したり、ディレクトリをマウントさせてやったりする必要がある。 その後のメンテナンスを考えるとちょっと面倒くさい。

3.authorized_keysで制限する

実行させたいコマンドが1個しかないならば、sshのauthorized_keysにコマンドを指定することでssh接続と同時にコマンドを実行させることが可能だ。 接続と同時にコマンドが実行され、コマンド実行後(コマンドの失敗・キャンセル含む)はリモートシェルには接続できずそのままssh接続も切れる。 authorized_keysで公開鍵ごとにコマンドを指定できるので、別途特定のユーザを作成しなくても実現できるのもポイントだろうか。

ただ、ssh接続と同時にコマンドが実行されてしまう、基本的に1個しかコマンドが実行できない(ラッパースクリプトを用意して実行できるコマンドを選択させるとかすれば別だが)ので、使いどころが難しい気がする。

【番外】(sudo実行コマンドを)/etc/sudoersで制限する

一般的な内容だし、ここに書かんでもいいかな感はあるのだが、実行可能コマンドつながりで残しておく。 sudoの実行コマンドを制限する場合は、「/etc/sudoers」でカンマ区切りで指定してやればよい。

ユーザ名    ALL=(ALL)       コマンド1,コマンド2...