是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密码,结果没有找到,密码是加密传输的 |
|
laixi781211 回复于:2004-10-27 08:34:30
顶一下,不错。
johnzw 回复于:2004-10-27 16:36:48
楼主,你的配置文件里force_local_login_ssl=YES没有选上,那么你用commview抓一下包,看看密码是不是明文!!!!!!!!!!!!!!!!!!!!如果你把上面的选项开启,那么你还能登陆上去吗?
eagerlinuxer 回复于:2004-10-27 16:45:47
我看看,但man vsftpd.conf文档内只要ssl_enable = YES,那force_local_login_ssl=YES 应该是默认选项。
force_local_data_ssl
Only applies if ssl_enable is activated. If activated, all non-anonymous
logins are forced to use a secure SSL connection in order to send and
receive data on data connections.
Default: YES
force_local_logins_ssl
Only applies if ssl_enable is activated. If activated, all non-anonymous
logins are forced to use a secure SSL connection in order to send the pass-
word.
Default: YES
本地用户是可以登录的。这是肯定的。不过我还要抓一包看看。
eagerlinuxer 回复于:2004-10-27 19:40:45
用commview抓取的包

| | 用pass模式连vsftpd服务60000口的加密包,内容不可见 |
|

| | 在commview抓取的包中有AUTH_TLS字样 |
|
johnzw 回复于:2004-10-28 17:53:01
在楼主的帮助下,偶终于实现了vsftpd+ssl,在此表示感谢!!!
linkyfan 回复于:2004-10-29 19:32:50
但是在redhat as3中还不行。原因在于这个kerberos,redhat把kerberos的库文件和头文件不是放在标准的/usr/include和/usr/lib中的,而是放在/usr/kerberos/include和/usr/kerberos/lib中的。我的解决办法比较简单,直接拷贝头文件到/usr/include中,并把几个需要的库文件在/usr/lib中做好链接,再make就可以通过了.
Brain1127 回复于:2004-10-29 20:18:27
如果要实现vsftpd上SSL,没有Kerberos库应该是不行的吧。。
偶在自己的LFS上实验,一直没有成功的说。。
phpcool 回复于:2004-10-30 10:38:51
楼主有没有proftpd/pureftpd+SSL的FTP的?
lyking 回复于:2004-11-17 17:55:22
引用:原帖由 "linkyfan"]但是在redhat as3中还不行。原因在于这个kerberos,redhat把kerberos的库文件和头文件不是放在标准的/usr/include和/usr/lib中的,而是放在/usr/kerberos/include和/usr/kerberos/lib中的。我的解决办法比较简单,直.......... 发表:
一个更简单的方法是,直接修改Makefile文件,其中有一项CFLAGS,加上
-I/path/to/kerberos/include就ok了。我这样做还没出过错。
chenfm 回复于:2004-12-28 00:07:27
引用:原帖由 "lyking" 发表:
一个更简单的方法是,直接修改Makefile文件,其中有一项CFLAGS,加上
-I/path/to/kerberos/include就ok了。我这样做还没出过错。
我在Makelife文件中,沒有看到CFLAGS,
可否將您的設定post一下,我按照上面的方法一直出現錯誤。
我使用的是 RH Enterprise AS 3.0
謝謝。
seacaptain 回复于:2004-12-30 13:20:53
经过测试,你的安装方法在vsftpd-2.0.2的版本中略有不同。并且安装中遇到2个小问题,补充如下
在vsftpd-2.02.中默认就支持ssl,不需要修改builddefs.h文件
直接make;make install即完成安装
在AS3中安装遇到两个小问题
1、make的时候错误提示
/usr/include/openssl/kssl.h:72:18: krb5.h: 没有那个文件或目录
解决方法 find / -name krb5.h 找到该文件位置 然后修改Makefile文件如下
CFLAGS = -O2 -Wall -W -Wshadow -I/usr/kerberos/include/ -L/usr/kerberos/lib
2、启动vsftpd的时候总是提示
500 OOPS: SSL: cannot load RSA key
解决方法
1)在/usr/share/ssl/certs目录里 运行
openssl req -new -x509 -nodes -out vsftpd.pem -keyout vsftpd.pem
2)配置文件中注释掉rsa_cert_file
#rsa_cert_file=/usr/share/ssl/certs/vsftpd.pem
shy82228 回复于:2005-01-13 10:28:06
不错,看了很好,也有我出问题的地方的讨论。
iotigod 回复于:2005-01-26 11:47:01
要是原有证书怎么办呢?也要将证书从新命名为vsftpd.pem么?
我是在/etc/vsftpd.conf中添了rsa_cert_file=/usr/local/ssl/certs/server.key
为什么启动时报500 OOPS: SSL: cannot load RSA key呢?
我将server.key命名为vsftpd.pem怎么也还是报找不到呢?
我是freebsd5.3,apache+ssl的认证使用正常就是用的这个key。谢谢
hongfengyue 回复于:2005-01-27 15:41:27
谢谢,改天测试看看。
ingood 回复于:2005-02-02 15:15:35
我的系统redhat as3,按照搂住的方法作后,生成验证时出错,看来我实在太菜咯,依样画葫芦都不会,哈哈
openssl: error while loading shared libraries: libssl.so.0.9.7: cannot open shared object file: No such file or directory
[root@ftp root]#
[root@ftp root]# rpm -qa |grep ssl
openssl-devel-0.9.7a-33.12
mod_ssl-2.0.46-38.ent
docbook-style-dsssl-1.76-8
openssl096b-0.9.6b-16
openssl-0.9.7a-33.12
openssl-perl-0.9.7a-33.12
不晓得什么原因,望各位大虾帮忙。
jackieyuan 回复于:2005-06-07 12:54:03
引用:原帖由 "ingood"] root 发表: # rpm -qa |grep ssl
openssl-devel-0.9.7a-33.12
mod_ssl-2.0.46-38.ent
docbook-style-dsssl-1.76-8
openssl096b-0.9.6b-16
openssl-0.9.7a-33.12
openssl-perl-0.9.7a-33.12
不晓得什么原因,望各..........
Try
$ ldconfig -n /usr/local/ssl/lib
and add /usr/local/ssl/lib to /etc/ld.so.conf in order to save the path when the machine reboot.
Mc_Hill 回复于:2005-08-18 14:24:06
顶一下,睡会儿觉去,一会儿回来仔细看
frank533 回复于:2005-12-22 04:01:16
我的vsftpd是2.0.3的版本了,怎么没有ssl的选项?奇怪了
wolfg 回复于:2005-12-22 22:11:24
引用:原帖由 frank533 于 2005-12-22 04:01 发表
我的vsftpd是2.0.3的版本了,怎么没有ssl的选项?奇怪了
编译的时候打开ssl选项
goodcjh2005 回复于:2006-07-12 13:49:21
不错
小烤包 回复于:2008-05-16 12:33:42
[root@szyzh vsftpd-2.0.6]# make
gcc -c main.c -O2 -Wall -W -Wshadow -idirafter dummyinc
gcc -c utility.c -O2 -Wall -W -Wshadow -idirafter dummyinc
gcc -c prelogin.c -O2 -Wall -W -Wshadow -idirafter dummyinc
gcc -c ftpcmdio.c -O2 -Wall -W -Wshadow -idirafter dummyinc
gcc -c postlogin.c -O2 -Wall -W -Wshadow -idirafter dummyinc
gcc -c privsock.c -O2 -Wall -W -Wshadow -idirafter dummyinc
gcc -c tunables.c -O2 -Wall -W -Wshadow -idirafter dummyinc
gcc -c ftpdataio.c -O2 -Wall -W -Wshadow -idirafter dummyinc
gcc -c secbuf.c -O2 -Wall -W -Wshadow -idirafter dummyinc
gcc -c ls.c -O2 -Wall -W -Wshadow -idirafter dummyinc
gcc -c postprivparent.c -O2 -Wall -W -Wshadow -idirafter dummyinc
gcc -c logging.c -O2 -Wall -W -Wshadow -idirafter dummyinc
gcc -c str.c -O2 -Wall -W -Wshadow -idirafter dummyinc
gcc -c netstr.c -O2 -Wall -W -Wshadow -idirafter dummyinc
gcc -c sysstr.c -O2 -Wall -W -Wshadow -idirafter dummyinc
gcc -c strlist.c -O2 -Wall -W -Wshadow -idirafter dummyinc
gcc -c banner.c -O2 -Wall -W -Wshadow -idirafter dummyinc
gcc -c filestr.c -O2 -Wall -W -Wshadow -idirafter dummyinc
gcc -c parseconf.c -O2 -Wall -W -Wshadow -idirafter dummyinc
gcc -c secutil.c -O2 -Wall -W -Wshadow -idirafter dummyinc
gcc -c ascii.c -O2 -Wall -W -Wshadow -idirafter dummyinc
gcc -c oneprocess.c -O2 -Wall -W -Wshadow -idirafter dummyinc
gcc -c twoprocess.c -O2 -Wall -W -Wshadow -idirafter dummyinc
gcc -c privops.c -O2 -Wall -W -Wshadow -idirafter dummyinc
gcc -c standalone.c -O2 -Wall -W -Wshadow -idirafter dummyinc
gcc -c hash.c -O2 -Wall -W -Wshadow -idirafter dummyinc
gcc -c tcpwrap.c -O2 -Wall -W -Wshadow -idirafter dummyinc
gcc -c ipaddrparse.c -O2 -Wall -W -Wshadow -idirafter dummyinc
gcc -c access.c -O2 -Wall -W -Wshadow -idirafter dummyinc
gcc -c features.c -O2 -Wall -W -Wshadow -idirafter dummyinc
gcc -c readwrite.c -O2 -Wall -W -Wshadow -idirafter dummyinc
gcc -c opts.c -O2 -Wall -W -Wshadow -idirafter dummyinc
gcc -c ssl.c -O2 -Wall -W -Wshadow -idirafter dummyinc
gcc -c sysutil.c -O2 -Wall -W -Wshadow -idirafter dummyinc
gcc -c sysdeputil.c -O2 -Wall -W -Wshadow -idirafter dummyinc
gcc -o vsftpd main.o utility.o prelogin.o ftpcmdio.o postlogin.o privsock.o tunables.o ftpdataio.o secbuf.o ls.o postprivparent.o logging.o str.o netstr.o sysstr.o strlist.o banner.o filestr.o parseconf.o secutil.o ascii.o oneprocess.o twoprocess.o privops.o standalone.o hash.o tcpwrap.o ipaddrparse.o access.o features.o readwrite.o opts.o ssl.o sysutil.o sysdeputil.o -Wl,-s `./vsf_findlibs.sh`
ssl.o(.text+0x564): In function `ssl_cert_digest':
: undefined reference to `EVP_sha256'
ssl.o(.text+0x898): In function `setup_bio_callbacks':
: undefined reference to `BIO_set_callback'
ssl.o(.text+0x8ad): In function `setup_bio_callbacks':
: undefined reference to `BIO_set_callback'
collect2: ld returned 1 exit status
make: *** [vsftpd] 错误 1
[root@szyzh vsftpd-2.0.6]#
我的不知道为什么,总是make 的时候出错。我的是linux as4
一直找不到办法,我是新手,希望大家提点下,谢谢!
如果可以。加我的QQ:2487707 指导下,谢谢
phantast 回复于:2008-07-08 16:00:45
好像这样可以解决问题:
http://koreny.blog.163.com/blog/static/4501501320078581521898/
7717060 回复于:2008-07-10 08:38:03
文章不错谢谢共享
huai2019 回复于:2008-07-29 10:03:15
在你的ssl。c文件里面添加上下面两行应该就可以了
#define BIO_set_callback(b,cb) ((b)->callback=(cb))
#define BIO_get_callback(b) ((b)->callback)
|