您的位置:首页 > 运维架构 > Linux

Linux 搭建支持SSL加密传输的ftp服务器

2017-04-20 16:31 330 查看
一、前言

 

Vsftp(Very Secure FTP)是一种在Unix/Linux中非常安全且快速稳定的FTP服务器。

Vsftpd的实现有三种方式:

1、匿名用户形式:在默认安装的情况下,系统只提供匿名用户访问

2、本地用户形式:以/etc/passwd中的用户名为认证方式

3、虚拟用户形式:支持将用户名和口令保存在数据库文件或数据库服务器中。相对于FTP的本地用户形式来说,虚拟用户只是FTP服务器的专有用户,虚拟用户只能访问FTP服务器所提供的资源,这大大增强系统本身的安全性。相对于匿名用户而言,虚拟用户需要用户名和密码才能获取FTP服务器中的文件,增加了对用户和下载的可管理性。对于需要提供下载服务,但又不希望所有人都可以匿名下载;既需要对下载用户进行管理,又考虑到主机安全和管理方便的FTP站点来说,虚拟用户是一种极好的解决方案。

 

二、工作原理

 

工作原理:ftp协议工作是,需要使用两个网络连接进行通信,一个叫控制连接(21),一个叫数据连接(20)。

控制连接:客户端和服务器端进行口沟通的链接,客户端通过该连接向服务器端发送指令的。服务器默认通过21端口等待客户端的指令请求。

数据连接:进行文件传输或者显示文件列表的链接,通信的端口是由控制连接决定的。

FTP协议中,控制连接均有客户端发起,而数据连接有两种工作方式:PORT方式和PASV方式

PORT模式(主动方式)

FTP 客户端首先和FTP Server的TCP 21端口建立连接,通过这个通道发送命令,客户端需要接收数据的时候在这个通道上发送PORT命令。 PORT命令包含了客户端用什么端口(一个大于1024的端口)接收数据。在传送数据的时候,服务器端通过自己的TCP 20端口发送数据。 FTP server必须和客户端建立一个新的连接用来传送数据。

PASV模式(被动方式)

在建立控制通道的时候和PORT模式类似,当客户端通过这个通道发送PASV 命令的时候,FTP server打开一个位于1024和5000之间的随机端口并且通知客户端在这个端口上传送数据的请求,然后FTP server 将通过这个端口进行数据的传送,这个时候FTP server不再需要建立一个新的和客户端之间的连接传送数据。

如果从C/S模型这个角度来说,PORT对于服务器来说是OUTBOUND,而PASV模式对于服务器是INBOUND,这一点请特别注意,尤其是在使用防火墙的企业里,这一点非常关键,如果设置错了,那么客户将无法连接。

 

