用FreeBSD构建安全的Web服务器(四)

来源:岁月联盟 编辑:zhu 时间:2008-01-18
用FreeBSD构建安全的Web服务器(四)内容简介:5. SSH安全设置 SSH是一个基于SSL的安全连接远程治理的服务程序,主要出现就是为了解决telnet、rlogin、rsh等程序在程序交互过程中存在明文传输易被监听的问题而产生的,目前基本上是推荐使用ssh来代替telnet、rl   5. SSH安全设置
  
  SSH是一个基于SSL的安全连接远程治理的服务程序,主要出现就是为了解决telnet、rlogin、rsh等程序在程序交互过程中存在明文传输易被监听的问题而产生的,目前基本上是推荐使用ssh来代替telnet、rlogin、rsh等远程治理服务。
  ssh能够直接在windows平台下通过Secure SSH Client等客户端工具进行连接治理,目前最流行的服务器端就是OpenSSH程序,目前最新版本是OpenSSH4.0版,具体可以参考www.openssh.com网站。
  OpenSSH在FreeBSD下已经集成安装了,FreeBSD5.3下的OpenSSH版本是3.8.1,建议ports升级到4.0。
  
  
  主要的安全配置文件是/etc/ssh/sshd_config文件,我们编辑该文件。
  
  (1) 使用protocol 2代替protocol 1,SSH2更加安全,可以防止攻击者通过修改携带的版本banner来劫持(hijacking)启动会话进程并降低到protocol 1。注释掉protocol 2,1 改用下面语句代替:
  protocol 2
  
  (2) 合理设置最大连接数量, 防止DOS攻击
  
    MaxStartups 5:50:10
  
  (3)关闭X11forwording ,防止会话劫持
  
    X11Forwarding no
  
  (4)建议不使用静态密码,而使用DSA 或RSA KEY,修改如下内容可以关闭使用密码认证:
  
    PasswordAuthentication no
  
  (5)可以限制某个组或光是单个用户访问shell
  
    AllowGroups wheel
  或者
    AllowUsers heiyeluren
  
  (6) 限制root用户登陆,主要是为了防止暴力破解
  
   PermitRootLogin no
  
  (7) 不答应口令为空的用户登陆
  
   PermitEmptyPasswords no
  
  (8)使用TCP wrappers来限制一些访问,修改/etc/hosts.allow文件,注释掉"ALL : ALL : allow",增加如下内容:
  
    sshd:localhost:allow
    sshd:friendlcomputer:allow
    sshd:all : deny
  
    #相关命令:
    #chsh -s /sbin/nologin user
     四、防火墙的安装和设置
  
  FreeBSD自带有一个基于包过滤的防火墙--ipfw,虽然功能没有专业防火墙那么强大,但是应付一个Web站点的安全还是足够的,所以我们决定选用该防火墙来保护我们的Web服务器。
  
  
  1. 安装ipfw
  
  IPFW 的主要部分是在内核中运行的, 因此会需要在FreeBSD内核配置文件中添加部分选项。(注重,假如你没有安装FreeBSD核心源代码,是无法进入以下目录的,所以运行之前一定要先安装内核源代码)我们先进入内核配置文件:
  # cd /sys/i386/conf
  # cp GENERIC ./kernel_fw
  
  打开内核配置文件:
  # ee ./kernel_fw
  
  添加四个选项,不需要后面的注释信息:
  options IPFIREWALL # 将包过滤部分的代码编译进内核。
  options IPFIREWALL_VERBOSE
  # 启用通过syslogd记录的日志。假如没有指定这个选项,即使您在过滤规则中指定记录包, 也不会真的记录它们
  options IPFIREWALL_VERBOSE_LIMIT=10
  # 限制通过 syslogd(8) 记录的每项包规则的记录条数。在恶劣的环境中假如您想记录防火墙的活动, 而又不想由于 syslog 洪水一般的记录而导致拒绝服务攻击, 那么这个选项将会很有用。
  options IPFIREWALL_DEFAULT_TO_ACCEPT
  # 这将把默认的规则动作从 ``deny’’ 改为 ``allow’’。这可以防止在没有配置防火墙之前使用启用过 IPFIREWALL 支持的内核重启时把自己锁在外面。 另外, 假如您经常使用 ipfw(8) 来解决一些问题时它也非常有用。 尽管如此,在使用时应该小心, 因为这将使防火墙敞开, 并改变它的行为。
  
  
  编译内核:
  # /usr/sbin/config kernel_fw
  # cd ../compile/kernel_fw (注重你的版本,假如是低于5.0的版本用../../compile/kernel_fw)
  # make depend
  # make
  # make install
  
  重启系统。注重,我们没有选择options IPFIREWALL_DEFAULT_TO_ACCEPT该选项,就是说默认系统启动后是打开防火墙的,并且防火墙默认是不答应任何连接的(deny from any to any),所以一定要在本地操作,否则你将被“锁在门外”,假如你选择了该选项则可以使用ssh等连接不受影响,不过这相对不安全。
  
  
  2. 配置ipfw
  
  假如配置普通情况下的规则,使用命令配置的模式:
  ipfw的配置命令:ipfw [-N] 命令 [编号] 动作 [log(日志)] 协议 地址 [其它选项]
  例如:
  # ipfw add allow tcp from any to 10.10.10.1 80 #答应外界访问我的web服务
  # ipfw add allow tcp from any to 10.10.10.1 21 #答应外面访问我的ftp服务
  # ipfw add allow tcp from any to 10.10.10.1 22 #答应外界访问我的ssh服务
  
  假如使用规则包的形式,那么查看下面内容。
  系统启动后,我们还要配置rc.conf文件来运行我们的防火墙:
  # ee /etc/rc.conf
  
  加入如下内容:
  gateway_enable="YES" # 启动网关
  firewall_enable="YES" # 激活firewall防火墙
  firewall_script="/etc/rc.firewall" # firewall防火墙的默认脚本
  firewall_type="/etc/ipfw.conf" # firewall自定义脚本
  firewall_quiet="NO" # 起用脚本时,是否显示规则信息。现在为“NO”假如你的防火墙脚本已经定型,那么就可以把这里设置成“YES”了。
  firewall_logging_enable="YES" # 启用firewall的log记录。
  
  设置完成后我们再编辑/etc/syslog.conf文件:
  # ee /etc/syslog.conf
  加入以下行:
  !ipfw
  *.* /var/log/ipfw.log
  
  现在到了最重要的编辑规则包了:
  # ee /etc/ipfw.conf
  我们添加一下规则:(注重 10.10.10.1是我们服务器的IP)
  
  ######### TCP ##########
  add 00001 deny log ip from any to any ipopt rr
  add 00002 deny log ip from any to any ipopt ts
  add 00003 deny log ip from any to any ipopt ssrr
  add 00004 deny log ip from any to any ipopt lsrr
  add 00005 deny tcp from any to any in tcpflags syn,fin
  # 这5行是过滤各种扫描包
  
  add 10001 allow tcp from any to 10.10.10.1 80 in # 向整个Internet开放http服务。
  add 10002 allow tcp from any to 10.10.10.1 21 in # 向整个Internet开放ftp服务。
  add 10000 allow tcp from 1.2.3.4 to 10.10.10.1 22 in
  # 向Internet的xx.xx.xx.xx这个IP开放SSH服务。也就是只信任这个IP的SSH登陆。
  # 假如你登陆服务器的IP不固定,那么就要设为:add 10000 allow tcp from any to 10.10.10.1 22 in
  
  add 19997 check-state
  add 19998 allow tcp from any to any out keep-state setup
  add 19999 allow tcp from any to any out #这三个组合起来是答应内部网络访问出去,假如想服务器自己不和Internet进行tcp连接出去,可以把19997和19998去掉。(不影响Internet对服务器的访问)
  
  ########## UDP ##########
  add 20001 allow udp from any 53 to 10.10.10.1 # 答应其他DNS服务器的信息进入该服务器,因为自己要进行DNS解析嘛~
  add 29999 allow udp from any to any out # 答应自己的UDP包往外发送。
  
  ########## ICMP #########
  add 30000 allow icmp from any to any icmptypes 3
  add 30001 allow icmp from any to any icmptypes 4
  add 30002 allow icmp from any to any icmptypes 8 out
  add 30003 allow icmp from any to any icmptypes 0 in
  add 30004 allow icmp from any to any icmptypes 11 in
  #答应自己ping别人的服务器。也答应内部网络用router命令进行路由跟踪。
    五、Unix/Linux上的后门技术和防范
  
  对黑客来讲,入侵一个系统只是万里长征的开始,最主要的是长期占有一个肉鸡(傀儡机),所以,后门技术往往非常重要。对于我们来讲,总是处于被动的地位,百密一疏,总有没有做到位的地方,谁都不能保证自己的系统是绝对安全的,所以不能避免我们可能会被入侵黑客入侵后肯定会留后门,当然,除了那些高手,境界非常高,入侵只是为了测试或者技术挑战,对于一般黑客来讲,入侵之后留个后门是很重要的,我们要防范,当然就要了解常用的后门技术,下面就简单的讲将在Unix/Linux系统中比较常见的后门技术。
  
  1. 帐号后门
  
  最普通和原始的后门技术,一般就是在系统中添加一个治理员帐户。
  # echo "heiyeluren:*:0:0::/root:/bin/sh" >> /etc/passwd
  # echo "heiyeluren::0:0::0:0::/root:/bin/sh" >> /etc/shadow
  给系统增加一个 uid和gid都为0(root)的帐号,无口令。
  FreeBSD的密码是存储在 /etc/master.passwd里面的,那么后面的命令就应该改成:
  # echo "heiyeluren:::::::::" >> /etc/master.passwd
  也可以使用程序来实现:
  /* Add super user */
  #include "stdio.h"
  #define PASSWD_PATH "/etc/passwd"
  #define SHADOW_PATH "/etc/master.passwd"
  main()
  {
  FILE *fd;
  fd = fopen(PASSWD_PATH, "a ");
  fprintf(fd, "heiyeluren:*:0:0::/root:/bin/sh/n");
  fclose(fd);
  fd = fopen(SHADOW_PATH, "a ");
  fprintf(fd, "heiyeluren::0:0::0:0::/root:/bin/sh/n");
  fclose(fd);
  }
  # gcc -o adduser adduser.c
  # ./adduser
  这种方法比较傻,一般比较轻易发现,非凡是系统帐户不多的时候。也有的用户名起的比较迷惑人,比如起个r00t的用户名,uid和gid都是0,这样假如不注重,可能就会被蒙混过关了。
  
  * 防范方法:
  这种方法虽然比较轻易发现,但是我们还是要防范,要多注重观察系统的帐户情况,本来我们系统帐户就不多,检查起来比较方便,另外也要注重那些比较少使用的帐户是不是被更改过,比如默认的帐户有bind,它的shell是 /usr/sbin/nologin,就是不能登陆的,但是黑客入侵后把它改了,比如改为/bin/csh,那么对方就能登陆了,但是你确不知道。所以最好办法是把/etc/passwd另外备份一份,不定期的检查,同时把/etc/passwd和/etc/master.passwd设为只有root才能查看。
  
  
  2. shell后门
  
  这个比较常用,也比较流行。一般就是把root执行的shell程序通过setuid的形式把shell程序拷贝到其他能够执行的地方,然后只要用小权限用户执行该shell就能够直接获取root权限。
  比如:
  # cp /bin/sh /tmp/.backdoor
  # chown root:root /tmp/.backdoor
  # chmod s /tmp/.backdoor
  这样只是把sh复制了,假如你喜欢其他shell,比如ksh、csh也可以,具体你看各个不同的操作系统而定。你就可以把那个加了s标记的shell程序放到任何目录,最好是深一点,不轻易被人发现的地方,比如/usr/local/share/man之类的目录,然后你使用小权限用户登陆后执行该shell就可以了,比如我们上面复制的shell,我们只要用小权限用户登陆后执行:
  $ /tmp/.backdoor
  #
  就可以了,当然,如何获得小权限用户,你可以使用暴力破解一些帐户,或者自己创建一个小权限的帐户。
  
  * 防范方法:
  首先给各个主要目录加上我们上面说的文件指纹校验,知道某个目录下有什么文件,假如多出了可疑文件可以仔细检查。还有使用find命令来查找有没有危险的root suid程序:
  find / -type f (-perm -4000 -o -perm -2000 ) -print
  
  
  3. Crontab服务后门
  
  crontab命令就相当于windows下的at命令,定期执行某些任务。对黑客来讲,比如定期建立一个帐户,然后过多久就删除,这样治理员永远看不到系统中有后门,这样是非常保险的。。
  
  * 防范方法:
  cron的服务默认是存储在 /var/spool/crontab/root目录下,定期检查cron服务,看是否有异常的任务在执行,或者假如你不使用cron的话,直接关闭掉它。
  
  
  4. rhosts后门
  
  Rhosts文件经常被黑客利用来制作后门,假如系统开了rlogin、rexec等r的服务,因为象rlogin这样的服务是基于rhosts文件里的主机名使用简单的认证方法,所以黑客只要将.rhosts文件设置成" ",那么就答应任何人从任何地方使用该用户名,无须口令登陆513端口的rlogin服务就行。而且r之类的服务没有日志能力,不轻易被发现。
  实现方法:
  # echo " " > /usr/heiyeluren/.rhosts
  # rlogin -l heiyeluren localhost
  这样就不需要任何密码,直接输入用户名heiyeluren就登陆到了系统。
  
  * 防范办法:
  不要使用rlogin等服务,同时也不推荐使用telnet等服务,因为telnetd等守护进程溢出漏洞一堆,而且在数据传输过程中是没有加密的,很轻易被嗅探,建议使用ssh等经过安全加密的服务来替代。
  
  
  5. Login后门
  
  login程序通常用来对telnet来的用户进行口令验证. 入侵者获取login的原代码并修改使它在比较输入口令与存储口令时先检查后门口令. 假如用户敲入后门口令,它将忽视治理员设置的口令让你长驱直入。
  
  * 防范方法:
  一般针对这类后门,一般都是使用"string"命令搜索login程序中是否有中是否有密码等字符串来进行检查。假如密码经过加密,那么就对login文件进行指纹记录和MD5值的记录,觉得异常时进行检测。
  
  
  6. Bind后门
  
  就是通过常用的网络连接协议 TCP/UDP/ICMP 来建立连接的后门,这个在Windows下可是轰轰烈烈。
  比较普遍的有TCP协议的后门都是写一段程序开一个指定的端口进行监听,然后从客户端进行连接后登陆系统。也有黑客为了隐蔽使用UDP协议来连接。icmp后门也常见,一般是。有时候可能bind后门跟服务后门结合,黑客通过自己写的bind后门来替换inetd中的服务。
  
  * 防范方法:
  经常使用netstat命令检查有没有非法的端口打开,最好直接用防火墙屏蔽除了正常访问的端口之外的端口。对于ping后门的话,直接在防火墙上禁止ping服务器
  
  
  7. 服务后门
  
  一般是替换或者添加服务来实现后门。比如在 /etc/inetd.conf 中添加或者替换某个服务来运行自己的后门程序,或者在某些服务中加入自己的后门代码。假如是替换服务的话,该服务必须不被使用,而且不轻易发现。假如是自己添加的服务,那么必须在/etc/services中设置对应的服务和端口才能使用。
  
  * 防范方法:
  经常检查服务,最好备份 /etc/inetd.conf 、/etc/services等文件,同时在FreeBSD下也要时常检查 /usr/loca/etc/rc.d 下面的脚本是否是合法的并且是否那些脚本里面有没有启动非法程序。假如是在服务程序中添加自己的代码,那么就要对文件的指纹进行校验,比如md5值看是否匹配。
  
  
  8. rootkit后门
  
  rootkit后门一般是替换治理员使用的工具,比如ls、ps、netstat、who等常用文件,把那些程序替换成被黑客加了非凡代码的程序,那样就能达到控制的效果。而且现在已经有很多现成能下载使用的rootkit。
  
  * 防范方法:
  按照我们前面的方法,给每个文件建立系统指纹档案和md5校验值,假如觉得不对劲的时候查看文件指纹是否匹配,有没有别修改过,就知道是否着了rootkit的道。
  
  
  9. 内核后门
  
  通过加载内核模块的方式来加载后门,比较复杂。一般内核后门都是针对操作系统而言的,不同的操作系统内核模块设置编写方法都不一样,一般不通用。内核后门一般无法通过md5校验等来判定,所有基本比较难发现,目前针对内核后门比较多的是Linux和Solaris下。
  
  * 防范方法:
  FreeBSD下通过我们上面讲的设置内核安全等级来控制加载内核模块。
  
  
  10. 其他后门
  还有包括.forward等其他各类后门,另外很多后门可能是结合多种技术,比如把rootkit和内核后门结合在一起,实际过程中,黑克是会更难对付的。当然还有许多我们没有发现高手独门秘诀,这需要灵活检查,不过只要勤劳一点,安全会提升很多。
  
  六、结束语
  
  安全是一个整体,即使那么服务你设置的非常安全,但是不能保证永远安全,安全是动态的,必须不断的充实自己的知识,发现新漏洞、新技术。假如你需要更安全的系统,一定要自己有时常能够手工作入侵检测或者使用部分工具帮助你进行入侵检测。同时推荐你安装一些网络入侵检测系统(NIDS),比如Snort。
  我想这个题目真的有点大了,开始写的时候没有那种感觉,越做到后来越觉得想要说的很多,最后只能泛泛而谈了一下,虽然如此,也希望能够给在使用FreeBSD的网管和网络安全爱好者一点点的帮助,那就足够了。
  
  感谢所有致力于开源世界安全研究和治理并且愿意共享自己学习心得的朋友!
  
  最后谢谢你能够耐心阅读本文。
  
  
  (声明:本人也是初学者,文章不当之处,敬请指出,同时本文参考了很多高手的文章,有些不能一一注明,敬请谅解。)
  
  
  附录(本文参考资料)
  
  * 《黑客防线》2004年6月 《细心构造安全的PHP系统》(作者:单长虹)
  * 《黑客防线》2004年5月 《一步一步加强Mysql的安全》(作者:单长虹)
  * 《黑客防线》2004年5月 《文件系统安全巧设置》(作者:小华健)
  * 《黑客防线》2004年1月 《知己知彼,方能百战不殆-Apache安全设定面面观》(作者:老牛)
  * 《黑客防线》2003年11月《打造免费的分布式入侵检测系统》(作者:王雪冰)
  * 《安全焦点》文档精华 《利用FreeBSD组建安全的网关》(作者:iceblood)
  * 《安全焦点》文档精华 《MySQL数据库安全配置》(作者:san)
  * 《安全焦点》文档精华 《PHP安全配置》(作者:san)
  * 《安全焦点》文档精华 《一些FreeBSD相关的安全问题》(作者:xundi)
  * 《安全焦点》文档精华 《FreeBSD系统优化部分内核参数调整中文注释》(作者:iceblood)
  * 《FreeBSD系统安装及安全调整》(作者:xundi)
  * 《详谈 vsftpd 的设置 》(作者:未知)
  * 《Linux系统中OpenSSH的安装和配置》(LinuxAid.com.cn网站技术文档)
  * 《如何创建后门》

图片内容