VSFTP基线安全

时间:2023-03-08 17:40:36

在企业级的应用中,越来越多的企业应用开源的vsftpd软件来搭建自己的文件共享服务,优点是速度快且节省开支。然而,企业用户行为难以预料,配置稍有不当则会使该服务成为一个安全风险点,导致带宽恶意占用、用户FTP服务密码泄露等。本文将以实例为大家介绍vsftpd的安全设置方法。

  1、vsftpd简介

  vsftpd是一个基于GPL发布的类UNIX类操作系统上运行的服务器的名字(表明它也是一种守护进程),可以运行在诸如Linux、BSD、Solaris、HP-UX及Irix上,是当前很多Linux发行套件的最新版本提供的默认FTP服务器。该服务器支持很多其他传统的FTP服务器不支持的功能,主要有如下几个显著特点:1)非常高的安全性;2)带宽限制功能;3)良好的扩展性;4)支持创建虚拟用户;5)支持IPv6;6)支持虚拟IP;7)高速、稳定。总体来说,vsftpd是Linux系统中继Wu-ftpd之后又一款优秀的、使用普遍的FTP服务器,

  2、vsftpd快速安装

  目前在主流的Linux发行版本中,如Red Hat Enterprise Linux(RHEL)、Fedora或CentOS系统上,安装vsftp很简单,这里使用CentOS作为演示来介绍。

  首先,需要登录开源分站点将vsftp的安装包下载回来(RHEL版本的操作与其相同),如下命令所示:

  #wget  htt://ftp.cica.es/CentOS/5/updates/i386/RPMS/vsftpd-2.0.5-16.el5_4.1.i386.rpm

  接着,使用rpm命令安装所需软件包:

  #rpm -ivh vsftpd-2.0.5-16.el5_4.1.i386.rpm

  值得注意的是:在运行vsftpd之前,需要确定系统的SELinux已经支持FTP读写或者SELinux为关闭状态。否则,vsftpd将无法正常运行。

  3、vsftpd快速配置

  首先,配置vsftpd需要修改vsftpd的主配置文件/etc/vsftpd/vsftpd.conf,并设定默认的匿名用户根目录:/var/ftp/。图1为安装完成后的vsftpd.conf。默认情况下匿名用户的访问是被允许的,图中的anonymous_enable=YES。

VSFTP基线安全

图1

  如果在配置文件末尾加上anon_upload_enable=YES和anon_mkdir_write_enable=YES。那将允许匿名用户上传文件并可以创建目录。如图2:

VSFTP基线安全

图2

  接着,需要切换到/var/ftp目录下建立新的文件夹xiaowang,如下命令:

  #cd /var/ftp
  #mkdir /var/ftp/xiaowang

  然后,使用如下命令启动vsftpd服务即可:

  #service vsftpd start

  其中那个pub文件夹是vsftp安装完自带的,我们暂时不用理会。

  值得注意的是:如果在命令行模式下输入ntsysv命令调出系统的面板,并在vsftpd前选上星号,并回车确认,即可以让vsftp开机启动。

  4、实例剖析安全设置

  (1)用户访问权限管理

  前面所看到的是非常简单的vsftp使用过程,基本上没做什么安全上的配置,接下来通过实例配置来介绍常规的vsftpd安全管理应该如何进行。

  为了安全起见,一个安全的vsftp服务器肯定不允许匿名登录,更不用说匿名上传和匿名删除服务器中的相关文件。那么,就需要如下一些步骤来进行用户管理,从而保证其安全。

  1)修改默认配置文件

  需要修改/etc/vsftpd/vsftpd.conf,修改为anonymous_enable=NO,如图3:

VSFTP基线安全 图3

  2)使用nologin禁止FTP帐户登录Linux服务器

  目前大多数使用vsftpd的企业用户都知道这么一种默认情况: vsftp的用户可以使用本地系统帐号。也就是说。如果在这个Linux系统中有一个叫xiaowang的普通用户的话,那这个xiaowang帐号是可以登录vsftp的。初看起来,这没有什么问题,但是,通过分析我们不难得知:如果xiaowang这个FTP帐号信息被人非法获得的话,对方将可以用这个帐号远程ssh登录Linux服务器执行多种命令。这是一个较大的安全隐患。所以企业系统管理员在新建FTP用户时,需要用到nologin。

  假设这里添加一个不允许本地登录的帐号xiaowang,执行如下命令:

  #useradd -s /sbin/nologin xiaowang

  然后再用passwd命令设置密码,这样,就保证了FTP帐号将只能传输文件无法本地登录。即使帐户被丢失,黑客拿到FTP帐号也顶多只能访问FTP服务,而不可能登录到Linux服务器本地,进行更多的非法操作。

  在《实例剖析开源系统中vsftpd的安全设置方法(二)》中,我们将介绍如何使用chroot控制用户访问权限,如何限制恶意占有带宽的用户等内容。