三、常见FTP命令及其功能

 
FTP命令
功能
FTP命令
功能
ls
显示服务器上的目录
ls [remote-dir][local-file]
显示远程目录remote-dir,并存入本地文件local-file
get remote-file [local-file]
从服务器下载指定文件到客户端
mget remote-files
下载多个远程文件(mget命令允许用通配符下载多个文件)
put local-file [remote-file]
从客户端上传指定文件到服务器
mput local-file
将多个文件上传至远程主机(mput命令允许用通配符上传多个文件)
open
连接FTP服务器
mdelete [remote-file]
删除远程主机文件
close
中断与远程服务器的ftp会话(与open对应)
mkdir dir-name
在远程主机中创建目录
open host[port]
建立指定的ftp服务器连接,可指定连接端口
newer file-name
如果远程主机中file-name的修改时间比本地硬盘同名文件的时间更近,则重传该文件
cd directory
改变服务器的工作目录
rename [from][to]
更改远程主机的文件名
lcd directory
在客户端上(本地)改变工作目录
pwd
显示远程主机的当前工作目录
bye
退出FTP命令状态
quit
同bye,退出ftp会话
ascii
设置文件传输方式为ASCII模式
reget remote-file [local-file]
类似于get,但若local-file存在,则从上次传输中断处续传
binary
设置文件传输方式为二进制模式
rhelp [cmd-name]
请求获得远程主机的帮助
![cmd [args]]
在本地主机中交互shell后退回到ftp环境,如:!ls *.zip
rstatus [file-name]
若未指定文件名,则显示远程主机的状态,否则显示文件状态
accout [password]
提供登录远程系统成功后访问系统资源所需的密码
hash
每传输1024字节,显示一个hash符号(#)
append local-file [remote-file]
将本地文件追加到远程系统主机,若未指定远程系统文件名,则使用本地文件名
restart marker
从指定的标志marker处,重新开始get或put,如restart 130
bye
退出ftp会话过程
rmdir dir-name
删除远程主机目录
case
在使用mget命令时,将远程主机文件名中的大写转为小写字母
size file-name
显示远程主机文件大小,如:

size idle 7200
cd remote-dir
进入远程主机目录
status
显示当前ftp状态
cdup
进入远程主机目录的父目录
system
显示远程主机的操作系统
delete remote-file
删除远程主机文件
user user-name [password][account]
向远程主机表明自己的身份,需要密码时,必须输入密码,如:user anonymous my@email
dir [remote-dir][local-file]
显示远程主机目录,并将结果存入本地文件
help [cmd]
显示ftp内部命令cmd的帮助信息,如help get
FTP数字代码的意义

110 重新启动标记应答。

120 服务在多久时间内ready。

125 数据链路端口开启,准备传送。

150 文件状态正常,开启数据连接端口。

200 命令执行成功。

202 命令执行失败。

211 系统状态或是系统求助响应。

212 目录的状态。

213 文件的状态。

214 求助的讯息。

215 名称系统类型。

220 新的联机服务ready。

221 服务的控制连接端口关闭,可以注销。

225 数据连结开启,但无传输动作。

226 关闭数据连接端口,请求的文件操作成功。

227 进入passive mode。

230 使用者登入。

250 请求的文件操作完成。

257 显示目前的路径名称。

331 用户名称正确,需要密码。

332 登入时需要账号信息。

350 请求的操作需要进一部的命令。

421 无法提供服务,关闭控制连结。

425 无法开启数据链路。

426 关闭联机,终止传输。

450 请求的操作未执行。

451 命令终止:有本地的错误。

452 未执行命令:磁盘空间不足。

500 格式错误,无法识别命令。

501 参数语法错误。

502 命令执行失败。

503 命令顺序错误。

504 命令所接的参数不正确。

530 未登入。

532 储存文件需要账户登入。

550 未执行请求的操作。

551 请求的命令终止,类型未知。

552 请求的文件终止,储存位溢出。 

553 未执行请求的的命令,名称不正确。

 

四、安装和配置vsftp服务器

 

 adduser -d /home/vsftphome/docutone -g ftp -s /sbin/nologin ftpdocutone

[root@localhost ~]# mkdir /mnt/cdrom

[root@localhost ~]# mount /dev/cdrom /mnt/cdrom

[root@localhost ~]# cd /mnt/cdrom/Server/

[root@localhost Server]# rpm -ivh vsftpd-2.0.5-16.el5.i386.rpm

 

[root@localhost Server]# rpm -ql vsftpd |less ##查看形成的文件

[root@localhost Server]# man 5 vsftpd.conf ##查看配置文件的参数信息

 

[root@localhost Server]# vim /etc/vsftpd/vsftpd.conf ##编辑配置文件

 

12 anonymous_enable=YES ##支持匿名帐号

15 local_enable=YES ##支持本地帐号

18 write_enable=YES ##允许使用任何可以修改文件系统的FTP的指令

22 local_umask=022 ##屏蔽权限即本地用户上传的文件权限

27 #anon_upload_enable=YES允许匿名用户上传文件

31 #anon_mkdir_write_enable=YES允许匿名用户创建新目录

35 dirmessage_enable=YES ##允许为目录配置显示信息,显示每个目录下面的message_file文件的内容

39 xferlog_enable=YES ##开启日记功能

42 connect_from_port_20=YES ##使用标准的20端口来连接ftp

47 #chown_uploads=YES所有匿名上传的文件的所属用户将会被更改成chown_username

48 #chown_username=whoever匿名上传文件所属用户名

52 #xferlog_file=/var/log/xferlog日志文件位置

56 xferlog_std_format=YES ##使用标准的日志格式

59 #idle_session_timeout=600空闲连接超时

62 #data_connection_timeout=120数据传输超时

66 #nopriv_user=ftpsecure当服务器运行于最底层时使用的用户名

71 #async_abor_enable=YES允许使用\"async ABOR\"命令,一般不用,容易出问题

81 #ascii_upload_enable=YES管控是否可用ASCII 模式上传。默认值为NO

82 #ascii_download_enable=YES管控是否可用ASCII 模式下载。默认值为NO

85 #ftpd_banner=Welcome to blah FTP service ## login时显示欢迎信息.如果设置了banner_file则此设置无效

89 #deny_email_enable=YES如果匿名用户需要密码,那么使用banned_email_file里面的电子邮件地址的用户不能登录

90 # (default follows)

91 #banned_email_file=/etc/vsftpd/banned_emails禁止使用匿名用户登陆时作为密码的电子邮件地址

96 #chroot_list_enable=YES如果启动这项功能,则所有列在chroot_list_file中的使用者不能更改根目录

97 # (default follows)

98 #chroot_list_file=/etc/vsftpd/chroot_list定义不能更改用户主目录的文件

104 #ls_recurse_enable=YES 是否能使用ls -R命令以防止浪费大量的服务器资源

109 listen=YES ##绑定到listen_port指定的端口,既然都绑定了也就是每时都开着的,就是standalone模式(独立的sftpd服务器)

116 pam_service_name=vsftpd ##定义PAM 所使用的名称,预设为vsftpd

117 userlist_enable=YES ##若启用此选项,userlist_deny选项才被启动

118 tcp_wrappers=YES ##开启tcp_wrappers支持

 

五、案例-------实现支持SSL加密传输的ftp服务器

 

1.在没有实现ssl加密之前,先安装一个抓包软件

[root@localhost ~]# yum install wireshark –y

Running Transaction

 Installing     : libsmi                                           1/2

 Installing     : wireshark                                        2/2

Installed:

 wireshark.i386 0:1.0.8-1.el5_3.1                                     

Dependency Installed:

 libsmi.i386 0:0.4.5-2.el5                                            

Complete!

[root@localhost ~]# tshark -ni eth0 -R "tcp.dstport eq 21"  

Running as user "root" and group "root". This could be dangerous.

Capturing on eth0

##登录ftp,在21端口上进行抓包

如下图:





2.配置颁发证书的根机构

[root@mail ~]# cd /etc/pki/

[root@mail pki]# vim tls/openssl.cnf

45 dir             = /etc/pki/CA ##证书路径

88 countryName             = optional

89 stateOrProvinceName     = optional

90 organizationName        = optional ##optional表示这些项可选择

136 countryName_default          = CN ##修改一下证书机构的默认值,可以不修改

141 stateOrProvinceName_default  = BeiJing

144 localityName_default         = BeiJing

:88,90 s/match/optional (vim编辑可以选用命令)

产生证书

[root@mail pki]# cd CA

[root@mail CA]# mkdir crl certs newcerts

[root@mail CA]# touch index.txt serial

##新建相应的文件和目录

[root@mail CA]# echo "01">serial

##证书的序列号从1开始

[root@mail CA]# openssl genrsa 1024 >private/cakey.pem

##产生私钥

Generating RSA private key, 1024 bit long modulus

[root@mail CA]# chmod 600 private/*  

##更改权限

[root@mail CA]# openssl req -new -key private/cakey.pem -x509 -out cacert.pem -days 3650  

##产生证书

 

3.为ftp申请证书

[root@localhost ~]# mkdir /etc/vsftpd/certs

##创建存放私有钥匙,证书等信息的目录

[root@localhost ~]# cd /etc/vsftpd/certs/

产生钥匙

[root@localhost certs]# openssl genrsa 1024 >vsftpd.key

Generating RSA private key, 1024 bit long modulus

.......++++++

..........................++++++

e is 65537 (0x10001)

向根机构请求证书

[root@localhost certs]# openssl req -new -key vsftpd.key -out vsftpd.csr

Country Name (2 letter code) [CN]:

State or Province Name (full name) [BeiJing]:

Locality Name (eg, city) [BeiJing]:

Organization Name (eg, company) [My Company Ltd]:lee

Organizational Unit Name (eg, section) []:tec

Common Name (eg, your name or your server's hostname) []:ftp.abc.com

Email Address []:

 

Please enter the following 'extra' attributes

to be sent with your certificate request

A challenge password []:

An optional company name []:

申请证书

[root@localhost certs]# openssl ca -in vsftpd.csr -out vsftpd.cert

更改存放证书私钥的目录权限

[root@localhost certs]# chmod 600 *

 

修改配置文件

[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf

在这如果不知道怎么写的话,可以man一下,查看一下帮助

[root@localhost ~]# man 5 vsftpd.conf

添加的内容如下

120 rsa_cert_file=/etc/vsftpd/certs/vsftpd.cert

121 rsa_private_key_file=/etc/vsftpd/certs/vsftpd.key

##指定证书和钥匙的目录

122 ssl_tlsv1=YES

123 ssl_sslv3=YES

124 ssl_sslv2=YES

125 ssl_enable=YES

##启动ssl,并支持ssl的版本

126 force_local_logins_ssl=YES

127 force_local_data_ssl=YES

重启服务

[root@localhost ~]# service vsftpd restart

 

 

 

六、测试

 

在客户机上安装一个ftp客户端FlashFXP

安装之后,新建一个站点,如图:





 

用之后,连接





接受

现在可以看一下抓包工具所抓取的信息

[root@localhost ~]# tshark -ni eth0 -R "tcp.dstport eq 21"

Running as user "root" and group "root". This could be dangerous.

Capturing on eth0





 已看不到帐号和密码信息
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: