如何保证安全的最大化呢?量体裁衣,有的放矢,取舍得当是关键。现从以下几个方面加以详述。
控制文件的属性和权限
密切关注文件的属性和权限设置是保证主机文件系统完整性的至关紧要的操作。
两种特殊的文件访问权限分别是SUID(八进制为4000)和SGID(八进制为2000)。设置这两种权限的文件,将使其它用户在执行它们时拥有所有者的权限。也就是说,如果一个设置为SUID的程序,即使是普通用户使用也是作为root来运行的。因此,SUID/SGID文件是安全的隐患。
SUID和SGID攻击方式的预防:
1.严格审查系统内的文件权限。可以找出系统内使用SUID/SGID的文件,列出清单保存,做到心中有数。命令如下:
[root#] find / -type f -perm +6000 -ls | less
[root#] find / -type f -perm +6000 > Suid-Sgid.txt
2.对于一部分程序必须设置为SUID的,可以让它们自成一组,集中管理。但是绝对不允许在用户的家目录下有SUID程序存在。
3.确保重要的SUID脚本不可写。命令如下:
[root#] find / -perm -2 ! -type l -ls
4.对于并非绝对需要被设置成SUID的程序,改变它们的访问权限或者卸载程序。如:
[root#] chmod -s [program]
5.查找系统内所有不属于任何用户和组的文件。因为这些文件很容易被利用来获得入侵主机的权限,造成潜在的威胁。命令如下:
[root#] find / -nouser -o -nogroup
6.善于使用lsattr和chattr这两个ext2/3的属性命令。本文将主要讨论a属性和i属性,因为这两个属性对于提高文件系统的安全性和保障文件系统的完整性有很大的好处。a属性(Append-only),系统只允许在这个文件之后追加数据,不允许任何进程覆盖或截断这个文件。如果目录具有这个属性,系统将只允许在这个目录下建立和修改文件,而不允许删除任何文件。i属性(Immutable),系统不允许对这个文件进行任何的修改。如果目录具有这个属性,那么任何进程只能修改目录之下的文件,不允许建立和删除文件。
如果主机直接暴露在因特网或者位于其它危险(如其它非管理员亦可接触服务器)环境,有很多Shell账户或提供HTTP和FTP等网络服务,一般应该在安装配置完成后使用如下命令,便于保护这些重要目录:
[root#] chattr -R +i /bin /boot /etc /lib /sbin
[root#] chattr -R +i /usr/bin /usr/include /usr/lib /usr/sbin
[root#] chattr +a /var/log/messages /var/log/secure......
如果很少对账户进行添加、变更或删除操作,把/home本身设置为Immutable属性也不会造成什么问题。
在很多情况下,整个/usr目录树也应该具有不可改变属性。实际上,除了对/usr目录使用chattr -R +i /usr/命令外,还可以在/etc/fstab文件中使用ro选项,使/usr目录所在的分区以只读的方式加载。
另外,把系统日志文件设置为只能添加属性(Append-only),将使入侵者无法擦除自己的踪迹,以便于执法人员取证、分析。
文件系统的完整性检查
完整性是安全系统的核心属性。管理员需要知道是否有文件被恶意改动过。攻击者可以用很多方法破坏文件系统,例如,可以利用错误配置获得权限,也可以修改文件植入特洛伊木马和病毒。Linux中常用如下工具进行校验检查。
1.md5sum
md5sum 命令可以用来创建长度为128位的文件指纹信息。通过md5sum -c命令可以反向检查文件是否被修改过。黑客进入到系统后,会用修改后的文件来取代系统上某些特定的文件,如netstat命令等。于是当使用 netstat -a命令查看系统状态时,不会显示系统攻击者存在的信息。攻击者还可能会替代所有可能泄露其存在的文件,一般来说包括:
/bin/ps、/bin/netstat、/bin/login、/bin/ls、
/usr/bin/top、/usr/bin/passwd、/usr/bin/top、
/sbin/portmap、/etc/xinetd.conf、/etc/services。
这些文件都是替代的对象。由于这些文件已经被取代,那么简单地利用ls命令是查看不出这些文件有什么破绽的。因此你需要用md5sum工具在系统安装前期为这些文件做好指纹认证并保存,以备日后检测所用。
2.RPM安装包
如果使用的是基于RPM的安装包(Red Hat公司开发并包含在其Linux产品之中的多功能软件安装管理器,现有多种版本的Linux使用此管理器,如Red Hat、 TurboLinux),它可以用来建立、安装、查询、检验、升级和卸载独立的软件包。一个完整的RPM包包括压缩文件和包信息。当使用RPM安装软件时,RPM为每个被安装的文件向数据库中添加信息,包括MD5校验和、文件大小、文件类型、拥有者、组和权限模式。当RPM以-verify标志运行时,将把初始文件的值与当前安装的文件进行比较并报告差异。例如,下面是对一个被黑站点的运行结果:
# rpm -qf /bin/ps(或# rpm -qf /usr/bin/top 查看命令隶属哪个RPM包)
procps.2.0.2-2
# rpm -V procps(-V MD5检验)
SM5..UGT /bin/ps
SM5..UGT /usr/bin/top(有消息表示此文件已被修改)
由上可以看出,攻击者已经入侵到系统中,并且用自己的ps及top命令替代了原来系统中的命令,从而使管理员看不到其运行的进程。RPM的使用方法很多,具体操作方法参见man rpm文档。
3.Tripwire
Tripwire是一个用来检测整个系统是否存在恶意代码和检验文件完整性的有用工具。它采用MD5算法生成128位的“指纹”,通过命令自动保存系统快照,再产生相应的MD5数值以供日后比较判断。
使用Tripwire可以定义哪些文件/目录需要被检验。一般默认设置能满足大多数的要求。该工具运行在四种模式下:数据库生成模式、数据库更新模式、文件完整性检查模式、互动式数据库更新模式。当初始化数据库生成的时候,它生成对现有文件各种信息的数据库文件。为预防以后系统文件或者配置文件被意外地改变、替换或删除,它将每天基于原始数据库对现有文件进行比较,以发现哪些文件被更改、是否有系统入侵等意外事件发生。当然,如果系统中的配置文件或程序被更改,则需要再次生成数据库文件,保持最新的系统快照。此软件功能强大,使用方便。具体的安装和使用,可以通过Google搜索获得。
有效控制服务器运行的后台进程
服务进程(Daemon)是Linux操作系统的核心程序,是外界与主机互相交互的主要途径,同时也是连接因特网的大门。正因为运行了不同的服务进程,Linux系统才能够提供不同的服务,网络才变得丰富多彩。一个称职的管理员必须掌握以下几个要领:
1. 要对自己的服务器有足够的了解,清楚每台服务器的所有后台进程,了解哪台主机运行了哪些服务,开放了哪些端口。我们可以用以下方法得到服务器的配置:
# ntsysv (或 setup) (列出所有的服务清单,可以选择安装/卸载)
# less /etc/services (列出所有服务运行的端口)
# ps -auxf > daemons.txt(推荐使用,把所有后台打印列表)
# cd /var/run/|ls -al(查看启动服务的进程号文件)
2. 对每个服务都要做好软件版本号的登记归档,密切注意各服务软件的漏洞,尽快升级或打补丁。如bind软件在8.X存在安全漏洞,应该尽快升级到9.X。
3.尤其要注意的是,新手们总是认为把服务运行起来工作就已经做完了,其实这是不对的。当服务进程运行起来后,配置文件的优化处理相当重要。比如, Apache的配置文件中,KeepAlive、MaxKeepAliveRequests、KeepAliveTimeout、 StarServers、MinSpareServers、MaxSpareServers、MaxClients、 MaxRequestsPerChild对机器性能的影响都非常重要。所以,需要常去网上论坛了解最新信息和发展动态,从而更好地守住每个进出的要口。管理员应该常去的网站链接http://www.linuxsecurity.com。
同时还要特别注意以下几方面:
配置独立的专用服务器,增加负荷能力,降低风险
Linux 作为优秀的网络操作平台,完全有能力胜任运行多个服务器。比如,它可以作为Web服务器,同时也可以充当FTP服务器和Mail服务器。这样做的好处在于能够降低投资成本,但是不安全因素也会随之相应增加。因此,需要在投资成本与安全最大化之间权衡。假如电脑连接因特网,提供多种服务,且每天都要提供大量访问量时,建议一“不要把所有的鸡蛋放在同一个篮子里”。把各个服务进程运行在不同的主机上,成为专用的Web服务器,FTP服务器或Mail服务器,共同分担风险。建议二把各种服务分类管理。在FTP服务器和Mail服务器访问量不大时,也可以把它们统一管理。
取消所有非必要的服务,尽量做到干净,减少后门
把Linux作为专用服务器是个明智的举措。例如,希望Linux成为强大的Web服务器,可以取消系统内所有非必要的服务,只开启必要服务。这样做可以尽量减少后门,降低隐患,而且可以合理分配系统资源,提高整机性能。以下是几个不常用的服务:
1. fingerd(finger服务器)报告指定用户的个人信息,包括用户名、真实姓名、shell、目录和联系方式,它将使系统暴露在不受欢迎的情报收集活动下,应避免启动此服务。
2. R服务(rshd、rlogin、rwhod、rexec)提供各种级别的命令,它们可以在远程主机上运行或与远程主机交互,在封闭的网络环境中登录而不再要求输入用户名和口令,相当方便。然而在公共服务器上就会暴露问题,导致安全威胁。
3. X-Window从严格的意义上说,是Linux窗口管理器的扩展,而不是重要组成部分。从目前的GNOME、KDE这两种主流图形服务器来看,体积越来越臃肿,耗存越来越大,一些基于图形界面的软件在使用上也存在不少问题。虽然开发人员不会放弃对它的完善,但对于服务器来说,它的存在价值几乎没有。因此,在安装服务器时,务必考虑是否真的需要图形管理界面。
4. 其它服务,如amd、arpwatch、atd、dhcpd、innd、nntpd、talkd、lpd、named、routed、snmpd、 xfs、wuftpd、tftpd、telnet、ypbind、yppasswd、ypserv,既然是Web服务器,都可以取消或卸载掉。
同理,如果是作为FTP服务器运行,只需FTP进程和必要的程序。
安全系数高的服务替代正在运行的服务进程
对于一些必要的服务器,如前所说的Web服务器,理论上只需要Apache的进程就可以工作了。但是如果管理员需要远程控制放在运营中心的主机呢?或者用户需要通过FTP上传更新资料呢?Telnet、wu-ftp这些服务的安全性太低,这时,就需要启用安全级别高的服务来替代这些服务程序。以下为几个需要替代的进程:
1.用OpenSSH替代Telnet
推荐使用开放软件OpenSSH(Secure Shell),这是一个安全的登录系统,且不受加密方法的出口限制,适用于替代Telnet、rlogin、rsh、rcp、rdist。另外, OpenSSH也可以用来在两台计算机间建立一条加密信道供其它不安全软件使用。OpenSSH支持多种算法,包括BlowFish、Triple DES、IDEA、RSA。目前支持SSH的客户端软件不少,推荐使用Putty和Filezilla。关于服务器和软件的安装使用,请参见相关文章,在此不再详述。
2.用Vsftpd替代wu-ftpd、tftpd(基本的FTP服务)、ncftpd(匿名服务)
如果想要一个优秀的FTP软件,建议使用Vsftpd。Vsftpd(Very Secure)是一个非常值得信赖的FTP软件。除了与生俱来的高安全性外,在ASCⅡ传输模式下的速度是wu-ftpd的两倍,在千兆以太网的下载速度可达86Mb/s;在稳定性方面,Vsftpd可以在单机(非集群)上支持4000~15000个以上的并发用户同时连接。除此以外,还可以建立虚拟 FTP服务器,支持非系统用户的登录下载,同时也可以给不同的用户分配不同的权限,保证服务的安全最大化。现在世界上很多著名的公司都在使用 Vsftpd,如Red Hat、GNU、GNOME、SuSe、KDE、OpenBSD等。具体安装和配置请见参考资料。
3.用Qmail替代Sendmail
Sendmail 将来仍然是主要的SMTP服务器,网络上有关Sendmail服务器的配置资料随处可见。但事实上由于Sendmail代码的复杂性,使得很多人对其配置一知半解。多数情况下,新手们往往只要能够让Sendmail启动起来、能收发邮件就觉得万事大吉了。这样的配置其实漏洞太多,难以保证安全性。所以, Qmail是个更好的选择。当然,要想真正建立一个功能强大、运行稳定的邮件服务器,掌握其灵活的配置,认真阅读How-to手册和FAQ是很有必要的。
使用tcpwrappers控制文件
在没有设置防火墙之前,可以通过一种简单而可靠的机制——tcpwrappers来加强网络访问控制。tcpwrappers从两个文件中读取网络访问控制规则:
/etc/hosts.allow 指定授权主机
/etc/hosts.deny 指定非授权主机
配置文件的编写规则非常简单,一般是:
services_list : client_list [ : shell_command ]
1. 如果client及services满足hosts.allow里面的条目,那么访问将被允许。
2. 如果client及services满足hosts.deny里面的条目,那么访问将被禁止。
3. 如果以上两条都不满足,访问将被允许。
4. 如果访问控制文件不存在,将被当作空规则文件处理。所以可以通过删除访问控制文件来关闭访问限制。
其中services_list可以列出一个或几个服务进程名,也可以使用通配符;client_list可以是IP地址、主机名或者网络号,也可以使用通配符。
services_list有两个特殊用法的符号:ALL和EXCEPT。ALL表示所有的进程,而EXCEPT表示排除某个进程。比如,ALL EXCEPT in.fingerd表示除了in.fingerd外所有的进程。
client_list可以使用如下通配符:
1. “.”号在字符串前匹配所有后面部分和所提供字符串一样的主机名。比如:.xssz.net可以匹配www.xssz.net或mail.xssz.net。
2. “.”号在字符串后匹配以所提供字符串开头的地址,比如,10.44.可以匹配所有10.44.xxx.xxx的地址。
3. 可以使用n.n.n.n/m.m.m.m的格式来表示net/mask,比如,10.44.72.0/255.255.254.0匹配从10.44.72.0到10.44.73.255的地址。
4. 以“/”号开头的字符串将被看作一个文件处理,它匹配所有在这个文件中列出的主机名或者地址。
5. “@”开头的串将被当作一个NIS组的名字。
6. ALL表示所有的主机,LOCAL匹配所有机器名中不带“.”号的主机,EXCEPT表示排除某些主机。
比如,hosts.allow中有一行,ALL: .edu.cn EXCEPT example.edu.cn表示允许除了主机名叫example.edu.cn 以外的所有.edu.cn域内的机器访问所有的服务。而在hosts.deny中,ALL EXCEPT in.fingerd:192.168.0.0/255.255.255.0则表示禁止192.168.0.1到192.168.0.254的机器访问除了in.fingerd以外的服务。
防火墙的选用和配置
前面介绍了tcpwrappers的详细应用,但是对管理员而言,只有经过Internet的考验才能真正得到直接有效的磨炼和提高。如何分辨和抵挡 Internet上形形色色的信息呢?仅仅 tcpwrappers是不够的,关键是防火墙的选用和配置。配置高效的防火墙是管理员要掌握的十分重要而且非常有效的必修课。在此,防火墙的功能和类型就不介绍了。最主要的是防火墙的构建要量身定制,应从企业自身状况和需求特点来考虑所需要的防火墙解决方案。不同规模、不同类型的企业,其网络保护的要求也存在明显的差异。防火墙是个重要的话题,在这里限于篇幅不可能详细分析每一种配置。有兴趣的朋友可以详见参考资料http://linux-firewall-tools.com/linux/faq/index3.html,这是个很不错的主题。
入侵检测系统
对攻击者来说,端口扫描是入侵主机的必备工作,可以用端口扫描程序扫描服务器的所有端口来收集有用的信息,如哪些端口打开、哪些端口关闭、提供服务的程序版本、操作系统的版本等。下面介绍几种对付端口扫描的工具。
1. PortSentry
PortSentry是一个被设计成实时地发现端口扫描并对端口扫描快速作出反应的检测工具。一旦发现端口扫描,PortSentry做出的反应有:
(1)通过syslog()函数给出一个日志消息;
(2)自动地把对服务器进行端口扫描的主机加到tcp wrappers的/etc/hosts.deny文件中;
(3)本地主机会自动把所有的信息流都重定向到一个不存在的主机;
(4)本地主机用包过滤程序把所有的数据包(来自对其进行端口扫描的主机)都过滤掉。
该软件的安装和使用可按照源码包里的手册进行,也可以参考http://www.linuxsecurity.com/tips/tip-23.html中的介绍,但是这里的下载链接已不能使用,读者可以去rpmfind.net查找下载。简单地介绍一下配置和启动步骤:
(1)配置/usr/psionic/portsentry/portsentry.conf文件
/usr/psionic/portsentry/portsentry.conf是PortSentry的主要配置文件。可以设置需要监听的端口、需要禁止和监控的IP地址等。可以参看PortSentry的README.install文件以获取更多的信息。
(2)配置portsentry.ignore文件
在portsentry.ignore文件中设置希望PortSentry忽略的主机。这个文件至少要包括localhost(127.0.0.1)和本地界面(lo)的IP。
(3)最好改变文件默认的权限:
#chmod 600 /usr/psionic/portsentry/portsentry.conf
#chmod 600 /usr/psionic/portsentry/portsentry.ignore
(4)启动PortSentry
PortSentry程序可以配置在6个不同的模式下运行,但每次启动时只能在一种模式下运行。这些模式是:
◆ portsentry -tcp(基本的端口绑定TCP模式)
◆ portsentry -udp 基本的端口绑定UDP 模式)
◆ portsentry -stcp(秘密的TCP扫描检测)
◆ portsentry -atcp(高级TCP秘密扫描检测)
◆ portsentry -sudp(秘密的UDP扫描检测)
◆ portsentry -audp(高级的秘密UDP扫描检测)
推荐使用最后两种模式检测。建立启动脚本:
# vi /etc/init.d/portsentry
/usr/local/portsentry/portsentry sudp
/usr/local/portsentry/portsentry audp
# chmod a+x ./portsentry(建立启动脚本)
# cd /etc/rc.d/rc3.d/ ; ln -s ../init.d/portsentry S60portsentry(建立软链接启动)
2. chkrootkit
另一个有用的工具是chkrootkit。chkrootkit是设计用来检查许多广为人知的rootkit(一组包括常用木马程序的套件,以方便 cracker攻入主机时, 在受害主机上顺利地编译和安装特洛伊木马程序)。在chkrootkit的网站上会公布最新的rootkit列表。
配置chkrookit非常简单:先从http://www.chkrootkit.com下载源代码,解开软件包,在文件被解开的路径里敲入make。完成后,chkrootkit就随时侯命了。下面是在机器上chkrootkit的一个输出的例子:
# ./chkrootkit
Checking `su'... not infected
Checking `ifconfig'... not infected
Checking `inetd'... not tested
Checking `inetdconf'... not found
Checking `identd'... not infected
Checking `init'... not infected
Checking `killall'... not infected
Checking `login'... not infected
Checking `ls'... not infected
Checking `lsof'... not infected
Checking `mail'... not infected
Checking `mingetty'... not infected
Checking `netstat'... not infected
Checking `named'... not infected
Checking `passwd'... not infected
[...]
由上可以看到,系统中重要的一些命令并没有被改变。chkrootkit是一个很不错的实用工具,它可以进一步让我们放心:机器目前是安全的。
3.secheck
个人推荐一个比较好的检测工具secheck,这个软件安装简单,检测范围广,记录文件条目简明,资料详细。它可以检测开放端口列表、登录用户、磁盘空间情况;检查UID和GID为0的非root用户、弱口令用户、正在运行的系统进程、su root的用户;检测有SUID和SGID标识的命令,以及相关password、shadow、xinetd.conf、.rhosts文件的变化等。建议配合crontab做定时检查,命令如下(每隔一小时做一次检查):
00 * * * * /usr/local/etc/secheck/secheck
可以从http://twtelecom.dl.sourceforge.net/secheck/secheck-0.03.tgz下载感受一下。
灾难恢复
尽管已经采用了许多的安全措施来保护主机稳定运行,但是遇到一些意外情况,如停电、硬件故障或地震等仍有可能发生系统崩溃事件。要想在最短时间内恢复系统,必须事先做好备份工作。
在进行备份之前,首先要选择合适的备份策略,包括何时需要备份,以及出现故障时进行恢复的方式。通常使用的备份方式有三种:
1.完全备份
每隔一定时间就对系统进行一次全面的备份,这样在备份间隔期间出现数据丢失等问题,可以使用上一次的备份数据恢复到前次备份时的数据状况。
2.增量备份
首先进行一次完全备份,然后每隔一个较短时间进行一次备份,但仅备份在这个期间更改的内容。这样一旦发生数据丢失,首先恢复到前一个完全备份,然后按日期逐个恢复每天的备份,就能恢复到前一天的情况。这种备份方法比较经济。
3.累计备份
这种备份方法与增量备份相似,首先每月进行一次完全备份,然后备份从上次进行完全备份后更改的全部数据文件。一旦发生数据丢失,使用一个完全备份和一个累计备份就可以恢复故障以前的状态。累计备份只需两次恢复,因此它的恢复工作相对简单。
备份内容 工作量 恢复步骤 恢复速度 优缺点
完全备份 全部内容 大,慢 一次操作 很快 占用空间大,恢复快
增量备份 每次修改后的单个内容 小,很快 多次操作 中 空间小,恢复麻烦
累计备份 每次修改后的所有内容 中,快 二次操作 快 空间较小,恢复快
增量备份和累计备份都能以比较经济的方式对系统进行备份。如果系统数据更新不是太频繁的话,可以选用累计备份。如果系统数据更新太快,使每个备份周期后的几次累计备份的数据量相当大,这时候可以考虑增量备份或混用累计备份和增量备份的方式,或者缩短备份周期。下面是一个有效的备份方式供参考。
假设备份介质为支持热插拔的硬盘,挂接在/backup目录下:
# tar zcvf /backup/bp_full.tar.gz /*(先做一个完全备份)
# find / -mtime -7 -print > /tmp/filelist(找出7天内修改过的文件)
# tar -c -T /tmp/filelist -f /backup/bp_add.tar.gz(每隔7天做增量备份)
其它建议和技巧
1.用密码保护单用户模式。
# vi /etc/lilo.conf
restricted
password="I am admin"
2.修改/etc/inittab文件。
# ca::ctrlaltdel:/sbin/shutdown -t3 -r now
#表示取消Alt+Ctrl+Delete重启机器
3.删除登录信息(不显示内核版本,主机名,发行版本号及一些后台进程的版本号),这样可以从一定程度上防止别有用心的探测。
# cat /dev/null > /etc/issue
# cat /dev/null > /etc/issue.net
# cat /dev/null > /etc/motd
4.设置密码属性,包括有效时间(-e)、失效时间、警告时间(-w)等。修改缺省的密码长度。
# vi /etc/login.defs
PASS_MAX_DAYS 99999(设置密码有效期限)
PASS_MIN_DAYS 0(设置修改密码的最少时间段)
PASS_MIN_LEN 5(修改密码设置的长度)
PASS_WARN_AGE 7(修改改变密码的告警时间)
修改为:
PASS_MAX_DAYS 30 (30天后必须重新设置)
PASS_MIN_LEN 8 (密码长度不得少于8位)
5.默认账号的管理。查看/etc/passwd 文件,删除多余的账号,检查有没有除root外UID、GID为0的其它非法用户。
6.如果正在接手的是一个新的服务器,那么对原先的配置必须有深刻的了解。要删除一些旧的系统账户应注意以下问题:
(1) 删除用户与其home目录
# userdel -r good
(2) 删除用户未接收的邮件
# rm /var/spool/mail/good
(3) 删除由此用户在后台执行的程序
# ps -aux|grep "good"
# kill PID
(4) 删除crontab 任务
# crontab -l good
# crontab -d good
7.应该取消普通用户的控制台访问权限,比如shutdown、reboot、halt等命令。
# rm -f /etc/security/console.apps/*
*表示要注销的程序名,如halt、shutdown
8.修改/etc/profile文件中的“HISTFILESIZE”和“HISTSIZE”行,确定所有用户的.bash_history文件中可以保存的旧命令条数。编辑profile文件(vi /etc/profile),把下面这行改为:
HISTFILESIZE=30
HISTSIZE=30
表示每个用户的.bash_history文件只可以保存30条旧命令。
9.编辑.bash_logout文件。
# vi /etc/skel/.bash_logou(添加下面这行)
# rm -f $HOME/.bash_history
这样,当用户每次注销时,.bash_history文件自动被删除。