VSFTPD

為{幸葍}努か 提交于 2019-12-28 09:47:20

VSFTPD

1. vsftpd 软件介绍

由 vsftpd 包提供,不再由xinetd管理
用户认证配置文件:/etc/pam.d/vsftpd

启动服务相关文件:

/usr/lib/systemd/system/vsftpd.service

/etc/rc.d/init.d/vsftpd

配置文件:

/etc/vsftpd/vsftpd.conf

配置文件格式:

option=value

注意:= 前后不要有空格

用户和其共享目录

  • 匿名用户(映射为系统用户ftp )共享文件位置:/var/ftp
  • 系统用户共享文件位置:用户家目录
  • 虚拟用户共享文件位置:为其映射的系统用户的家目录

2. vsftpd服务常见配置

2.1 命令端口

listen_port=21

2.2 主动模式端口

connect_from_port_20=YES 	主动模式端口为20
ftp_data_port=20 	(默认) 指定主动模式的端口

2.3 被动模式端口

linux 									客户端默认使用被动模式
windows 							 客户端默认使用主动模式
pasv_min_port=6000 		0为随机分配
pasv_max_port=6010

2.4 使用当地时间

use_localtime=YES 	使用当地时间(默认为NO,使用GMT)

这个没必要改,默认就行,因为ftp客户端会会自动调整时间,使用当地时间会导致客户端时间错误

2.5 匿名用户登录

anonymous_enable=YES 	支持匿名用户
no_anon_password=YES 	匿名用户略过口令检查 , 默认NO

2.6 匿名用户上传文件

anon_upload_enable=YES 			匿名上传,注意:文件系统权限
anon_mkdir_write_enable=YES 	匿名建目录
anon_world_readable_only 		   只能下载全部读的文件, 默认YES
anon_umask=0333 						指定匿名上传文件的umask,默认077
anon_other_write_enable=YES 	可删除和修改上传的文件, ,默认NO

2.7 指定匿名用户的上传文件的默认的所有者和权限

chown_uploads=YES 		默认NO
chown_username=wang
chown_upload_mode=0644

2.8 linux系统用户

local_enable=YES 	是否允许linux用户登录
write_enable=YES 	允许linux用户上传文件
local_umask=022 	指定系统用户上传文件的默认权限

2.9 将系统用户映射为指定的guest用户

guest_enable=YES 		所有系统用户都映射成guest用户
guest_username=ftp 	配合上面选项才生效,指定guest用户
local_root=/ftproot 		guest用户登录所在目录

2.10 禁锢系统用户

2.10.1 禁锢所有系统在家目录中

chroot_local_user=YES 禁锢系统用户,默认NO,即不禁锢

2.10.2 禁锢或不禁锢特定的系统用户在家目录中,与上面设置功能相反

chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
  • 当chroot_local_user=YES时,则chroot_list中用户不禁锢
  • 当chroot_local_user=NO时,则chroot_list中用户禁锢

2.11 日志

wu-ftp日志:默认启用

xferlog_enable=YES 启用记录上传下载日志,此为默认值
xferlog_std_format=YES 使用wu-ftp日志格式,此为默认值
xferlog_file=/var/log/xferlog 可自动生成, 此为默认值

vsftpd日志:默认不启用

dual_log_enable=YES 使用vsftpd日志格式,默认不启用
vsftpd_log_file=/var/log/vsftpd.log 可自动生成, 此为默认值

2.12 提示信息

2.12.1 登录提示信息

ftpd_banner="welcome to mage ftp server"
banner_file=/etc/vsftpd/ftpbanner.txt

2.12.2 目录访问提示信息

dirmessage_enable=YES 	此为默认值
message_file=.message 	信息存放在指定目录下.message ,此为默认值

2.13 PAM模块实现用户访问控制

pam_service_name=vsftpd
pam配置文件:/etc/pam.d/vsftpd
/etc/vsftpd/ftpusers 默认文件中用户拒绝登录

2.14 是否启用控制用户登录的列表文件

userlist_enable=YES 						 此为默认值
userlist_deny=YES(默认值) 			  黑名单,不提示口令,NO为白名单
userlist_file=/etc/vsftpd/users_list 此为默认值

2.15 vsftpd服务指定用户身份运行

nopriv_user=nobody 此为默认值

