vsftpd配置详解之实现加密数据传输:
FTP一个声名狼藉的问题是它以明文方式发送用户名和口令。任何人只要在网络中合适的位置进行抓包分析就可以看到用户名和口令;FTP发送的数据也是以明文方式传输,通过对ftp连接的监控和数据收集就可以重现ftp的数据传输。很多用户为了方便把相同的用户名和口令用在不同的应用中,如果黑客收集到 FTP口令,他们也可能就得到了你在线帐号或者其他一些机密数据的口令。
下面我们使用linux自带的抓包工具tcpdump抓包分析,来截取ftp登录用户口令:
# tcpdump -i eth0 -A
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
17:44:35.520880 IP 192.168.0.101.vytalvaultpipe > 192.168.0.105.ftp: S 3417937804:3417937804(0) win 65535
E..0..@........e...i ...........p...............
17:44:45.681026 IP 192.168.0.105.ftp > 192.168.0.101.vytalvaultpipe: S 2518028758:2518028758(0) ack 3417937805 win 5840
E..0..@[email].@......i...e[/email].. .........p...............
17:44:35.520954 IP 192.168.0.101.vytalvaultpipe > 192.168.0.105.ftp: . ack 1 win 65535
E..([email]..@........e...i[/email] ...........P....x........
建立TCP连接的三次握手,接下来登录之前信息,省约……
17:44:36.513224 IP 192.168.0.101.vytalvaultpipe > 192.168.0.105.ftp: P 32:44(12) ack 97 win 513
E..4..@........e...i ...........P...v...USER test1
用户名:test1
17:44:39.942107 IP 192.168.0.105.ftp > 192.168.0.101.vytalvaultpipe: . ack 13 win 5840
E..(.|@[email].@..5...i...e[/email].. .........P.......
17:44:39.942277 IP 192.168.0.105.ftp > 192.168.0.101.vytalvaultpipe: P 21:55(34) ack 13 win 5840
E..J.}@[email].@......i...e[/email].. .........P....[..331 Please specify the password.
17:44:40.094629 IP 192.168.0.101.vytalvaultpipe > 192.168.0.105.ftp: . ack 55 win 65481
P....l.........e...i ..........
17:44:40.525157 IP 192.168.0.105.32832 > 192.168.0.1.domain: 31226 PTR? 105.0.168.192.in-addr.arpa. (44)
E..H..@.@..;[email]...i.....@.5.4..y............105.0.168.192.in-addr.arpa[/email].....
17:44:41.714630 IP 192.168.0.101.vytalvaultpipe > 192.168.0.105.ftp: P 13:23(10) ack 55 win 65481
P.......PASS abc...i ..........
密码:abc
17:44:41.742271 IP 192.168.0.105.ftp > 192.168.0.101.vytalvaultpipe: P 55:78(23) ack 23 win 5840
....P....P..230 Login successful.
登录成功!
怎么样!弄到密码很简单吧!服务器配置的再优秀,数据是明文传输的,所以还是会让别有用心之人有机可乘。
SSL(Secure Socket Layer)工作于传输层和应用程序之间。作为一个中间层,应用程序只要采用SSL提供的一套SSL套接字API来替换标准的Socket套接字,就可以把程序转换为SSL化的安全网络程序,在传输过程中将由SSL协议实现数据机密性和完整性的保证。SSL取得大规模成功后,IETF将SSL作了标准化,并将其称为TLS(Transport Layer Security)。Ftp结合SSL,将实现传输数据的加密,保证数据不被别人窃取。
要让vsftpd支持SSL,必须在安装之前修改头文件builddefs.h,将#undef VSF_BUILD_SSL行改为#define VSF_BUILD_SSL,在安装小节已经讲过。这里我们用OpenSSL结合vsftpd来实现数据加密传输。首先查看自己的系统有没有安装 OpenSSL,如果没有安装,到官网下载安装,安装过程很简单,就不贴出来了。
下面我们为 vsftpd 生成证书:
# cd /etc/vsftpd/
# openssl req -new -x509 -nodes -out vsftpd.pem -keyout vsftpd.pem
Generating a 1024 bit RSA private key
.........................
.............
writing new private key to 'vsftpd.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:cn
State or Province Name (full name) [Berkshire]:ShiChuan
Locality Name (eg, city) [Newbury]:ChenDu
Organization Name (eg, company) [My Company Ltd]:linuxer
Organizational Unit Name (eg, section) []:linuxer
Common Name (eg, your name or your server's hostname) []:
www.linuxer.cn
Email Address []:icecard@hotmail.com
填写这些信息后,就产生了/etc/vsftpd/vsftpd.pem证书文件,接下来我们在配置文件中加入下面两行:
- ssl_enable=yes
- rsa_cert_file=/etc/vsftpd/vsftpd.pem
#p#
现在我们登录服务器测试:
- # ftp 127.0.0.1
- Connected to 127.0.0.1.
- 220 (vsFTPd 2.0.5)
- 504 Unknown AUTH type.
- 504 Unknown AUTH type.
- KERBEROS_V4 rejected as an authentication type
- Name (127.0.0.1:root): test1
- 530 Non-anonymous sessions must use encryption.
- Login failed.
已经不能登录了,可能是这个ftp客户端不支持ssl的原因吧!在windows下支持ssl的ftp客户端很多(IE是不支持的),比如 FlashFXP,使用比较简单,相信大家都会使用。我们这里介绍Linux下使用lftp来登录服务器。很多Linux发行版中都已经包含了lftp软件包,如果你的Linux中没有lftp,到官网下载原码包来安装。
# lftp 127.0.0.1
lftp 127.0.0.1:~> user test1
口令:
lftp
test1@127.0.0.1
:~> ls
-rw-r--r-- 1 0 0 5 May 17 21:35 virftp.file
drwxrwxrwx 2 500 500 4096 May 17 21:47 woo
同时我们打开tcpdump抓包测试:
- # tcpdump -i lo -A
- tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
- listening on lo, link-type EN10MB (Ethernet), capture size 96 bytes
省约部分信息……
23:32:15.237079 IP localhost.localdomain.ftp > localhost.localdomain.46605: P 36:47(11) ack 7 win 512
..yI...U.....3.........
..M7..M5 AUTH SSL
启用了SSL
23:32:15.272496 IP localhost.localdomain.46605 > localhost.localdomain.ftp: . ack 47 win 513
.....U..yT....9......
..M@..M6
23:32:15.272570 IP localhost.localdomain.ftp > localhost.localdomain.46605: P 47:137(90) ack 7 win 512
..yT...U...............
..M@..M@ AUTH TLS
EPRT
EPSV
MDTM
23:32:15.272605 IP localhost.localdomain.46605 > localhost.localdomain.ftp: . ack 137 win 513
.....U..y.....9i.....
..M@..M@
23:32:15.273156 IP localhost.localdomain.46605 > localhost.localdomain.ftp: P 7:17(10) ack 137 win 513
.....U..y......2.....
..M@..M@AUTH TLS
使用 TLS 认证方式,这是 Vsftpd 默认的安全认证方式。
我们看到使用tcpdump抓到的包已经使用 TLS 加密了,数据也是加密的,再也不怕第三方窃听了。
上面的例子只使用了两条配置语句,vsftp还提供了下面的语句来设置ssl:
- ssl_enable=yes/no //是否启用 SSL,默认为no
- allow_anon_ssl=yes/no //是否允许匿名用户使用SSL,默认为no
- rsa_cert_file=/path/to/file //rsa证书的位置
- dsa_cert_file=/path/to/file //dsa证书的位置
- force_local_logins_ssl=yes/no //非匿名用户登陆时是否加密,默认为yes
- force_local_data_ssl=yes/no //非匿名用户传输数据时是否加密,默认为yes
- force_anon_logins_ssl=yes/no //匿名用户登录时是否加密,默认为no
- force_anon_data_ssl=yes/no //匿名用户数据传输时是否加密,默认为no
- ssl_sslv2=yes/no //是否激活sslv2加密,默认no
- ssl_sslv3=yes/no //是否激活sslv3加密,默认no
- ssl_tlsv1=yes/no //是否激活tls v1加密,默认yes
- ssl_ciphers=加密方法 //默认是DES-CBC3-SHA
总结:FTP展望
FTP是在70年代设计出来的,当时的互联网是一个封闭的网络,与现代网络环境还是有很大的差异,现代网络中不管你使用Port模式还是Passive模式,都可能产生问题。很多人对FTP协议安全性进行不懈的努力,使用SSL/TLS进行ftp传输过程的验证和加密,基本解决明文传数据的问题。但还是存在不少缺陷,于是出现了一些FTP替代应用,如SCP、SFTP;如果你使用ftp更新你的网页,还可以考虑WebDAV。
在FTP服务器软件中,vsftpd可以说是最安全的ftp软件,短小精悍,且高性能,是ftp服务器软件中的佼佼者。经过上面的学习,对于搭建安全高效的FTP服务器,再也不会困惑了。
【编辑推荐】