柴少鹏的官方网站 技术在分享中进步,水平在学习中升华

Centos6.4 vsftpd服务器搭建(二)

承接上文,http://www.51niux.com/?id=70,上文讲了vsftp的一些介绍和匿名和系统用户,两种登录方式,写得略微简陋,下面这里将是我很重要虚拟用户以及不同的实现形式,也是我们工作中经常使用的一种方式。

一、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就没有写权限了。

anon_upload_enable=NO   #关闭匿名用户上传

anon_mkdir_write_enable=NO #关闭匿名用户创建目录,不过这里设置不设置都没什么关系,就算是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.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以下吧。

blob.png

我靠,如果我们要是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.

图片.png

第四步:登录测试

这时候我们只能用windows专门的ftp客户端来测试了.

blob.png

只截图部分抓包信息:


blob.png


blob.png

经过测试,上传下载创建目录删除目录都是OK的,大家可自行测试,然后再用抓包工具监听的话,已经使用 TLS 加密了,数据也是加密的,再也不怕第三方窃听了。使用 TLS 认证方式,这是 Vsftpd 默认的安全认证方式。

作者:忙碌的柴少 分类:网络文件共享 浏览:1978 评论:0
留言列表
发表评论
来宾的头像