【TechTarget中国原创】在《实例剖析开源系统中vsftpd的安全设置方法(一)》中,我们介绍到了用户访问权限管理中的使用nologin禁止FTP帐户登录Linux服务器,下面我们继续介绍如何安全配置开源系统中vsftpd。

  3)使用chroot控制用户访问权限

  假设FTP用户根目录在/ftproot/game,那我们就要在配置文件中添加local_root=/ftproot/game。然后激活chroot,编辑添加chroot_list_enable=YES,把允许访问FTP的用户加到/etc/vsftpd/chroot_list这个文件中去,即:chroot_list_file=/etc/vsftpd/chroot_list。修改后的配置文件如图4:

VSFTP基线安全 图4

  值得注意的是:这里所介绍的/etc/vsftpd/chroot_list文件系统默认是没有的,需要手工创建,命令如下:

  #touch /etc/vsftpd/chroot_list
  #echo xiaowang > /etc/vsftpd/chroot_list
  #echo xiaowang1 >> /etc/vsftpd/chroot_list

  上述命令添加了两个用户,分别是xiaowang和xiaowang1。重新启动vsftpd服务即可。

  这个时候再从客户端来访问一下FTP服务器,发现需要输入用户名密码。如图5:

VSFTP基线安全 图5

  下面进一步使用WinSCP这个传输工具来看看上传下载的情况如何。如图6:

VSFTP基线安全 图6

  可以看到,本地的文件都传输到服务器上去了。如图7:

VSFTP基线安全
图7

  以上需要说明一点的是:必须先确定FTP根目录没有权限问题,否则将会出现如下问题(见图8)。如果出现该问题,可以使用chmod 757 /ftproot/game这个命令来设定权限。

VSFTP基线安全 图8

  (2)如何限制恶意占有带宽的用户

  如果所在公司或单位服务器性能够强,带宽够多,带宽限制这方面的需求可能不是特别地突出。然而,如果下载量特别大,人也特别多,就有必要进行一下安全的设置。

  在vsftp中,匿名用户和本地用户的速度限制是分开的。前者是anon_max_rate,后者是local_max_rate。 它们的单位都是byte(字节)。

  如果让匿名用户和本地的用户都以最高100KB的速度下载,所以这个数字应该是1024x100=102400。在vsftpd.conf文件末尾中加入下面的两行即可:

  anon_max_rate=102400
  local_max_rate=102400

  然后重启vsftpd服务即可。

  另外,还可以限制FTP的最大连接数和每个IP的最大连接数。这两个参数分别是Max_clients和Max_per_ip。和上面一样,也只需要在vsftpd.conf文件末尾添加参数即可,如下设成了最大连接数100,每个IP的最大连接数5个:

  max_clients=100
  max_per_ip=5

  (3)如何防止FTP密码被恶意嗅探

  由于vsftpd发送的数据是以明文方式传输,尤其是密码容易被恶意的嗅探(Sniffering)到,所以企业通常会采用SSL(Secure Sockets Layer,安全套接字层)技术,配置使得vsftpd支持SSL加密传输,以此来抵御恶意嗅探攻击。

  SSL是一种国际标准的加密及身份认证通信协议,用户采用的浏览器就支持此协议。SSL最初是由美国Netscape公司研究出来的,后来成为了Internet网上安全通讯与交易的标准。比如,当IE浏览器需要通过不可靠的互联网,与服务器安全地连接时,我们通常可以看到SSL技术被使用于其中。同样,这类技术也可以灵活地运用到邮件服务或FTP服务中去。SSL协议使用通讯双方的客户证书以及CA根证书,允许客户/服务器应用以一种不能被偷听的方式通讯,在通讯双方间建立起了一条安全的、可信任的通讯通道。它具备以下基本特征:信息保密性、信息完整性、相互鉴定。该协议主要使用Hash编码、加密技术。

  使用SSL技术,依赖于另外一个软件:OpenSSL,它是一个可以*使用的SSL实现,首先需要安装这个软件。用户可以从网站http://www.openssl.org/source/上下载Linux下OpenSSL的稳定版本,比如:openssl-0.9.8e-7.el5.i686.rpm,然后执行命令生成密钥:

  # openssl req –new –x509 –nodes –out vsftpd.pem –keyout vsftpd.pem

  接着,把生成的vsftpd.pem复制到/usr/share/ssl/certs的目录中:

  #cp vsftpd.pem /usr/share/ssl/certs/vsftpd.pem

  然后,修改/etc/vsftpd/vsftpd.conf文件。在末尾添加SSL相关配置。如图9:

VSFTP基线安全 图9

  保存后重启vsftpd服务。下面就可以用客户端来尝试进行SSL加密连接了。这里使用的客户端是Core FTP,选择SSL加密登录后,会出现如下提示,如图10:

VSFTP基线安全 图10

  选择Accept之后我们即可登入远程的ftp服务器。如图11:

VSFTP基线安全

