Hatena::ブログ(Diary)

make world

2009-08-05

/bin/false と /sbin/nologin と /etc/shells について

ユーザーのシェルとリモートログインの制限を行うことについて調べたことに関する備忘録。

目的

  • あるユーザーをリモートからログインすることは不許可にする
  • FTP の接続のみ許可
  • シェルの利用を制限したい

解決方法

# usermod -s /sbin/nologin username

で、対象ユーザーのデフォルトシェルを /sbin/nologin に変更する。

/bin/false と /sbin/nologin について

/bin/false/sbin/nologin
Telnet の接続不可不可
SSH の接続不可不可
FTP の接続不可*1
SFTP の接続不可不可
シェルの実行不可不可

/bin/false で FTP ログインを可能にしたい

# vi /etc/shells
/bin/false

/etc/shells に /bin/false を追記すれば可能になるが、セキュリティが緩む点と、ユーザーのデフォルトシェルを単純に /sbin/nologin に指定すればいいので、わざわざ追記する必要はない*2

特定のユーザーのデフォルトシェルを変更する

# usermod -s /sbin/nologin username

もしくは

# chsh /sbin/nologin username

/sbin/nologin を指定せずに、ユーザーに FTP 接続のみを許可する

下記のページで、他の対応方法が書かれていた。

手順は、

  1. /bin/ftp というスクリプトを作成する
  2. /etc/shells に /bin/ftp と追記する
  3. FTP 接続は可能だが、リモートログインシェルの実行が不可能になる
# vi /bin/ftp
#!/bin/sh
# this shell can user only ftp or pop.
trap "/bin/echo Sorry; exit 0" 1 2 3 4 5 6 7 10 15
IFS=""

/bin/echo
/bin/echo "--------------------WARNING-----------------------"
/bin/echo " You aren't allowed interactive access to SCNe.JP."
/bin/echo " only usr ftp."
/bin/echo " If you've a question, e-mail to root@localhost."
/bin/echo "--------------------WARNING-----------------------"
exit 0

# vi /etc/shells
/bin/ftp

/bin/ftp の記述内容について

  • ユーザーがログイン(リモートログインも含む)をした時に、/bin/ftp が実行される
  • trap が実行されて、「1 2 3 4 5 6 7 10 15」のシグナルを出力して停止する
  • IFS変数に空文字が代入される
  • /bin/echo が実行されて、メッセージが出力される

/bin/ftp を直接実行すると、

% /bin/ftp
--------------------WARNING-----------------------
 You aren't allowed interactive access to SCNe.JP.
 only usr ftp.
 If you've a question, e-mail to root@localhost.
--------------------WARNING-----------------------

と表示される。

シェルの制限をする記述がないのに、FTP ログインのみ許可されているのは何故か

telnetssh とは違い、ユーザのシェルが /sbin/nologin といった偽シェルになっていたとしても、それが /etc/shells に正当なものとして書いてある限り、FTP は成立してしまう。ただし、(少なくとも Fedora Core 4 では)ユーザの指定シェルが /bin/false であれば、 /etc/shells に書いてないので FTP ログインも不可能となる。

http://www.asahi-net.or.jp/~aa4t-nngk/ftpd.html#chrootlocalnote

/bin/ftp を /etc/shells に登録することで FTP でのログインは可能にして、trap でシェルの実行を不可能にするというギミックになっている。

この解決方法は /etc/shells に /sbin/nologin が登録されていない可能性を考慮しているのかもしれないが、

  • /etc/shells に追記できるということは、root 権限を有しているということ
  • root 権限を有しているならば、/bin/ftp を作成せずに、/sbin/nologin を /etc/shells に追記することができる

ため、この解決方法は遠回りのように思える。

また、

--------------------WARNING-----------------------
 You aren't allowed interactive access to SCNe.JP.
 only usr ftp.
 If you've a question, e-mail to root@localhost.
--------------------WARNING-----------------------

をリモートログインを試みた際に、上記のメッセージを表示したのならば、/sbin/nologin はユーザー独自のメッセージを設定することもできる。

# vi /etc/nologin
Write your messages.

*1:/etc/shells に記載されている場合

*2:そもそも /etc/shells に追記すると /bin/false が持つ役割の意味がなくなる

