当前位置:Linux教程 - Linux - 熟悉Linux系统的安全和优化

熟悉Linux系统的安全和优化

Linux的安全

概述

UNIX的系统安全和系统管理员有很大的关系。安装越多的服务,越容易导致系统的安全漏洞。一些其它的操作系统,如:SCO,实际上更容易有安全漏洞,因为,为了更加“用户友好”,这些操作系统集成了更多的服务。
Linux本身是稳定和安全的,但是它可以以不同的形式发行。在安装Linux时候,最好先最小化安装,然后再加上必要的软件。这样可以减小某个程序出现安全隐患的可能。如果管理得好,Linux可以是最安全的系统。
如果在系统中有隐患存在,在网络上成千上万的自愿者就会指出隐患,并给出修正。大的公司,比如:商业软件公司,只能把有限的人力用于解决这方面的问题。把问题都公开出来,对它们来说可能没有什么好处,而且通过正规的发行和升级渠道,一个小小修正到用户手中都要很长的时间。也许这些修正会以补丁的方式出现,但是商业软件的系统管理员都倾向于使用现成的软件,而且自以为这些软件都是很专业的。
在编程的时候随时可能发生错误,但是,当有上万个人在看程序的源代码,这些错误就能很快地被发现。现在全球共有一千二百万的Linux拷贝,想想看,这是一种什么情况。如果系统有安全漏洞,很容易就被某个人发现了。
这一章将讨论一些保护服务器安全的一般方法。我们假定这台服务器是连在Internet上的。在通常情况下,有些服务,如:NFS、Samba、Imap和Pop只是供内部用户使用的。当然,也可以把这台服务器和外界隔离,这样就可以简单地避免外部的入侵。但是这没有什么实际意义,我们下面要介绍的是如何避免来自外部的和内部的攻击。

1. 基础知识
尽量少让外人知道有关系统的信息。有时候简单地用finger程序就能知道不少系统信息,比如:有多少用户、管理员什么时候登录、什么时候工作、他们是谁、谁现在在用这个系统以及其它有利于黑客猜出用户口令的信息。你可以用一个强大的finger daemon和tcpd限制可以连接到服务器的用户以及他们可以知道的有关系统的信息。但是,最好还是把finger软件包卸载掉。
日志是了解Linux系统运行情况的唯一方法。当然,这是以黑客没有破坏日志文件为前提的,但是这种情况很少见。把所有的连接都记录下来,可以发现攻击者和他们试图进行的攻击。如果你看不懂日志,可以向别人请教,一定要学会看懂它们。向别人请教你不懂的东西这是很正常的,不要不好意思。我自己就是从不断地犯错误和改正错误中学到不少知识的。因为骄傲自大不能学到东西和本身的资质差是两码事。看下面的《31. 创建所有重要的日志文件的硬拷贝》,你可以学到怎样管理日志文件的一些有用的知识。
限制系统中SUID的程序。SUID的程序是以root(UNIX世界中的上帝)权限运行的程序。有时候这是必须的,但是在多数情况下这没有必要。因为SUID程序可以做任何root可以做的事,这样有更多的机会出现安全隐患。也许,它们有时候会带来安全隐患,有时候不会,但是黑客可以利用SUID的程序来破坏系统的安全。这就是一种叫exploit的程序的由来。exploit程序是一种利用SUID程序的程序或脚本,具有很大的破坏力,可以用来得到root的shell、获取password文件、读其他人的邮件、删除文件,等等。这方面的知识可以参考《34. 带“s”位的程序》。

2. BIOS安全,设定引导口令
禁止从软盘启动,并且给BIOS加上密码。每次启动的时候都手工检查一下BIOS,这样可以提高系统的安全性。禁止从软盘启动,可以阻止别人用特殊的软盘启动你的计算机;给BIOS加上密码,可以防止有人改变BIOS的参数,比如:允许从硬盘启动或不用输入口令就可以引导计算机。

3. 安全策略
有一点很重要而且必须指出的是:如果你不知道要保护什么,那么更本没有办法保证系统的安全。所以必须要有一个安全策略,基于这样的一个策略才可以决定哪些东西允许别人访问,哪些不允许。如何制定一个安全策略完全依赖于你对于安全的定义。下面的这些问题提供一些一般的指导方针:
* 你怎么定义保密的和敏感的信息?
* 你想重点防范哪些人?
* 远程用户有必要访问你的系统吗?
* 系统中有保密的或敏感的信息吗?
* 如果这些信息被泄露给你的竞争者和外面的人有什么后果?
* 口令和加密能够提供足够的保护吗?
* 你想访问Internet吗?
* 你允许系统在Internet上有多大的访问量?
* 如果发现系统被黑客入侵了,下一步该怎么做?
这个列表很短,真正的安全策略可能包含比这多得多的内容。可能你要做的第一件是:评估一下你偏执的程度。任何一个安全策略多少都有一定程度的偏执:确定到底在多大程度上相信别人,包括内部的人和外部的人。安全策略必须在允许用户合理地使用可以完成工作所必须的信息和完全禁止用户使用信息之间找到平衡点。这个平衡点就是由系统策略决定的。

4. 口令
这章的Linux安全概要就从口令的安全开始。许多人都把所有的东西保存在计算机上,防止别人查看这些信息的方法就是用口令把计算机保护起来。没有什么东西是绝对安全的。与常识相反的是:无法破解的口令是不存在的。只要给足时间和资源,所有的口令都能用社会工程(译者注:原文是social engineering,找不出更好的翻译,大致的意思是用社会和心理学的知识,而不是用纯粹的技术手段)或强行计算的方法猜出来。
通过社会工程或其它方法获得服务器的口令是最简单和最流行的入侵服务器的方法。决大多数的技术支持人员很容易获得其他用户的口令,因为用户的安全意识很差而且很轻易就相信自己的同事,特别是帮助自己解决问题的人。有很多登记在案的成功入侵就是因为一些别有用心的人利用安全管理上的松懈而获得成功的。有时候,在特定的时间在特定的地点,上级或老板对员工喊话就有可能泄露机密,导致可怕的后果。
因为破解口令是一项很耗时间和资源的工作,所以应该使得口令文件难于破解,这样即使黑客获取了口令文件也不能轻易破解。作为一个系统管理员,自己在每个周末运行一下口令破解程序,是保证系统安全的好方法。这有利于尽早地发现和替换那些很容易被猜出来的口令。而且,还要有一个好的口令检查机制,在用户选择新口令或改变旧口令的时候,来排除那些有安全隐患的口令。那些字典里的单词、或者全是大写或全是小写的以及没有包含数字或特殊字符的字符串是不能用来做口令的。我建议用下面的规则选择有效的口令:
* 口令至少要有6个字符,最好包含一个以上的数字或特殊字符。
* 口令不能太简单,所谓的简单就是很容易猜出来,也就是用自己的名字,电话号码、生日、职业或者其它个人信息作为口令。
* 口令必须是有有效期的,在一段时间之后就要更换口令。
* 口令在这种情况下必须作废或者重新设定:如果发现有人试图猜测你的口令,而且已经试过很多次了。

