CentOS7 vsftpd HAProxyによるFTPリバプロ バーチャルユーザー chroot てんこ盛り

やんごとなき事情により、FTPのリバプロやバーチャルユーザーなどてんこ盛り構成にて構築した際の記録。

環境

  • CentOS Linux release 7.4
  • vsftpd 3.0.2
    • パッシブモード
    • TCP:21 + TCP:1500-1520
  • haproxy 1.5.18
  • マシンローカルIP: 192.168.1.2

設定

パッケージインストール

yum install haproxy
yum install vsftpd
yum install compat-db47

haproxy設定

/etc/haproxy/haproxy.cfg

global
    log         127.0.0.1 local2
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon
    stats socket /var/lib/haproxy/stats

defaults
    mode                    tcp
    log                     global
    option                  tcplog
    option                  dontlognull
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          24h
    timeout server          24h
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000

frontend ftp
 mode tcp
 bind 192.168.1.2:21
 default_backend ftp

frontend ftpdata
 mode tcp
 bind 192.168.1.2:1500-1520
 default_backend ftpdata

backend ftp
  server 127.0.0.1 check port 21 inter 10s rise 1 fall 2
backend ftpdata
  server 127.0.0.1 check port 21 inter 10s rise 1 fall 2

バーチャルユーザー認証のためのPAM設定

/etc/pam.d/vsftpd.virtual

auth       required     pam_userdb.so db=/etc/vsftpd/virtual-users
account    required     pam_userdb.so db=/etc/vsftpd/virtual-users
session    required     pam_loginuid.so

バーチャルユーザーDB作成

ユーザー認証情報のDBが /etc/vsftpd/virtual-users へ完全に置き換わるので、既存ユーザーの認証情報もここに記述する。

/etc/vsftpd/virtual-users

user1
user1_passwd
user2
user2_passwd
user3
.
.
.
# db_load -T -t hash -f /etc/vsftpd/virtual-users /etc/vsftpd/virtual-users.db
# chmod 600 /etc/vsftpd/virtual-users.db
# chmod 600 /etc/vsftpd/virtual-users

vsftpd設定

/etc/vsftpd/vsftpd.conf

.
.
.
listen=YES
#listen_ipv6=YES

force_dot_files=YES
chmod_enable=YES
use_localtime=YES

# listen only on lo
listen_address=127.0.0.1
listen_ipv6=NO
tcp_wrappers=YES

# pasv
pasv_enable=YES
pasv_min_port=1500
pasv_max_port=1520
pasv_address=xxx.xxx.xxx.xxx

# log
dual_log_enable=YES
log_ftp_protocol=YES

# userlist
userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd/user_list

# user-specific config
user_config_dir=/etc/vsftpd/user_conf

# enable selective chroot
allow_writeable_chroot=YES
chroot_local_user=NO
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list

# enable virtual user
pam_service_name=vsftpd.virtual
virtual_use_local_privs=YES
guest_enable=YES
guest_username=actual_linux_username

/etc/vsftpd/user_list

user1
user2
user3
.
.
.

(必要な場合のみ) chroot設定

/etc/vsftpd/chroot_list

user1
user2
user3
.
.
.

/etc/vsftpd/user_conf/{{username}}

local_root=/path/to/chroot/dir/of/username

参考