astast 2010/11/16 13:23 古い記事に対してのコメント、ご容赦ください。
設定を参考させて頂いております。ところで、
>そもそも /etc/shells に追記すると /bin/false が持つ役割の意味がなくなる
の意味を教えていただけますでしょうか。

littlebuddhalittlebuddha 2010/11/16 22:51 「/bin/false」は、
1.「/bin/false」はシェエルを通じて一切の操作ができない偽シェルである
2.「/bin/false」は通常、人間以外のユーザーに割り当てられるシェルである
3.人間以外のユーザーとはデーモンとして起動する Apache や MySQL のことを指す
4.デーモンは定められた機能を果たすのが目的で、シェルを通じて操作をするための役割は担わない(担わせない)
5.「/bin/false」を割り当てられたデーモンが、ログイン・ログアウトの処理をすることは通常ありえない(ログインさせない)
という特徴があります。

「/etc/shells」は、リモート・ローカルを含めてログインをするユーザーに対して、割り当てられるシェルが記述されています。
つまり、ログイン・ログアウトをすることがないユーザー(プログラム)に対して、わざわざ「/etc/shells」に「/bin/false」を記述して設定する必要がないということです。
また、「/etc/shells」に記述されたシェルを割り当てられているユーザーは、リモート・ローカルからログインができることを意味するため、ログイン・ログアウトしないシェルを「/bin/shells」に記述することで、ログインできる余地が生まれてしまいます。

このような余地を残しておくと、想定外のことが起きた場合に、セキュリティ上のリスクとなり得る可能性が出てきます。
その可能性をゼロにするためにも、「/bin/shells」にわざわざ「/bin/false」を記述する必要性はないということです。
上記のような可能性を生むということもあり、「/etc/shells に追記すると /bin/false が持つ役割の意味がなくなる」と書きました。

ちなみに、「/bin/nologin」を使って FTP の操作ができるのは、ユーザーがリモートにログインをしているようにみえて、実際は FTP デーモンがローカルのファイルを代理で操作しています。

littlebuddhalittlebuddha 2010/11/16 22:54 「/bin/false」は、
1.「/bin/false」はシェエルを通じて一切の操作ができない偽シェルである
2.「/bin/false」は通常、人間以外のユーザーに割り当てられるシェルである
3.人間以外のユーザーとはデーモンとして起動する Apache や MySQL のことを指す
4.デーモンは定められた機能を果たすのが目的で、シェルを通じて操作をするための役割は担わない(担わせない)
5.「/bin/false」を割り当てられたデーモンが、ログイン・ログアウトの処理をすることは通常ありえない(ログインさせない)
という特徴があります。

「/etc/shells」は、リモート・ローカルを含めてログインをするユーザーに対して、割り当てられるシェルが記述されています。
つまり、ログイン・ログアウトをすることがないユーザー(プログラム)に対して、わざわざ「/etc/shells」に「/bin/false」を記述して設定する必要がないということです。
また、「/etc/shells」に記述されたシェルを割り当てられているユーザーは、リモート・ローカルからログインができることを意味するため、ログイン・ログアウトしないシェルを「/bin/shells」に記述することで、ログインできる余地が生まれてしまいます。

このような余地を残しておくと、想定外のことが起きた場合に、セキュリティ上のリスクとなり得る可能性が出てきます。
その可能性をゼロにするためにも、「/bin/shells」にわざわざ「/bin/false」を記述する必要性はないということです。
上記のような可能性を生むということもあり、「/etc/shells に追記すると /bin/false が持つ役割の意味がなくなる」と書きました。

ちなみに、「/bin/nologin」を使って FTP の操作ができるのは、ユーザーがリモートにログインをしているようにみえて、実際は
FTP デーモンがローカルのファイルを代理で操作しています。

説明が分かりづらかったかもしれませんが、端的に言うとプログラムに割り当てているシェルを、人間が使うシェルの設定に登録すると、予期せぬときに予期せぬ影響がでる可能性があるので、その可能性を排除したいということです。
そういうリスクの芽を摘むのがセキュリティだと私は考えています。

はてなユーザーのみコメントできます。はてなへログインもしくは新規登録をおこなってください。

トラックバック - http://d.hatena.ne.jp/littlebuddha/20090805/1249457771