5. 口令长度
安装完Linux系统之后默认的最小口令长度为5。这就是说一个新的用户可以访问服务器,那么他的口令必须多于5字符。但是这样是不够安全的,最好口令的长度能够大于8。可以强制用户使用8个字符以上的口令。编辑“/etc/login.defs”文件,把最小口令长度由5改成8。找到 PASS_MIN_LEN 5 这一行,改为:PASS_MIN_LEN 8 。“login.defs”是很重要的配置文件。可以在这个文件中设定一些其它的安全策略,比如:口令的有效期。

6. root帐号
“root”帐号是Unix系统中享有特权的帐号。“root”帐号是不受任何限制和制约的。因为系统认为root知道自己在做些什么,而且会按root说的做,不问任何问题。因此,可能会因为敲错了一个命令,导致重要的系统文件被删除。用root帐号的时候,要非常非常小心。因为安全原因,在不是绝对必要的情况下,不要用root帐号登录。特别要注意的是:不在自己的服务器上的时候,千万不要在别的计算机上用“root”登录自己的服务器。这是非常非常非常糟糕的一件事。

7. 加密
加密时要用到密匙,密匙是一个特殊的数字,把密匙和需要加密的信息经过加密算法加密之后,只有知道密匙的人才能把信息读出来。如果所有的计算机主机都在你的控制下,加密当然是一个好方法,但是,如果其中一台“被信任的”主机被黑客控制了,你马上就有危险了。这就不仅仅是用户的帐号和口令有危险了。在通常情况下,加密是用来保证机密信息在系统中传送的安全。如果一台计算机被控制了,那么这些加密信息就会让人知道或是泄密了。有一个好的安全策略,这种危险的可能性会降到最低,但是如果某台主机的密匙被泄露出去,那么危险始终存在。使用如:OpenSSL、SSH和MD5这样的加密技术是非常有用的,可以参考后面的章节。

8. “/etc/exports""文件
如果通过NFS把文件共享出来,那么一定要配置“/etc/exports”文件,使得访问限制尽可能的严。这就是说,不要用通配符,不允许对根目录有写权限,而且尽可能只给只读权限。编辑exports文件(vi /etc/exports)加入:
例如:
/dir/to/export host1.mydomain.com(ro,root_squash)
/dir/to/export host2.mydomain.com(ro,root_squash)
“/dir/to/export”是你想共享出来的目录,host.mydomain.com是允许访问这个目录的计算机。ro代表只读,root_squash代表不允许对根目录进行写操作。使这些改变生效,你还要运行“/usr/sbin/exportfs -a”命令。
注意:在服务器上装NFS服务是会有安全隐患的,就我个人而言,不建议你使用NFS。

9. 禁止使用控制台程序
一个最简单而且最常用的保证系统安全的方法就是禁止使用所有的控制台程序,如:shutdown和halt。可以运行下面的命令来实现:
[root@deep]# rm -f /etc/security/console.apps/servicename
这里servicename是你要禁止的控制台程序名。除非你使用xdm,否则不要把xserver文件删掉,如果这样除了root之外,没有人可以启动X服务器了。(如果使用xdm启动X服务器,这时root是唯一需要启动X服务器的用户,这才有必要把xserver文件删掉)。例如:
[root@deep]# rm -f /etc/security/console.apps/halt
[root@deep]# rm -f /etc/security/console.apps/poweroff
[root@deep]# rm -f /etc/security/console.apps/reboot
[root@deep]# rm -f /etc/security/console.apps/shutdown
[root@deep]# rm -f /etc/security/console.apps/xserver (如果删除,只有root可以启动X).
这些命令就可以禁止所有的控制台程序:halt、poweroff、reboot和shutdown。记住,只有装了Xwindow,删除xerver文件才会有效果。
注意:根据我们前一章的介绍安装服务器,Xwindow是没有安装上的,上面说的那些文件可能不会出现在“/etc/security”目录下的,如果这样就可以不管这一节介绍的方法。

