如何借助vsftpd在Linux上构建安全的FTP服务

如何借助vsftpd在Linux上构建安全的FTP服务,第1张

FTP(文件传输协议)是互联网上广泛使用的服务之一,主要用于将文件从一个主机传输到另一个主机。FTP本身当初不是作为一种安全协议而设计的正因为如此,典型的FTP服务很容易遭受诸如中间人攻击和蛮力攻击之类的常见攻击。

许多具有安全功能的应用程序可用来构建安全的FTP服务。比如说,FTPS(安全Secure)使用SSL/TLS证书,对端到端数据进行加密。基于客户端的需求,FTPS可加以配置,以支持经过加密及/或未经过加密的连接。SFTP(SSH文件传输协议)是另一种为传输中数据确保安全的方法。SFTP是作为SSH的一种扩展技术而开发的,同样可以结合其他安全协议使用。

本教程将着重介绍借助SSL/TLS已被启用的vsftpd,构建和保护FTP服务。

先稍微介绍一下背景:典型的FTP服务器侦听TCP端口20以监视数据、侦听TCP端口以监视命令(又叫控制端口)。连接的建立和命令参数的交互都通过端口21来完成。FTP连接支持两种方法:主动模式和被动模式。在主动模式下的连接建立过程中,服务器建立一条从其端口20(数据)到客户机的连接。在被动模式下,服务器为每一个客户机会话专门指定了随机性数据端口,并将该端口通知客户机。随后,客户机建立一条通向服务器随机性端口的连接。

据RFC 1635显示,FTP支持通过特殊用户anonymous进行的公众访问,不需要任何密码,或者通过用户ftp、使用密码ftp来进行访问。除了这类公众用户外,vsftpd还支持本地Linux用户进行的登录。Linux用户可以通过使用FTP连接到服务器,并提供登录信息,访问其主目录,即/home/user。

把vsftpd安装到Linux上

如果想把vsftpd安装到Ubuntu、Debian或Linux Mint上,可以使用apt-get命令。系统一启动,vsftpd服务就会自动启动。

$ sudo apt-get install vsftpd

如果想把vsftpd安装到CentOS、Fedora或RHEL上,我们可以使用yum来轻松完成安装。服务启动后,还被添加到系统启动项。

# yum install vsftpd

# service vsftpd start

# chkconfig vsftpd on

使用vsftpd的一种最基本的FTP服务现已准备好使用。我们只要将浏览器指向URL ftp://[ServerName/IP],或者使用FileZilla等FTP客户软件、使用用户名anonymous,无需密码来连接,或使用用户名ftp、密码ftp来连接,就可以访问FTP服务。

vsftpd安装完毕后,系统用户ftp连同主目录/var/ftp已被添加到系统中。只要建立了匿名FTP连接,会话总是默认使用/var/ftp目录。所以,我们可以将该目录用作FTP公众用户的主目录。放在/var/ftp下面的任何文件/目录都可以通过ftp://[ServerName/IP]加以访问。

vsftpd配置文件的位置出现在下面两个地方:

•Ubuntu、Debian或Linux Mint:/etc/vsftpd.conf

•CentOS、Fedora或RHEL:/etc/vsftpd/vsftpd.conf

在本教程的其余部分,使用你Linux系统上的对应位置的vsftpd.conf文件。

调整FTP用户

如果想禁用公众访问,我们就要在vsftpd.conf中明确禁止用户anonymous。注释掉这一行不管用,因为vsftpd使用默认值运行。你还需要重启vsftpd。

anonymous_enable=NO

# service vsfptd restart

因而就要启用强制性验证只有现有的Linux用户才能够使用其登录信息来进行连接。

若想启用/禁用本地用户,我们可以修改vsftpd.conf文件。如果我们禁用本地用户,就得确保用户anonymous已被授予访问权限。

local_enable=YES/NO

# service vsfptd restart

如果想使用特定用户连接到系统,我们只要将URL改成ftp://username@[ServerName/IP]。相应用户的主目录可使用这种方法,通过FTP来加以访问。

将用户限制在各自的主目录

用户使用FTP访问远程服务器时,用户可以浏览整个系统,只要文件/目录是可读取的。根本不建议这么做,因为任何用户都能通过FTP会话,读取和下载/etc、/var、/usr 及其他位置下面的系统文件。

想限制本地用户在FTP会话期间只能访问各自的主目录,我们可以修改下面这个参数。

chroot_local_user=YES

# service vsftpd restart

现在,本地用户只能够访问其主目录了,无法访问系统中的其他任何文件或目录。

启用SSL/TLS加密

FTP原本是一种明文协议,这意味着谁都可以轻松窥视在客户机与远程FTP服务器之间所传输的文件。想对FTP通信内容进行加密,可以启用vsftpd中的SSL/TLS。

第一步是创建SSL/TLS证书和私钥,如下所示。它会将所创建的证书/私钥存放在目标.pem文件中。