2.16 连接数限制

max_clients=0 			最大并发连接数
max_per_ip=0 			每个IP同时发起的最大连接数

2.17 传输速率,字节/秒(b/s)

anon_max_rate=0 		匿名用户的最大传输速率
local_max_rate=0 		本地用户的最大传输速率

2.18 连接时间:秒为单位

connect_timeout=60 						 主动模式数据连接超时时长
accept_timeout=60 							被动模式数据连接超时时长
data_connection_timeout=300 		数据连接无数据输超时时长
idle_session_timeout=60 				  无命令操作超时时长

2.19 优先以文本方式传输

ascii_upload_enable=YES
ascii_download_enable=YES

以文本方式传输会破坏文件格式

2.20 实现基于SSL的FTPS

查看是否支持SSL

[root@centos8 ftp]# ldd `which vsftpd`
	linux-vdso.so.1 (0x00007fffd59f4000)
	libssl.so.1.1 => /lib64/libssl.so.1.1 (0x00007f12c4228000)
	libpam.so.0 => /lib64/libpam.so.0 (0x00007f12c4019000)
	libcap.so.2 => /lib64/libcap.so.2 (0x00007f12c3e14000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00007f12c3c10000)
	libcrypto.so.1.1 => /lib64/libcrypto.so.1.1 (0x00007f12c3738000)
	libc.so.6 => /lib64/libc.so.6 (0x00007f12c3374000)
	libz.so.1 => /lib64/libz.so.1 (0x00007f12c315d000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f12c2f3d000)
	libaudit.so.1 => /lib64/libaudit.so.1 (0x00007f12c2d13000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f12c46e6000)
	libcap-ng.so.0 => /lib64/libcap-ng.so.0 (0x00012c2b0d000)

创建自签名证书

