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.
来源:CSDN
作者:wjasia
链接:https://blog.csdn.net/qq_45467372/article/details/103660105