在Debian/Ubuntu上:

$ sudo openssl req -x509 -days 365 -newkey rsa:2048 –node

s -keyout /etc/vsftpd.pem -out /etc/vsftpd.pem

在CentOS/Fedora/RHEL上:

$ sudo openssl req -x509 -days 365 -newkey rsa:2048 –node

s -keyout /etc/vsftpd/vsftpd.pem -out /etc/vsftpd/vsftpd.pem

然后,将下面这些参数添加到vsftpd.conf配置文件中。

# 启用TLS/SSL

ssl_enable=YES

# 强迫客户机在登录时使用TLS

allow_anon_ssl=NO

force_local_data_ssl=YES

force_local_logins_ssl=YES

ssl_tlsv1=YES

ssl_sslv2=NO

ssl_sslv3=NO

require_ssl_reuse=NO

ssl_ciphers=HIGH

# 指定SSL证书/私钥(Debian/Ubuntu)

# 如果是CentOS/Fedora/RHEL,将其换成/etc/vsftpd/vsftpd.pem

rsa_cert_file=/etc/vsftpd.pem

rsa_private_key_file=/etc/vsftpd.pem

# 为被动模式下的连接定义端口范围

pasv_max_port=65535

pasv_min_port=64000

最后重启vsftpd。

# service vsftpd restart

控制连接和带宽

vsftpd提供了几种方法来控制连接和用户带宽。我们将使用几种方法来调整我们的FTP服务器。

## 为每个匿名会话分配的带宽设置为大约30 KB/s ##

anon_max_rate=30000

## 每个本地用户被授予大约30 KB/s的带宽##

local_max_rate=30000

## 客户机会话闲置300秒后被终止##

idle_session_timeout=300

## 每个源IP地址的最大连接数量,这有助于防范拒绝服务(DoS)和分布式拒绝服务攻击(DDoS)#

max_per_ip=50

调整防火墙

最后,如果你在系统(比如CentOS)上运行iptables防火墙,就要确保调整防火墙规则,允许FTP流量通过。下面这些规则应当有助于你开始上手。

# iptables -I INPUT -p tcp --dport 20 -j ACCEPT

# iptables -I INPUT -p tcp --dport 21 -j ACCEPT

# iptables -I INPUT -p tcp --dport 64000:65535 -j ACCEPT

头两条规则允许流量通过FTP数据/控制端口。最后一条规则允许被动模式下的连接,其端口范围已经在vsftpd.conf中予以定义。

启用日志功能

万一你在本教程的FTP服务构建过程中遇到任何问题,可以启用日志功能,为此只需修改vsftpd.conf中的下面这个参数:

xferlog_enable=YES

xferlog_std_format=NO

xferlog_file=/var/log/vsftpd.log

log_ftp_protocol=YES

debug_ssl=YES

# service vsftpd restart

借助FileZilla连接到FTP服务器

现在有几款FTP客户软件支持SSL/TLS,尤其是FileZilla。想通过FileZilla连接到支持SSL/TLS的网站,就要为FTP主机使用下列设置。

你头一次连接到支持SSL/TLS的FTP服务器后,会看到该网站的证书。只管信任证书、登录上去。

为sftpd排查故障

1. 如果你在连接到FTP服务器的过程中遇到了下面这个错误,这可能是由于你的防火墙阻止FTP流量。为此,确保你在防火墙上打开了必要的FTP端口,如上所述。

ftp: connect: No route to host

2. 如果你连接到在CentOS/RHEL上运行的使用chroot改变根目录的FTP服务器时遇到了下面这个错误,禁用SELinux是一个办法。

500 OOPS: cannot change directory:/home/dev

Login failed.

虽然关闭SELinux是一个快速的解决办法,但在生产环境下这么做可能不安全。所以,改而打开SELinux中的下列布尔表达式可以解决这个问题。

$ sudo setsebool -P ftp_home_dir on

3. 如果你通过FileZilla访问支持SSL/TLS的FTP服务器时遇到了下列错误,就要确保在vsftpd.conf中添加“ssl_ciphers=HIGH”。FileZilla并不支持默认密码(DES-CBC3-SHA)。

Trace: GnuTLS alert 40: Handshake failed

Error: GnuTLS error -12: A TLS fatal alert has been received.

"SSL_accept failed: error:1408A0C1:SSL routines:SSL3_GET_CLIENT_HELLO:no shared cipher"

