Vsftpd

​ 文件传输协议:File Transfer Protocol是用于在网络上进行文件传输的一套标准协议,使用客户/服务器模式。它属于网络传输协议的应用层。

服务器端:vsftpd

客户端:lftp

安装:yum -y install vsftpd lftp

用户认证配置文件:/etc/pam.d/vsftpd

服务脚本: /usr/lib/systemd/system/vsftpd.service

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

匿名用户共享文件位置:/var/ftp

系统用户共享文件位置:用户家目录

虚拟用户共享文件位置:为其映射的系统用户的家目录

一、vsftpd服务配置选项

  • listen_port=21:命令端口监听
  • connect_from_port_20=YES:主动模式端口为20
  • ftp_data_port=20:指定主动模式的端口
  • pasv_min_port=6000 | pasv_max_port=6010:被动模式端口范围,0为随机分配
  • use_localtime=YES:使用当地时间
  • max_clients=0:最大并发连接数
  • max_per_ip=0:每个IP同时发起的最大连接数
  • nopriv_user=nobody:vsftpd服务指定用户身份运行
  • anon_max_rate=0:匿名用户的最大传输速率
  • local_max_rate=0:本地用户的最大传输速率
  • connect_timeout=60:主动模式数据连接超时时长
  • accept_timeout=60:被动模式数据连接超时时长
  • data_connection_timeout=300:数据连接无数据输超时时长
  • idle_session_timeout=60:无命令操作超时时长
  • ascii_upload_enable=YES:优先以文本方式上传
  • ascii_download_enable=YES: 优先以文本方式下载

匿名用户相关:

  • anonymous_enable=YES:支持匿名用户
  • no_anon_password=YES:(默认NO) 匿名用户略过口令检查
  • anon_world_readable_only:(默认YES)只能下载全部读的文件
  • anon_upload_enable=YES:允许匿名上传,注意:文件系统权限
  • anon_mkdir_write_enable=YES:允许匿名用户创建文件夹
  • anon_umask=077:指定匿名用户上传文件的umask
  • anon_other_write_enable=YES:匿名用户可删除和修改上传的文件
  • chown_uploads=YES:(默认NO) 修改上传文件的默认的所有者和权限
  • chown_username=user1:将匿名上传的文件的属主修改为user1
  • chown_upload_mode=0644:将匿名上传的文件的权限修改为644

系统用户相关:

  • guest_enable=YES:所有系统用户都映射成guest用户
  • guest_username=ftp:配合上面选项才生效,指定guest用户
  • local_enable=YES:是否允许linux用户登录
  • write_enable-YES:允许linux用户上传文件
  • local_umask=022:指定系统用户上传文件的默认权限
  • local_root=/ftproot:非匿名用户登录所在目录
  • chroot_local_user=YES:(默认NO,不禁锢)禁锢系统用户在家目录中
  • chroot_list_enable=YES
  • chroot_list_file=/etc/vsftpd/chroot_list

当chroot_local_user=YES时,则chroot_list中用户不禁锢
当chroot_local_user=NO时,则chroot_list中用户禁锢

日志相关:

  • xferlog_enable=YES:(默认)启用记录上传下载日志
  • xferlog_std_format=YES:(默认)使用wu-ftp日志格式
  • xferlog_file=/var/log/xferlog:(默认)可自动生成
  • dual_log_enable=YES:使用vsftpd日志格式,默认不启用
  • vsftpd_log_file=/var/log/vsftpd.log:(默认)可自动生成

登录提示信息相关:

  • ftpd_banner=Welcome to blah FTP service.
  • banner_file=/etc/vsftpd/ftpbanner.txt:显示指定文件中的提示信息,优先此项生效
  • dirmessage_enable=YES:(默认) 目录访问提示信息
  • message_file=.message:(默认)信息存放在指定目录下.message

访问控制相关:

  • pam_service_name=vsftpd:指定pam模块配置文件

使用pam模块完成用户认证
pam配置文件:/etc/pam.d/vsftpd
/etc/vsftpd/ftpusers:默认此文件中用户拒绝登录

  • userlist_enable=YES:默认有此设置
  • userlist_deny=YES:(默认值)黑名单,不提示口令,NO为白名单
  • userlist_file=/etc/vsftpd/users_list:用户认证黑名单,此为默认值

