vsftpd

vsftpd はシンプルで堅牢なFTP サーバーソフトです。
更新日 2016-05-31

インストール

CentOS7 にyum でインストールします。

yum でインストール

yum が簡単です。CentOS7 にvsftpd-3.0.2をインストールします。
yum install vsftpd
systemctl start vsftpd.service
systemctl enable vsftpd.service
firewall-cmd --zone=public --add-service=ftp --permanent
firewall-cmd --reload

初期設定

ここでは user_list に書かれたユーザーのみログインできるようにします。

/etc/vsftpd/vsftpd.conf の編集

vi /etc/vsftpd/vsftpd.conf

 anonymous_enable=NO
 local_enable=YES
 write_enable=YES
 dirmessage_enable=YES
 xferlog_enable=YES
 connect_from_port_20=YES
 xferlog_file=/var/log/vsftpd.log

 // 全てのやりとりをログに残す。
 xferlog_std_format=NO
 log_ftp_protocol=YES

 ascii_upload_enable=YES
 ascii_download_enable=YES

 // 全てのユーザーに対してchroot します。ただchroot_local_user を設定すると
 // chroot_list に書かれたユーザーは逆にchroot から除外される。要注意!
 chroot_local_user=YES
 chroot_list_enable=YES
 chroot_list_file=/etc/vsftpd/chroot_list


 // 子ディレクトリを有する場合でも一括削除を許可する
 ls_recurse_enable=YES

 listen=YES

 // コンピュータのローカル時刻を使う
 use_localtime=YES
 pam_service_name=vsftpd


 // user_list に書かれたユーザーのみログオンできる。
 userlist_enable=YES
 userlist_deny=NO
 userlist_file=/etc/vsftpd/user_list


 // 書き込み可能なディレクトリへのchroot を許可する
 // [500 OOPS: refusing to run with writable root inside chroot]
 allow_writeable_chroot=YES
ログインできるユーザーを設定
vi /etc/vsftpd/user_list
 USERNAME
chroot 不要のユーザーを指定(空でもファイルは必須です)
echo "" > /etc/vsftpd/chroot_list
/etc/vsftpd/ftpusers にはログオンを絶対に許可しないユーザーを記述します。PAM 認証サイドで参照するので、ここに記載されたユーザーはパスワードを求められる事もなく 拒否されます。root など最初から記述済みなので編集は不要。

FTP ログオンユーザーの設定について

次の順で優先的に設定されます。
userlist_enable=NO にするとローカルユーザー全員がログインできます。
userlist_enable=YES でuserlist_deny=NO なら/etc/vsftpd/user_list に記述されたユーザーのみログインできます。
userlist_deny=YES なら/erc/vsftpd/user_list に記述されたユーザー以外はログインできます。

SELinux の設定

SELinux を有効のまま使うには設定が必要です。
// 500 OOPS: chroot Login failed.

setsebool -P ftp_home_dir 1		// 設定
getsebool ftp_home_dir			// 確認

firewall の設定

ポート21番を使います。
firewall-cmd --zone=public --add-service=ftp --permanent
firewall-cmd --reload

起動

systemctl start vsftpd
systemctl enable vsftpd

トラブルと対策

パスワード認証で弾かれてログインできない

/etc/shells に記載されていないシェルを実装しているユーザーはFTP ログインに失敗するようです。/sbin/true などはNG です。

mount したフォルダに書き込めない

chroot のおかげでmount されたファイルシステムに書き込みができません。mount --bind を使います。
mount --bind /camera_avis1 /home/ast/camera_avis1
それでもうまくいかない。SELinux が有効だとダメみたいです。

ソースからビルド

ソースから最新版をビルドします。

ビルド

yum groupinstall "Development Tools" -y
yum groupinstall "Compatibility libraries" -y

yum install tcp_wrappers-devel openssl-devel libcap-devel -y

mkdir -p /usr/local/man/{man5,man8}

cd /usr/src
wget https://security.appspot.com/downloads/vsftpd-3.0.3.tar.gz
tar zxvf vsftpd-3.0.3.tar.gz
cd vsftpd-3.0.3

vi builddefs.h

 // change define 
 #define VSF_BUILD_TCPWRAPPERS
 #define VSF_BUILD_PAM
 #define VSF_BUILD_SSL


vi Makefile

make
make install

mkdir /etc/vsftpd

cp vsftpd.conf /etc/vsftpd
cp RedHat/vsftpd.log /etc/logrotate.d/vsftpd
cp RedHat/vsftpd.pam /etc/pam.d/vsftpd

スタンドアロン起動スクリプトの作成

yum インストール時の起動スクリプトをほぼコピーしたものを流用します。参考サイト
vi /etc/init.d/vsftpd
 
#!/bin/bash
#
# vsftpd      This shell script takes care of starting and stopping
#             standalone vsftpd.
#
# chkconfig: - 60 50
# description: Vsftpd is a ftp daemon, which is the program \
#              that answers incoming ftp service requests.
# processname: vsftpd
# config: /etc/vsftpd/vsftpd.conf

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0

[ -x /usr/local/sbin/vsftpd ] || exit 0

RETVAL=0
prog="vsftpd"

start() {
        # Start daemons.

        if [ -d /etc/vsftpd ] ; then
                for i in `ls /etc/vsftpd/*.conf`; do
                        site=`basename $i .conf`
                        echo -n $"Starting $prog for $site: "
                        /usr/local/sbin/vsftpd $i &
                        RETVAL=$?
                        [ $RETVAL -eq 0 ] && {
                                touch /var/lock/subsys/$prog
                                success $"$prog $site"
                        }
                        echo
                done
        else
                RETVAL=1
        fi
        return $RETVAL
}

stop() {
        # Stop daemons.
        echo -n $"Shutting down $prog: "
        killproc $prog
        RETVAL=$?
        echo e
        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog
        return $RETVAL
}


# See how we were called.
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart|reload)
        stop
        start
        RETVAL=$?
        ;;
  condrestart)
        if [ -f /var/lock/subsys/$prog ]; then
            stop
            start
            RETVAL=$?
        fi
        ;;
  status)
        status $prog
        RETVAL=$?
        ;;
  *)
        echo $"Usage: $0 {start|stop|restart|condrestart|status}"
        exit 1
esac

exit $RETVAL
起動できれば成功です。
chkconfig vsftpd on
service vsftpd start