FTP
FTP:(File Transfer Protocol )早期的三个应用级协议之一。它最主要的功能是在服务器与客户端之间进行文件的传输。
以vsftp搭建的ftp服务有三种认证模式,分别是匿名,系统用户和虚拟用户
匿名用户:ftp,anonymous,对应Linux用户ftp
系统用户:Linux用户,用户/etc/passwd,密码/etc/shadow
虚拟用户:特定服务的专用用户,独立的用户/密码文件
虚拟用户:所有虚拟用户会统一映射为一个指定的系统帐号:访问共享位置,即为此系统帐号的家目录
各虚拟用户可被赋予不同的访问权限,通过匿名用户的权限控制参数进行指定虚拟用户
帐号的存储方式:
文件:编辑文本文件,此文件需要被编码为hash格式
奇数行为用户名,偶数行为密码
db_load -T -t hash -f vusers.txt vusers.db
关系型数据库中的表中:
实时查询数据库完成用户认证
mysql库:pam要依赖于pam-mysql
/lib64/security/pam_mysql.so
/usr/share/doc/pam_mysql-0.7/README
下面实现基于两种验证的vsftpd虚拟用户。
一、实现基于文件验证的vsftpd虚拟用户
实验环境:centos7.3(ip=192.168.18.131)
iptables -F 关闭防火墙,临时生效下次重启机器失效
setenforce 0 关闭SELinux,临时生效下次重启机器失效
1.安装相应的软件
[root@centos7 ~]# yum -y install vsftpd 这里直接yum安装就好
2.创建数据库文件
[root@centos7 ~]# vim /etc/vsftpd/vusers.txt
ftp1 注:奇数行为用户名
123456 注:偶数行为密码
ftp2
123456
[root@centos7 ~]#cd /etc/vsftpd/
根据vusers.txt文件来生成将来pam模块能识别的二进制数据库
[root@centos7 vsftpd]#db_load -T -t hash -f vusers.txt vusers.db 编码为hash格式
[root@centos7 vsftpd]#chmod 600 vusers.db 修改权限只能root读写
3.创建用户和访问FTP目录
[root@centos7 vsftpd]# useradd -d /var/ftproot -s /sbin/nologin vuser 创建用户
[root@centos7 vsftpd]#mkdir /var/ftproot 创建用户vuser的ftp登录目录
[root@centos7 vsftpd]#chmod -w /var/ftproot
这里去掉写权限,是因为虚拟用户使用的参数是匿名用户的参数,
因此也是被禁锢在家目录中的,这就需要家目录没有写权限
[root@centos7 vsftpd]#mkdir /var/ftproot/upload 创建用户能上传的文件的目录
[root@centos7 vsftpd]#setfal -m u:vuser:rwx /var/ftproot/upload 用户vuser对这个文件有rwx权限
4.创建pam配置文件
[root@centos7 vsftpd]#vim /etc/pam.d/vsftpd.db
auth required pam_userdb.so db=/etc/vsftpd/vusers
account required pam_userdb.so db=/etc/vsftpd/vusers
这里不用加后缀为.db,pam模块自动识别
5.修改vsftpd.conf配置文件指定定pam配置文件
[root@centos7 vsftpd]#vim vsftpd.conf
guest_enable=YES 开启用户映射成guest用户
guest_username=vuser 指定guest用户为vuser
pam_service_name=vsftpd.db pam使用的文件 ,改动原来的文件pam_service_name=vsftpd或注释掉
6.虚拟用户建立独立的配置文件
1.创建配置文件存放的路径
[root@centos7 vsftpd]#mdkir vusers.d
[root@centos7 vsftpd]#vim vsftpd.conf
user_config_dir=/etc/vsftpd/vusers.d/ 在vsftpd.conf配置文件添加虚拟用户独立配置文件目录
[root@centos7 vsftpd]#cd vusers.d
2.创建ftp1用户可读写,其他用户只读
[root@centos7 vusers.d]#vim ftp1
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
3.创建ftp2用户可读写,其他用户只读并且登录目录改变
[root@centos7 vusers.d]#vim ftp2
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
local_root=/ftproot2 若果没有则去创建并设置相应权限
7.测试
可在另一台连接测试
[root@cnetos7 ~]#yum -y install ftp 安装ftp的客户端
[root@cnetos7 ~]#ftp 192.168.18.131 连接ftp服务端
........
二、实现基MySQL验证的vsftpd虚拟用户
实验环境:centos6.9(ip=192.168.18.130)当mysql数据服务器 。centos7.3(ip=192.168.18.131)当ftp服务器
在各个主机上关闭防护墙和SELinux以免影响实验结果
iptables -F 关闭防火墙6.7都可用 ,临时生效下次重启机器失效
setenforce 0 关闭SELinux 6,7都可用 ,临时生效下次重启机器失效
1.在各个主机上安装相应的软件包
centos 6.9安装mysql服务
[root@centos6 ~]#yum -y install mysql-server
[root@centos6 ~]#service mysqld start
[root@centos6 ~]#service mysqld on 开机启动
[root@centos6 ~]# mysql_secure_installation 开始设置mysql安全密码
centos 7.3 安装vsftpd、pam_mysql包
注意:在centos6中pam_mysql由epel6的源中提供可直接yum安装即可(yum install vsftpdpam_mysql)
在centos7中无对应rpm包,需手动编译安装
[root@centos7 ~]#yum -y install vsftpd
[root@centos7 ~]#wget http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz
[root@centos7 ~]#tar xvf pam_mysql-0.7RC1.tar.gz
[root@centos7 ~]#cd pam_mysql-0.7RC1
[root@centos7 pam_mysql-0.7RC1]# yum -y groupinstall Development tools
[root@centos7 pam_mysql-0.7RC1]#yum -y install mariadb-devel pam-devel 安装依赖程序包
[root@centos7 pam_mysql-0.7RC1]#./configure --with-mysql=/usr --with-pam=/usr --with-pam-mods-dir=/lib64/security
[root@centos7 pam_mysql-0.7RC1]#make && make install
2.在数据库服务器上创建虚拟用户账号
[root@centos6 ~]#mysql -uroot -p 进入mysql
mysql> create database ftpdb; 创建一个为ftpdbde 数据库
mysql> show databases; 查看数据库
mysql> grant all on ftpdb.* to 'ftpuser'@'192.168.18.%' identified by '123456';
创建一个为ftpuserde 用户对ftpdb数据库有最大权限
mysql> create table ftpusers(id int unsigned auto_increment primary key,name char(50),password char(48));
创建表
mysql> desc ftpusers; 查看
mysql> insert into ftpusers(name,password) values('ftp1',password('123456')),('ftp2',password('123456'));
建立用户ftp1 与 ftp2用户,为了安全应该使用PASSWORD函数加密其密码后存储
mysql> select * from ftpusers; 查看
[root@centos6 ~]#service mysqld restart 重启服务
设置完成可对建立的账号测试
在另一台主机
mysql -uftpuser -h(centos6.9ip) -p123456
mysql> show databases;
3.在FTP服务器上配置vsftpd服务
在FTP服务器上建立pam认证所需文件
[root@centos7 ~]#cd /etc/pam.d/
[root@centos7 pam.d]#vim vsftpd.mysql 创建认证文件
[root@centos7 pam.d]#cat vsftpd.mysql 这里的文件与centos6数据库里的表一一对应。
auth required pam_mysql.so user=ftpuser passwd=123456 host=192.168.18.130 db=ftpdb table=ftpusers usercolumn=name passwdcolumn=password crypt=2
account required pam_mysql.so user=ftpuser passwd=123456 host=192.168.18.130 db=ftpdb table=ftpusers usercolumn=name passwdcolumn=password crypt=2
注意:参考README文档,选择正确的加密方式
crypt是加密方式
0表示不加密
1表示crypt(3)加密
2表示使用mysql password()函数加密
3表示md5加密
4表示sha1加密
•auth 表示认证
•account 验证账号密码正常使用
•required 表示认证要通过
•pam_mysql.so模块是默认的相对路径,是相对/lib64/security/路径而言,也可以写绝对路径;后面为给此模块传递的参数
•user=ftpuser为登录mysql的用户
•passwd=123456 登录mysql的的密码
•host=192.168.18.130 mysql服务器的主机名或ip地址
•db=ftpd 指定连接msyql的数据库名称
•table=ftpusers 指定连接数据库中的表名
•usercolumn=name 当做用户名的字段
•passwdcolumn=password 当做用户名字段的密码
•crypt=2 密码的加密方式为mysql password()函数加密
建立相应用户和修改vsftpd配置文件,使其适应mysql认证
[root@centos7 ~]#useradd -s /sbin/nologin -d /var/ftproot ftpuser -m
[root@centos7 ~]#chmod 555 /var/ftproot centos7 需除去ftp根目录的写权限
[root@centos7 ~]#mkdir /var/ftproot/{upload,pub}
[root@centos7 ~]#setfacl –m u:ftpuser:rwx /var/ftproot/upload
建立虚拟用户映射的系统用户及对应的目录
[root@centos7 ~]#vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
添加下面两项
guest_enable=YES
guest_username=ftpuser
修改下面一项,原系统用户无法登录
pam_service_name=vsftpd改成
pam_service_name=vsftpd.mysql
[root@centos7 ~]#systemctl restart vsftpd
[root@centos7 ~]#systemctl enable vsftpd
[root@centos7 ~]#netstat -tnlp 查看端口开启情况
如果启用了SELinux不想关掉则可对SELinux进行相关设置
[root@centos7 ~]#restorecon -R /lib64/security
[root@centos7 ~]#setsebool -P ftpd_connect_db 1
[root@centos7 ~]#setsebool -P ftp_home_dir 1
[root@centos7 ~]#chcon -R -t public_content_rw_t /var/ftproot/
测试:利用FTP客户端工具,以虚拟用户登录验证结果
[root@centos7 ~]#tail /var/log/secure
4.在FTP服务器上配置虚拟用户具有不同的访问权限
vsftpd可以在配置文件目录中为每个用户提供单独的配置文件以定义其ftp服务访问权限,每个虚拟用户的配置文件名同虚拟用户的用户名。配置文件目录可以是任意未使用目录,只需要在vsftpd.conf指定其路径及名称即可
1.配置vsftpd为虚拟用户使用配置文件目录
[root@centos7 ~]#vim /etc/vsftpd/vsftpd.conf
添加如下选项
user_config_dir=/etc/vsftpd/conf.d 用户规则目录路径
2.创建所需要目录,并为虚拟用户提供配置文件
[root@centos7 ~]#mkdir /etc/vsftpd/vsftpd.conf
[root@centos7 ~]#cd /etc/vsftpd/vsftpd.conf
[root@centos7 vsftpd.conf]#touch ftp1 ftp2
3.配置虚拟用户的访问权限
虚拟用户对vsftpd服务的访问权限是通过匿名用户的相关指令进行的。
如果需要让用户ftp1具有上传文件的权限,可以修改/etc/vsftpd/vsftpd.conf/ftp1文件,在里面添加如下选项并设置为YES即可,只读则设为NO
注意:需确保对应的映射用户对于文件系统有写权限
创建ftp1用户可读写,其他用户只读
[root@centos7 vsftpd.conf]# vim ftp1
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
[root@centos7 vsftpd.conf]#vim ftp2
local_root=/var/ftproot2 切换ftp2的目录所在
5.测试
可在另一台连接测试
[root@cnetos7 ~]#yum -y install ftp 安装ftp的客户端
[root@cnetos7 ~]#ftp 192.168.18.131 连接ftp服务端
Connected to 192.168.18.131 (192.168.18.131).
220 (vsFTPd 3.0.2)
Name (192.168.18.131:root): ftp1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
........
总结:在window中亦可使用FileZilla连接测试,如果测试不成功,检查下防火墙和SELinux的配置,在配置中也注意改动项的字母的书写,保持相应的一致性。
基于虚拟用户的用户存放地点有两种,二进制文件验证和MySQL,因为我们的用户一般不多,使用mysql验证还要通过TCP三次握手四次分手,比较慢,因此常用二进制文件来进行存放验证比较好。
如果不足!请多多指教!