热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何配置安全的ProFTPd服务器2

四、其他安全策略1.隐藏ProFTPD服务器版本信息通常软件的BUG信息是和特定版本相关的,因此版本号是黑客寻求最有价值的信息。隐藏ProFTPD版本号比较简单,修改配置文件:/etc/Proftpd.conf:ServerIdentoff2.伪装ProFTPD服务器Windows下的FTP服务多是Se

四、其他安全策略

    1.隐藏ProFTPD服务器版本信息

    通常软件的BUG信息是和特定版本相关的,因此版本号是黑客寻求最有价值的信息。隐藏ProFTPD版本号比较简单,修改配置文件:/etc/Proftpd.conf:

ServerIdent off

    2.伪装ProFTPD服务器

    Windows下的FTP服务多是Serv-U,可以把ProFTPD伪装为Serv-U,方法是修改配置文件proftpd.conf,添加如下内容:

ServerIdent on \"Serv-U FTP Server v5.0 for WinSock ready...\"

存盘退出后,重新启动proftpd服务,登录到修改了提示信息的FTP服务器进行测试:

C:\\>ftp 192.168.0.1

Connected to 192.168.0.1.

220 Serv-U FTP Server v5.0 for WinSock ready...

User (192.168.0.1:(none)):

331 Password required for (none).

Password:

530 Login incorrect.

Login failed.

ftp > quit

221 Goodbye.

    这样从表面上看,服务器就是一个运行着Serv-U的Windows了。

    3. 使用非root权限运行ProFTPD

    以非root权限运行ProFTPD 。修改配置文件:/etc/Proftpd.conf:

User nobody      #设置FTP服务以nobody运行

Group nogroup        #注意:原来是“Group nobody”,一定要改为“Group nogroup ”

上面的配置表示以nobody用户身份运行ProFTPD服务器 。使用nobody身份运行能够降低缓冲区溢出攻击所带来的危险。

    4.监控ProFTPD服务器运行情况

    通常新部署一个ProFTPD服务器之后需要进行一段时间的监控:记录FTP连接记录、谁连接到我的FTP服务器。Proftpd本身附带了几个命令可以使用。

    (1) 记录FTP连接数

    使用usr/local/bin/ftpcout命令,可以显示FTP服务器连接用户数量信息。 我们还可以使用watch命令配合使用,运行下面命令:

watch -n 360 /usr/local/bin/ftpcount

    这个命令每三百六十秒显示一次连接用户数量的信息。

    (2) 查找谁与FTP服务器连接

    使用usr/local/bin/ftpwho命令可以显示谁连接到FTP服务器。一个简单的输出如下:

Master proftpd process 8322:

8387 0m1s proftpd: sheila - reboot.intevo.com: IDLE

8341 3m59s proftpd: kabir - k2.intevo.com: IDLE

- - 2 users

    以上输出显示有两个用户(sheila和kabir)从不同的计算机连接到FTP服务器,输出内容还包括:为这些用户服务的ProFTPD的进程和主ProFTPD的进程ID。

5.修改配置文件服务器

     ProFTPD使用的配置文件和Apache类似:

    单线指令:ServerName 和 ServerType

    多线容器指令:

    如果以前配置过Apache的话,会很容易掌握。Proftpd服务器配置文件etc/Proftpd.conf中的许多选项可以加固服务器。

    (1)通过IP地址限制FTP访问

    假设要允许主机名称myhost.domain.com访问FTP服务器,首先使用命令:

Ping myhost.domain.com

假设等到IP地址是:216.112.169.138。下面修改配置文件,加入以下内容:

Order Allow, Deny

Allow from 216.112.169.138

Deny from all

    注意不要在Allow命令后直接使用主机名称,因为检查主机名称会降低服务器的运行速度。另外主机名称比IP地址更具有欺骗性。如果 myhost.domain.com没有固定IP地址,主机用户在下一次从ISP获得一个IP地址时就无法和FTP服务器连接。这时必须给整个网络授予FTP访问的权限。命令如下:“Allow from 216.112.169.” 。

    (2)使用PAM作为ProFTPD授权用户的鉴别方法

    ProFTPD可以加入嵌入式认证模块,成为PAM-aware的FTP服务器。PAM全称:Pluggable Authentication Module (嵌入式认证模块)。它最初有SUN公司开发;很快被Linux社区的接受,并且开发了更多的模块。其目标是提供一套可用于验证用户身份的函数库,从而将认证从应用程序开发中独立出来。Linux-PAM处理四种独立的(管理)工作。它们是: 认证管理; 帐号管理; 会话期间管理;和密码管理。

    PAM工作方式:

(1)       调用某个应用程序,以得到该程序的服务。

(2)       PAM应用程序调用后台的PAM库进行认证工作。

(3)       PAM库在/etc/pam.d/目录中查找有关应用程序细节的配置文件,该文件告诉PAM,本应用程序使用何种认证机制。

(4)       PAM库装载所需的认证模块。

(5)       这些模块可以让PAM与应用程序中的会话函数进行通信。

(6)       会话函数向用户要求有关信息。

(7)       用户对这些要求做出回应,提供所需信息。

(8)       PAM认证模块通过PAM库将认证信息提供给应用程序。

(9)       认证完成后,应用程序做出两种选择:

*将所需权限赋予用户,并通知用户。

*认证失败,并通知用户。PAM工作流程见图8。

教你配置安全的ProFTPD服务器(下) - zhukeqing - zhukeqing_1984 的博客
图8 PAM工作流程

    下面手工建立一个/etc/pam.d/ftp文件包括以下内容:

%PAM-1.0

auth required /lib/security/pam_listfile.so item=user \

sense=deny file=/etc/ftpusers onerr=succeed

auth required /lib/security/pam_stack.so service=system-auth

auth required /lib/security/pam_shells.so

account required /lib/security/pam_stack.so service=system-auth

session required /lib/security/pam_stack.so service=system-auth

然后在配置文件/etc/Proftpd.conf加入两行:

AuthPAMAuthoritative on

AuthPAMConfig ftp

    这样ProFTPD服务器会自动把/etc/pam.d/ftp配置用于用户授权。这样用户连接到ProFTPD服务器时都由PAM使用/etc/pam.d/ftp文件进行认证。

    (3)对FTP用户使用chroot限制

    Unix(以及类Unix)操作系统提供了一种功能,让用户在重新映射的根文件系统中执行进程。chroot(更改根目录)命令会将根(/)文件系统的重新映射转换成相对于当前根目录的指定目录,然后在新的根目录下执行指定的命令。ProFTPD服务器要限制普通FTP用户可以访问的目录,配置很简单,如果限制skate组的skate用户登录时不能切换到其他目录,修改配置文件加入一行:

DefaultRoot ~ skate,skate

    这样他只能呆在自己的home目录中。警告:正如在真实生活中一样,没有监牢是不可攻破的。使用网络常驻程序中任何已知的弱点,恶意的用户可以上载并执行刻意编制的程序代码,促使系统核心允许他们冲破chroot,因而能够追踪其他不属于已更换根目录环境的进程,或者以你不会喜欢的方式来利用可用的设备。在chroot监牢中执行不安全的常驻程序可挡住大多数利用该常驻程序来侵入服务器计算机的举动。不过,你不能企望chroot能让服务器完全安全!务必遵守其他步骤。

    (4)限制FTP命令特权

    *禁止一些用户创建和删除目录的特权

    如果发现一些用户有威胁行为,可以把他放在一个特定组中(badusers)使用如下的配置:

Order deny,allow

DenyGroup badusers

AllowAll

    这样除了那个特定的用户组之外,其他用户可以创建和删除目录。

    *建立只能上载的FTP服务器

    如果要建立一个只能上载的FTP服务器,在主服务器或者虚拟主容器中使用如下配置:

DenyAll

    *限制对单个目录的访问。

DenyAll

    这样相应的FTP用户就不能更改目录。如果使用DenyGroup groupname代替DenyAll ,将配置范围限定在/etc/group文件中定义的groupname用户组中。

    *限制目录浏览特权

DenyGroup newfriends

以上配置可以限制/my/mp3s目录中名为newfriends组的目录浏览特权。这样可以防止他得到/my/mp3s目录的列表。

    (5)控制FTP命令缓冲区大小

    许多黑客通过发送一个大尺寸的命令攻击FTP服务器,希望造成服务器缓冲区溢出。可以在使用CommandBufferSize命令可以限制客户端命令长度。通常设定为512。

    (6)修改ProFTPD服务器使用端口

    ProFTP如果使用Stand-alone模式,可以通过设置proftpd.conf来控制它。使用不同端口的设置也较为简单,只需在proftpd.conf中将“Port xx”改为需要的值即可。

    (7)使不同用户之间相互隔离

    一些用户通常访问ISP的FTP服务器时,会看到一些不应当的系统信息,因此隐藏这些信息是必要的,下面是一个配置:

DefaultRoot “/www”

HideNoAccess on

IgnoreHidden on

HideNoAccess指令将用户隐藏/www 目录下的所有条目,IgnoreHidden指令指示ProFTPD 服务器忽略用户所有指令。

    (8)简化配置文件

    对于初学者来说看到大量的配置文件和注释时反到会感到不知所措。如果/etc/group 中定义了一个novices的组,希望组用户可以在 /ftp/download目录中上传和下载,可以如下配置proftpd.conf :

AllowGroup novices

DenyGroup novices

DenyGroup novices

AllowGroup novices

五、加密FTP服务器与客户端连接

    传统的网络服务程序FTP在本质上都是不安全的,因为它们在网络上用明文传送口令和数据,嗅探器非常容易就可以截获这些口令和数据。而且,这些服务程序的安全验证方式也是有其弱点的,就是很容易受到“中间服务器” (server-in-the-middle)这种方式的攻击。所谓“中间服务器”的攻击方式,就是“中间服务器”冒充真正的服务器接收你传给服务器的数据,然后再冒充你把数据传给真正的服务器。服务器和你之间的数据传送被“中间服务器”转手后做了手脚之后,就会出现很严重的问题。虽然近年来出现了很多种 ftp的替代服务,例如ssh加密通道的sftp/scp,或使用IPSEC协议的VPN通道等等,但是在大多数情况下,ftp的通用性和易用性使得它在很长一段时间内必然无法被完全取代。所以如同其他一系列古董服务(例如SMTP/HTTP)一样,近年来也出现了一些不需要对ftp协议自身做完全更改的协议扩展模块,能够良好的完成兼容性和功能扩展。ftp SSL/TLS Extension就是其中一种方式。

    SSL/TLS协议,SSL(Secure SocketLayer)最早是netscape公司设计的用于HTTP协议加密的安全传输协议,SSL工作于TCP协议的传输层(TCP层)和应用程序之间。作为一个中间层,应用程序只要采用SSL提供的一套SSL套接字API来替换标准的Socket套接字,就可以把程序转换为SSL化的安全网络程序,在传输过程中将由SSL协议实现数据机密性和完整性的保证。SSL协议的当前版本为3.0,当SSL取得大规模成功后,IETF(www.ietf.org)将SSL作了标准化,规范为RFC2246,并将其称为TLS(TransportLayerSecurity)。从技术上讲,TLS1.0与SSL3.0的差别非常微小,SSL由于其历史应用的原因在当前的商业应用程序之中使用得更多一些。

下面配置支持TLS的ProFTPD服务器。

    1.首先配置文件

# ./configure --with-modules=mod_tls \

 --with-modules=mod_sql:mod_sql_mysql \

 --with-includes=/usr/local/include \

 --with-libraries=/usr/local/lib/mysql

# make;# make install

    2. 接下来制作凭证

# mkdir /etc/ssl/certs

# mkdir /etc/ssl/private

# chmod og-rwx /etc/ssl/private

# mkdir /etc/ssl/crl

# mkdir /etc/ssl/newcerts

修改 /etc/ssl/openssl.cnf

把 dir = ./demoCA 改成 dir = /etc/ssl

    3.制作最高层认证中心 (Root CA)

Private Key ( Public Key )

# openssl genrsa -des3 -out /etc/ssl/private/myrootca.key 2048

# chmod og-rwx /etc/ssl/private/myrootca.key