二、基于SSL实现FTPS

# ldd`which vsftpd`|grep libssl.so #查看是否支持SSL
	libssl.so.10 => /lib64/libssl.so.10 (0x00007f50d43a4000)

1)创建自签名证书:

# cd /etc/pki/tls/certs/
certs]# make vsftpd.pem
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:bj
Locality Name (eg, city) [Default City]:bj
Organization Name (eg, company) [Default Company Ltd]:ftp
Organizational Unit Name (eg, section) []:opt
Common Name (eg, your name or your server's hostname) []:vsftpd.ftp.com

2)配置vsftpd服务支持SSL:

# vim /etc/vsftpd/vsftpd.conf
ssl_enable=YES  #启用SSL
allow_anon_ssl=NO  #匿名不支持SSL
force_local_logins_ssl=YES  #本地用户登录加密
force_local_data_ssl=YES  #本地用户数据传输加密
rsa_cert_file=/etc/pki/tls/certs/vsftpd.pem  #证书文件
# systemctl restart vsftpd
# useradd testftpuser
# echo testftppass |passwd --stdin testftpuser

3)用filezilla等客户端工具测试

三、虚拟用户的实现

所有虚拟用户会统一映射为一个指定的系统帐号:访问共享位置,即为此系统帐号的家目录
各虚拟用户可被赋予不同的访问权限,通过匿名用户的权限控制参数进行指定

1、基于文件认证

1)创建用户数据库文件

# vim /etc/vsftpd/vusers.txt
user1
user1pass
user2
user2pass
# db_load -T -t hash -f /etc/vsftpd/vusers.txt /etc/vsftpd/vusers.db
# chmod 600 /etc/vsftpd/vusers.db

2)创建系统用户和FTP目录

# useradd -r -d /data/ftp/ -s /sbin/nologin vuser
# mkdir -pv /data/ftp/pub/
# chmod -w /data/ftp/
# setfacl -m u:vuser:rwx /data/ftp/pub/

3)创建pam配置文件

# vim /etc/pam.d/vsftpd.db
auth required pam_userdb.so db=/etc/vsftpd/vusers  #这里指定数据库文件,不需要加.db
account required pam_userdb.so db=/etc/vsftpd/vusers

4)指定pam配置文件

# vim /etc/vsftpd/vsftpd.conf
guest_enable=YES
guest_username=vuser  #指定系统用户
pam_service_name=vsftpd.db  #指定pam配置文件

5)建立各虚拟用户独立的配置文件

# mkdir /etc/vsftpd/vusers.d/
# vim /etc/vsftpd/vsftpd.conf
user_config_dir=/etc/vsftpd/vusers.d/
# vim /etc/vsftpd/vusers.d/user1
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES  #匿名用户可删除和修改上传的文件
# mkdir /data/user2/
# vim /etc/vsftpd/vusers.d/user2
# systemctl restart vsftpd

2、基于MySQL数据库认证

说明:本实验在两台CentOS主机上实现,一台做为FTP服务器,一台做数据库服务器

数据库服务器和FTP服务器系统都是CentOS7

注意:如果是CentOS6系统请执行yum install vsftpd pam_mysql 命令安装连接组件

MariaDB服务器:

# yum install mariadb-server -y
# systemctl start mariadb
# mysql
MariaDB [(none)]> CREATE DATABASE vsftpddb;  #准备数据库
MariaDB [(none)]> use vsftpddb
MariaDB [vsftpddb]> CREATE TABLE users(id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,name CHAR(50) BINARY NOT NULL,password CHAR(48) BINARY NOT NULL);  #创建users表
MariaDB [vsftpddb]> DESC users;
+----------+----------+------+-----+---------+----------------+
| Field    | Type     | Null | Key | Default | Extra          |
+----------+----------+------+-----+---------+----------------+
| id       | int(11)  | NO   | PRI | NULL    | auto_increment |
| name     | char(50) | NO   |     | NULL    |                |
| password | char(48) | NO   |     | NULL    |                |
+----------+----------+------+-----+---------+----------------+
MariaDB [vsftpddb]> GRANT ALL ON vsftpddb.* TO vsftpduser@'192.168.0.7' IDENTIFIED BY 'vsftpdpass';  #创建并授权用户

