vsftp配置详解


FTP:文件传输协议(File Transfer Protocol)

是用于在网络上进行文件传输的一套标准协议。它属于网络传输协议的应用层。

FTP服务一般运行在20和21两个端口

20用于在客户端和服务器之间传输数据流(主动模式时使用)
 21用于传输控制流,并且是命令通向ftp服务器的进口。

FTP两种使用模式:

  • 主动PORT模式:PORT模式 由FTP服务器端发起,FTP服务器使用20端口连接客户端的某一个大于1023的随机端口。

  • 被动PASV模式:PASV模式 由FTP客户端发起的,使用一个大于1024的端口连接服务器上大于1023的随机端口。

数据传输模式:

  • ASCII:文本格式

  • BINARY:二进制格式


vsftp:very secure FTP

主配置文件:/etc/vsftpd/vsftpd.conf

anonymous_enable=YES    允许匿名用户登录
local_enable=YES    允许本地用户登录
write_enable=YES    允许用户上传
local_umask=022     本地用户上传后的权限mask
anon_upload_enable=NO   匿名用户上传控制

#anon_mkdir_write_enable=YES    匿名用户创建目录

dirmessage_enable=YES   显示目录注释
xferlog_enable=YES      开启日志
connect_from_port_20=YES    主动连接使用的数据通道

#chown_uploads=YES      
#chown_username=whoever

xferlog_std_format=YES  与wu-ftp相同的日志文件格式

#idle_session_timeout=600
#data_connection_timeout=120
#nopriv_user=ftpsecure
#async_abor_enable=YES
#ascii_upload_enable=YES
#ascii_download_enable=YES
#ftpd_banner=Welcome to blah FTP service.
#deny_email_enable=YES
#banned_email_file=/etc/vsftpd/banned_emails

#chroot_local_user=NO   若开启,则本地用户默认使用chroot()
#chroot_list_enable=NO  如果开启,需提供文件指定生效用户,如果chroot_local_user设置为Yes,则这个列表为不生效用户,默认列表文件是/etc/vsftpd.chroot_list,可通过chroot_list_file参数制定文件
#chroot_list_file=/etc/vsftpd/chroot_list

ls_recurse_enable=NO     是否允许用户使用'ls -R'命令,递归显示目录
listen=YES  以stand alone的方式启动(值为NO时,super daemon方式启动)

#listen_ipv6=YES

pam_service_name=vsftpd     vsftpd服务中PAM验证模块的名称
userlist_enable=YES     使用user_list文件控制用户登录(配合userlist_deny)
#userlist_deny=YES
tcp_wrappers=YES    采用tcp_wrappers进行控制访问

匿名用户相关配置:

anonymous_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

系统用户相关:

local_enable=YES
write_enable=YES

辅助认证配置文件/etc/vsftpd/ftpusers
pam认证的配置文件:/etc/pam.d/vsftpd

chroot_local_users=YES
禁锢所有的本地用户于自己的家目录中;需移除用户对家目录写权限;

chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
禁锢指定的文件中的用户于自己的家目录中;需移除用户对家目录写权限;

数据传输日志:

xferlog_std_format=YES
xferlog_enable=YES
xferlog_file=/var/log/xferlog

控制可登录vsftpd服务的用户列表:

userlist_enable=YES
userlist_deny={YES|NO}
如果userlist_deny=NO, 只允许user_list文件中的用户
如果userlist_deny=YES (默认), 不允许user_list文件中的用户, 输入密码前就会报错

vsftpd配置实例:
Centos 7

  1. 禁锢系统用户于家目录;

  2. 基于mysql进行用户认证;

  3. 不同的虚拟用户拥有不同的权限设定;

安装vsftp、mysql及pam-mysql模块,用于pam连接mysql存储密码:

]# yum isntall vsftpd mariadb-server mariadb-devel pam-devel
]# wget http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz

]# tar xvf pam_mysql-0.7RC1.tar.gz
]# cd pam_mysql-0.7RC1
]# ./configure --with-pam=/usr --with-mysql=/usr --with-pam-mods-dir=/usr/lib64/security
]# make
]# make install

准备mairadb数据库:

]# mysql_install_db  --user=mysql   初始化数据库
]# systemctl start mariadb  启动mariadb
]# mysql_secure_installation    安全设置
]# mysql -p     输入密码登陆数据库
> create database vsftpd;   创建vsftpd数据库

插入虚拟用户信息:
> insert into vsftpd.users (name,password) values ('rick',PASSWORD('222222')),('morty',PASSWORD('222222'));

授权:
> grant all on vsftpd.* to 'vuser'@'localhost' identified by '333333';
> grant all on vsftpd.* to 'vuser'@'127.0.0.1' identified by '333333';
> flush privileges;

配置vsftpd通过pam_mysql进行认证

]# vi /etc/vsftpd/vsftpd.conf
#listen_ipv6=YES    注释该行
pam_service_name=vsftpd.mysql
guest_enable=YES
guest_username=vuser

模块认证配置文件:

]# vi /etc/pam.d/vsftpd.mysql   添加两行
auth required /usr/lib64/security/pam_mysql.so user=vuser passwd=333333 host=127.0.0.1 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
account required /usr/lib64/security/pam_mysql.so user=vuser passwd=333333 host=127.0.0.1 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2

创建映射的系统用户账号:

]# mkdir vpub
]# useradd -d /vpub vuser
]# mkdir /vpub/{pub,upload}
]# chmod u-w /vpub
]# setfacl -m u:vuser:rwx /vpub/upload

设置各虚拟用户的权限

]# vi /etc/vsftpd/vsftpd.conf   添加一行指定虚拟用户权限目录
user_config_dir=/etc/vsftpd/users_conf

]# mkdir users_conf
]# vi rick  虚拟用户的权限都用匿名指令指定
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

]# vi morty 该用户无上传权限
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO

测试成功:

lftp rick@10.1.235.7:/upload> put issue
59 bytes transferred

lftp morty@10.1.235.7:/upload> put centos-release
put: Access failed: 550 Permission denied. (centos-release)