Linux上で、限られた操作だけができるようなアカウントを作る機会があったので、そのあたりについてまとめてみました。
「ログインできないアカウント」では足りない場面
Linuxマシンには、数多くのアカウントが作られることがあります。で、その中には「メールアカウントとしてしか使わない」「FTP専用のアカウント」「デーモンの権限切り分け用」などというように、シェルログインが全く不要なアカウントも存在します。ログインしなくていいのなら、/bin/falseや/sbin/nologinのようなダミーシェルを与えておけば、ログイン自体が不能となります1。
一方で、「それでは済まない」という用事ももちろんあります。サーバに自動的なオペレーションを走らせるような場面で、他のサーバへ特定のコマンドを実行させたい、というような場合です。このような場合、機械処理可能な形でログイン情報を置いておかざるを得ないので、何も制約をかけなければやりたい放題になってしまいます。
1コマンドなら楽勝
サーバへSSHログインする際にauthorized_keysを設定しますが、このファイルには鍵だけでなく各種のオプションを設定できます。そこで、command="…"のように指定すれば、特定のコマンドを実行して、それが終わればすぐ接続断という専用の鍵ができます。
複数実行したい場合
とはいえ、リモートサーバでいくつかのオペレーションをしたい場合に、その1つ1つに鍵を作るのも手間かもしれません。そんなときに使えそうな手段として、rbashというシェルがあります。
rbashとは
rbashとは、bashの特殊なモードの1つです。rbashという名前で起動する、あるいはbash -rとするとこのモードに入ります。
詳しくはmanを見てもらうとわかりやすいのですが、できなくなることとして、
-
cdでのディレクトリ変更 -
PATHの変更 -
/のあるコマンドの実行、source - リダイレクト
があります。大雑把に言えば、元からPATHに入っているコマンドと、bashの組み込みコマンドしか実行できなくなります。
ただし、これはあくまでシェル単位での設定なので、(シェルスクリプトを含め)シェルから実行した別コマンドには制約が適用されなくなります2。つまり、シェルそのものを筆頭に、「任意のプログラムを実行できるプログラム」をこの環境から呼び出せるなら、まったく意味がなくなってしまいます。
実行できるものの制限
まずまっ先に、.bash_profileでPATHを制限しましょう。~/binでも掘って、そこだけを指定しておくのがいいと思います。そして、PATHにしたディレクトリやホームディレクトリ、そして.bash_profileや.bashrcからは、当該アカウントの書き込み権を奪っておきます。
bash内部の機能について
これだけやっても、bash自体に内蔵されたコマンドは実行できるままです。特に、killなんてのもあったりします。ということで、enable -n コマンドとして組み込みコマンドを無効化しておきましょう(なお、enable自体を無効にしたい場合は最後に実行する必要がありますが、rbashの環境下ではenableで組み込みコマンドを再有効化することはもともとできません)。
あと、スラッシュ付きのコマンドの実行はできませんが、シェルへの入力はできてしまい、入力補助でファイルリストが出ます。.inputrcでset disable-completion onとして止めておきましょう。
最後に
セキュリティに完璧はありません。このrbashを使った方法も、あくまでシェルログインに伴うリスクを軽減させる方法の1つでしかありません。もっと厳格にしたければ、上のように鍵を分けるほうがより安全だと思います。
ポートフォワード専用シェルについて
「SSH接続でポートフォワードだけしたい」というのであれば、ssh -Nとすることで、シェル設定なしでも可能とのことです。