填写凭证申请书 (然后按照问题回答即可)

#openssl req -new -key /etc/ssl/private/myrootca.key -out /tmp/myrootca.req

签发凭证

# openssl x509 -req -days 7305 -sha1 -extfile /etc/ssl/openssl.cnf

-extensions v3_ca -signkey /etc/ssl/private/myrootca.key -in /tmp/myrootca.req -out /etc/ssl/certs/myrootca.crt

# rm -f /tmp/myrootca.req

制作服务器用的凭证

Private Key ( Public Key )

# openssl genrsa -out /etc/ssl/private/myhost.key 2048

# chmod og-rwx /etc/ssl/private/myhost.key

填写凭证申请书

# openssl req -new -key /etc/ssl/private/myhost.key -out /tmp/myhost.req

    4.用最高层认证中心签发凭证

# openssl x509 -req -days 3650 -sha1 -extfile /etc/ssl/openssl.cnf

-extensions v3_req -CA /etc/ssl/certs/myrootca.crt -CAkey /etc/ssl/private/myrootca.key -CAserial /etc/ssl/myrootca.srl -CAcreateserial -in /tmp/myhost.req -out /etc/ssl/certs/myhost.crt

# rm -f /tmp/myhost.req

    5. 接下来设定/usr/local/etc/proftpd.conf,主要是在最后加上以下有关TLS的设定

TLSEngine on

TLSLog /var/log/tls.log

TLSProtocol SSLv23

TLSOptions NoCertRequest

TLSRequired On

TLSRSACertificateFile /etc/ssl/certs/myhost.crt

TLSRSACertificateKeyFile /etc/ssl/private/myhost.key

TLSCACertificateFile /etc/ssl/certs/myrootca.crt

TLSVerifyClient On

    使用支持TSL技术的客户端连接FTP服务器。到此为止服务器端安装设置完毕,登陆服务器的客户端使用FlashFXP , FlashFXP由于安装使用的文章比较多,所以本文就不详细介绍了。其他支持TLS连接的客户端很多windows环境下的FileZilla、 UltraFXP,Linux环境下的C-kermit 8.0(http://www.columbia.edu/kermit/ck80.html ),fireftp(firefox浏览器的ftp插件下载链接:http://releases.mozilla.org/pub/mozilla.org/extensions/fireftp/fireftp-0.94.2-fx.xpi )和lftp(http://lftp.yar.ru/ )。

    lftp 是一个功能强大的下载工具,它支持访问文件的协议: ftp, ftps, http, https, hftp, fish.(其中ftps和https需要在编译的时候包含openssl库)。llftp的界面非常想一个shell: 有命令补全,历史记录,允许多个后台任务执行等功能,使用起来非常方便。它还有书签、排队、镜像、断点续传、多进程下载等功能。

    命令行语法

lftp [OPTS]

`lftp' 是在 rc 文件执行后 lftp 执行的第一个命令

 -f            执行文件中的命令后退出

 -c             执行命令后退出

 --help              显示帮助信息后退出

 --version           显示 lftp 版本后退出

 其他的选项同 `open' 命令

 -e             在选择后执行命令

 -u [,]  使用指定的用户名/口令进行验证

 -p            连接指定的端口

               主机名, URL 或书签的名字

    如果在命令行中输入的站点名称,lftp将直接登录站点,如果在命令行不输入站点名称,则必须在进入到lftp界面后用open命令打开 。

    更多可以支持TSL的FTP客户端查看列表:http://www.ford-hutchinson.com/~fh-1-pfh/ftps-ext_col.html

    这样我们就成功的为FTP增添了TSL加密连接.而一个比较完整安全的FTP站点也配置完成了 。


推荐阅读
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • 禁止程序接收鼠标事件的工具_VNC Viewer for Mac(远程桌面工具)免费版
    VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ... [详细]
  • 生成对抗式网络GAN及其衍生CGAN、DCGAN、WGAN、LSGAN、BEGAN介绍
    一、GAN原理介绍学习GAN的第一篇论文当然由是IanGoodfellow于2014年发表的GenerativeAdversarialNetworks(论文下载链接arxiv:[h ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
author-avatar
扬帆900
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有