[root@centos7 ~]# cd /etc/pki/tls/certs/
[root@centos7 certs]# make vsftpd.pem
umask 77 ; \
PEM1=`/bin/mktemp /tmp/openssl.XXXXXX` ; \
PEM2=`/bin/mktemp /tmp/openssl.XXXXXX` ; \
/usr/bin/openssl req -utf8 -newkey rsa:2048 -keyout $PEM1 -nodes -x509 -days 365 -out $PEM2  ; \
cat $PEM1 >  vsftpd.pem ; \
echo ""    >> vsftpd.pem ; \
cat $PEM2 >> vsftpd.pem ; \
rm -f $PEM1 $PEM2
Generating a 2048 bit RSA private key
..........................+++
..................................+++
writing new private key to '/tmp/openssl.Q3EmGo'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:cn
State or Province Name (full name) []:beijing
Locality Name (eg, city) [Default City]:beijing
Organization Name (eg, company) [Default Company Ltd]:wjops 
Organizational Unit Name (eg, section) []:sre
Common Name (eg, your name or your server's hostname) []:www.wj.com
Email Address []:
[root@centos7 certs]# openssl x509 -in vsftpd.pem -noout -text
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            9f:c7:70:bd:22:0d:1d:de
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=cn, ST=beijing, L=beijing, O=wjops, OU=sre, CN=www.wj.com
        Validity
            Not Before: Dec 18 09:24:01 2019 GMT
            Not After : Dec 17 09:24:01 2020 GMT
        Subject: C=cn, ST=beijing, L=beijing, O=wjops, OU=sre, CN=www.wj.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:f5:df:28:67:7b:c2:71:2a:1e:cb:05:34:e6:ec:
                    7c:52:82:02:a1:05:64:97:83:80:3c:e9:67:c5:72:
                    c1:06:1d:6a:ec:93:a0:79:9a:fe:af:d3:da:e7:2b:
                    a7:44:8a:1c:bf:05:de:a4:9c:42:e8:b7:10:27:dc:
                    f9:88:6e:e4:5e:fb:47:ed:4b:dc:71:b7:b8:60:55:
                    d8:a2:33:5c:63:ed:be:9d:77:7d:41:7f:15:1f:35:
                    9f:c7:2b:d6:bf:fa:bf:e1:4f:e0:83:70:0c:9c:c2:
                    d6:b4:f8:13:69:ca:28:a8:f8:e5:4c:72:05:aa:52:
                    b2:b5:8c:d4:1a:12:1c:41:a2:d9:02:f1:b7:ed:05:
                    5a:1a:6d:71:fe:68:e9:0a:e3:fe:75:a6:80:a4:db:
                    0a:7f:f2:aa:6b:46:4f:3e:cf:be:a2:33:6a:f4:41:
                    e5:cd:45:b0:e8:67:72:37:a4:71:4f:59:66:13:b2:
                    85:87:b4:bd:62:db:15:40:32:50:42:a1:f1:1a:21:
                    38:4c:8e:8b:3c:b1:1e:c9:03:73:9c:de:f4:9d:9d:
                    a9:c0:7a:ff:14:b3:bf:84:52:a6:f4:09:ea:b9:c2:
                    7c:fd:51:37:a6:f4:b6:38:1f:0e:84:05:ac:79:40:
                    08:45:fd:b4:68:2d:8d:ce:b7:f1:5d:fa:b8:1a:a2:
                    47:89
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Key Identifier: 
                7C:98:54:6D:D5:1D:E5:0D:08:A1:F3:B1:84:39:FB:1B:C3:10:F2:F5
            X509v3 Authority Key Identifier: 
                keyid:7C:98:54:6D:D5:1D:E5:0D:08:A1:F3:B1:84:39:FB:1B:C3:10:F2:F5

            X509v3 Basic Constraints: 
                CA:TRUE
    Signature Algorithm: sha256WithRSAEncryption
         69:d6:df:04:32:07:4b:b0:85:5f:53:a9:60:ef:7f:24:cd:40:
         20:f1:05:68:7e:86:61:d3:07:8b:bc:d1:55:0c:b8:7d:9b:a4:
         25:30:b0:1f:9b:db:e5:29:17:e9:a6:30:b2:21:36:84:c2:31:
         29:b5:07:d5:a1:b0:05:1f:1b:92:74:4b:d0:5f:58:fb:06:49:
         41:31:41:8a:58:b4:91:ee:16:9e:4f:2e:e6:4a:35:b5:bc:9c:
         8f:de:0c:f3:c2:66:1e:de:21:45:c9:3b:bf:e6:a9:20:d2:dc:
         fa:56:8d:6b:1c:c3:18:94:a6:60:28:d2:c4:a1:55:72:66:2d:
         85:7a:31:b9:64:02:b5:2c:0b:ee:5b:7f:22:26:5c:8f:30:64:
         4b:5a:32:95:64:2a:18:10:b5:a0:6f:64:e6:0f:25:58:a2:34:
         e1:9b:4d:83:18:5f:43:67:74:ab:c7:c8:f8:93:47:3b:9a:22:
         7e:07:1f:dc:f9:96:c1:be:fe:c9:df:7e:aa:67:1d:2f:94:8d:
         1c:6f:5f:a6:e1:40:89:87:67:a6:64:2e:67:08:92:ad:37:43:
         b2:75:b6:8c:13:04:a1:7e:8a:39:e3:b7:7d:e5:34:b4:ef:14:
         b4:e8:b5:ad:43:67:32:55:f6:eb:01:ac:24:28:fc:36:1d:ea:
         a8:73:91:e1
         
#或者分别生成一个证书和私钥文件
[root@centos7 certs]# mkdir /etc/vsftpd/ssl -p
[root@centos7 certs]# cd /etc/vsftpd/ssl/
[root@centos7 ssl]# openssl req -x509 -nodes -keyout vsftpd.key -out vsftpd.crt -days 365 -newkey rsa:2048

配置vsftpd服务支持ssl:

[root@centos7 ~]#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
#rsa_private_key_file /path/file #此项如果没有指定,私钥也在证书文件中
#ssl_tlsv1=YES
#ssl_sslv2=NO
#ssl_sslv3=NO
#require_ssl_reuse=NO
#ssl_ciphers=HIGH

[root@centos7 ~]#systemctl restart vsftpd

[root@centos8 ~]# ftp 192.168.38.107

3. vsftpd 虚拟用户

虚拟用户:

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

虚拟用户帐号的存储方式:

  • 文件:编辑文本文件,此文件需要被编码为hash格式
    奇数行为用户名,偶数行为密码
db_load -T -t hash -f vusers.txt vusers.db
  • 关系型数据库中的表中:实时查询数据库完成用户认证

    vsftpd 支持mysql库:pam要依赖于pam-mysql
    /lib64/security/pam_mysql.so
    /usr/share/doc/pam_mysql-0.7/README

3.1 实现基于文件验证的vsftpd虚拟用户

3.1.1 创建用户数据库文件

[root@centos7 ssl]# vim /etc/vsftpd/vusers.txt

wang
wangpass
mage
magepass
[root@centos7 ssl]# cd /etc/vsftpd/
[root@centos7 vsftpd]# db_load -T -t hash -f vusers.txt vusers.db
[root@centos7 vsftpd]# chmod 600 vusers.db

3.1.2 创建用户和访问FTP目录

[root@centos7 vsftpd]# useradd -d /data/ftproot -s /sbin/nologin -r vuser
[root@centos7 ~]# mkdir -p /data/ftproot/upload
[root@centos7 ~]# setfacl -m u:vuser:rwx /data/ftproot/upload/
#chmod a=rx /data/ftproot/ 如果自动创建家目录,需修改权限

3.1.3 创建pam配置文件

[root@centos7 ~]# vim /etc/pam.d/vsftpd.db

auth required pam_userdb.so db=/etc/vsftpd/vusers
account required pam_userdb.so db=/etc/vsftpd/vusers

3.1.4 指定pam配置文件

[root@centos7 vsftpd]# vim /etc/vsftpd/vsftpd.conf
guest_enable=YES
guest_username=vuser
pam_service_name=vsftpd.db

3.1.5 虚拟用户建立独立的配置文件

#指定各个用户配置文件存放的路径
[root@centos7 ~]# vim /etc/vsftpd/vsftpd.conf 
user_config_dir=/etc/vsftpd/vusers.d/

#创建各个用户配置文件存放的路径
[root@centos7 ~]# mkdir /etc/vsftpd/vusers.d

#创建各用户自已的配置文件,允许wang用户可读写,其它用户只读
[root@centos7 ~]# vim /etc/vsftpd/vusers.d/wang

anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
#创建各用户自已的配置文件
[root@centos7 ~]# vim /etc/vsftpd/vusers.d/mage

local_root=/data/ftproot2

3.2 实现基于MYSQL验证的vsftpd虚拟用户

环境准备

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

3.2.1 安装数据库并进行配置

[root@centos7 ~]# yum –y install mariadb-server
[root@centos7 ~]# systemctl start mariadb.service
[root@centos7 ~]# mysql
MariaDB [mysql]> CREATE DATABASE vsftpd;
Query OK, 1 row affected (0.00 sec)

MariaDB [mysql]> use vsftpd
Database changed

MariaDB [vsftpd]> CREATE TABLE users (
    -> id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
    -> name CHAR(50) BINARY NOT NULL,
    -> password CHAR(48) BINARY NOT NULL);
Query OK, 0 rows affected (0.00 sec)

MariaDB [vsftpd]> SHOW TABLES;
+------------------+
| Tables_in_vsftpd |
+------------------+
| users            |
+------------------+
1 row in set (0.01 sec)       
MariaDB [vsftpd]> INSERT INTO users(name,password) VALUES ('wang',password('mage'));
Query OK, 1 row affected (0.00 sec)

MariaDB [vsftpd]> INSERT INTO users(name,password) VALUES ('mage',password('centos'));
Query OK, 1 row affected (0.00 sec)
#创建连接的数据库用户
MariaDB [vsftpd]> GRANT SELECT ON vsftpd.* TO vsftpd@'192.168.38.%' IDENTIFIED BY 'magedu';
Query OK, 0 rows affected (0.00 sec)

3.2.3 在FTP服务器上安装vsftpd 和 pam_mysql包

[root@centos7 vsftpd]# yum install vsftpd -y

对于 centos 6:pam_mysql由EPEL的源中提供

yum install pam_mysql

对于 centos7 和 8:无对应rpm包,需手动编译安装

pam-mysql源码进行编译
#安装相关包
[root@centos7 vsftpd]# yum install gcc gcc-c++ make mariadb-devel pam-devel -y
#下载pam-mysql源码进行编译
[root@centos7 data]# wget http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz
-bash: wget: command not found
[root@centos7 data]# yum install wget -y
[root@centos7 data]# ll
total 344
drwx------ 2 root root  16384 Nov 20 20:51 lost+found
-rw-r--r-- 1 root root 335240 Jan  9  2006 pam_mysql-0.7RC1.tar.gz
[root@centos7 data]# tar xvf pam_mysql-0.7RC1.tar.gz
[root@centos7 pam_mysql-0.7RC1]# ./configure --with-pam-mods-dir=/lib64/security

#如果上面命令不指定 --with-pam-mods-dir=/lib64/security 会报以下错误
#checking if the second argument of pam_conv.conv() takes const pointer... no
#configure: error: Your system doesn't appear to be configured to use PAM.
#Perhaps you need to specify the correct location where the PAM modules reside.

[root@centos7 pam_mysql-0.7RC1]# make && make install
[root@centos7 pam_mysql-0.7RC1]# ll /lib64/security/pam_mysql*
-rwxr-xr-x 1 root root    882 Dec 20 14:17 /lib64/security/pam_mysql.la
-rwxr-xr-x 1 root root 141752 Dec 20 14:17 /lib64/security/pam_mysql.so

3.2.4 在FTP服务器上建立pam认证所需文件

[root@centos7 pam_mysql-0.7RC1]# vim /etc/pam.d/vsftpd.mysql

auth required pam_mysql.so user=vsftpd passwd=magedu host=192.168.38.108 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
account required pam_mysql.so user=vsftpd passwd=magedu host=192.168.38.108 db=vsftpd 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()函数加密

3.2.5 建立相应用户和修改vsftpd配置文件

#建立虚拟用户映射的系统用户及对应的目录
[root@centos7 pam_mysql-0.7RC1]# useradd -s /sbin/nologin -d /data/ftproot -r vuser
#centos7 需除去ftp根目录的写权限
[root@centos7 data]# mkdir -pv /data/ftproot/{upload,pub}
[root@centos7 ~]# setfacl -m u:vuser:rwx /data/ftproot/upload/
#确保/etc/vsftpd/vsftpd.conf中已经启用了以下选项
[root@centos7 data]# vim /etc/vsftpd/vsftpd.conf 
anonymous_enable=YES
#添加下面两项
guest_enable=YES
guest_username=vuser
#修改下面一项,原系统用户无法登录
pam_service_name=vsftpd.mysql
#启动vsftpd服务
[root@centos7 data]# systemctl restart vsftpd

3.2.6 在FTP服务器上配置虚拟用户具有不同的访问权限

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

#配置vsftpd为虚拟用户使用配置文件目录
[root@centos7 data]# vim /etc/vsftpd/vsftpd.conf
#添加如下选项
user_config_dir=/etc/vsftpd/vusers.d/

#创建所需要目录,并为虚拟用户提供配置文件
[root@centos7 data]# mkdir /etc/vsftpd/vusers.d/
[root@centos7 data]# cd /etc/vsftpd/vusers.d/
[root@centos7 data]# touch wang mage
#配置虚拟用户的访问权限
#虚拟用户对vsftpd服务的访问权限是通过匿名用户的相关指令进行的。如要让用户wang具有上传文件的权限,可修改/etc/vsftpd/vusers.d/wang文件,在里面添加如下选项并设置为YES即可,只读则设为NO
#注意:需确保对应的映射用户对于文件系统有写权限
[root@centos7 data]# vim /etc/vsftpd/vusers.d/wang 

anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
[root@centos7 data]# vim /etc/vsftpd/vusers.d/mage 

local_root=/data/ftproot2

3.2.7 测试

[root@centos8 ~]# ftp 192.168.38.107
Connected to 192.168.38.107 (192.168.38.107).
220 (vsFTPd 3.0.2)
Name (192.168.38.107:root): wang
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,38,107,141,102).
150 Here comes the directory listing.
drwxr-xr-x    2 0        0            4096 Dec 20 07:06 upload
226 Directory send OK.
ftp> exit
221 Goodbye.

[root@centos8 ~]# ftp 192.168.38.107
Connected to 192.168.38.107 (192.168.38.107).
220 (vsFTPd 3.0.2)
Name (192.168.38.107:root): mage
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,38,107,201,52).
150 Here comes the directory listing.
226 Directory send OK.
ftp> exit
221 Goodbye.
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!