操作环境(虚拟机):
rhel5.8(光盘源), IP: 192.168.88.131
vsftpd-2.0.5-24.el5 (yum安装)
openssl-0.9.8e-22.el5 (yum安装)
db4-utils-4.3.29-10.el5_5.2 (yum安装,{可选,待笔者操作时解})
MySQL5.5.28.tar.gz (源码编译安装)
pam_mysql-0.7RC1.tar.gz (源码安装,必须项)
setenforce 0 (selinux对vsftpd的管制很严格,本文暂不细说selinux.临时关闭之)
物理机(Win7 IP: 192.168.88.1),
测试软件: FlashFXP(windows软件...笔者就不细说了)
一. 安装vsftpd.及配置文件一些注释
1.1 基本功能实现
- yum install vsftpd –y
- service vsftpd restart
1.2 简单配置解说:
- grep –v ‘^#’ /etc/vsftpd/vsftpd.conf #过滤vsftpd.conf的有效行
- anonymous_enable=YES #允许匿名用户
- local_enable=YES #允许系统有效用户登陆
- write_enable=YES #允许用户写权限,全局
- local_umask=022 #本地用户上传文件时的umask值
- anon_upload_enable=YES #允许匿名用户上传
- anon_mkdir_write_enable=YES #允许匿名用户创建目录
- dirmessage_enable=YES #登录时显示相关目录中,message_file文件的内容,自行创建
- xferlog_enable=YES #开启日志记录,默认日志文件/var/log/vsftpd.log
- connect_from_port_20=YES #数据传输端口(vsftpd命令端口为21,此为数据传输端口.)
- xferlog_std_format=YES #使用标准日志记录格式
- listen=YES #开启服务器后为监听状态(这不废话吗...)
- chroot_local_user=YES #开启此行,表示所有用户都限制在家目录
- chroot_list_enable=YES #控制用户锁定在家目录(同上行配可实现仅允许,仅限制)
- chroot_list_file=/etc/vsftpd/chroot_list #上一行的控制用户写在此文件
- pam_service_name=vsftpd #pam模块文件位置.(/etc/pam.d/vsftpd)
- userlist_enable=YES #写在/etc/vsftpd/user_list中的用户禁止登陆
- tcp_wrappers=YES #支持tcp_wrappers(就是/etc/hosts.{deny,allow} 的访问控制支持)
1.3 不安全的vsftpd测试
- useradd mos1 #创建一个普通测试用户(名: mos1 密码: redhat)
- echo “redhat” |passwd –stdin mos1
- tcpdump -i eth1 -nn -X tcp port 21 and host 192.168.88.131
#使用抓包工具,抓取知道网卡IP的指定协议的指定端口数据:
使用物理机登陆ftp时,抓到如下图:
二. 实现加密的ftp
(PS:请先执行 ldd `which vsftpd`|grep libssl 保证有字符出现!若没有,安装openssl-0.9.8e-22.el5后在检查,这个必须有.)
2.1 创建私有CA及其私有证书签发:
证书的过程,笔者之前写过,不再罗嗦,超级传送门如下:
openssl个人笔记
2.2 在配置文件vsftpd.conf中添加对tls的支持
- ssl_enable=YES #支持加密的ftp
- allow_anon_ssl=NO #匿名用户不使用加密连接
- force_local_data_ssl=YES #强制所有本地用户数据加密传输
- force_local_logins_ssl=YES #强制本地用户登陆时账号和密码加密传输
- ssl_tlsv1=YES #支持tlsv1版本
- ssl_sslv2=NO #不支持sslv2版本
- ssl_sslv3=NO #不支持sslv3版本
- rsa_cert_file=/etc/vsfpd/ssl/vsftpd.crt #CA签署csr后的证书,用于传递给客户端
- rsa_private_key_file=/etc/vsftpd/ssl/vsftpd.key #私钥文件
2.3 重启vsftpd服务,在物理机做测试即可,若出现下图,则OK.
'
三. vsftpd, tls和MySQL整合.
3.1 创建一个普通用户(用于做虚拟用户映射,指定特定目录,给shell为/sbin/nologin即可)
- mkdir –pv /var/testuser
- useradd -s /sbin/nologin -d /var/testuser guest
- chown -R guest. /var/testuser
3.2 先做一个简单的不通过mysql认证的测试,不做可直接跳过3.2所有操作.
3.2.1 安装文件数据库生成工具,并生成数据库文件
- yum install db4-utils –y
- echo -e 'demo1\n123\ndemo2\n456' > /etc/vsftpd/ulist.txt #数据库模板,奇数行用户名,偶数行密码
- db_load -T -t hash -f /etc/vsftpd/ulist.txt /etc/vsftpd/ulist.db #生成数据库文件
3.2.2 修改配置pam认证文件(里面的文件不用指定扩展名).
- vim /etc/pam.d/vsftpd
- #%PAM-1.0
- auth required pam_userdb.so db=/etc/vsftpd/ulist
- account required pam_userdb.so db=/etc/vsftpd/ulist
3.2.3 修改vsftpd.conf支持虚拟用户
- vim /etc/vsftpd/vsftpd.conf #追加如下两行
- guest_enable=YES
- guest_username=guest
Ps: 重启服务,使用用户demo1,密码123 和用户demo2,密码456 登陆测试即可
3.3 使用基于MySQL的认证
3.3.1 安装MySQL
这里笔者偷个懒.笔者的
LAMPX-AMPX编译安装篇:
3.3.2 在MySQL中创建虚拟用户的数据
- mysql>create database vsftpd;
- mysql>GRANT SELECT ON vsftpd.* TO 'ftpuser'@'localhost' IDENTIFIED BY '123';
- mysql>use vsftpd;
- mysql>CREATE TABLE vusers (id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, Name VARCHAR(30) NOT NULL, Password CHAR(48) NOT NULL);
- mysql>INSERT INTO vusers (Name,Password) VALUES ('demo1',password('123')),('demo2',password('123'));
- mysq>FLUSH PRIVILEGES;
- mysql>\q
Ps:对上面几条数据库命令做个注释,按顺序:
创建名为 vsftpd 的数据库
创建一个用户ftpuser,允许其通过localhost使用123密码访问
创建一个名字为vusers的表,id为主键,自增,不得为空,其后是Name和密码,都不得为空
插入俩数据(测试用户),分别是demo1和demo2,密码123加密存放.
刷新权限
退出mysql
3.3.3编译生成pam_mysql.so模块.
(Ps: 笔者不推荐使用yum安装MySQL,笔者肯定不会说在其它虚拟机测试时使用yum安装的mysql,编译这个模块一直失败的......笑话,这种事儿能说吗.)
- mkdir –pv /root/work
- wget http://down1.chinaunix.net/distfiles/pam_mysql-0.7RC1.tar.gz
- tar xf pam_mysql-0.7RC1.tar.gz
- cd pam_mysql-0.7RC1
- ./configure –with-mysql=/usr/local/mysql
- make && make install #编译后请确认/lib/security/pam_mysql.so这个文件存在.
3.3.4 编辑pam认证文件
- vim /etc/pam.d/vsftpd
- auth required pam_mysql.so user=ftpuser passwd=123 host=localhost db=vsftpd table=vusers usercolumn=Name passwdcolumn=Password crypt=2
- account required pam_mysql.so user=ftpuser passwd=123 host=localhost db=vsftpd table=vusers usercolumn=Name passwdcolumn=Password crypt=2
Ps: 这两行中前面都好说,末尾的crypt加个注释:
crypt=0: 明文密码
crypt=1: 使用crpyt()函数(对应SQL数据里的encrypt(),encrypt()随机产生salt)
crypt=2: 使用MYSQL中的password()函数加密<-笔者插入数据时使用的这个
crypt=3: 表示使用md5的散列方式
3.3.5 修改vsftpd.conf支持虚拟用户
- vim /etc/vsftpd/vsftpd.conf #追加如下两行
- guest_enable=YES
- guest_username=guest
Ps:重启服务,使用用户demo1,密码123 和用户demo2,密码123 登陆测试即可
3.4 给每个虚拟用户做单独的权限控制(事先得知道要限制的用户名,又废话了)
- mkdir –pv /etc/vsftpd/limit
- touch /etc/vsftpd/limit/{demo1,demo2}
- vim /etc/vsftpd/limit/demo1 #用户单独限制,仅demo1不能写入
- write_enable=NO #写权限关闭
- vim /etc/vsftpd/vsftpd.conf #修改主配置文件.添加如下行.
- user_config_dir=/etc/vsftpd/limit
本次配置到此完成...重启vsftpd,测试即可..
如果认证不通过,请检查mysql库文件是否已载入,如果没有,请检查mysql安装目录是否有lib目录,并将其路径写入/etc/ld.so.conf.d/mysql.conf,并使用ldconfig重启载入,当出现如下信息,则为正常,具体操作方法,参见 LAMPX-AMPX编译安装篇:
[root@stu35 ~]# ldconfig -v|grep mysql
/usr/local/mysql/lib:
libmysqlclient.so.18 -> libmysqlclient_r.so.18.0.0