10. 禁止控制台的访问
为了禁止所有的控制台访问,包括程序和文件,请在“/etc/pam.d/”目录下的所有文件中,给那些包含pam_console.so的行加上注释。这一步是上一章《禁止使用控制台程序》的延续。下面的脚本可以自动完成这项工作。转成root身份,创建disabling.sh脚本文件(touch disabling.sh),接着加入下面这些行:
# !/bin/sh
cd /etc/pam.d
for i in * ; do
sed ''/[^#].*pam_console.so/s/^/#/'' < $i > foo && mv foo $i
done
用下面的命令使脚本有可执行的权限,并执行它:
[root@deep]# chmod 700 disabling.sh
[root@deep]# ./disabling.sh
这样“/etc/pam.d”目录下所有文件中包含“pam_console.so”的行都被加上注释。这个脚本运行完之后,可以把它从系统中删掉。

11. “/etc/inetd.conf”文件
inetd,也叫作“超级服务器”,根据网络请求装入网络程序。“inetd.conf”文件告诉inetd监听哪些网络端口,为每个端口启动哪个服务。把Linux系统放在任何的网络环境中,第一件要做的事就是了解一下服务器到底要提供哪些服务。不需要的那些服务应该被禁止掉,最好卸载掉,这样黑客就少了一些攻击系统的机会。查看“/etc/inetd.conf”文件,了解一下inetd提供哪些服务。用加上注释的方法(在一行的开头加上#号),禁止任何不需要的服务,再给inetd进程发一个SIGHUP信号。
第一步:把文件的许可权限改成600。
[root@deep]# chmod 600 /etc/inetd.conf
第二步:确信文件的所有者是root。
[root@deep]# stat /etc/inetd.conf
这个命令显示出来的信息应该是:
File: ""/etc/inetd.conf""
Size: 2869 Filetype: Regular File
Mode: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root)
Device: 8,6 Inode: 18219 Links: 1
Access: Wed Sep 22 16:24:16 1999(00000.00:10:44)
Modify: Mon Sep 20 10:22:44 1999(00002.06:12:16)
Change: Mon Sep 20 10:22:44 1999(00002.06:12:16)
第三步:编辑inetd.conf文件(vi /etc/inetd.conf),禁止所有不需要的服务,如:ftp、 telnet、 shell、 login、 exec、talk、ntalk、 imap、 pop-2、pop-3、finger、auth,等等。如果你觉得某些服务有用,可以不禁止这些服务。但是,把这些服务禁止掉,系统受攻击的可能性就会小很多。改变后的inetd.conf文件的内容如下面所示:
# To re-read this file after changes, just do a ''killall -HUP inetd''
#
#echo stream tcp nowait root internal
#echo dgram udp wait root internal
#discard stream tcp nowait root internal
#discard dgram udp wait root internal
#daytime stream tcp nowait root internal
#daytime dgram udp wait root internal
#chargen stream tcp nowait root internal
#chargen dgram udp wait root internal
#time stream tcp nowait root internal
#time dgram udp wait root internal
#
# These are standard services.
#
#ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -a
#telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd
#
# Shell, login, exec, comsat and talk are BSD protocols.
#
#shell stream tcp nowait root /usr/sbin/tcpd in.rshd
#login stream tcp nowait root /usr/sbin/tcpd in.rlogind
#exec stream tcp nowait root /usr/sbin/tcpd in.rexecd
#comsat dgram udp wait root /usr/sbin/tcpd in.comsat
#talk dgram udp wait root /usr/sbin/tcpd in.talkd
#ntalk dgram udp wait root /usr/sbin/tcpd in.ntalkd
#dtalk stream tcp wait nobody /usr/sbin/tcpd in.dtalkd
#
# Pop and imap mail services et al
#
#pop-2 stream tcp nowait root /usr/sbin/tcpd ipop2d
#pop-3 stream tcp nowait root /usr/sbin/tcpd ipop3d
#imap stream tcp nowait root /usr/sbin/tcpd imapd
#
# The Internet UUCP service.
#
#uucp stream tcp nowait uucp /usr/sbin/tcpd /usr/lib/uucp/uucico -l
#
# Tftp service is provided primarily for booting. Most sites
# run this only on machines acting as ""boot servers."" Do not uncomment
# this unless you *need* it.
#
#tftp dgram udp wait root /usr/sbin/tcpd in.tftpd
#bootps dgram udp wait root /usr/sbin/tcpd bootpd
#
# Finger, systat and netstat give out user information which may be
# valuable to potential ""system crackers."" Many sites choose to disable
# some or all of these services to improve security.
#
#finger stream tcp nowait root /usr/sbin/tcpd in.fingerd
#cfinger stream tcp nowait root /usr/sbin/tcpd in.cfingerd
#systat stream tcp nowait guest /usr/sbin/tcpd /bin/ps -auwwx
#netstat stream tcp nowait guest /usr/sbin/tcpd /bin/netstat -f inet
#
# Authentication
#
#auth stream tcp nowait nobody /usr/sbin/in.identd in.identd -l -e -o
#
# End of inetd.conf
注意:改变了inetd.conf文件之后,别忘了给inetd进程发一个SIGHUP信号(killall -HUP inetd)。
[root@deep /root]# killall -HUP inetd
第四步:
为了保证“inetd.conf”文件的安全,可以用chattr命令把它设成不可改变。把文件设成不可改变的只要用下面的命令:
[root@deep]# chattr +i /etc/inetd.conf
这样可以避免“inetd.conf”文件的任何改变(意外或是别的原因)。一个有“i”属性的文件是不能被改动的:不能删除或重命名,不能创建这个文件的连接,不能往这个文件里写数据。只有系统管理员才能设置和清除这个属性。如果要改变inetd.conf文件,你必须先清除这个不允许改变的标志:
[root@deep]# chattr -i /etc/inetd.conf

12. TCP_WRAPPERS
在默认情况下,RedHat Linux允许所有的服务请求。用TCP_WRAPPERS来保护服务器的安全,使其免受外部的攻击,比想象的要简单和轻松得多。在“/etc/hosts.deny”文件中加入“ALL: ALL@ALL, PARANOID”以禁止所有计算机访问你的服务器,然后在“/etc/hosts.allow”文件中一个一个加入允许访问你的服务器的计算机。这种作法是最安全的。
TCP_WRAPPERS是由两个文件控制的,依次是:/etc/hosts.allow和/etc/hosts.deny。判断是依次进行的,具体的规则如下:
* 如果在在/etc/hosts.allow文件中有匹配的项(daemon, client),那么允许访问;
* 否则,查看/etc/hosts.deny,如果找到匹配的项,那么访问被禁止;
* 否则,访问被允许。
第一步:编辑hosts.deny文件(vi /etc/hosts.deny)加入下面这些行:
Access is denied by default.
# Deny access to everyone.
ALL: ALL@ALL, PARANOID #Matches any host whose name does not match its address, see bellow.
这样做的意思是:所有的服务、访问位置,如果没有被明确地允许,也就是在/etc/hosts.allow中找不到匹配的项,就是被禁止的。
注意:加上“PARANOID”参数之后,如果要在服务器上使用telnet或ftp服务,就要在服务器的“/etc/hosts”文件中加入允许使用telnet和ftp服务的客户端计算机的名字和IP地址。否则,在显示登录提示之前,因为DNS的域名解析,可能要等上几分钟时间。
第二步:编辑hosts.allow文件(vi /etc/hosts.allow)。例如,可以加入下面这些行(被授权访问的计算机要被明确地列出来):
sshd: 208.164.186.1 gate.openarch.com
被授权访问的计算机的IP地址是:208.164.186.1,主机名是:gate.openarch.com,允许使用的服务是:sshd。
第三步:tcpdchk是检查TCP_WAPPERS配置的程序。它检查TCP_WAPPERS的配置,并报告它可以发现的问题或潜在的问题。在所有的配置都完成了之后,请运行tcpdchk程序:
[root@deep]# tcpdchk

13. “/etc/aliases”文件
aliases文件如果管理错误或管理得太粗心了就会造成安全隐患。例如:很多的软件产商都把“decode”这个别名放在aliases文件里。这样做的目的是为了方便通过email传送二进制文件。在发送邮件的时候,用户把二进制文件用“uuencode”转成ASCII文件,然后把结果发给接受端的“decode”。由这个别名让邮件信息通过“/usr/bin/uuencode”程序把二进制文件重新转换成ASCII文件。如果允许“decode”出现在aliases文件中,可以想象将会有什么样的安全隐患。
把定义“decode”这个别名的行从aliases文件中删除。同样的,每一个会运行程序的别名都要好好查看一下,很有可能要把它们删除掉。要使改动生效,还必须运行:
[root@deep]# /usr/bin/newaliases
编辑aliases文件(vi /etc/aliases),删除或注释掉下面这些行:
# Basic system aliases -- these MUST be present.
MAILER-DAEMON: postmaster
postmaster: root
# General redirections for pseudo accounts.
bin: root
daemon: root
#games: root ??remove or comment out.
#ingres: root ??remove or comment out.
nobody: root
#system: root ??remove or comment out.
#toor: root ??remove or comment out.

#uucp: root ??remove or comment out.
# Well-known aliases.
#manager: root ??remove or comment out.
#dumper: root ??remove or comment out.
#operator: root ??remove or comment out.
# trap decode to catch security attacks
#decode: root
# Person who should get root''s mail
#root: marc
别忘了运行“/usr/bin/newaliases”使改变生效。

14. 防止sendmail被没有授权的用户滥用
最新版的sendmail(8.9.3)集成了很强大的防止垃圾邮件(anti-spam)的功能,可以防止邮件服务器被没有授权的用户滥用。要实现这个功能可以通过编辑“/etc/sendmail.cf”文件,改变配置文件以阻止那些发垃圾邮件的人。
编辑sendmail.cf文件(vi /etc/sendmail.cf),把这一行:
O PrivacyOptions=authwarnings
改为:
O PrivacyOptions=authwarnings,noexpn,novrfy
这些改变可以防止发垃圾邮件的人使用sendmail中的“EXPN”和“VRFY”命令。这些命令经常被没有授权的人使用。参考本书sendmail配置这一节以获得更多这方面的信息。
编辑sendmail.cf文件(vi /etc/sendmail.cf),把这一行:
O SmtpGreetingMessage=$j Sendmail $v/$Z; $b
改为:
O SmtpGreetingMessage=$j Sendmail $v/$Z; $b NO UCE C=xx L=xx
这将改变sendmail接受连接时所显示的提示信息。你要把“C=xx L=xx”中的“xx”改成你所在的国家和地区编码。例如:我是这样写的“C=CA L=QC”,代表加拿大,魁北克。这个改变不会对sendmail有什么影响,但是news.admin.net-abuse.email新闻组的人建议这么做,主要是为了预防法律上的问题。

15. 使系统对ping没有反应
防止你的系统对ping请求做出反应,对于网络安全很有好处,因为没人能够ping你的服务器并得到任何反应。TCP/IP协议本身有很多的弱点,黑客可以利用一些技术,把传输正常数据包的通道用来偷偷地传送数据。使你的系统对ping请求没有反应可以把这个危险减到最小。用下面的命令:
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
运行完这个命令后,系统对ping就没有反应了。可以把这一行加到“/etc/rc.d/rc.local”文件中去,这样当系统重新启动的时候,该命令就会自动运行。对ping命令没有反应,至少可以把绝大多数的黑客排除到系统之外,因为黑客不可能知道你的服务器在哪里。重新恢复对ping的响应,可以用下面的命令:
echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all""

16. 不要显示系统提示信息
如果你不想让远程登录的用户看到系统的提示信息,你可以改变“/etc/inetd.conf”文件中的telnet设置:
telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd -h
在末尾加上“-h”参数可以让daemon不显示任何系统信息,只显示登录提示。当然,只有在服务器上装了telnet服务器才有这样做的必要。

17. “/etc/host.conf”文件
Linux用解析器(resolver)库把主机名翻译成IP地址。“/etc/host.conf”文件定义主机名是怎样解析的。“/etc/host.conf”文件中的那些项告诉解析器库用什么服务,以什么顺序解析主机名。
编辑host.conf文件(vi /etc/host.conf)加入下面这些行:
# Lookup names via DNS first then fall back to /etc/hosts.
order bind,hosts
# We have machines with multiple IP addresses.
multi on
# Check for IP address spoofing.
nospoof on
order选项指明的是选择服务的顺序。上面“order bind, hosts”说的是解析器库解析文件名的时候先查询域名服务器,然后再查看“/etc/hosts”文件。因为性能和安全上的原因,最好将解析器库的查找顺序设成先查域名服务器(bind)。当然也要先安装了DNS/BIND软件,否则这样配置根本没有任何作用。
multi选项决定在“/etc/hosts”文件中出现的主机能不能有多个IP地址(多个网络界面)。具有多个IP网络界面的主机被称为具有多个网络界面(multiomed),因为同时有多个IP地址也就意味着这台主机有多个网络界面。例如:网关服务器就有多个IP地址,必须把这个选项设成ON。
nospoof选项指明不允许IP伪装。IP伪装是把自己伪装成别的计算机去欺骗其它的计算机,获得它的信任。这种攻击方法把自己伪装成别的服务器,并且与其它客户机、服务器和大型数据存储系统建立网络连接或其它类型的网络活动。不管对任何类型的服务器,这个选项都要设成ON。

18. 路由协议
路由和路由协议会导致一些问题。IP原路径路由(IP source routing),也就是IP包包含到达底目的地址的详细路径信息,是非常危险的,因为根据RFC 1122规定目的主机必须按原路径返回这样的IP包。如果黑客能够伪造原路径路由的信息包,那么它就能截取返回的信息包,并且欺骗你的计算机,让它觉得正在和它交换信息的是可以信任的主机。我强烈建议你禁止IP原路径路由以避免这个安全漏洞。
用下面的命令在你的服务器上禁止IP原路径路由:
for f in /proc/sys/net/ipv4/conf/*/accept_source_route; do
echo 0 > $f
done
把上面的命令加到“/etc/rc.d/rc.local”文件中去,你就不用在系统重新启动之后再把这些命令敲一遍。注意,上面的命令将禁止所有的网络界面(lo、ethN、pppN,等等)的原路径路由包。如果你打算安装书中介绍的IPCHAINS防火墙,就不必用这些命令了,因为在防火墙的脚本文件中已经包含这些命令了。

19. 使TCP SYN Cookie保护生效
“SYN Attack”是一种拒绝服务(DoS)的攻击方式,会消耗掉系统中的所有资源,迫使服务器重新启动。拒绝服务(这种攻击方式用巨大的信息流来消耗系统的资源,以至于服务器不能够响应正常的连接请求)是很容易被黑客利用的。在2.1系列的内核中,syn cookie只是一个可选项,并没有使其生效。想要使其生效必须用下面的命令:
[root@deep]# echo 1 > /proc/sys/net/ipv4/tcp_syncookies
把这个命令加入“/etc/rc.d/rc.local”文件中,等下次系统重新启动的时候就不必重新敲一遍了。如果打算安装IPCHAINS防火墙,你就没有必要用这个命令,因为它已经包含在防火墙的脚本文件里了。

20. 防火墙
安全问题的另一个解决方案是把计算机主机和内部计算机间的信息传送同外部的网络隔离开,只让内部网络与外部网络之间的信息交流,通过一个安全的网关进行。这样一个网关叫做防火墙,在下面的一些章节我们会用很大的篇幅介绍防火墙。

21. “/etc/services”文件
端口号和标准服务之间的对应关系在RFC 1700 “Assigned Numbers""中有详细的定义。“/etc/services”文件使得服务器和客户端的程序能够把服务的名字转成端口号,这张表在每一台主机上都存在,其文件名是“/etc/services”。只有“root”用户才有权限修改这个文件,而且在通常情况下这个文件是没有必要修改的,因为这个文件中已经包含了常用的服务所对应的端口号。为了提高安全性,我们可以给这个文件加上保护以避免没有经过授权的删除和改变。为了保护这个文件可以用下面的命令:
[root@deep]# chattr +i /etc/services

22. “/etc/securetty”文件
“/etc/securetty”文件允许你规定“root”用户可以从那个TTY设备登录。登录程序(通常是“/bin/login”)需要读取“/etc/securetty”文件。它的格式是:列出来的tty设备都是允许登录的,注释掉或是在这个文件中不存在的都是不允许root登录的。
注释掉(在这一行的开头加上#号)所有你想不让root登录的tty设备。
编辑securetty文件(vi /etc/securetty)象下面一样,注释掉一些行:
tty1
#tty2
#tty3
#tty4
#tty5
#tty6
#tty7
#tty8
上面这样做的意思是只允许root在tty1上登录。我建议只允许root在一个tty设备上登录,如果从其它tty上登录,用“su”命令把身份转成“root”。

23. 特殊的帐号
禁止操作系统中不必要的预置帐号(每次升级或安装完都要检查一下)。Linux系统中就提供这样一些你可能不需要的预置帐号。如果确实不需要这些帐号,就把它们删掉。系统中有越多的帐号,就越容易受到攻击。
我们假定你已经在系统中使用shadow口令。如果不是这样,最好在系统中加上shadow口令的支持,因为这样系统会更安全。如果你是按照上一章介绍的方法安装服务器,那么在“安全验证配置”这一步就已经选上“Enable Shaow Passwords”这个选项了。
* 在系统中删除一个用户可以用这个命令:
[root@deep]# userdel username
* 在系统中删除一个组可以用这个命令:
[root@deep]# groupdel username
第一步
用下面的命令删除一些不必要的用户:
[root@deep]# userdel adm
[root@deep]# userdel lp
[root@deep]# userdel sync
[root@deep]# userdel shutdown
[root@deep]# userdel halt
[root@deep]# userdel news
[root@deep]# userdel uucp
[root@deep]# userdel operator
[root@deep]# userdel games (如果不用X Window服务器,可以删除这个用户)
[root@deep]# userdel gopher
[root@deep]# userdel ftp (如果没安装匿名ftp服务器,可以删除这个用户)
第二步
输入下面的命令删除一些不必要的组:
[root@deep]# groupdel adm
[root@deep]# groupdel lp
[root@deep]# groupdel news
[root@deep]# groupdel uucp
[root@deep]# groupdel games (delete this group if you don''t use X Window Server).
[root@deep]# groupdel dip
[root@deep]# groupdel pppusers
[root@deep]# groupdel popusers (delete this group if you don''t use pop server for email).
[root@deep]# groupdel slipusers
第三步
在系统中加入必要的用户:
* 在系统中添加用户,用这个命令:
[root@deep]# useradd username
* 给系统中的用户添加或改变口令,用这个命令:
[root@deep]# passwd username
例如:
[root@deep]# useradd admin
[root@deep]# passwd admin
这些命令的输出是这样的:
Changing password for user admin
New UNIX password: somepasswd
passwd: all authentication tokens updated successfully
第四步
“不许改变”位可以用来保护文件使其不被意外地删除或重写,也可以防止有些人创建这个文件的符号连接。删除“/etc/passwd”、“/etc/shadow”、“/etc/group”或“/etc/gshadow”都是黑客的攻击方法。
给口令文件和组文件设置不可改变位,可以用下面的命令:
[root@deep]# chattr +i /etc/passwd
[root@deep]# chattr +i /etc/shadow
[root@deep]# chattr +i /etc/group
[root@deep]# chattr +i /etc/gshadow
注意:如果将来要在口令或组文件中增加或删除用户,就必须先清除这些文件的不可改变位,否则就不能做任何改变。如果没有清除这些文件的不可改变位,安装那些会自动在口令文件和组文件中加入新用户的rpm软件包的时候,在安装过程中就会出现出错的提示。

24. 防止任何人都可以用su命令成为root
如果不想任何人都可以用“su”命令成为root或只让某些用户有权使用“su”命令,那么在“/etc/pam.d/su”文件中加入下面两行。我建议尽量限制用户通过“su”命令成为root。
第一步
编辑su文件(vi /etc/pam.d/su)在文件的头部加入下面两行:
auth sufficient /lib/security/pam_rootok.so debug
auth required /lib/security/pam_wheel.so group=wheel
加入这两行之后,“/etc/pam.d/su”文件变为:
#%PAM-1.0
auth sufficient /lib/security/pam_rootok.so debug
auth required /lib/security/pam_wheel.so group=wheel
auth required /lib/security/pam_pwdb.so shadow nullok
account required /lib/security/pam_pwdb.so
password required /lib/security/pam_cracklib.so
password required /lib/security/pam_pwdb.so shadow use_authtok nullok
session required /lib/security/pam_pwdb.so
session optional /lib/security/pam_xauth.so
这两行的意思是只有“wheel”组的成员才能用su命令成为root。注意,“wheel”组是系统中用于这个目的的特殊帐号。不能用别的组名。把这节介绍的方法和《22. “/etc/securetty”文件》中介绍的方法结合起来,可以更好地加强系统的安全性。
第二步
我们在“/etc/pam.d/su”配置文件中定义了“wheel”组,现在介绍一下怎样让一些用户可以用“su”命令成为“root”。下面是一个例子,让admin用户成为“wheel”组的成员,这样就可以用“su”命令成为“root”:
[root@deep]# usermod -G10 admin
“G”是表示用户所在的其它组。“10”是“wheel”组的ID值,“admin”是我们加到“wheel”组的用户。用同样的命令可以让其他的用户可以用su命令成为root。

25. 资源限制
限制用户对系统资源的使用,可以避免拒绝服务(如:创建很多进程、消耗系统的内存,等等)这种攻击方式。这些限制必须在用户登录之前设定。例如,可以用下面的方法对系统中用户加以。
第一步
编辑limits.conf文件(vi /etc/security/limits.conf),加入或改变下面这些行:
* hard core 0
* hard rss 5000
* hard nproc 20
这些行的的意思是:“core 0”表示禁止创建core文件;“nproc 20”把最多进程数限制到20;“rss 5000”表示除了root之外,其他用户都最多只能用5M内存。上面这些都只对登录到系统中的用户有效。通过上面这些限制,就能更好地控制系统中的用户对进程、core文件和内存的使用情况。星号“*”表示的是所有登录到系统中的用户。
第二步
必须编辑“/etc/pam.d/login”文件,在文件末尾加入下面这一行:
session required /lib/security/pam_limits.so
加入这一行后“/etc/pam.d/login”文件是这样的:
#%PAM-1.0
auth required /lib/security/pam_securetty.so
auth required /lib/security/pam_pwdb.so shadow nullok
auth required /lib/security/pam_nologin.so
account required /lib/security/pam_pwdb.so
password required /lib/security/pam_cracklib.so
password required /lib/security/pam_pwdb.so nullok use_authtok md5 shadow
session required /lib/security/pam_pwdb.so
session required /lib/security/pam_limits.so
#session optional /lib/security/pam_console.so

26. 更好地控制mount上的文件系统
可以用一些选项,如:noexec、nodev和nosuid,更好地控制mount上的文件系统,如:“/home”和“/tmp”。这些都在“/etc/fstab”文件中设定。fstab文件包含了各个文件系统的描述信息。如果想知道在这个文件中可以设定哪些选项,请用man命令查看关于mount的帮助。
编辑fstab文件(vi /etc/fstab),并根据需要把这两行:
/dev/sda11 /tmp ext2 defaults 1 2
/dev/sda6 /home ext2 defaults 1 2
改变成:
/dev/sda11 /tmp ext2 nosuid,nodev,noexec 1 2
/dev/sda6 /home ext2 nosuid,nodev 1 2
“nodev”表示不允许在这个文件系统上有字符或特殊的块设备。“nosuid”表示不允许设定文件的suid(set-user-identifier)和sgid(set-group-identifier)许可位。“noexec”表示不允许文件系统上有任何可执行的二进制文件。
注意:上面的例子中,“/dev/sda11”mount到“/tmp”目录上,而“/dev/sd6”mount到“/home”目录上。当然这和你的实际情况会有所不同,这些取决于你是怎么分区的以及用什么样的硬盘,例如:IDE硬盘是hda、hdb,等等,而SCSI硬盘是sda、sdb,等等。

27. 把rpm程序转移到一个安全的地方,并改变默认的访问许可
一旦在Linux服务器上用rpm命令安装完所有需要的软件,最好把rpm程序转移到一个安全的地方,如:软盘或其它你认为安全的地方。因为如果有人入侵了你的服务器,他就不能用rpm命令安装那些有害的软件。当然,如果将来要用rpm安装新的软件,你就要把rpm程序拷回原来的目录。
* 把rpm程序移到软盘上,用下面的命令:
[root@deep]# mount /dev/fd0 /mnt/floppy/
[root@deep]# mv /bin/rpm /mnt/floppy/
[root@deep]# umount /mnt/floppy
注意:千万不要把rpm程序从系统中卸载掉,否则以后就不能重新安装它,因为安装rpm程序或其它软件包本身就要用rpm命令。
还有一点要注意的是,把rpm命令的访问许可从默认的755改成700。这样非root用户就不能使用rpm命令了。特别是考虑到万一在安装完新软件之后忘了把rpm程序移到一个安全的地方,这样做就更有必要了。
* 改变“/bin/rpm”默认的访问权限,用下面这个命令:
[root@deep]# chmod 700 /bin/rpm

28. 登录shell
为了方便重复输入很长的命令,bash shell可以在“~/.bash_history”文件(“~/”是家目录,每个用户都是不一样的)中存500个曾经输入过的命令。每一个有自己帐号的用户,在自己的家目录中,都会有“.bash_history”文件。可能会有这种情况,用户在不该输入口令的地方输入了口令,而输入的口令会在“.bash_history”文件中保存下来。而且“.bash_history”文件越大这种可能性也越大。
在“/etc/profile”文件中HISTFILESIZE和HISTSIZE这两行决定了系统中所有用户的“.bash_history”文件可以保存多少命令。我建议把“/etc/profile”文件中的HISTFILESIZE和HISTSIZE都设成一个比较小的值,如:20。
编辑profile文件(vi /etc/profile),把这些行改成:
HISTFILESIZE=20
HISTSIZE=20
这样每个用户家目录下的“.bash_history”就最多只能存20个命令。如果黑客试图在用户的“~/.bash_history”文件中发现一些口令,他就没有什么机会了。

29. “/etc/lilo.conf”文件
LILO是Linux上一个多功能的引导程序。它可以用于多种文件系统,也可以从软盘或硬盘上引导Linux并装入内核,还可以做为其它操作系统的“引导管理器”。
根(/)文件系统对LILO来说很重要,有下面这两个原因:第一:LILO要告诉内核到那里去找根文件系统;第二:LILO要用到的一些东西,如:引导扇区、“/boot”目录和内核就存放在根文件系统中。引导扇区包括LILO引导程序的第一部分,这个部分在引导阶段的后半部分还要装入更大的引导程序。这两个引导程序通常存在“/boot/boot.b”文件中。内核是由引导程序装入并启动的。在RedHat Linux系统中,内核通常在根目录或“/boot”目录下。
因为LILO对Linux系统非常重要,所以我们要尽可能地保护好它。LILO最重要的配置文件是“/etc”目录下的“lilo.conf”文件。用这个文件我们可以配置或提高LILO程序以及Linux系统的安全性。下面是LILO程序的三个重要的选项设置。
* 加入:timeout=00
这项设置设定LILO在引导默认的系统之前,等候用户输入的时间。 C2安全等级规定这个时间间隔必须设成0,因为多重引导会使系统的安全措施形同虚设。除非想用多重引导,否则最好把这项设成0。
* 加入:restricted
当LILO引导的时候,输入参数linux single,进入单用户(single)模式。因为单用户模式没有口令验证,所以可以在LILO引导时,加上口令保护。“restricted”选项只能和“password”合起来用。注意要给每个内核都要加上口令保护。
* 加入:password=password
用单用户模式启动Linux系统的时候,系统要求用户输入这个口令。口令是大小写敏感的,而且要注意,要让“/etc/lilo.conf”文件,除了root之外,其他用户没有读的权限,这样也就看不到口令了。下面是用“lilo.conf”文件保护LILO的一个具体例子。
第一步
编辑lilo.conf文件(vi /etc/lilo.conf),加上或改变下面介绍的三个设置:
boot=/dev/sda
map=/boot/map
install=/boot/boot.b
prompt
timeout=00 ??change this line to 00.
Default=linux
restricted ??add this line.
password=password ??add this line and put your password.
image=/boot/vmlinuz-2.2.12-20
label=linux
initrd=/boot/initrd-2.2.12-10.img
root=/dev/sda6
read-only
第二步
因为“/etc/lilo.conf”配置文件里,存在没有经过加密的口令,所以只有root才能有读的权限。用下面的命令改变文件的权限:
[root@deep]# chmod 600 /etc/lilo.conf (will be no longer world readable).
第三步
使改变后的“/etc/lilo.conf”配置文件生效:
[root@deep]# /sbin/lilo -v (to update the lilo.conf file).
第四步
为了更安全一点,可以用chattr命令给“lilo.conf”文件加上不可改变的权限。
* 让文件不可改变用下面的命令:
[root@deep]# chattr +i /etc/lilo.conf
这样可以避免“lilo.conf”文件因为意外或其它原因而被改变。如果想要改变“lilo.conf”文件,必须先清除它的不可改变标志。
* 清除不可改变的标记用下面的命令:
[root@deep]# chattr -i /etc/lilo.conf

30. 使Control-Alt-Delete关机键无效
把“/etc/inittab”文件中的一行注释掉可以禁止用Control-Alt-Delete关闭计算机。如果服务器不是放在一个安全的地方,这非常重要。
编辑inittab文件(vi /etc/inittab)把这一行:
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
改为:
#ca::ctrlaltdel:/sbin/shutdown -t3 -r now
用下面的命令使改变生效:
[root@deep]# /sbin/init q

31. 创建所有重要的日志文件的硬拷贝
保证在“/var/log”目录下的不同日志文件的完整性是保证系统安全所要考虑的非常重要的一个方面。如果我们在服务器上已经加上了很多安全措施,黑客还是能够成功入侵,那么日志文件就是我们最后的防范措施。因此,很有必要考虑一下用什么方法才能保证日志文件的完整性。如果服务器上或网络中的其它服务器上已经安装了打印机,就可以把重要的日志文件打印出来。这要求有一个可以连续打印的打印机,并用syslog把所有重要的日志文件传到“/dev/lp0”(打印设备)。黑客可以改变服务器上的文件、程序,等等,但是,把重要的日志文件打印出来之后,他就无能为力了。
例如:
记录下服务器上所有的telnet、mail、引导信息和ssh连接,并打印到连接在这台服务器上的打印机。需要在“/etc/syslog.conf”文件中加入一行。
编辑syslog.conf文件(vi /etc/syslog.conf),在文件末尾加入下面这一行:
authpriv.*;mail.*;local7.*;auth.*;daemon.info /dev/lp0
重新启动syslog daemon使改动生效:
[root@deep]# /etc/rc.d/init.d/syslog restart
又例如:
记录下服务器上所有的telnet、mail、引导信息和ssh连接,并打印到本地网络中其它服务器上连接的打印机,要在这台接收日志文件的服务器的“/etc/syslog.cof”文件中加入一行。如果本地网中没有打印机,可以把所有的日志文件拷贝到别的服务器上,只要忽略下面第一步,把“/dev/lp0”加到其它服务器的“syslog.conf”文件中,直接跳到在其它服务器上设置“-r”参数那一步。把所有日志文件拷贝到其它计算机上,使你可以在一台计算机上管理多台计算机的日志文件,从而简化管理工作。
编辑接收日志文件的服务器(例如:mail.openarch.com)上的syslog.conf文件(vi /etc/syslog.conf),在文件的末尾加入下面这一行:
authpriv.*;mail.*;local7.*;auth.*;daemon.info /dev/lp0
因为syslog daemon的默认配置是拒绝接收来自网络上的信息,我们必须使它能够接收来自网络上的信息,在syslog daemon的脚本文件(指的是接收日志文件的服务器上的脚本文件)中加入下面的“-r”参数。
编辑syslog脚本文件(vi +24 /etc/rc.d/init.d/syslog),把这一行:
daemon syslogd -m 0
改为:
daemon syslogd -r -m 0
重新启动syslog daemon使改动生效:
[root@mail]# /etc/rc.d/init.d/syslog restart
如果接收日志文件的服务器上有防火墙,你可以检查一下防火墙的脚本文件中有没有下面几行(没有就加上):
ipchains -A input -i $EXTERNAL_INTERFACE -p udp
-s $SYSLOG_CLIENT
-d $IPADDR 514 -j ACCEPT
在这个例子中防火墙的脚本文件中定义了EXTERNAL_INTERFACE=""eth0"";
IPADDR=""208.164.186.2"";
SYSLOG_CLIENT=""208.164.168.0/24""
重新启动接收日志文件的服务器上的防火墙,使改动生效:
[root@mail]# /etc/rc.d/init.d/firewall restart
这个防火墙规则允许接收日志文件的服务器接收来自端口514(syslog的端口)的UDP包。关于防火墙的资料可以查看《第七章 网络防火墙》。
最后,编辑一下发送日志文件的服务器上的“syslog.conf”文件(vi /etc/syslog.conf),在末尾加上这一行:
authpriv.*;mail.*;local7.*;auth.*;daemon.info @mail
“mail”是接收日志文件的计算机主机名。如果有人试图黑你的计算机并且威胁把所有重要的系统日志文件都删掉,你就不用怕了,因为你已经打印出来或者在别的地方还有一个拷贝。这样就可以根据这些日志文件分析出黑客在什么地方,然后出理这次入侵事件。
重新启动syslog daemon,使改变生效:
[root@deep]# /etc/rc.d/init.d/syslog restart
同样也要看看发送日志文件的服务器的防火墙的脚本文件中有没有这几行(没有加上);
ipchains -A output -i $EXTERNAL_INTERFACE -p udp
-s $IPADDR 514
-d $SYSLOG_SERVER 514 -j ACCEPT
这里防火墙的脚本文件中定义了:
EXTERNAL_INTERFACE=""eth0""
IPADDR=""208.164.186.1""
SYSLOG_SERVER=""mail.openarch.com""
重新启动防火墙,使改变生效:
[root@deep]# /etc/rc.d/init.d/firewall restart
这个防火墙的规则允许发送日志文件的服务器通过端口514(syslog端口)发送UDP包。关于防火墙的资料可以查看《第七章 网络防火墙》。
注意:千万不要用网关服务器来收集和管理所有的系统日志信息。有关syslogd程序的其它一些参数和策略,可以用man命令查看帮助:syslogd(8)、syslog(2)和syslog.conf(5)。

32. 改变“/etc/rc.d/init.d/”目录下的脚本文件的访问许可
改变启动和停止daemon的脚本文件的权限。
[root@deep]# chmod -R 700 /etc/rc.d/init.d/*
这样只有root可以读、写和执行这个目录下的脚本。我想一般用户没有什么必要知道脚本文件的内容。
注意:如果你安装或升级了一个程序,要用到“/etc/rc.d/init.d/”中system V脚本,不要忘记再检查一下改变和检查这个脚本文件的许可。

33. “/etc/rc.d/rc.local”文件
在默认情况下,当登录装有Linux系统的计算机时,系统会告诉你Linux发行版的名字、版本号、内核版本和服务器名称。这泄露了太多的系统信息。最好只显示一个“Login:”的提示信息。
第一步
编辑“/ect/rc.d/rc.local”文件,在下面这些行的前面加上“#”:
--
# This will overwrite /etc/issue at every boot. So, make any changes you
# want to make to /etc/issue here or you will lose them when you reboot.
#echo """" > /etc/issue
#echo ""$R"" >> /etc/issue
#echo ""Kernel $(uname -r) on $a $(uname -m)"" >> /etc/issue
#
#cp -f /etc/issue /etc/issue.net
#echo >> /etc/issue
--
第二步
删除“/etc”目录下的“issue.net”和“issue”文件:
[root@deep]# rm -f /etc/issue
[root@deep]# rm -f /etc/issue.net
注意:“/etc/issue.net”文件是用户从网络登录计算机时(例如:telnet、SSH),看到的登录提示。同样在“/etc”目录下还有一个“issue”文件,是用户从本地登录时看到的提示。这两个文件都是文本文件,可以根据需要改变。但是,如果想删掉这两个文件,必须向上面介绍的那样把“/etc/rc.d/rc.local”脚本中的那些行注释掉,否则每次重新启动的时候,系统又会重新创建这两个文件。

34. 带“s”位的程序
用ls -l命令列出来的文件,如果文件的权限位中出现“s”,则这些文件的SUID(-rwsr-xr-x)或SGID(-r-xr-sr-x)位被设定了。因为这些程序给执行它的用户一些特权,所以如果不需要用到这些特权,最好把这些程序的“s”位移去。可以用下面这个命令“chmod a -s 文件名”移去相应文件的“s”位。
可以清除“s”位的程序包括但不限于:
1) 重来不用的程序
2) 不希望非root用户运行的程序
3) 偶尔用用,但是不介意先用su命令变为root后再运行。
下面加了星号(*)的程序,我个人认为有必要移去“s”位。注意,系统可能需要一些SUID的程序才能正常运行,所以要千万小心。
* 用下面的命令查找所有带“s”位的程序:
[root@deep]# find / -type f ( -perm -04000 -o -perm -02000 ) -exec ls -lg {} ;
*-rwsr-xr-x 1 root root 35168 Sep 22 23:35 /usr/bin/chage
*-rwsr-xr-x 1 root root 36756 Sep 22 23:35 /usr/bin/gpasswd
*-r-xr-sr-x 1 root tty 6788 Sep 6 18:17 /usr/bin/wall
-rwsr-xr-x 1 root root 33152 Aug 16 16:35 /usr/bin/at
-rwxr-sr-x 1 root man 34656 Sep 13 20:26 /usr/bin/man
-r-s--x--x 1 root root 22312 Sep 25 11:52 /usr/bin/passwd
-rws--x--x 2 root root 518140 Aug 30 23:12 /usr/bin/suidperl
-rws--x--x 2 root root 518140 Aug 30 23:12 /usr/bin/sperl5.00503
-rwxr-sr-x 1 root slocate 24744 Sep 20 10:29 /usr/bin/slocate
*-rws--x--x 1 root root 14024 Sep 9 01:01 /usr/bin/chfn
*-rws--x--x 1 root root 13768 Sep 9 01:01 /usr/bin/chsh
*-rws--x--x 1 root root 5576 Sep 9 01:01 /usr/bin/newgrp
*-rwxr-sr-x 1 root tty 8328 Sep 9 01:01 /usr/bin/write
-rwsr-xr-x 1 root root 21816 Sep 10 16:03 /usr/bin/crontab
*-rwsr-xr-x 1 root root 5896 Nov 23 21:59 /usr/sbin/usernetctl
*-rwsr-xr-x 1 root bin 16488 Jul 2 10:21 /usr/sbin/traceroute
-rwxr-sr-x 1 root utmp 6096 Sep 13 20:11 /usr/sbin/utempter
-rwsr-xr-x 1 root root 14124 Aug 17 22:31 /bin/su
*-rwsr-xr-x 1 root root 53620 Sep 13 20:26 /bin/mount
*-rwsr-xr-x 1 root root 26700 Sep 13 20:26 /bin/umount
*-rwsr-xr-x 1 root root 18228 Sep 10 16:04 /bin/ping
*-rwxr-sr-x 1 root root 3860 Nov 23 21:59 /sbin/netreport
-r-sr-xr-x 1 root root 26309 Oct 11 20:48 /sbin/pwdb_chkpwd
* 用下面的命令禁止上面选出来的SUID的程序:
[root@deep]# chmod a-s /usr/bin/chage
[root@deep]# chmod a-s /usr/bin/gpasswd
[root@deep]# chmod a-s /usr/bin/wall
[root@deep]# chmod a-s /usr/bin/chfn
[root@deep]# chmod a-s /usr/bin/chsh
[root@deep]# chmod a-s /usr/bin/newgrp
[root@deep]# chmod a-s /usr/bin/write
[root@deep]# chmod a-s /usr/sbin/usernetctl
[root@deep]# chmod a-s /usr/sbin/traceroute
[root@deep]# chmod a-s /bin/mount
[root@deep]# chmod a-s /bin/umount
[root@deep]# chmod a-s /bin/ping
[root@deep]# chmod a-s /sbin/netreport
如果你想知道这些程序到底有什么用,可以用man命令查看帮助。
例如:
[root@deep]# man netreport

35. 异常和隐含文件
在系统的每个地方都要查看一下有没有异常和隐含文件(点号是起始字符的,用“ls”命令看不到的文件),因为这些文件可能是隐藏的黑客工具或者其它一些信息(口令破解程序、其它系统的口令文件,等等)。在UNIX下,一个常用的技术就是用一些特殊的名,如:“...”、“.. ”(点点空格)或“..^G”(点点control-G),来隐含文件或目录。用“find”程序可以查找到这些隐含文件。
例如:
[root@deep]# find / -name "".. "" -print -xdev
[root@deep]# find / -name "".*"" -print -xdev | cat -v
同时也要注意象“.xx”和“.mail”这样的文件名的。(这些文件名看起来都很象正常的文件名)

36. 查找所有SUID/SGID位有效的文件
系统中SUID和SGID文件很有可能成为安全隐患,必须被严密监控。因为这些程序都给执行它的用户一些特权,所以要确保危险的SUID程序没有被安装。
黑客常常利用SUID程序,故意留下一个SUID的程序作为下次进入系统的后门。注意系统中所有的SUID和SGID的程序,并跟踪它们,这样你就可以尽早发现入侵者。
用下面的命令查找系统中所有的SUID和SGID程序:
[root@deep]# find / -type f ( -perm -04000 -o -perm -02000 ) -exec ls -lg {} ;
注意:参考《第九章 安全软件》中关于sXid的介绍,sXid可以为你每天自动的完成这项任务,并用email报告结果。

37. 查找任何人都有写权限的文件和目录
如果黑客获得并改变了一些系统文件,这些系统文件就会成为安全漏洞。任何人都有写权限的目录也同样有危险,因为黑客可以根据他们的需要自由地添加或删除文件。在正常情况下有些文件是可写的,包括一些“/dev”目录下的文件和符号连接。
在系统中定位任何人都有写权限的文件和目录用下面的命令:
[root@deep]# find / -type f ( -perm -2 -o -perm -20 ) -exec ls -lg {} ;
[root@deep]# find / -type d ( -perm -2 -o -perm -20 ) -exec ls -ldg {} ;
注意:象Tripware软件这样的文件和目录完整性的检查器能够扫描、管理和方便地发现被改变过的任何人都有写权限的文件。参考《第九章 安全软件》以获得关于Tripware的更多信息。

38. 查找没有主人的文件
发现没有主人的文件就意味着有黑客入侵你的系统了。不能允许没有主人的文件存在。如果在系统中发现了没有主人的文件或目录,先查看它的完整性,如果一切正常,给它一个主人。有时候卸载程序可能会出现一些没有主人的文件或目录,在这种情况下可以把这些文件和目录删除掉。
定位系统中没有主人的文件用下面的命令:
[root@deep]# find / -nouser -o -nogroup
注意:不用管“/dev”目录下的那些文件。

39. 查找“.rhosts”文件
查找“.rhosts”文件是日常管理工作的一部分,因为这些文件不允许在系统中存在。记住,黑客有可能只要有一个帐号就可能入侵整个网络。
可以用下面的命令定位系统中的“.rhosts”文件:
[root@deep]# find /home -name .rhosts
也可以用一个cron任务定期地查看、报告和删除$HOME/.rhosts文件。同时,也必须让用户知道你会经常地进行这种审核。
用root身份在“/etc/cron.daily”目录下,创建“find_rhosts_files”脚本文件(touch /etc/cron.daily/find_rhosts_files),并在脚本文件中加入下面几行:
#!/bin/sh
/usr/bin/find /home -name .rhosts | (cat < This is an automated report of possible existent "".rhosts"" files on the server
deep.openarch.com, generated by the find utility command.
New detected "".rhosts"" files under the ""/home"" directory include:
EOF
cat
) | /bin/mail -s ""Content of .rhosts file audit report"" root
然后,让这个脚本可执行,把所有者和组设置成“root”:
[root@deep]# chmod 755 /etc/cron.daily/find_rhosts_files
[root@deep]# chown 0.0 /etc/cron.daily/find_rhosts_files
每一天都会有一份主题为“Content of .rhosts file audit report”的邮件发给“root”,报告新发现的“.rhosts”文件。

40. 系统已经被黑客控制
如果你确信系统已经被黑客控制,赶快联系CERT(r) Coordination Center或FIRST(Forum of Incident Response and Security Teams)。
电子邮件:[email protected]
CERT热线电话:(+1) 412-268-7090
传真:(+1) 412-268-6989
CERT/CC的人员在工作日回答问题的时间是:8:00 a.m. - 8:00 p.m. EST (GMT -5)/EDT (GMT -4));在其它时间或者节假日他们也接收紧急求救电话。