图11

  若使用不支持SSL的客户端工具访问时有可能会出现:530 Non-anonymous sessions must use encryption.的错误提示。所以提醒用户尽量选择flashfxp或CoreFtp这类的多功能客户端。

  到这里为止,采用SSL机制保护下的vsftpd就算配置完成了。其中DES-CBC3-SHA是默认的加密方式,用户可以修改“ssl_ciphers=xxx”的方式来选择想要的加密方式。关于vsftpd对SSL的支持选项设置,可以参见表1。

主要选项

功能

ssl_enable

是否启用 SSL,默认为no

allow_anon_ssl

是否允许匿名用户使用SSL,默认为no

rsa_cert_file

rsa证书的位置

dsa_cert_file

dsa证书的位置

force_local_logins_ssl

非匿名用户登陆时是否加密,默认为yes

force_local_data_ssl

非匿名用户传输数据时是否加密,默认为yes

force_anon_logins_ssl

匿名用户登录时是否加密,默认为no

force_anon_data_ssl

匿名用户数据传输时是否加密,默认为no

ssl_sslv2

是否激活sslv2加密,默认no

ssl_sslv3

是否激活sslv3加密,默认no

ssl_tlsv1

是否激活tls v1加密,默认yes

ssl_ciphers

默认是DES-CBC3-SHA

表1

前两部分文章(http://www.2cto.com/Article/201112/114141.html)详细的介绍了如何进行sftpd的安全设置方法,最后我们总结一下vsftpd的配置清单。
  (4)一个完整的vsftpd高级配置清单
  为了使用户更加清晰地了解vsftpd的安全配置方法,下面给出一个完整的vsftpd高级配置清单及其注释,供用户在实际的配置中参考使用。
  Part I:基本登录和权限配置部分
  Anonymous_enable=yes(允许匿名登录)
  Dirmessage_enable=yes (切换目录时,显示目录下.message的内容)
  Local_umask=022(FTP上本地的文件权限,默认是077)
  Connect_form_port_20=yes (启用FTP数据端口的数据连接)
  Xferlog_enable=yes (激活上传和下传的日志)
  Xferlog_std_format=yes(使用标准的日志格式)
  Ftpd_banner=XXXXX (欢迎信息)
  Pam_service_name=vsftpd (验证方式)*
  Listen=yes (独立的VSFTPD服务器)*
  Anon_upload_enable=yes(开放上传权限)
  Anon_mkdir_write_enable=yes (可创建目录的同时可以在此目录中上传文件)
  Write_enable=yes(开放本地用户写的权限)
  Anon_other_write_enable=yes(匿名帐号可以有删除的权限)
  Anon_world_readable_only=no(放开匿名用户浏览权限)
  Ascii_upload_enable=yes(启用上传的ASCII传输方式)
  Ascii_download_enable=yes(启用下载的ASCII传输方式)
  Part II:FTP连接控制部分
  Banner_file=/var/vsftpd_banner_file(用户连接后欢迎信息使用的是此文件中的相关信息)
  Idle_session_timeout=600(秒) (用户会话空闲后10分钟)
  Data_connection_timeout=120(秒) (将数据连接空闲2分钟断)
  Accept_timeout=60(秒) (将客户端空闲1分钟后断)
  Connect_timeout=60(秒) (中断1分钟后又重新连接)
  Local_max_rate=50000(bite) (本地用户传输率50K)
  Anon_max_rate=30000(bite) (匿名用户传输率30K)
  Pasv_min_port=50000
  Pasv_max_port=60000(将客户端的数据连接端口改在50000—60000之间)
  Max_clients=200 (FTP的最大连接数)
  Max_per_ip=4 (每IP的最大连接数)
  Listen_port=5555 (从5555端口进行数据连接)
  Part III:本地帐户权限控制部分
  Local_enble=yes (本地帐户能够登录)
  Write_enable=no (本地帐户登录后无权删除和修改文件)
  Userlist_enable=yes (在指定的文件中的用户不可以访问)
  Userlist_deny=yes
  Userlist_file=/指定的路径/vsftpd.user_list
  Banner_fail=/路径/文件名 (连接失败时显示文件中的内容)
  Ls_recurse_enable=no
  Async_abor_enable=yes
  One_process_model=yes
  Listen_address=10.2.2.2 (将虚拟服务绑定到某端口)
  Part III:虚拟用户权限控制部分
  Guest_enable=yes (虚拟用户可以登录)
  Guest_username=所设的用户名 (将虚拟用户映射为本地用户)
  User_config_dir=/任意指定的路径/为用户策略自己所建的文件夹
(指定不同虚拟用户配置文件的路径)
  Part IV:其他配置部分
  Chown_uploads=yes (改变上传文件的所有者为root)
  Chown_username=root
  Deny_email_enable=yes (是否允许禁止匿名用户使用某些邮件地址)
  Banned_email_file=//任意指定的路径/xx/
  Pasv_enable=yes (服务器端用被动模式)
  User_config_dir=/任意指定的路径//任意文件目录 (指定虚拟用户存放配置文件的路径)

【TechTarget中国原创】