- vsftpd是一款在Linux发行版中最受 推崇的FTP服务器程序,特点是小巧轻快,安全易用,目前在开源操作系统中常用的FTP套件主要有proftpd、pureftp、ServU和wu- ftpd等。本文将讲解vsftpd的基本功能和如何基于PAM和MySQL/MariaDB实现虚拟用户访问控制。
(1) ftp的主动和被动模式
-
PORT(主动模式)
PORT中文称为主动模式,工作的原理: FTP客户端连接到FTP服务器的21端口,发送用户名和密码登录,登录成功后要list列表或者读取数据时,客户端随机开放一个端口(1024以上),发送 PORT命令到FTP服务器,告诉服务器客户端采用主动模式并开放端口;FTP服务器收到PORT主动模式命令和端口号后,通过服务器的20端口和客户端开放的端口连接,发送数据.
image.png
-
PASV(被动模式)
PASV是Passive的缩写,中文成为被动模式,工作原理:FTP客户端连接到FTP服务器的21端口,发送用户名和密码登录,登录成功后要list列表或者读取数据时,发送PASV命令到FTP服务器, 服务器在本地随机开放一个端口(1024以上),然后把开放的端口告诉客户端, 客户端再连接到服务器开放的端口进行数据传输.
image.png
-
ftp的守护进程的类型:有两种
standalone:独立守护进程;由服务进程自行监听套按字,并接收用户访问请求;
transient:瞬时守护进程;由受托管方代为监听套按字,服务进程没有访问请求时不启动;当托管方收到访问请求时,才启动服务进程;一般使用这种
CentOS 6:xinetd独立守护进程, /etc/xinetd.d/,
CentOS 7:由systemd代为监听 -
vsftpd以ftp用户的身份运行进程,默认认用户即为ftp用户,匿名用户的默认路径即ftp用户的家目录/var/ftp
程序环境: -
主程序:/usr/sbin/vsftpd
主配置文件:/etc/vsftpd/vsftpd.conf
数据根目录:/var/ftp
(2)vsftpd用户:
1)、用户类别:
-
匿名用户:anonymous --> ftp, /var/ftp
-
系统用户:至少禁止系统用户访问ftp服务,/etc/vsftpd/ftpusers,PAM(/etc/pam.d/vsftpd);
-
虚拟用户:非系统用户,用户账号非为可登录操作系统的用户账号(非/etc/passwd);
-
用户通过vsftpd服务访问到的默认路径,是用户自己的家目录;默认可以自己有权限访问的所有路径间切换;禁锢用户于其家目录中;
2)、配置文件设置
-
主配置文件:/etc/vsftpd/vsftpd.conf
directive value
注意:directive之前不能有多余字符;顶格写 -
匿名用户设置:
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES是否支持匿名账户只有下载权限
anon_upload_enable=YES上传权限只能上传文件
anon_mkdir_write_enable=YES创建目录
anon_other_write_enable=YES修改权限包括删除目录
anon_umask=077
* 系统用户设置:
local_enable=YES是否本地用户
write_enable=YES写权限
local_umask=022默认权限644
chroot_local_user=YES#禁锢所有本地用户于其家目录;需要事先去除用户对家目录的写权限;
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list#禁锢列表中文件存在的用户于其家目录中;需要事先去除用户对家目录的写权限;
* 传输日志设置:
xferlog_enable=YES
xferlog_file=/var/log/xferlog
xferlog_std_format=YES
* 上传下载速率:
anon_max_rate=0 0代表无限制
local_max_rate=0
* 并发连接数限制:
max_clients=2000最大并发连接数
max_per_ip=50单个(一个客户端)ip最大连接数
辅助配置文件/etc/vsftpd/ftpusers;列在此文件中的用户均禁止使用ftp服务;
[root@localhost ~]# vim /etc/vsftpd/ftpusers;
# Users that are not allowed to login via ftp
root
bin
-省略-
- 控制可登录vsftpd服务的用户列表:
userlist_enable=YES
启用/etc/vsftpd/user_list文件来控制可登录用户;
userlist_deny=
YES:意味着此为黑名单;
NO:白名单;
(3)配置pam_mysql认证ftp虚拟用户
image.png- 环境准备:
ftp服务器:172.16.15.103
mysql服务器:172.16.15.107
1)mysql服务器安装及设置
- 首先关闭selinux和防火墙
[root@mariadb-107 ~]# systemctl stop firewalld
[root@mariadb-107 ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@mariadb-107 ~]# vim /etc/selinux/config
SELINUX=disabled
[root@mariadb-107 ~]# systemctl reboot #重启生效
- 安装mariadb服务
[root@mariadb-107 ~]# yum install mariadb-server -y
- 编辑/etc/my.cnf.d/server.cnf配置文件
[root@mariadb-107 ~]# vim /etc/my.cnf.d/server.cnf
[mysqld]
skip_name_resolve=ON #添加
innodb_file_per_table=ON #添加
- 开启mariadb服务
[root@mariadb-107 ~]# systemctl start mariadb.service
[root@mariadb-107 ~]# systemctl enable mariadb.service
[root@mariadb-107 ~]# ss -tnl
- 授权一个ftp用户
[root@mariadb-107 ~]# mysql #登录数据库
MariaDB [(none)]>CREATE DATABASE vsftpd;
MariaDB [(none)]> use vsftpd;
MariaDB [vsftpd]> GRANT SELECT ON vsftpd.* TO vsftp@'172.16.15.%' IDENTIFIED BY 'vpass';#创建ftp授权用户
MariaDB [vsftpd]> FLUSH PRIVILEGES; #刷新
MariaDB [vsftpd]> CREATE TABLE users (id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50) BINARY NOT NULL,password CHAR(48) BINARY NOT NULL);#创建users表,id列为无符号整型,该列值不可以为空,并不可以重复,而且自增;
MariaDB [vsftpd]> INSERT INTO users(name,password) VALUES ('test1',password('123')),('test2',password('456'));#插入test1和test2用户名密码
MariaDB [vsftpd]> select * from users;
+----+-------+-------------------------------------------+
| id | name | password |
+----+-------+-------------------------------------------+
| 1 | test1 | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
| 2 | test2 | *531E182E2F72080AB0740FE2F2D689DBE0146E04 |
+----+-------+-------------------------------------------+
MariaDB [vsftpd]> exit
2)ftp服务器安装及设置
- 首先关闭selinux和防火墙
[root@fpt-103 ~]# systemctl stop firewalld
[root@fpt-103 ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@fpt-103 ~]# vim /etc/selinux/config
SELINUX=disabled
[root@fpt-103 ~]# systemctl reboot #重启生效
- 安装vsftpd和pam_mysql
[root@fpt-103 ~]# yum groupinstall -y "Development Tools" "Server PlatformDevelopment" #安装编辑包组
[root@fpt-103 ~]# yum install -y vsftpd ftp wget #安装vsftp、wget、ftp客户端
[root@fpt-103 ~]# yum install -y mariadb-devel pam-devel openssl-devel #安装相关扩展
[root@fpt-103 ~]#wget http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz --no-check-certificate #下载源码包
[root@fpt-103 ~]# tra xf pam_mysql-0.7RC1.tar.gz #解压缩包
[root@fpt-103 ~]# cd pam_mysql-0.7RC1 #切换到pam_mysql目录下
[root@ftp-103 pam_mysql-0.7RC1]# ./configure --with-mysql=/usr --with-openssl=/usr --with-pam=/usr --with-pam-mods-dir=/lib64/security #设置预编译
[root@ftp-103 pam_mysql-0.7RC1]# make && make install #编译并安装
[root@fpt-103 ~]# ll /lib64/security/ | grep mysql #查询是否安装成功
-rwxr-xr-x 1 root root 882 Jun 24 23:49 pam_mysql.la
-rwxr-xr-x 1 root root 141752 Jun 24 23:49 pam_mysql.so
[root@fpt-103 ~]# vim /etc/pam.d/vsftpd.mysql #创建pam认证文件
auth required /usr/lib64/security/pam_mysql.so user=vsftp passwd=vpass host=172.16.15.107 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
account required /usr/lib64/security/pam_mysql.so user=vsftp passwd=vpass host=172.16.15.107 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
[root@fpt-103 ~]# useradd -s /sbin/nologin -d /var/ftproot vuser
[root@fpt-103 ~]# chmod go+rx /var/ftproot #更改权限
[root@fpt-103 ~] vim /etc/vsftpd/vsftpd.conf #设置配置文件
chroot_local_user=YES
allow_writeable_chroot=YES
pam_service_name=vsftpd.mysql
userlist_enable=YES
guest_enable=YES
guest_username=vuser
user_config_dir=/etc/vsftpd/vusers_conf
-
配置虚拟用户具有不同的访问权限:
vsftpd可以在配置文件目录中为每个用户提供单独的配置文件以定义其ftp服务访问权限,每个虚拟用户的配置文件名同虚拟用户的用户名。配置文件目录可以是任意未使用目录,只需要在vsftpd.conf指定其路径及名称即可。 -
配置vsftpd为虚拟用户使用配置文件目录
[root@fpt-103 ~]# mkdir /etc/vsftpd/vusers_conf #创建虚拟用户配置目录
[root@fpt-103 ~]# cd /etc/vsftpd/vusers_conf#切换目录
[root@ftp-103 vusers_conf]# vim test1#创建测试1用户配置
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
[root@ftp-103 vusers_conf]# vim test2#创建测试2用户配置
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
[root@fpt-103 ~]# systemctl start vsftpd 启动vsftp
(4)在客户端测试
-
客户端主机要安装ftp工具
yum -y install ftp -
状态响应码
-
1xx:信息码
-
2xx:成功状态码
-
3xx:进一步提示补全信息的状态码
-
4xx:客户端错误
-
5xx:服务器端错误
-
测试test1用户
[root@client-90 ~]# ftp 172.16.15.103
Connected to 172.16.15.103 (172.16.15.103).
220 (vsFTPd 3.0.2)
Name (172.16.15.103:root): test1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> lcd /etc
Local directory now /etc
ftp> put issue
local: issue remote: issue #上传issue
227 Entering Passive Mode (172,16,15,103,119,150).
150 Ok to send data. #上传成功
226 Transfer complete.
23 bytes sent in 9e-05 secs (255.56 Kbytes/sec)
ftp> mkdir test
257 "/test" created #创建test目录成功
ftp> rm test
250 Remove directory operation successful. #删除成功
ftp> exit
221 Goodbye.
- 测试test2用户
[root@client-90 ~]# ftp 172.16.15.103
Connected to 172.16.15.103 (172.16.15.103).
220 (vsFTPd 3.0.2)
Name (172.16.15.103:root): test2
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> lcd /etc
Local directory now /etc
ftp> put issue #上传issue
local: issue remote: issue
227 Entering Passive Mode (172,16,15,103,47,230).
550 Permission denied #上传被拒绝
ftp> mkdir test
550 Permission denied #创建目录被拒绝
网友评论