vsftpd服务器:

# yum install mariadb -y
# mysql -uvsftpduser -pvsftpdpass -h192.168.0.8  #测试连接数据库
MariaDB [(none)]> DESC vsftpddb.users;
+----------+----------+------+-----+---------+----------------+
| Field    | Type     | Null | Key | Default | Extra          |
+----------+----------+------+-----+---------+----------------+
| id       | int(11)  | NO   | PRI | NULL    | auto_increment |
| name     | char(50) | NO   |     | NULL    |                |
| password | char(48) | NO   |     | NULL    |                |
+----------+----------+------+-----+---------+----------------+
MariaDB [(none)]> use vsftpddb
MariaDB [vsftpddb]> INSERT INTO users(name,password) VALUES('user1',PASSWORD('user1pass'));  #创建vsftpd的虚拟用户
MariaDB [vsftpddb]> INSERT INTO users(name,password) VALUES('user2',PASSWORD('user2pass'));
MariaDB [vsftpddb]> SELECT * FROM users;
+----+-------+-------------------------------------------+
| id | name  | password                                  |
+----+-------+-------------------------------------------+
|  1 | user1 | *F20B90D5A0CED3757C51AE04CD4700AB9879E467 |
|  2 | user2 | *A9C95B38C9A88ECAE9128FD396059335E97CAA6E |
+----+-------+-------------------------------------------+
# yum groupinstall "Development Tools" -y
# yum -y install mariadb-devel pam-devel vsftpd
# wget http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz
# tar xf pam_mysql-0.7RC1.tar.gz
# cd pam_mysql-0.7RC1/
pam_mysql-0.7RC1]# ./configure --with-pam-mods-dir=/lib64/security
pam_mysql-0.7RC1]# make && make install
# ls /lib64/security/ |grep pam_mysql.so
pam_mysql.so  #pam模块已安装
# vim /etc/pam.d/vsftpd.mysql
auth required pam_mysql.so user=vsftpduser passwd=vsftpdpass host=192.168.0.8 db=vsftpddb table=users usercolumn=name passwdcolumn=password crypt=2
account required pam_mysql.so user=vsftpduser passwd=vsftpdpass host=192.168.0.8 db=vsftpddb table=users usercolumn=name passwdcolumn=password crypt=2

crypt是加密方式,0表示不加密,1表示crypt(3)加密,2表示使用mysql password()函数加密,3表示md5加密,4表示sha1加密

auth 表示认证
account 验证账号密码正常使用
required 表示认证要通过
pam_mysql.so模块是默认的相对路径,是相对/lib64/security/路径而言,也可以写绝对路径;后面为给此模块传递的参数
user=vsftpd为登录mysql的用户
passwd=magedu 登录mysql的的密码
host=mysqlserver mysql服务器的主机名或ip地址
db=vsftpd 指定连接msyql的数据库名称
table=users 指定连接数据库中的表名
usercolumn=name 当做用户名的字段
passwdcolumn=password 当做用户名字段的密码
crypt=2 密码的加密方式为mysql password()函数加密

# useradd -r -s /sbin/nologin -d /data/mftp/ vuser
# mkdir -pv /data/mftp/pub/
# chmod -w /data/mftp/
# setfacl -m u:vuser:rwx /data/mftp/pub/
# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
guest_enable=YES
guest_username=vuser
pam_service_name=vsftpd.mysql  #修改为使用pam_mysql模块认证
# systemctl restart vsftpd

vsftpd可以在配置文件目录中为每个用户提供单独的配置文件以定义其ftp服务访问权限,每个虚拟用户的配置文件名同虚拟用户的用户名。配置文件目录可以是任意未使用目录,只需要在vsftpd.conf指定其路径及名称即可

# vim /etc/vsftpd/vsftpd.conf
user_config_dir=/etc/vsftpd/vusers.d
# mkdir /etc/vsftpd/vusers.d/
# touch /etc/vsftpd/vusers.d/{user1,user2}
# vim /etc/vsftpd/vusers.d/user1
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
#local_root=/ftproot  #登录目录改变至指定的目录
posted @ 2018-06-25 22:52  生生不息.连绵不绝  阅读(343)  评论(0编辑  收藏  举报