vsftpd服务是Linux上应用较常见的FTP服务软件,通过FTP服务共享文件,下载速度快,而且方便,但是,FTP服务是最古老的,却又是最复杂的服务,它是一个应用层协议,闲话不扯,进入讲解。
vsftpd服务器上有着不用等级的用户:分别有系统用户、匿名用户、虚拟用户
系统用户:FTP服务上的系统用户,操作权限较多,操作较为危险
匿名用户:不需要验证即可登录FTP服务器的用户,用户名一般为ftpP或anonymous,密码为空
虚拟用户:虚拟用户会被统一映射为一个特定的系统用户,访问此系统用户共享的资源
虚拟用户:
所有的虚拟用户都会被统一映射到系统上的一个指定的用户,当虚拟用户访问时,其访问的共享位置是映射关系的系统用户的家目录,而且,对于不同的虚拟用户,可以被赋予不同的访问权限,是通过匿名用户的权限控制参数进行指定的
响应码:这些信息在下面的实例中,我们能看到的
1xx: 信息 2xx: 成功类的状态码 3xx: 提示需进一步提供补充类信息的状态码 4xx: 客户端错误 5xx: 服务端错误
每个服务,最重要的就是它的配置文件,实现某种功能,就得在配置文件中配置,下面就详细介绍一下我们的vsftpd服务的配置文件。
使用rpm -ql vsftpd,我们可以查看vsftpd生成的文件
vsftpd的配置文件在/etc/vsftpd/vsftpd.conf
具体选项如下所示:
以下是匿名用户的相关选项:
anonymous_enable=YES #允许匿名用户登录 anon_upload_enable=YES #允许匿名用户上传 anon_other_write_eable=YES #允许匿名用户有更多权限,如创建目录,删除目录
以下是系统用户的相关选项:
ocal_enable=YES #允许系统用户登录 write_enable=YES #本地用户是否有写的权限 local_umask=022 #用户上传文件后,权限被改为644 chroot_local_user=YES #这里是禁锢所有的系统用户登录ftp时,将其家目录作为根目录
禁锢指定的系统用户于其家目录,并作为根目录
chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list
vsftpd的日志
xferlog_enable=YES #启用日志功能 xferlog_std_format=YES #日志的格式 xferlog_file=/var/log/xferlog #这项最关键,如果开启前两项,这项没有指定,也不会开启日志功能
改变上传文件的属主
chown_uploads=YES #开启此项功能 chown_username=$USERNAME #指定改变为哪个用户
当vsftpd要完成认证时,就要使用pam,要指定这个配置文件
pam_service_name=vsftpd
在vsftpd服务器上,我们也可以开启控制用户登录的功能
userlist_enable=YES userlist_deny=YES|NO userlist_deny=YES #这是启用黑名单 userlist_deny=YES #这是启用白名单
默认文件为/etc/vsftpd/user_list
额外的配置选项
max_clients #最大并发连接数 max_per_ip #每个IP可同时发起的并发请求数
传输速率:
anon_max_rate #匿名用户的最大传输速率,单位是:字节/秒 local_max_rate #本地用户的最大传输速率,单位如上
ftp服务器的用户数据一般情况可以放在文件系统中或是关系型数据库中,下面,我将基于vsftpd和MariaDB数据库还有pam认证,实现vsftpd服务基于关系型数据库的认证。
拓扑如下:
首先,pam要和MariaDB交互,需要一个第三方的软件,pam_mysql,一般情况,使用yum安装,注意的是,这个软件位于epel源中。
[root@localhost ~]# yum install -y pam_mysql
我们可以看看pam_mysql这个软件生成了哪些文件:
[root@localhost ~]# rpm -ql pam_mysql/lib64/security/pam_mysql.so /usr/share/doc/pam_mysql-0.7 /usr/share/doc/pam_mysql-0.7/COPYING /usr/share/doc/pam_mysql-0.7/CREDITS /usr/share/doc/pam_mysql-0.7/ChangeLog /usr/share/doc/pam_mysql-0.7/NEWS /usr/share/doc/pam_mysql-0.7/README
第一个列出的是pam_mysql的模块,就是通过它实现MariaDB和pam交互的
另外一个重要的就是README文件,在不会安装的情况下,可以查看之
由于我们的MariaDB数据库服务器在另外一台主机上,我们要在这台主机上新建可以认证的用户:
MariaDB [(none)]> CREATE DATABASE ftpdb; Query OK, 1 row affected (0.05 sec) MariaDB [(none)]> USE ftpdb; Database changed MariaDB [FTPdb]> GRANT SELECT ON ftpdb.* TO ftp@'172.16.30.10' IDENTIFIED BY '123'; Query OK, 0 rows affected (0.01 sec) MariaDB [FTPdb]> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec)
以上,我们新建了一个库,并把库的权限赋予给了ftp这个用户,且密码为123,上面的ip地址一定要严格指定,不然的话,用户信息泄露,对企业是种损失。
然后,我们可以在vsftpd服务器上测试,是否能够连上刚刚这台数据库服务器
[root@localhost ~]# mysql -u ftp1 -h IP -p
然后回到mariadb数据库服务器,创建认证用户的表
MariaDB [FTPdb]> CREATE TABLE users ( -> id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, -> name VARCHAR(50) BINARY NOT NULL, -> password CHAR(48) BINARY NOT NULL ); Query OK, 0 rows affected (0.02 sec)
BINARY:比较时,区分大小写
添加虚拟用户信息,password是mariadb的内建函数,会编码加密
MariaDB[FTPdb]>INSERT INTO users (name,password) VALUES ('tom',password('tom')),('bob',password('bob')); Query OK, 2 rows affected (0.02 sec) Records: 2 Duplicates: 0 Warnings:
查看表中的信息
MariaDB [ftpdb]> SELECT * FROM users; +―--+――---+―――――-―――――――-----------------+ | id | name | password | +―--+―--―-+――――――――――――----------------―-+ | 1 | tom | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 | | 2 | jerry | *531E182E2F72080AB0740FE2F2D689DBE0146E04 | +―--+――---+―――――――――――-----------------―-+ 2 rows in set (0.03 sec)
然后,回到vsftpd服务器,配置一下FTP服务器
1、建立pam认证需要的文件
[root@localhost ~]#vim /etc/pam.d/vsftpd.mysql
添加下面的两行
auth required /lib64/security/pam_mysql.so user=ftp passwd=123 host=I172.16.30.10 db=ftpdb table=users usercolumn=name passwordcolumn=password crypt=2 #在上面的README文件中提到过 account required /lib64/security/pam_mysql.so user=ftp passwd=123 host=172.16.30.10 db=ftpdb table=users usercolumn=name passwordcolumn=password crypt=2
上面添加的两行,加以注意,由于一个字母错误,整整纠结近乎一个下午
crypt解析
如果值为0,表示明文传输,不加密
如果为1,表示使用加密
如果为2,表示用mysql的内建函数加密
我们可以通过查看pam_mysql生成的README文件
需要注意的是pam的password()函数和MariaDB的password()函数不一样,可能导致实验报错,在往MariaDB插入数据时,也可以采用明文的形式,上面的crypt的值改为0
修改vsftpd的配置文件,让其是基于mysql的认证
建立一个虚拟用户,映射到系统用户
useradd �Cs /sbin/nologin -d /ftptest sysftp chmod go+rx /ftptest
加上读和执行,不要写权限,保证用户能进入目录
配置vsftpd的主配置文件,确保,已有如下选项
anonymous_enable=YES #必须启用 local_enable=YES write_enable=YES anon_upload_enable=NO anon_mkdir_write_enable=NO chroot_local_user=YES
然后,加入以下选项,支持来宾用户
guest_enable=YES guest_username=sysftp #上面添加的用户,这就是要映射的系统用户
并且,要保证支持pam认证,指定上面新建的vsftpd.mysql的文件
pam_service_name=vsftpd.mysql
我们可以在共享的目录下创建一个文件,例如test.txt
之后,我们就可以重启vsftpd服务了,在普通客户端上验证,结果如下:
用户访问ftp服务器时,都被映射成为sysftp用户,共享的文件在/ftptest目录中。
到此为止,基于MariaDB的认证就就结束了,但是上面的用户的权限是一样的,但是,如何区分每个用户的权限呢?
配置vsftp\服务的配置文件,为虚拟用户使用配置文件目录
[root@localhost ~]#vim vsftpd.conf #添加如下选项 user_config_dir=/etc/vsftpd/vusers_config #为目录
创建目录,并且提供配置文件
#mkdir /etc/vsftpd/vusers_config #名称自己定义 [root@localhost ~]#vim tom 给tom定义权限 anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_wirte_enable=YES #具有删除、创建文件的权限 [root@localhost ~]#vim bob 给bob定义权限 anon_upload_enable=NO anon_mkdir_write_enable=NO anon_other_wirte_enable=NO
然后,我通过普通客户端检测:
tom检查结果如下:
[root@localhost mysql]# ftp 172.16.30.20 Connected to 172.16.30.20 (172.16.30.20). 220 (vsFTPd 2.2.2) Name (172.16.30.20:root): tom 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 fstab local: fstab remote: fstab 227 Entering Passive Mode (172,16,30,20,98,119). 150 Ok to send data. 226 Transfer complete. 962 bytes sent in 0.000212 secs (4537.74 Kbytes/sec) ftp> mkdir tom 257 "/tom" created ftp> ls 227 Entering Passive Mode (172,16,30,20,182,207). 150 Here comes the directory listing. -rw――- 1 502 502 962 Jul 31 21:45 fstab -rw-r�Cr�C 1 0 0 0 Jul 31 21:39 test.txt drwx―― 2 502 502 4096 Jul 31 21:45 tom 226 Directory send OK. ftp> delete test.txt 250 Delete operation successful. ftp> ls 227 Entering Passive Mode (172,16,30,20,143,203). 150 Here comes the directory listing. -rw――- 1 502 502 962 Jul 31 21:45 fstab drwx―― 2 502 502 4096 Jul 31 21:45 tom 226 Directory send OK. ftp> bye 221 Goodbye.
检查bob
[root@localhost mysql]# ftp 172.16.30.20 Connected to 172.16.30.20 (172.16.30.20). 220 (vsFTPd 2.2.2) Name (172.16.30.20:root): bob 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 passwd local: passwd remote: passwd 227 Entering Passive Mode (172,16,30,20,186,223). 550 Permission denied. ftp> ls 227 Entering Passive Mode (172,16,30,20,144,26). 150 Here comes the directory listing. -rw――- 1 502 502 962 Jul 31 21:45 fstab drwx―― 2 502 502 4096 Jul 31 21:45 tom 226 Directory send OK. ftp> mkdir bob 550 Permission denied. ftp> delete fstab 550 Permission denied. ftp> bye 221 Goodbye.
此时,我们的ftp服务就能基于MySQL数据库的认证访问登录了,在不想让某些用户具有某些权限时,我们就能对部分用户进行授权了。