/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 が持つ役割の意味がなくなる