2010/06/05

migration from ftp to [sftp|scp]

俺は自宅で運用しているサーバを数人の友人に貸しているのだが、その一部のユーザのWeb更新用にFTPを開放していた。

そのユーザのひとりがいわゆる Gumblar にやられてWebスペースが汚染される事態が起きた。FTPユーザはchrootされていたとはいえ、流石にこれ以上FTPを開放し続けるのはユーザの便宜にならんだろうと考え、scp|sftp に移行することにした。

サーバの運用ポリシーから導き出された彼らに対する要件は以下の3点である

1. FTPを使っていたユーザーに SSH のシェルログイン権限は与えるわけにいかない
2. 1. のユーザには chroot は必須
3. SSH 経由でログインするにはSSH2の公開鍵を必要とするが、FTPを使っていたユーザにこの方式は合わないのでパスワード認証を使う必要がある

これらの要件と、SSHのシェルログイン権限があるユーザーを両立させなければならない。はたと困った末、rssh を使い、シェルログイン権限があるユーザとFTPを使っていたユーザーは別々のsshdを起動して区別することにした。

----

rssh のインストールは非常に簡単で、Debian lenny なら以下のコマンドでよい。

# aptitude install rssh

インストールしたら mkchroot.sh を chroot先のルートのパスを指定して実行する。ここでは /home/chroot をユーザのchroot先として指定している。実行するとchroot先で必要な必要最小限のファイルがコピーされる

# cd /usr/share/doc/rssh/examples
# chmod +x mkchroot.sh
# ./mkchroot.sh /home/chroot

次に /etc/rssh.conf を編集する。先頭が # になっていない部分はすべて重要である。user= の行で、実際に rssh が許可するコマンドをユーザーごとに編集できる。ここでは scp と sftpを許可し、chroot_path で、mkchroot.sh で指定したパスを指定する user= の行では、実際に scp, sftp でchrootさせるユーザの設定を行う。詳細はマニュアルおよび /etc/rssh.conf のコメントを参照のこと

logfacility = LOG_USER

# Leave these all commented out to make the default action for rssh to lock
# users out completely...

allowscp
allowsftp

# set the default umask
umask = 022

# If you want to chroot users, use this to set the directory where the root of
# the chroot jail will be located.
#
# if you DO NOT want to chroot users, LEAVE THIS COMMENTED OUT.
#
# You can quote anywhere, but quotes not required unless the path contains a
# space... as in this example.
#chrootpath = "/usr/local/my chroot"

chrootpath = /home/chroot

##########################################
# EXAMPLES of configuring per-user options
#....
user=chrootuser:022:00011:"/home/chroot" # scp, sftp with chroot

rssh は rssh_chroot_helper と呼ばれるヘルパを通してアクセスをコントロールしている。よってrsshユーザーがこれをroot権限で一時的に実行できる必要がある。よって以下のコマンドでsetUIDする。こうしないと ログインが失敗し、syslogには "Operation not permitted" というログが残る

# chmod u+s /usr/lib/rssh/rssh_chroot_helper

chroot先には /home/chroot を指定したが、ここにはユーザー情報を格納した passwd ファイルが必要だ。それを /etc/passwd から /home/chroot/etc/passwd にコピーし、最低限のユーザーに絞る。今回は例として以下のような感じにした。chroot のホームディレクトリは、以下の指定だと /home/chroot/home/chrootuser となる。あらかじめ作成しておくこと。

rssh:x:1003:1003::/home/rssh:/bin/false
chrootuser:x:508:508::/home/chrootuser:/usr/bin/rssh

そして /etc/passwd のchrootuser の中身を以下のように指定する。最後のシェルのパスが通常のユーザーでは /bin/bash 等となっているところを、 /usr/bin/rsshに変更していることと、ホームディレクトリを /home/chroot 以下の /home/chrootuser、つまり「/home/chroot/home/chrootuser」としていることに注意

chrootuser:x:508:508::/home/chroot/home/chrootuser:/usr/bin/rssh

あとは、この chrootuser が sshd からアクセスを許可されていれば sftp, scp ができるようになるはずだ。俺の場合はこのユーザーがパスワード認証できる必要があったので、/etc/ssh/sshd_config ファイルを /etc/ssh/sshd_config_passauth ファイルにコピーし、ポート番号や認証の変更などを行い、以下のようにして起動した

# /usr/sbin/sshd -f /etc/ssh/sshd_config_passauth

その際、sshd_confg_passauth には、以下の設定を記して他のユーザーと隔離するのが重要である

AllowUsers chrootuser

----

以上の作業を経て、ようやく vsftpd を止めることができた。ある意味面倒だが、既存の公開鍵認証とそれ以外のユーザーを隔離できただけでも十分な意義があると言えよう。

0 件のコメント: