用vsftpd+ssl+rsync+ssh实现一个安全的上传分发型的FTP

红薯 发布于 2009/05/06 11:02
阅读 1K+
收藏 0

是ftp的东西还是得放ftp版里,放linux版里没人看,呵呵。

用ftp上传文件,一直被认为是一种不安全的做法。因为ftp的密码及内容都是明文传输的。现在则不同了,新出的vsftpd-2.0.1 released 已经支持SSL,你可以用openssl加密你的vsftp登录及传输过程。这样我们就可以用vsftpd + SSL实现一个安全的上传型分发用的FTP了。与sftp相比,它至少可以让这些上传用户看不到你整个文件系统。(当然,sftp加工一下,也是可以做到的)
    下面是我的实践过程:
系统平台:RH7.3 (虽然老了点,但还是挻稳定的。)

1、升级openssl库
引用:
ssl_enable 
If enabled, and vsftpd was compiled against OpenSSL, vsftpd will support secure connections via SSL. This applies to the control connection (including login) and also data connections. You'll need a client with SSL support too. NOTE!! Beware enabling this option. Only enable it if you need it. vsftpd can make no guarantees about the security of the OpenSSL libraries. By enabling this option, you are declaring that you trust the security of your installed OpenSSL library



这是vsftpd.conf中的一段原话,其中NOTE!!后的一段话建义你升级到最新的openssl库。所以升级openssl库还是很有必要的,如果你想把vsftpd+ssl服务器放在公网上的话。
下面是我的升级过程:
   1)卸载掉老的opensll库
引用:
rpm  –e –-nodeps openssl



2)下载、解压、编译、安装最新的openssl
到  http://www.openssl.org/source/ 下载最新的openssl(我昨天下还是openssl-0.9.7d.tar.gz  今天已经是openssl-0.9.7e.tar.gz了,升得好快 :)
引用:
     tar  -zxvf openssl-0.9.7d.tar.gz
     cd openssl-0.9.7d
     ./config --prefix=/usr/local --openssldir=/usr/local/openssl shared
     make 
     make test
     make install
 


  4)生成vsftpd用的证书
引用:
     cd /usr/share/ssl/certs/
     openssl req -new -x509 -nodes -out vsftpd.pem -keyout vsftpd.pem


   3)编译安装新的vsftpd,使他使用最新的openssll库 (这个在下面介绍,不过得先做这步)
引用:
   4)rpm -ivh openssl-0.9.6b-18.i686.rpm  


再把老的openssl库给安装上,不然你会发现连sshd也启不来。这样vsfptd用新的openssl库,sshd等的软件就用老的openssl库,互不干扰。我不知是不是兼容性的问题。但我试了n多次,就是不能使用新的openssl库,除非你把所有的依赖openssl的库的软件重新用最新的源码再编一下。那太多了 :( 
2、安装支持opensll的vsftpd-2.0.1
1)到http://vsftpd.beasts.org/ 下载最新的原码包
2)安装支持openssl的vsftpd
引用:
  tar –zxvf  vsftpd-2.0.1.tar.gz
  cd vsftpd-2.0.1
  vi builddefs.h
  把 #undef VSF_BUILD_SSL改成 #define VSF_BUILD_SSL (#号要保留)。
  这样编译出来的vsftpd就支持openssl了。
  make
   make install
   cp RedHat/vsftpd.pam /etc/pam.d/ftp  (以使本地用户可以通过vsftpd的PAM认证功能来登录vsftpd)


3) 编辑/etc/vsftpd.conf文件:
引用:
listen=YES
# Access rights
anonymous_enable=NO
local_enable=YES
write_enable=YES
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO

# Security
port_enable=NO
anon_world_readable_only=YES
connect_from_port_20=YES
hide_ids=YES
hide_file={.ssh,.kde,.bash*,.vi*,.gt*,.em*}
pasv_min_port=60000
pasv_max_port=60000
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list
local_umask=0000
file_open_mode=0260
chmod_enable=NO
ssl_enable=YES
allow_anon_ssl=NO
rsa_cert_file= /usr/share/ssl/certs/vsftpd.pem

# Features
xferlog_enable=YES
xferlog_std_format=YES
xferlog_file=/home/log/vsftpd.log
#vsftpd_log_file=/home/log/vsftpd.log
ls_recurse_enable=NO
ascii_download_enable=NO
async_abor_enable=YES

# Performance
#one_process_model=YES
idle_session_timeout=120
data_connection_timeout=300
accept_timeout=60
connect_timeout=60
#anon_max_rate=30000
max_clients=3
#max_per_ip=2


这是我的vsftpd.conf文件,是只可本地用户用ssl上传(注意把可以上传的本地用户加到/etc/vsftpd.chroot_list文件中,这样这些用户登上来都是chroot的。),而且是只能用PASS模式。相关的俱体配置可以参考官方的 http://vsftpd.beasts.org/vsftpd_conf.html  。 E文不好的朋友,可以看一下CU上的http://chinaunix.net/jh/4/16163.html 这篇文章,也不错 。
下面是相关一些ssl选项的解释:
ssl_enable   是否启用vsftpd的ssl支持
allow_anon_ssl  是否让匿名用户使用ssl
rsa_cert_file= /usr/share/ssl/certs/vsftpd.pem  vsftpd用的rsa证书的位置
force_local_data_ssl  是否强制使用openssl加密数据
force_local_logins_ssl  是否强制使用openssl登录
ssl_sslv2  是否允许客户端用SSL v2 protocol 连接 (vsftpd 不建议)
ssl_sslv3  是否允许客户端用SSL v3protocol 连接  (vsftpd 不建议)
ssl_tlsv1  是否允许客户端用TLS v1 connections 连接 (首选)
ssl_ciphers  用哪种加密方法加密SSL连接 默认是DES-CBC3-SHA

4)启动vsftpd 
Vsftpd &
用cutfpt、flashfxp等支持ssl的ftp客户端软件连一下,选TLS v1连接方式,一切OK。


3、OK,一个支持SSL的vsftp服务器就这样搞定了。如果你要把上传的内容分发到其它下载ftp服务器上,可以用rsync +ssh 来实现,前题是各服务器上都安装了ssh和rsync。下面是用rsync+ssh来同步上传内容的方法:
1)做ssh的rsa无密码认证
在主ftp服务器上以aaa用户用ssh-keygen –t rsa命令生成rsa钥对(不加密码),把id_rsa.pub 文件考到其它的ftp服务器的/home/aaa/.ssh/authorized_keys,这样就可以实现不用密码的ssh-rsa认证登录,以便把rsync 加在主ftp的crontab中,让它定时自动调用ssh同步vsftp的内容。
2)用ssh+rsync实现各vsftp内容之间的定时自动同步
   在主ftp的aaa目录下写一个rsync.sh脚本:
引用:
#!/bin/bash
#a ftp rsync script
rsync  -vrgp --size-only --delete --timeout=30 --bwlimit=1500 -e ssh /home/aaa/ftp aaa@xxx.xxx.xxx.xxx:/home/aaa/ || perl mail.pl aaa


其中:
-v 参数为显示较多的同步信息
-r 参数为同步子目录下的文件(递归)
-gp 考贝时保护文件的组及权限属性
--size-only  指只考贝那些同名文件中大小不一样的文件(默认为大小及文件生成时间),也就是同名的大小一样的文件和目录就不考贝了。这对减少不必要考贝很有用。
--delete 在同步时删除主ftp上没有的但在从ftp上却有的文件或目录(这对删除一些没用的文件十分有用,只要删掉主ftp上的内容,同步一下,从ftp上的内容也会被删除掉。
--timeout=30 在30秒内如果建立不起连接就停止。
--bwlimit=1500  指最大同步带宽为1500KB(byte),这样可以不停主ftp,少影响主ftp用户的下载。
-e ssh 指用ssh 进得加密同步。
最后调用一个mail.pl脚本,在同步不成功时向srvadmin发邮件。

   把它加到aaa的crontab 中:
1 3 * * * /bin/bash /home/aaa/rsync.sh

每天晚上3点进行一次同步。

5、最后一个就是我还没有能在vsftpd 上实现的,就是在上传用户较多的情况下,怎样实现对这些用户的建立、控制、管理、权限设制等。不知高手们有何经验,是否可以共享一下:)




flashfxp客户使用TLSv1加密连接vsftpd时询问是否接受证书





在我用commview抓取的ftp连接包中查找我输入的ftp密码,结果没有找到,密码是加密传输的




加载中
返回顶部
顶部