|
8.6 系统安全控制
8.6.1 安全管理概要
8.6.2 安全检查
8.6.2.1
记帐
8.6.2.2
其它检查命令
8.6.2.3
系统泄密后怎么办?
8.6.4 系统管理员的安全意识
8.6.4.1
保持系统管理员个人的登录安全
8.6.4.2
保持系统安全要点
8.6.5 用户安全要点
安全控制对于一个Linux系统来说非常重要,这一章我们将从系统管理员和系统用户两个角度,讨论有关系统安全的几个常见问题。
8.6.1 安全管理概要
系统的安全管理主要分为四个方面:
(1)防止未授权存取:这是计算机安全最重要的问题,即未被授权使用系统的人进入系统。用户意识、良好的口令管理(由系统管理员和用户双方配合)、登录活动记录和报告、用户和网络活动的周期检查、这些都是防止未授权存取的关键。
(2)防止泄密:这也是计算机安全的一个重要问题。防止已授权或未授权的用户存取相互的重要信息。文件系统查帐,su登录和报告,用户意识,加密都是防止泄密的关键。
(3)防止用户拒绝系统的管理:这一方面的安全应由操作系统来完成。一个系统不应被一个有意试图使用过多资源的用户损害。不幸的是,UNIX不能很好地限制用户对资源的使用,一个用户能够使用文件系统的整个磁盘空间,而UNIX基本不能阻止用户这样做。系统管理员最好用PS命令,记帐程序df和du
周期地检查系统。查出过多占用CUP的进程和大量占用磁盘的文件。
(4)防止丢失系统的完整性:这一安全方面与一个好系统管理员的实际工作(例如:周期地备份文件系统,系统崩溃后运行fsck检查,修复文件系统,当有新用户时,检测该用户是否可能使系统崩溃的软件)和保持一个可靠的操作系统有关(即用户不能经常性地使系统崩溃)。
8.6.2 安全检查
像find和secure这样的程序称为检查程序,它们搜索文件系统,寻找出SUID/ SGID文件,设备文件,任何人可写的系统文件,设有口令的登录用户,具有相同UID
/GID的用户等等。
8.6.2.1 记帐
UNIX记帐软件包可用作安全检查工具,除最后登录时间的记录外,记帐系统还能保存全天运行的所有进程的完整记录,对于一个进程所存贮的信息包括UID,命令名,进程开始执行与结束的时间,CPU时间和实际消耗的时间,该进程是否是root进程,这将有助于系统管理员了解系统中的用户在干什么。
acctcom 命令可以列出一天的帐目表。系统中有多个记帐数据文件,记帐信息保存在文件/usr/adm/pacct*中,/usr/adm/pacct是当前记录文件,/usr/adm/pacctn
是以前的记帐文件(n为整型数)。若有若干个记帐文件要查看,可在acctcom命令中指定文件名: acctcom /usr/adm/pacct?
/usr/adm/pacct 要检查的其中一个问题是:在acctcom的输出中查找一个用户过多的登录过程,若有,则说明可能有人一遍遍地尝试登录,猜测口令,企图非法进入系统。此外,还应查看root进程,除了系统管理员用su命令从终端进入root,系统启动,系统停止时间,以及由init(通常init只启动getty,login,登录shell),cron启动的进程和具有root
SUID许可的命令外,不应当有任何root进程。由记帐系统也可获得有关每个用户的CPU利用率,运行的进程数等统计数据。
8.6.2.2 其它检查命令
*du:报告在层次目录结构(当前工作目录或指定目录起)中各目录占用的磁盘块数,可用于检查用户对文件系统的使用情况。
*df:报告整个文件系统当前的空间使用情况,可用于合理调整磁盘空间的使用和管理。
*ps:检查当前系统中正在运行的所有进程。对于用了大量CPU时间的进程,同时运行了许多进程的用户,运行了很长时间但用了很少CPU时间的用户进程应当深入检查。还可以查出运行了一个无限制循环的后台进程的用户,未注销户头就关终端的用户(一般发生在直接连线的终端)。
*who:可以告诉系统管理员系统中工作的进展情况等等许多信息,检查用户的登录时间,登录终端。
*su:每当用户试图使用su命令进入系统用户时,命令将在/usr/adm/sulog文件中写一条信息,若该文件记录了大量试图用su进入root的无效操作信息,则表明了可能有人企图破译root口令。
*login:在一些系统中,login程序记录了无效的登录企图。每天总有少量的无效登录,若无效登录的次数突然增加了两倍,则表明可能有人企图通过猜测登录名和口令,非法进入系统。
这里最重要的一点是:系统管理员越熟悉自己的用户和用户的工作习惯,就越能快速发现系统中任何不寻常的事件,而不寻常的事件很可能意味着系统已被人窃密。
8.6.2.3 系统泄密后怎么办?
发现有人已经破坏了系统安全的时候,这时系统管理员首先应做的是面对肇事用户。如果该用户所做的事不是蓄意的,而且公司没有关于"破坏安全"的规章,也未造成损坏,则系统管理员只需清理系统,并留心该用户一段时间。如果该用户造成了某些损坏,则应当报告有关人士,并且应尽可能地将系统恢复到原来的状态。
如果肇事者是非授权用户,那就得做最坏的假设了:肇事者已设法成为root 且本系统的文件和程序已经泄密了。系统管理员应当想法查出谁是肇事者,他造成了什么损坏?还应当对整个文件做一次全面的检查,并不只是检查SUID、SGID及设备文件。如果系统安全被一个敌对的用户破坏了,应当采用下面的步骤:
* 关系统,然后重新引导,不要进入多用户方式,进入单用户方式。
* 安装含有本系统原始Linux版本的软盘。
* 将/bin,/usr/bin,/etc,/usr/lib中的文件拷贝到一个暂存目录中。
* 将暂存目录中所有文件的校验和(用原始版本的sum程序拷贝做校验和,不要用/bin中的sum程序做)与系统中所有对就的文件的校验和进行比较,如果有任何差别,要查清差别产生的原因。如果两个校验和不同,是由于安装了新版本的程序,确认是否的确是安装了新版本程序。如果不能找出校验和不同的原因,用暂存目录中的命令替换系统中的原有命令。
* 在确认系统中的命令还未被窜改之前,不要用系统中原命令。用暂存目录中的shell,并将PATH设置为仅在暂存目录中搜索命令。
* 根据暂存目录中所有系统命令的存取许可,检查系统中所有命令的存取许可情况。
* 检查所有系统目录的存取许可,如果用了perms,检查permlist文件是否被篡改过。
* 如果系统UNIX(Linux)的校验和不同于原版的校验和,并且系统管理员从未修改过核心,则应当认为,一个非法者"很能干",从暂存缓冲区重新装入系统。系统管理员可以从逐步增加的文件系统备份中恢复用户的文件,但是在检查备份中的"有趣"文件之前,不能做文件恢复。
* 改变系统中的所有口令,通知用户他们的口令已改变,应找系统管理员得到新口令。
* 当用户来要新口令时,告诉用户发生了一次安全事故,他们应查看自己的文件和目录是否潜伏着危害(如SUID文件,特洛依木马,任何人可写的目录),并报告系统管理员任何异乎寻常的情况。
* 设法查清安全破坏是如何发生的?如果没有肇事者说明,这也许是不可能弄清的。如果能发现肇事者如何进入系统,设法堵住这个安全漏洞。
第一次安装系统时,可以将shell,sum命令,所有文件的校验和存放在安全的介质上(带,软盘,硬盘和任何可以卸下并锁起来的介质)。于是不必再从原版系统盘上重新装入文件,可以安装备份介质,装入shell和sum,将存在上面的校验和与系统中文件的校验和进行比较。系统管理员也许想自己写一个计算校验和的程序,破坏者将不能知道该程序的算法,如果将该程序及校验和保存在盘上,这一方法的保密问题就减小到一个物理的安全问题,即只需将它锁起来。
8.6.3 小系统安全
任何足够小,运行于办公室的Linux系统就是小系统。根据安全观点,使用小系统特别值得注意的有以下几点:
* 小系统的用户比大系统的用户少,通常是很小一组用户,使系统管理员能熟悉每个人,安全问题可以直接地面对面处理。
* 由于小Linux系统管理更简单,可能只需要一个系统管理员,因而维护系统安全的责任只有一个人担负。
* 如果既是用户又是系统管理员,就不能花大量时间考虑系统安全。
* 如果自己拥有系统并且是系统管理员,就可能有权直接将违反规定的用户从系统中删除,而没有几个大系统的管理员能有这种权利。
* 如果自己是系统的唯一用户,则将既是用户又是管理员,维护系统安全的任务就很简单了,只须确保系统中所有登录户头的口令是好的。
* 如果不能将系统锁起来,就把敏感的数据存放在软盘上,把软盘锁起来。
* 即使系统中有若干个用户,但如果系统的终端之间是有线连接,并且用户们保持门上锁,则系统也将是安全的,至少在本组用户内是安全的。
* 小系统通常有可移动的介质(软盘),可用mount命令将其安装到系统上,提供一种安全的方法让用户自己在系统上安装软盘,否则系统管理员要一天到晚地干这些琐碎的安装盘事务。允许用户安装软盘的通常做法是给用户一个SUID程序,该程序基本完成与系统管理员安装用户软盘同样的操作,首先检查软盘上有无SUID/SGID/设备文件,若发现任何奇怪的文件,则拒绝安装该软盘。
* 小系统的系统管理员在使用Linux系统方面常不如大系统管理员有经验,而安全地管理系统需要一定的使用系统的知识。
8.6.4 系统管理员的安全意识
8.6.4.1 保持系统管理员个人的登录安全
若系统管理员的登录口令泄密了,则窃密者离窃取root只有一步之遥了,因为系统管理员经常作为root运行,窃密者非法进入到系统管理员的户头后,将用特洛依木马替换系统管理员的某些程序,系统管理员将作为root运行这些已被替换的程序。正是因为这个原因,在Linux系统中,管理员的户头最常受到攻击。即使su命令通常要在任何都不可读的文件中记录所有想成为root的企图,还可用记帐数据或ps命令识别运行su命令的用户。正因为如此,系统管理员作为
root运行程序时应当特别小心,因为最微小的疏忽也可能"沉船"。下列一些指导规则可使系统管理员驾驶一艘“坚固的船”:
* 不要作为root或以自己的登录户头运行其他用户的程序,首先用su命令进入用户的户头。
* 决不要把当前工作目录排在PATH路径表的前边,那样实际是招引特洛依木马。当系统管理员用su命令进入root时,他的PATH将会改变,就让PATH保持这样,以避免特洛依木马的侵入。
* 敲入/bin/su执行su命令。若有su源码,将其改成必须用全路径名运行(即su要确认argv[0]的头一个字符是"/"才运行)。随着时间的推移,用户和管理员将养成敲/bin/su的习惯。
* 不要未注销户头就离开终端,特别是作为root用户时更不能这样。当系统管理员作为root用户时,命令提示符是"$",这个提示符对某些人来说可能是个红灯标志。
* 不允许root在除控制台外的任何终端登录(这是login的编译时的选项),如果没有login源码,就将登录名root改成别的名,使破坏者不能在root登录名下猜测各种可能的口令,从而非法进入root的户头。
* 经常改变root的口令。
* 确认su命令记下了想运行su企图的记录/usr/adm/sulog,该记录文件的许可方式是600,并属root所有。这是非法者喜欢选择来替换成特洛依木马的文件。
* 不要让某人作为root运行,即使是几分钟,即使是系统管理员在一旁注视着也不行!
8.6.4.2 保持系统安全要点
* 考虑系统中一些关键的薄弱环节:
a. 系统是否有MODEM?电话号码是否公布?
b. 系统是否连接到网络?还有什么系统也连接到该网络?
c. 系统管理员是否使用来源不可靠的程序?
d. 系统管理员是否将重要信息放在系统中?
e. 系统的用户是熟悉系统的还是新手?
f. 用户是否很重视安全?
g. 用户的管理部门是否重视安全?
* 保持系统文件安全的完整性。检查所有系统文件的存取许可,任何具有SUID许可的程序都是非法者想偷换的选择对象。
* 要特别注意设备文件的存取许可。
* 要审查用户目录中具有系统ID/系统小组的SUID/SGID许可的文件。
* 在未检查用户的文件系统的SUID/SGID程序和设备文件之前,不要安装用户的文件系统。
* 将磁盘的备份存放在安全的地方。
* 设置口令时效,如果能存取UNIX的源码,将加密口令和信息移到仅对root可读的文件中,并修改系统的口令处理子程序。这样可增加口令的安全。修改passwd,使passwd能删去口令打头和末尾的数字,然后根据spell词典和/etc/passwd中用户的个人信息,检查用户的新口令,也检查用户新口令中子串等于登录名的情况。如果新口令是spell词典中的单词,或/etc/passwd
中的入口项的某项值,或是登录名的子串,passwd将不允许用户改变口令。
* 记录本系统的用户及其授权使用的系统。
* 查出久未使用的登录户头,并取消该户头。
* 确保没有无口令的登录户头。
* 启动记帐系统。
* 查出不寻常的系统使用情况,如大量的占用磁盘,大量的使用CPU时间,大量的进程,大量的使用su的企图,大量无效的登录,大量的到某一系统的网络传输,奇怪的uucp请求。
* 修改shell,使其等待了一定时间而无任务时终止运行。
* 修改login,使其打印出用户登录的最后时间,三次无效登录后,将通讯线挂起,以便系统管理员能检查出是否有人试图非法进入系统。确保login不让root在除控制台外的任何地方登录。
* 修改su,使得只有root能以过期口令通过su进入某一户头。
* 当安装来源不可靠的软件时,要检查源码和makefile文件,查看特殊的子程序调用或命令。
* 即使是安装来源可靠的软件,也要检查是否有SUID(SGID)程序,确认这些许可的确是必要的。如果可能,不要让这些程序具有系统ID(或组)的SUID
(SGID)许可,而应该建立一个新用户(或给)供该软件运行。
* 如果系统在办公室中,门应上锁,将重要数据保存在软盘上或带上,并锁起来。
* 将secure,perms和任何其它做安全检查的shell程序存取许可置为仅执行,更好的是将这些shell程序存于可拆卸的介质上。
* 记住,只要系统有任何人都可调用的拨号线,系统就不可能真正的安全。系统管理员可以很好地防止系统受到偶然的破坏。但是那些有耐心,有计划,知道自己在干什么的破坏者,对系统直接的有预谋的攻击却常常能成功。
* 如果系统管理员认为系统已经泄密,则应当设法查出肇事者。若肇事者是本系统的用户,与用户的管理部门联系,并检查该用户的文件,查找任何可疑的文件,然后对该用户的登录小心地监督几个星期。如果肇事者不是本系统的用户,可让本公司采取合法的措施,并要求所有的用户改变口令,让用户知道出了安全事故,用户们应当检查自己的文件是否有被窜改的迹象。
如果系统管理员认为系统软件已被更改了,就应当从原版软盘上重装所有系统软件,保持系统安全比道歉更好。
8.6.5 用户安全要点
(1)保持口令的安全
* 不要将口令写下来。
* 不要将口令存于终端功能键或MODEM的字符串存储器中。
* 不要选取显而易见的信息作口令。
* 不要让别人知道。
* 不要交替使用两个口令。
* 不要在不同系统上使用同一口令。
* 不要让人看见自己在输入口令。
(2)不要让自己的文件或目录可被他人写。
* 如果不信任本组用户,umask设置为022。
* 确保自己的。profile除自己外对他人都不可读写。
* 暂存目录最好不用于存放重要文件。
* 确保HOME目录对任何人不可写。
* uucp传输的文件应加密,并尽快私人化。
(3)若不想要其他用户读自己的文件或目录,就要使自己的文件和目录不允许任何人读。
* umask设置为006/007。
* 若不允许同组用户存取自己的文件和目录,umask设置为077。
* 暂存文件按当前umask设置,存放重要数据到暂存文件的程序,就被写成能确保暂存文件对其他用户不可读。
* 确保HOME目录对每个用户不可读。
(4)不要写SUID/SGID程序。
(5)小心地拷贝和移文件。
* cp拷贝文件时,记住目的文件的许可方式将和文件相同,包括SUID/SGID许可在内,如目的文件已存在,则目的文件的存取许可和所有者均不变。
* mv移文件时,记住目的文件的许可方式将和文件相同,包括SUID/SGID许可在内,若在同一文件系统内移文件,目的文件的所有者和小组都不变,否则,目的文件的所有者和小组将设置成本用户的有效UID和GID。
* 小心使用cpio命令,它能复盖不在本用户当前目录结构中的文件,可用t选项首先列出要被拷贝的文件。
(6)删除一个SUID/SGID程序时,先检查该程序的链接数,如有多个链,则将存取许可方式改为000,然后再删除该程序,或先写空该程序再删除,也可将该程序的i结点号给系统管理员去查找其他链。
(7)用crypt加密不愿让任何用户(包括超级用户)看的文件。
* 不要将关键词做为命令变量。
* 用ed -x或vi -x编辑加密文件。
(8)除了信任的用户外,不要运行其他用户的程序。
(9)在自己的PATH中,将系统目录放在前面。
(10)不要离开自己登录的终端。
(11)若有智能终端,当心来自其他用户,包括write命令,mail命令和其他用户文件的信息中有换码序列。
(12)用CTRL+D或exit退出后,在断开与系统的联接前等待看到login:提示。
(13)注意cu版本。
* 不要用cu调用安全性更强的系统。
* 除非确信cu不会被诱骗去发送文件,否则不要用cu调用安全性较弱的系统。

谈谈您的看法
|