作为一个一般的规则,应该保证没有在任何地方使用符号符号连接(Symlinks),因此要禁止FollowSymLinks选项。所有的CGI都放在cgi-bin目录下,不允许放在其它任何地方,甚至也不允许在其它目录下执行。为了做到这一点,请不要使用ExecCGI配置选项。
为了禁止访问某些文件区,应该在这些目录下分别加入一个命名为.htaccess的文件,并在中加入下面的文本行:order deny,allow deny from all
第六步:Step 6: sudo程序与多个管理员
每一个管理员都应该有一个自己的帐号。如果每个人都使用root身份进行操作,那么就无法知道谁做了些什么。另外,如果使用root口令输入了一个不正确的命令可能对整个系统都产生严重的影响。应该仅仅在绝对需要时才使用具有高授权的操作。先前的harden_suse脚本已经将系统配置进行了必要的修改,它禁止了root用户的直接远程登录。仅仅以加密形式的SSH进行远程登录才可以执行管理任务。下一个需要做的事是配置sudo,这个程序可以帮助管理员记录执行过的命令。这个程序也提供了一个详细的授权结构,例如,象oracle用户一样,用户A可以被授权为可以重新启动数据库和查看root目录下的系统日志文件,但是不能做除此以外的任何事。可用用下面的命令行为每一个管理员设置一个用户:erde# adduser -m -g trusted username
将用户包含在”trusted”用户组是非常关键的,因为根据harden_suse所确定的安全标准,sudo仅能够被trusted组所使用。
随后,管理员就可以利用visudo程序,在编辑器中加入允许管理员可以做任何他想做的事的脚本行如下:
username ALL=(ALL) ALL
“man 5 sudoers”
设置了一个可以限制授权的主机。
当然,管理员应该使用sudo并且不应该使用”su root”命令转换到root身份,只有这样,才能保证让尽量少的人知道root口令。
第七步:最后的调整
完成所有的系统配置之后,应该使用tripwire程序产生一个包含所有文件的校验和的数据库:
erde# cp/usr/doc/packages/tripwire/tw.conf.example.linux
/var/adm/tripwire/tw.config
erde#/var/adm/tripwire/bin/tripwire -initialize
在连接Internet之前,产生文件/databases/tw.db_HOSTNAME应该备份到一个安全的存储介质(如CD-ROM)上。
一旦怀疑有攻击者已经入侵并操作了系统,可以用tripwire跟踪所有的操作。但是,应该隔一段时间就用tripware重新生成一次校验和数据库,因为这是对付高智商的攻击者的最有效方法。
在连接Internet之间的最后工作是对系统进行备份而后reboot。
但这些还不够,所有的系统管理员都应该订阅关于WEB安全的最重要的邮件列表:
suse-security:这是包含安全相关专题和安全公告的SuSE讨论组列表,要订阅这个列表,只需要发送一个空邮件到suse-security-subscribe@suse.com邮箱就可以了;
suse-security-announce:仅仅包含安全公告,要订阅这个列表,需要发一个空邮件到suse-security-announce-subscribe@suse.com邮箱;
bugtraq:致力于最新的安全问题的讨论区列表,要订阅这个列表,需要发送一个包含”subscribe bugtraq surname@firstname”内容的空白邮件到:listserv@securityfocus.com邮箱。
其它选择
由于没有安装本地入侵检测系统,所以只能从攻击者留下的可以痕迹跟踪成功入侵的黑客行为。对于这种措施,也没有什么现成的解决方案,但是还是有很多人开发了针对这种工作的程序和发布了一些窍门。然而,有关这些方面的细节描述远非本文的主题所能涵盖了。
如果Web服务器上的几个文件需要定期更新,scp——cp函数在SSH中的安全版本——就显得不是很好用了。一个更合适的方法是使用SSLftp,它具有FTP的功能并且象SSH一样对数据进行了加密。
日志数据很重要,所有的从Web服务器和路由器所记录的重要日志记录都应该送到一个集中管理的日志主机,这个日志主机主要用来监视所有计算机的运行状态。通过这种方法,攻击者就就很难遁形灭迹了。
另外,将Solar Designer [13]设计的安全内核补丁集成到系统中是个很好的主意,有了这个安全补丁,利用缓冲区溢出做手脚的攻击方式将变得更困难。
应该剥夺那些suid和sgid程序所具有的没必要的过高特权。这可以通过将那些不再需要具有特权的程序逐个输入到/etc/permissions.local然后手工去掉程序的授权(或启动SuSEconfig)的方法实现。
这个工作直到没有sgid程序并且仅仅有下面列出的少数几个suid程序时结束:
-rwsr-xr-x 1 root shadow 27920 Mar 11 11:50 /usr/bin/passwd
-rwsr-x--- 1 root trusted 56600 Mar 11 18:41 /usr/bin/sudo
-rwsr-xr-x 1 root root 6132 Mar 11 09:36 /usr/lib/pt_chown
如果系统由几个分区,通过使用mount选项ro(只读)、nodev(无设备)、nosuid (没有高特权的suid文件)和noexec (没有可执行文件)显著地提高系统的安全级别。
除此之外,可以使用ext2文件系统标志”append-only”和”immutable”(通过chattr命令设置)定义内核能力,这样就可以保护日志和引导文件等不被篡改。
如果服务器需要具有防止本地攻击的能力,必须为LILO引导装载器配备一个口令,这可以通过在/etc/lilo.conf文件的顶端输入下面的脚本行实现:
password=something_difficult_to_guess
restricted
最后,Web服务器不仅仅只是Apache。通常要包括1到2个数据库,还要引入一些附加的模块和程序,或者需要激活其它一些服务(如Dns服务器)。Linux包过滤(参见第二步中的例子)可以方便有效地提供保护支持。一个称为”隔离间”(”compartment”:可以从这里获得)的程序支持chroot、特权分配以及Linux能力配置等任务。
当然,还可以做很多其它的事情,但我所能想到的只有这些了。
- 相关链接:
-
教程说明:
Windows教程-一个安全Web服务器的安装(4)
。