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
とすることで、シェル設定なしでも可能とのことです。