Centos6.4 vsftpd服务器搭建(二)
一、vsftp使用hash文件的形式虚拟用户登录
第一步:查看vsftpd是否安装,并且添加开机启动,并且关闭防火墙、selinux并且做时间同步
# yum install vsftpd pam* db4* -y #安装vsftpd.pam.db4
第二步:创建ftp虚拟宿主账户
# useradd ftpuser -s /sbin/nologin
第三步:配置vsftpd.conf文件
# grep -v "^#" /etc/vsftpd/vsftpd.conf
anonymous_enable=NO #关闭匿名访问
local_enable=YES #设定本地用户可以访问。注:如使用虚拟宿主用户,在该项目设定为NO的情况下所有虚拟用户将无法访问
write_enable=YES #保持默认
local_umask=022 #上传后文件的权限掩码,不用改
dirmessage_enable=YES #开启目录标语,默认是YES
xferlog_enable=YES #开启日志,默认是YES,不用改
connect_from_port_20=YES #设定数据连接端口为20
xferlog_file=/var/log/xferlog #设定vsftpd的服务日志保存路径,要开启
xferlog_std_format=YES #设定vsftpd日志的格式不用修改
async_abor_enable=YES #支持异步传输功能
ascii_upload_enable=YES #支持ASCII模式的上传功能
ascii_download_enable=YES #支持ASCII模式的下载功能
chroot_local_user=YES #本地用户锁定在自己的家目录
chroot_list_enable=YES #开启下面的文件
chroot_list_file=/etc/vsftpd/chroot_list #将需要访问其他目录的用户写到里面,默认没有这个文件,所以默认所有的用户都要锁定在家目录。
listen=YES
pam_service_name=vsftpd #PAM认证文件名。PAM将根据/etc/pam.d/vsftpd进行认证
userlist_enable=YES #拒绝登录用户名单,不用改
tcp_wrappers=YES #限制主机对vsftp的访问
guest_enable=YES #增加项,设定启用虚拟用户功能
guest_username=ftpuser #增加项,指定虚拟用户的宿主用户
virtual_use_local_privs=YES #增加项,设定虚拟用户的权限符合他们得宿主用户
user_config_dir=/etc/vsftpd/conf.d #设置虚拟用户个人的配置文件存放的位置目录
博文来自:www.51niux.com
第四步:创建虚拟用户密码文件,并进行验证
# vi /etc/vsftpd/vuser_passwd #注意奇数行尾用户名,偶数行为密码,创建了一个51niux1用户,密码为123456,还有一个51niux2用户,密码为654321
51niux1
123456
51niux2
654321
# db_load -T -t hash -f /etc/vsftpd/vuser_passwd /etc/vsftpd/vuser_passwd.db #生成虚拟用户认证的db文件
# chmod 600 /etc/vsftpd/vuser_passwd.db #设置访问权限
# chmod 600 /etc/vsftpd/vuser_passwd
# vi /etc/pam.d/vsftpd # 编辑认证文件,其他的都注释掉
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser_passwd #新加此行
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser_passwd #新加此行
第五步:创建虚拟用户用户文件
# mkdir /etc/vsftpd/conf.d
# vi /etc/vsftpd/conf.d/51niux1 #建立以用户名为名称的文件,里面的好多配置都可以根据不同的用户做不同的自定义
local_root=/ftp1/ #主要是这里,自定义了自己的家目录在哪里。
anon_world_readable_only=no
anonymous_enable=NO
write_enable=YES
local_umask=022
max_clients=10
max_per_ip=5
local_max_rate=1048576
# mkdir /ftp1 #保证这个目录存在
# chown ftpuser:ftpuser /ftp1 #授权
第六步:测试
# lftp 192.168.1.111
lftp 192.168.1.111:~> login 51niux1 123456
lftp 51niux1@192.168.1.111:~> mkdir buhao
mkdir ok, `buhao' created
lftp 51niux1@192.168.1.111:/> ls -l
drwxr-xr-x 2 2537 2537 4096 Nov 27 16:06 buhao
drwxr-xr-x 2 2537 2537 4096 Nov 27 15:59 nihao
lftp 51niux1@192.168.1.111:/> rmdir nihao
rmdir ok, `nihao' removed
lftp 51niux1@192.168.1.111:/> ls -l
drwxr-xr-x 2 2537 2537 4096 Nov 27 16:06 buhao
博文来自:www.51niux.com
第七步:其他通用配置
首先我们要了解/etc/vsftpd/conf.d/下面可以不用存在以用户名称命令的文件,这样我们所有的用户都只会采用全局的配置,而不是自定义的配置。在生产环境中我们也是一般定义一个共有的目录,然后ftp不同的用户一起来访问这个共享的目录。
然后第一个问题,怎么来让大家一起来共享这个共有的目录呢?
第一个方法:
# cat /etc/vsftpd/vsftpd.conf
local_root=/ftp1/ #加上一句这个,就是把我们的系统用户重定向到一个/ftp1的目录里面去,然后对这个目录授权一下便可。
第二个方法:
我们把我们ftpuser的家目录重定向一下,这样如果/etc/vsftpd/conf.d/的用户配置文件里面没有定义local_root,就会使用宿主用户的家目录。
然后第二个问题,我们可以建议一个共享的根目录,然后不同的用户的家目录为自己以用户命名的家目录吗?
# cat /etc/vsftpd/vsftpd.conf
local_root=/ftp1/$USER #加上这句话,就是在/ftp1的目录下面,用户名称的目录为不同用户的ftp根目录
user_sub_token=$USER #加上这句话
测试:/etc/vsftpd/conf.d/下面是空的,我们用51niux1和51niux2这两个用户来测试,51niux1没有创建家目录,51niux2有创建家目录
# lftp 192.168.1.111
lftp 192.168.1.111:~> login 51niux1 123456
lftp 51niux1@192.168.1.111:~> ls
ls: Login failed: 500 OOPS: cannot change directory:/ftp1/51niux1 #提示没有这个家目录
然后我们给51niux2创建一个家目录:mkdir /ftp1/51niux2 && chown ftpuser:ftpuser /ftp1/51niux2
# lftp 192.168.1.111
lftp 192.168.1.111:~> login 51niux2 654321
lftp 51niux2@192.168.1.111:/> mkdir nihao
mkdir ok, `nihao' created
然后我们在ftp服务器上面查看一下:
[root@slave1 51niux2]# ls -l #我们创建的目录创建了
total 4
drwxr-xr-x 2 ftpuser ftpuser 4096 Nov 28 00:14 nihao
[root@slave1 51niux2]# pwd #是在51niux2下面
/ftp1/51niux2
二、vsftp结合mysql进行虚拟用户认证
用关系型数据库存储:以后新增用户账号,只需要使用insert就可以添加,即时查询数据库完成用户认证。
pam要依赖于pam-mysql ,而pam中默认是不支持mysql模块的,所以要手动编译安装mysql模块,或者用第三方epel源,进行yum.
我这里采用第三方源yum安装的形式,前面已经记录过如何使用第三方yum源,这就就不多做介绍了。下面是操作步骤。
第一步:安装必要软件
# yum -y install vsftpd mysql-server mysql-devel pam-devel pam_mysql
# rpm -qa|grep pam_mysql #查看rpm_mysql是否安装
pam_mysql-0.7-0.12.rc1.el6.x86_64
注:这里主要是pam_mysql一定要安装上。
下面为编译安装方法:
# cd /tools/
# wget prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz
# tar zxf pam_mysql-0.7RC1.tar.gz
# cd pam_mysql-0.7RC1
# ./configure --with-openssl && make && make install
报错:configure: error: Cannot find pam headers. Please check if your system is ready for pam module development.
解决方法:# yum install pam-devel -y
默认安装位置为:/lib/security/pam_mysql.so我们一般都是都是64操作系统,可以做个软链到/lib64/security/pam_mysql.so
报错:
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.
解决办法:# ./configure --with-openssl --with-pam-mods-dir=/lib64/security/ #手工指定一下。
第二步:数据库配置
# /etc/init.d/mysqld restart
# mysql
mysql> CREATE DATABASE vsftpd; #创建数据库
mysql> use vsftpd; #使用vsftpd数据库
mysql> GRANT SELECT ON vsftpd.* TO vsftp@'192.168.1.%' IDENTIFIED BY '51niux.com'; #创建vsftp用户密码为51niux.com,并且只拥有对vsftpd数据库所有表的查询权限,并只允许192.168.1段的IP访问
mysql> GRANT SELECT ON vsftpd.* TO vsftp@'127.0.0.1' IDENTIFIED BY '51niux.com'; #如果mysql是本机还要加一条
mysql> FLUSH PRIVILEGES; #刷新授权表
mysql> CREATE TABLE users (id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50) BINARY NOT NULL,password CHAR(48) BINARY NOT NULL);
mysql> desc users; #查看表结构
+----------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(50) | NO | | NULL | |
| password | char(48) | NO | | NULL | |
+----------+------------------+------+-----+---------+----------------+
mysql> INSERT INTO users (name,password) VALUES ('51niux1',password('51niux123')),('51niux2',password('51niux456')); #插入两个用户
mysql> select * from users; #查询用户已经生成
+----+---------+-------------------------------------------+
| id | name | password |
+----+---------+-------------------------------------------+
| 1 | 51niux1 | *1CF23E179E20401AD1CFB44E8767F5A33A9A76A8 |
| 2 | 51niux2 | *34A901CC17C13C7E8EDF777E437C43E555DC9FCD |
+----+---------+-------------------------------------------+
第三步:在vsftpd服务器上面配置pam_mysql
3.1 建立pam认证所需文件
我mysql服务器是本机,所以我就用本机的127.0.0.1登录了。
先测试一下:
# mysql -u vsftp -p51niux.com -h 127.0.0.1 -e "show databases;" #OK测试是可以的
+--------------------+
| Database |
+--------------------+
| information_schema |
| test |
| vsftpd |
+--------------------+
# vim /etc/pam.d/vsftpd.mysql
auth required pam_mysql.so user=vsftp passwd=51niux.com host=127.0.0.1 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
account required pam_mysql.so user=vsftp passwd=51niux.com host=127.0.0.1 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
注:
这里是2行,不可以换行.另外还要注意里面相应栏位的填写。
特别说明下crypt选项
crypt=0:明文密码
crypt=1:使用 crpyt()函数(对应 SQL 数据里的 encrypt(),encrypt()随机产生 salt)
crypt=2:使用 MYSQL 中的 password()函数加密
crypt=3:表示使用 md5 的散列方式
user 、passwd 用户名密码当然你也可以随便设置,不过需要在mysql 里面赋予查询权限。
3.2 修改vsftpd的配置文件,使其适应mysql认证
创建ftp虚拟宿主账户
# useradd ftpuser -s /sbin/nologin
配置vsftpd.conf文件
# grep -v "^#" /etc/vsftpd/vsftpd.conf
anonymous_enable=NO #关闭匿名访问
local_enable=YES #设定本地用户可以访问。注:如使用虚拟宿主用户,在该项目设定为NO的情况下所有虚拟用户将无法访问
write_enable=YES #保持默认,如果为NO就没有写权限了。
local_umask=022 #上传后文件的权限掩码,不用改
dirmessage_enable=YES #开启目录标语,默认是YES
xferlog_enable=YES #开启日志,默认是YES,不用改
connect_from_port_20=YES #设定数据连接端口为20
xferlog_file=/var/log/xferlog #设定vsftpd的服务日志保存路径,要开启
xferlog_std_format=YES #设定vsftpd日志的格式不用修改
async_abor_enable=YES #支持异步传输功能
ascii_upload_enable=YES #支持ASCII模式的上传功能
ascii_download_enable=YES #支持ASCII模式的下载功能
chroot_local_user=YES #本地用户锁定在自己的家目录
chroot_list_enable=YES #开启下面的文件
chroot_list_file=/etc/vsftpd/chroot_list #将需要访问其他目录的用户写到里面,默认没有这个文件,所以默认所有的用户都要锁定在家目录。
listen=YES #启用监听端口
pam_service_name=vsftpd.mysql #PAM认证文件名。PAM将根据/etc/pam.d/vsftpd.mysql进行认证
userlist_enable=YES #拒绝登录用户名单,不用改
tcp_wrappers=YES #限制主机对vsftp的访问
guest_enable=YES #增加项,设定启用虚拟用户功能
guest_username=ftpuser #增加项,指定虚拟用户的宿主用户
virtual_use_local_privs=YES #增加项,设定虚拟用户的权限符合他们得宿主用户
user_config_dir=/etc/vsftpd/conf.d #设置虚拟用户个人的配置文件存放的位置目录
local_root=/ftp1 #共享根目录为/ftp1
3.3 创建对应的目录:
#mkdir /etc/vsftpd/conf.d
#mkdir /ftp1
#chown ftpuser:ftpuser /ftp1
3.4 重启vsftpd服务
# /etc/init.d/vsftpd restart
第四步:测试
# yum install ftp -y #下载ftp工具
# ftp 192.168.1.111
Connected to 192.168.1.111 (192.168.1.111).
220 (vsFTPd 2.2.2)
Name (192.168.1.111:root): 51niux1 #输入用户名
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,1,111,39,173).
150 Here comes the directory listing.
drwxr-xr-x 3 2537 2537 4096 Nov 27 16:14 51niux2
drwxr-xr-x 2 2537 2537 4096 Nov 27 17:15 buhao
drwxr-xr-x 2 2537 2537 4096 Nov 27 17:14 ldaoptest7
drwxr-xr-x 3 2537 2537 4096 Nov 27 16:46 ldaptest1
drwxr-xr-x 2 2537 2537 4096 Nov 27 17:14 ldaptest8
drwxr-xr-x 3 2537 2537 4096 Nov 27 17:04 ldaptest9
226 Directory send OK.
lftp 51niux1@192.168.1.111:/> put index.html #可上传
136 bytes transferred
lftp 51niux1@192.168.1.111:/> get index.html #可下载
136 bytes transferred
lftp 51niux1@192.168.1.111:/> rmdir 51niuxtest #可删除目录
rmdir 成功, 删除 `51niuxtest'
lftp 51niux1@192.168.1.111:/> mkdir 51niuxhaha #可创建目录
mkdir 成功, 建立 `51niuxhaha'
当然我们可以在全局变量里面把权限设置的低,比如write_enable=NO,那所有登录的虚拟用户默认都是不具有写权限的,然后我们在/etc/vsftpd/conf.d下面自定义我们的用户,给他授予写权限以及其他权限。
三、vsftp用ssl加密
为什么要加密呢,因为我们ftp登录的时候是以用户名密码认证的形式,如果不加密会怎么样。比如你这台是一个ftp服务器,一扫描我靠你开放了21端口。好吧,tcpdump以下吧。
我靠,如果我们要是ftp服务器是对公网服务的,那就不能这么样直接登录了。
首先,如果你不想你的ftp是21端口,防止一眼就被认出来,可以进行端口修改:
1.编辑 /etc/vsftpd/vsftpd.conf 文件
在该配置文件中添加此行:listen_port=789
2.编辑 /etc/services 文件,将其中的
ftp 21/tcp 改为 ftp 789/tcp ,
ftp 21/udp 改为 ftp 789/udp
然后呢,我们可以对ftp进行ssl加密,下面是ssl加密过程
第一步:查看ftp软件是否支持ssl
# ldd /usr/sbin/vsftpd |grep libssl
libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007f48015b0000) #说明此版本支持
注意:
如没有输出libssl.so.6 => /lib/libssl.so.6 (0xf7f27000)类似文本,说明此vsftpd版本不支持SSL,就需要重新编译安装vsftp服务器或者对vsftp服务器进行升级
第二步:生成ssl证书
# openssl req -x509 -days 365 -newkey rsa:2048 -nodes -keyout /etc/vsftpd/vsftpd.pem -out /etc/vsftpd/vsftpd.pem #其中”-days 365″声明证书的有效期是一年。接下来的过程需要你输入一些相关的国家,地区,位置,组织名称,common name等信息。
第三步:修改vsftpd.conf,设置强制启用ssl认证
# vi /etc/vsftpd/vsftpd.conf
dual_log_enable=YES #如果启用,两个LOG文件会各自产生,默认的是/var/log/xferlog和/var/log/vsftpd.log。前一个是wu-ftpd格式的LOG,能被通用工具分析。后一个是VSFTPD的专用LOG格式。
vsftpd_log_file=/var/log/vsftpd.log #就是记录vsftpd连接客户端以及操作的日志位置,但是有一个问题,如果我们日志写详细了,可能会影响服务器的性能,根据情况判断是否开启吧。
log_ftp_protocol=NO #启用后,如果xferlog_std_format没有被激活,所有的FTP请求和反馈信息将被纪录。这常用于调试(debugging)。
ssl_enable=YES #是否启用SSL,默认为no
allow_anon_ssl=YES #是否允许匿名用户使用SSL,默认为no
force_local_data_ssl=YES #非匿名用户登陆时是否加密,默认是yes
force_local_logins_ssl=YES #非匿名用户登录时候是否加密,默认为no
force_anon_logins_ssl=YES #匿名用户登录时是否加密,默认为no
force_anon_data_ssl=YES #匿名用户数据传输时是否加密,默认为no
ssl_tlsv1=YES #是否激活tls v1 加密,默认yes
ssl_sslv2=NO #是否激活sslv3加密,默认No
ssl_sslv3=NO #是否激活sslv2加密,默认no
rsa_cert_file=/etc/vsftpd/vsftpd.pem #rsa证书位置
ssl_ciphers=AES128-SHA #加密算法,也可以用HIGH
ssl_request_cert=NO #防止出现:SSL routines:SSL3_GET_CERT_VERIFY:no client cert received错误
# /etc/init.d/vsftpd restart #重启vsftpd服务
#注:修改配置文件的时候一定要注意,每行文字后面不要有空格,否则可能会导致启动失败,如下图:
报错:Job for vsftpd.service failed because the control process exited with error code. See "systemctl status vsftpd.service" and "journalctl -xe" for details.
第四步:登录测试
这时候我们只能用windows专门的ftp客户端来测试了.
只截图部分抓包信息:
经过测试,上传下载创建目录删除目录都是OK的,大家可自行测试,然后再用抓包工具监听的话,已经使用 TLS 加密了,数据也是加密的,再也不怕第三方窃听了。使用 TLS 认证方式,这是 Vsftpd 默认的安全认证方式。