总而言之,使用vsftpd构建FTP服务器并非难事。针对用户anonymous的默认安装应该能够支持小型的常见FTP服务。Vsftpd还有许多可以调整的参数(详见http://linux.die.net/man/5/vsftpd.conf),让它显得用途广泛。

linux不需要安装vxftpd也可以使用ftp命令(FTP客户端)。

 在大多发行版都有打包,请到各大发行版的ftp列表中得到,或者在发行版的安装盘中也能得到。lftp是一个命令行式的ftp客户端。对中文支持较好。如果您在linux 的text模式下,要安装zhcon或者cce之类的。

安装:

1、RPM包管理的系统,请到

http://freshrpms.net

http//rpmfind.net 上查找lftp的最新包,可以用

#rpm -ivh name.rpm

#rpm -Uvh name.rpm 这是升级之用

2、源码包安装举例:lftp-3.2.0.tar.bz2

#tar zxvf lftp-3.2.0.tar.bz2

#cd lftp-3.2.0

#./configure

#make

#make install

3.调用方法:

lftp ftp://用户名:密码@地址

比如:

[beinan@S01~]$lftp ftp://beinan@192.168.1.2

口令:

lftp beinan@192.168.1.2:~>

lftp beinan@192.168.1.2:~>ls

-rw-r--r-- 1 1000 100 44387 May 18 10:04 xvmain.jpg

-rw-r--r-- 1 1000 100 202643 May 18 09:45 xxx.jpeg

-rw-r--r-- 1 1000 100 0 May 20 10:01 鲨鱼的故事.txt

二、使用方法:

0.简单的用法:lcd 切换本地目录,比如 lcd /opt

get 取回一个文件,put 向ftp服务器传文件;

1、获得帮助:

代码:

lftp beinan@192.168.1.2:~>help

!<shell-command>(commands)

alias [<name>[<value>]]anon

bookmark [SUBCMD]  cache [SUBCMD]

cat [-b] <files>cd <rdir>

chmod [OPTS] mode file...  close [-a]

[re]cls [opts] [path/][pattern] debug [<level>|off] [-o <file>]

du [options] <dirs>exit [<code>|bg]

get [OPTS] <rfile>[-o <lfile>] glob [OPTS] <cmd><args>

help [<cmd>]history -w file|-r file|-c|-l [cnt]

jobs [-v]  kill all|<job_no>

lcd <ldir> lftp [OPTS] <site>

ls [<args>] mget [OPTS] <files>

mirror [OPTS] [remote [local]] mkdir [-p] <dirs>

module name [args] more <files>

mput [OPTS] <files>mrm <files>

mv <file1><file2> [re]nlist [<args>]

open [OPTS] <site> pget [OPTS] <rfile>[-o <lfile>]

put [OPTS] <lfile>[-o <rfile>] pwd [-p]

queue [OPTS] [<cmd>]quote <cmd>

repeat [delay] [command]rm [-r] [-f] <files>

rmdir [-f] <dirs>  scache [<session_no>]

set [OPT] [<var>[<val>]]  site <site_cmd>

source <file>  user <user|URL>[<pass>]

version wait [<jobno>]

zcat <files>zmore <files>

如果针对lftp的每个命令的帮助,应该是:

lftp beinan@192.168.1.2:~>help 命令

比如

代码:

lftp beinan@192.168.1.2:~>help get

用法: get [OPTS] <rfile>[-o <lfile>]

Retrieve remote file <rfile>and store it to local file <lfile>.

-o <lfile>specifies local file name (default - basename of rfile)

-c continue, reget

-E delete remote files after successful transfer

-a use ascii mode (binary is the default)

-O <base>specifies base directory or URL where files should be placed

简介:gftp基于gtk的ftp客户端,大家用的也比较多吧,支持中文目录。如果您的gftp不能支持中文,请升级版本。

# Written in C and has a text interface and a GTK+ 1.2/2.x interface

# Supports the FTP, FTPS (control connection only), HTTP, HTTPS, SSH and FSP protocols

# FTP and HTTP proxy server support

# Supports FXP file transfers (transferring files between 2 remote servers via FTP)

# Supports UNIX, EPLF, Novell, MacOS, VMS, MVS and NT (DOS) style directory listings

# Bookmarks menu to allow you to quickly connect to remote sites

下载安装:

在各大发行版中,都有gftp的打包,可以用各发行版自带的工具来安装。我只说源码包安装:

源码包安装,通用于所有发行版,举例说明:gftp-2.0.18.tar.bz2

代码:

[root@S01ftp]#ls -lh

总用量 1.4M

-rw-r--r-- 1 root root 1.4M 2005-05-21 09:18 gftp-2.0.18.tar.bz2

[root@S01ftp]#tar jxvf gftp-2.0.18.tar.bz2

[root@S01gftp-2.0.18]#./configure

[root@S01gftp-2.0.18]#make

[root@S01gftp-2.0.18]#make install

注:因为gftp依赖gtk,如果不能make过去,您应该指定PKG_CONFIG_PATH

[root@S01gftp-2.0.18]# export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig

调用:

代码:

[root@S01gftp-2.0.18]#gftp


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7262387.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-03
下一篇 2023-04-03

发表评论

登录后才能评论

评论列表(0条)

保存