本文从系统管理员的角度讨论安全问题.系统管理员是管理系统的人:启动系统,中止系统运行,安装新软件,增长新用户,删除老用户,以及完成保持系统发展和运行的平常事务工做. 1.安全管理 安全管理主要分为四个方面: (1)防止未受权存取:这是计算机安全最重要的问题:未被使用系统的人进入系统.用户意识,良好的口令管理(由系统管理员和用户双方配合),登陆活动记录和报告,用户和网络活动的周期检查,这些都是防止未受权存取的关键. (2)防止泄密:这也是计算机安全的一个重要问题.防止已受权或未受权的用户相互存取相互的重要信息.文件系统查账,su登陆和报告,用户意识,加密都是防止泄密的关键. (3)防止用户拒绝系统的管理:这一方面的安全应由操做系统来完成.一个系统不该被一个有意试图使用过多资源的用户损害.不幸的是,UNIX不能很好地限制用户对资源的使用,一个用户可以使用文件系统的整个磁盘空间,而 UNIX基本不能阻止用户这样作.系统管理员最好用PS命令,记账程序df和du周期地检查系统.查出过多占用CUP的进程和大量占用磁盘的文件. (4)防止丢失系统的完整性:这一安全方面与一个好系统管理员的实际工做(例如:周期地备份文件系统,系统崩溃后运行fsck检查,修复文件系统,当有新用户时,检测该用户是否可能使系统崩溃的软件)和保持一个可靠的操做系 统有关(即用户不能常常性地使系统崩溃). 本文其他部分主要涉及前两个问题,第三个问题在"安全查账"一节讨论. 2.超级用户 一些系统管理命令只能由超级用户运行.超级用户拥有其余用户所没有的特权,超级用户无论文件存取许可方式如何,均可以读,写任何文件,运行任何程序.系统管理员一般使用命令: /bin/su 或以 root 进入系统从而成为超级用户.在后面文章中以#表示应敲入必须由超级用户运行的命令,用$表示应敲入由全部其余用户运行的命令. 3.文件系统安全 (1)UNIX文件系统概述 UNIX文件系统是UNIX系统的心脏部分,提供了层次结构的目录和文件.文件系统将磁盘空间划分为每1024个字节一组,称为(block)(也有用512字节为一块的,如:SCO XENIX).编号从0到整个磁盘的最大块数.所有块可划分为四个部分,块0称为引导块,文件系统不用该块;块1称为专用块,专用块含有许多信息,其中有磁盘大小和所有块的其它两部分的大小.从块2开始是i节点表,i节点表中含有i节点,表的块数是可变的,后面将作讨论.i节点表以后是空闲存储块(数据存储块),可用于存放文件内容.文件的逻辑结构和物理结构是十分不一样的,逻辑结构是用户敲入cat命令后所看到的文件,用户可获得表示文件内容的字符流.物理结构是文件实际上如何存放在磁盘上的存储格式.用户认为本身的文件是边疆的字符流,但实际上文件可能并非以边疆的方式存放在磁盘上的,长于一块的文件一般将分散地存放在盘上.然而当用户存取文件时,UNIX文件系统将以正确的顺序取各块,给用户提供文件的逻辑结构. 固然,在UNIX系统的某处必定会有一个表,告诉文件系统如何将物理结构转换为逻辑结构.这就涉及到i节点了.i节点是一个64字节长的表,含有有关一个文件的信息,其中有文件大小,文件全部者,文件存取许可方式,以及文件为普通文件,目录文件仍是特别文件等.在i节点中最重要的一项是磁盘地址表.该表中有13个块号.前10个块号是文件前10块的存放地址.这10个块号能给出一个至多10块长的文件的逻辑结构,文件将以块号在磁盘地址表中出现的顺序依次取相应的块.当文件长于10块时又怎样呢?磁盘地址表中的第十一项给出一个块号,这个块号指出的块中含有256个块号,至此,这种方法知足了至多长于266块的文件(272,384字节).若是文件大于266块,磁盘地址表的第十二项给出一个块号,这个块号指出的块中含有256个块号,这256个块号的每个块号又指出一块,块中含256个块号,这些块号才用于取文件的内容.磁盘地址中和第十三项索引寻址方式与第十二项相似,只是多一级间接索引.这样,在UNIX系统中,文件的最大长度是16,842,762块,即17,246,988,288字节,有幸是是UNIX系统对文件的最大长度(通常为1到2M字节)加了更实际的限制,使用户不会无心中创建一个用完整个磁盘窨全部块的文件. 文件系统将文件名转换为i节点的方法实际上至关简单.一个目录其实是一个含有目录表的文件:对于目录中的每一个文件,在目录表中有一个入口项,入口项中含有文件名和与文件相应的i节点号.当用户敲入cat xxx时,文件系统就在当前目录表中查找名为xxx的入口项,获得与文件xxx相应的i节点号,而后开始取含有文件xxx的内容的块. (2)设备文件 UNIX系统与边在本系统上的各类设备之间的通信,经过特别文件来实现, 就程序而言,磁盘是文件,MODEM是文件,甚至内存也是文件.全部链接到系统上的设备都在/dev目录中有一个文件与其对应.当在这些文件上执行I/O操做时,由UNIX系统将I/O操做转换成实际设备的动做.例如,文件/dev/mem是系统的内存,若是cat这个文件,其实是在终端显示系统的内存.为了安全起见,这个文件对普通用户是不可读的.由于在任一给定时间,内存区可能含有用户登陆口令或运行程序的口令,某部分文件的编辑缓冲区,缓冲区可能含有用ed -x命令解密后的文本,以及用户不肯让其余人存取的种种信息. 在/dev中的文件一般称为设备文件,用ls /dev命令能够看看系统中的一些设备: acuo 呼叫自动拨号器 console 系统控制台 dsknn 块方式操做磁盘分区 kmem 核心内存 mem 内存 lp 打印机 mto 块方式操做磁带 rdsknn 流方式操做的磁盘分区 rmto 流方式操做的磁带 swap 交换区 syscon 系统终端 ttynn 终端口 x25 网络端口 等等 (3)/etc/mknod命令 用于创建设备文件.只有root能使用这个命令创建设备文件.其参数是文件名,字母c或b分别表明字符特别文件或块特别文件,主设备号,次设备号.块特别文件是像磁带,磁盘这样一些以块为单位存取数据的设备.字符特别文件是如像终端,打印机,MODEM,或者其它任何与系统通信时,一次传输一个字符的设备,包括模仿对磁盘进行字符方式存取的磁盘驱动器.主设备号指定了系统子程序(设备驱动程序),当在设备上执行I/O时,系统将调用这个驱动程序.调用设备驱动程序时,次设备号将传递给该驱动程序(次设备规定具体的磁盘驱 动器,带驱动器,信号线编号,或磁盘分区).每种类型的设备通常都有本身的设备驱动程序.文件系统将主设备号和次设备号存放在i节点中的磁盘地址表内,因此没有磁盘空间分配给设备文件(除i节点自己占用的磁盘区外).当程序试图在设备文件上执行I/O操做时,系统识别出该文件是一个特别文件,并调用由主设备号指定的设备驱动程序,次设备号做为调用设备驱动程序的参数. (4)安全考虑 将设备处理成文件,使得UNIX程序独立于设备,即程序没必要必定要了解正使用的设备的任何特性,存取设备也不须要记录长度,块大小,传输速度,网络协议等这样一些信息,全部烦人的细节由设备驱动程序去关心考虑,要存取设备,程序只须打开设备文件,而后做为普通的UNIX文件来使用.从安全的观点来看这样处理很好,由于任何设备上进行的I/O操做只通过了少许的渠道(即设备文件).用户不能直接地存取设备.因此若是正确地设置了磁盘分区的存取许可,用户就只能经过UNIX文件系统存取磁盘.文件系统有内部安全机制(文件许可).不幸的是,若是磁盘分区设备得不正确,任何用户都可以写一个程序读磁盘分区中的每一个文件,做法很简单:读一i节点,而后以磁盘地址表中块号出现的顺序,依次读这些块号指出的存有文件内容的块.故除了root之外,决不要使盘分区对任何人可写.由于全部者,文件存取许可方式这样一些信息存放于i节点中,任何人只要具备已安装分区的写许可,就能设置任何文件的SUID许可,而无论文件的全部者是谁,也没必要用chmod()命令,还可避过系统创建的安全检查.以上所述对内存文件mem,kmem和对换文件swap也是同样的.这些文件含有用户信息,一个"耐心"的程序能够将用户信息提取出来.要避免磁盘分区(以及其它设备)可读可写,应当在创建设备文件前先用umask命令设置文件创建屏蔽值.通常状况下,UNIX系统上的终端口对任何人都是可写的,从而使用户能够用write命令发送信息.虽然write命令易引发安全方面的问题,但大多数用户以为用write获得其余用户的信息很方便,因此系统将终端设备的存取许可设置成对全部用户可写./dev目录应当是755存取许可方式,且属root全部.不容许除root外的任何用户读或写盘分区的原则有一例外,即一些程序(一般是数据库系统)要求对磁盘分区直接存取,解决这个问题的经验的盘分区应当由这种程序专用(不安装文件系统),并且应当告知使用这种程序的用户,文件安全保护将由程序本身而不是UNIX文件系统完成. (5)find命令 find命令用于搜索目录树,并对目录树上的全部文件执行某种操做,参数是目录名表(指出从哪些起点开始搜索),还可给出一个或多个选项,规定对每一个文件执行什么操做. find . -print 将列出当前工做目录下的目录树的每个文件. find / -user bob -print 将列出在系统中可找到的属于bob用户的全部文件. find /usr/bob -perm 666 -print 将列出/usr/bob目录树下全部存取许可为666的文件.若将666改成-666则将列出全部具备包含了666在内的存取许可方式的文件(如777). find /usr/bob -type b -print 将列出/usr/bob目录树下全部块特别文件(c为字符特别文件). find / -user root -perm -4000 -exec ls -l {} \; 是一个较复杂一点的命令,-exec COMMAND \;容许对所找到的每一个文件运行指定的命令COMMAND.若COMMAND中含有{},则{}将由find所找到的文件名替换.COMMAND必须以\;结束. 以上举例介绍find的用法,各选项可组合使用以达到更强的功能. (6)secure程序 系统管理员应当作一个程序以按期检查系统中的各个系统文件,包括检查设备文件和SUID,SGID程序,尤为要注意检查SUID,SGID程序,检查/etc/passwd和/etc/group文件,寻找久未登陆的户头和校验各重要文件是否被修改. (源程序清单将在从此发表) (7)ncheck命令 用于检查文件系统,只用一个磁盘分区名做为参数,将列出i节点号及相应的文件名.i节点相同的文件为建链文件. 注意:所列出的清单文件名与mount命令的第一个域相同的文件名前部分将不会列出来.由于是作文件系统内部的检查,ncheck并不知道文件系统安装点以上部分的目录. 也可用此命令来搜索文件系统中全部的SUID和SGID程序和设备文件,使用-s选项来完成此项功能. (8)安装和拆卸文件系统 UNIX文件系统是可安装的,这意味着每一个文件系统能够链接到整个目录树的任意节点上(根目录老是被安装上的).安装文件系统的目录称为安装点./etc/mount命令用于安装文件系统,用这条命令可将文件系统安装在现有目录结构的任意处.安装文件系统时,安装点的文件和目录都是不可存取的,所以未安装文件系统时,不要将文件存入安装点目录.文件系统安装后,安装点的存取许可方式和全部者将改变为所安装的文件根目录的许可方式和全部者.安装文件系统时要当心:安装点的属性会改变!还要注意新建的文件,除非新文件系统是由标准文件创建的,系统标准文件会设置适当的存取许可方式,不然新文件系统的存取许可将是777!可用-r选项将文件系统安装成只读文件系统.须要写保护的带驱动器和磁盘应当以这种方式来安装.不带任何参数的/etc/mount可得到系统中所安装的文件系统的有关信息. 包括:文件系统被安装的安装点目录,对应/dev中的哪一个设备,只读或可读写,安装时间和日期等.从安全的观点来说,可安装系统的危险来自用户可能请求系统管理员为其安装用户本身的文件系统.若是安装了用户的文件系统,则应在容许用户存取文件系统前,先扫描用户的文件系统,搜索SUID/SGID程序和设备文件.在除了root外任何人不能执行的目录中安装文件系统,用find命令或secure列出可疑文件,删除不属用户全部的文件的SUID/SGID许可.用户的文件系统用完后,可用umount命令卸下文件系统.并将安装点目录的全部者改回root,存取许可改成755. (9)系统目录和文件 UNIX系统中有许多文件不容许用户写,如:/bin,/usr/bin,/usr/lbin, /etc/passwd,/usr/lib/crontab,/unix,/etc/rc,/etc/inittab这样一些文件和目录(大多数的系统目录),可写的目录容许移动文件,会引发安全问题.系统管理员应常常检查系统文件和目录的许可权限和全部者.可作一个程序根据系统提供的规则文件(在/etc/permlist文件中)所描述的文件全部者和许可权规则检查各文件.(源程序清单将在从此发表) 注意:若是系统的安全管理很差,或系统是新安装的,其安全程序不够高,能够用make方式在安全强的系统上运行上述程序,将许可规则文件拷贝到新系统来,再以设置方式在新系统上运行上述程序,就可提升本系统的安全程序.但要记住,两个系统必须运行相同的UNIX系统版本. 4.做为root运行的程序 在UNIX系统中,有些程序由系统做为root进程运行.这些程序并不老是具备SUID许可,由于其很多程序仅由root运行,系统管理员须要清楚这些程序作什么,以及这些程序还将运行其它什么程序. (1)启动系统 当某些UNIX系统(如SCO UNIX/XENIX)启动时,是以被称为单用户的方式运行,在这种方式中普通用户不能登陆,惟有的进程是init, swapper,以及一些由系统管理员从控制台运行的进程.UNIX系统的单用户方式启动,使系统管理员能在容许普通用户登陆之前,先检查系统操做,确保系统一切正常,当系统处于单用户方式时,控制台做为超级用户,命令揭示是"#",有些UNIX系统不要确认超级用户口令就承认控制台是root,给出#提示符.这就可能成为一个安全问题. (2)init进程 UNIX系统老是以某种方式或称为某种级运行,系统有若干种运行级,这些运行级由init进程控制.UNIX系统启动时以单用户方式运行,也叫1级或S级.对于其余用户登陆进入系统,UNIX有一种多用户运行方式,也叫2级.init进程控制系统运行级,它读入文件/etc/ inittab,该文件详细地规定了哪些进程在哪一级运行.当root敲入init n(数字),系统就进入n级.init读该文件以肯定终止哪些进程,启动哪些进程.有效的运行级的数值是从0到6与s. 注意:由init创建的进程以UID为0运行(root)从/etc/inittab运行的程序 也做为root运行,因此系统管理员要确保本身知道/etc/inittab中的程序作什么工做,确保这些程序以及这些程序所在的目录直到/和/etc/inittab除root外无人可写. (3)进入多用户 当UNIX系统进入多用户方式时,将寝化一系列事件,接着开始执行gettys,容许其余用户登陆进入系统.若是再看看/etc/inittab文件,会看到gettys定义在运行级2,至少三个shell程序/etc/brc,/etc/bcheckrc,/etc/rc*也定义在运行级2.这些程序都在gettys启动前运行.这些shell程序做为root运行,也不能仅对root可写还应当检查shell程序运行的命令,由于这些命令也将做为root运行. (4)shutdown命令 用shutdown命令关系统,shutdown shell程序发送警告通知全部用户离开系统,在"给定的期限时间"到了后,就终止进程,拆卸文件系统,进入单用户方式或关机状态.一旦进入单用户方式,全部的gettys中止运行,用户再不能登陆.进入关机状态后可将系统关电. shutdown仅能由做为root登陆的用户从系统控制台上运行.因此任何的shutdown运行的命令仅能对root可写. (5)系统V的cron程序 cron在UNIX系统是多用户方式时运行,根据规定的时间安排执行指定的命令,每隔一分钟检查一次文件/usr/lib/crontab,寻找是否有应当运行的程序? 若是找到要运行的程序,就运行该程序,不然睡眠等待一分钟. 实际的/usr/lib/crontab用于根据全天的规则时间表运行程序,也可在夜晚运行白天不肯运行怕下降其余用户速度的程序.一般由cron运行的程序是如记账,存文件这样的程序.cron通常在系统进入多用户后由/etc/rc启动,当shutdown运行killall命令时便终止运行.由cron运行的程序做为root,因此应当注意放什么程序在crontab中,还要确保/usr/lib/crontab和该表中列出的任何程序对任何人不可写.若是用户须要由cron执行一个程序,系统管理员可用su命令在crontab表中创建一个入口,使用户的程序不能得到root的权限. (6)系统V版本2以后的cron程序 在系统V版本2中,cron被修改为容许用户创建本身的crontab入口,/usr/lib/crontab文件再也不存在,由目录/usr/spool/cron/crontabs中的文件代替.这些文件的格式与crontab相同,但每一个文件与系统中的一个用户对应,并以某用户的名义由cron运行.若是想限制能创建crontab的用户,可在文/usr/lib/cron/cron.allow文件中列出容许运行crontab命令的用户.任何未列于该文件的用户不能运行crontab.反之,若更愿意列出不容许运行crontab命令的用户,则可将他们列入/usr/lib/cron/ cron.deny文件中,未列于该文件的其余用户将被容许创建 crontab. 注意:若两个文件都存在,系统将使用cron.allow,忽略cron.deny.若是两个文件都不存在,则只有root可运行crontab.因此,若要容许系统中的全部用户均可运行crontab命令,应当创建一个空的cron.deny文件,若是cron.allow也存在,则删除该文件.这个版本的cron命令的安全程度比前一个高,由于用户只能看本身的 crontab,系统管理员也没必要担忧其余用户的程序是否会做为root运行,因为容许每一个系统登陆用户有本身的crontab,也简化了对程序必须由cron运行,但没必要做为root运行的系统程序的处理.必须确保root的crontab文件仅对root可写,而且该文件所在的目录及全部的父目录也仅对root可写. (7)/etc/profile 每当用户(包括root在内)登陆时,由shell执行/etc/profile文件,应确保这个文件以及从这个文件运行的程序和命令都仅对root可写. 5./etc/passwd文件 /etc/passwd文件是UNIX安全的关键文件之一.该文件用于用户登陆时校验用户的口令,固然应当仅对root可写.文件中每行的通常格式为:LOGNAME:PASSWORD:UID:GID:USERINFO:HOME:SHELL每行的头两项是登陆名和加密后的口令,后面的两个数是UID和GID,接着的一项是系统管理员想写入的有关该用户的任何信息,最后两项是两个路径名:一个是分配给用户的HOME目录,第二个是用户登陆后将执行的shell(若为空格则缺省为/bin/sh). (1)口令时效 /etc/passwd文件的格式使系统管理员能要求用户按期地改变他们的口令.在口令文件中能够看到,有些加密后的口令有逗号,逗号后有几个字符和一个冒号.如: steve:xyDfccTrt180x,M.y8:0:0:admin:/:/bin/sh restrict:pomJk109Jky41,.1:0:0:admin:/:/bin/sh pat:xmotTVoyumjls:0:0:admin:/:/bin/sh 能够看到,steve的口令逗号后有4个字符,restrict有2个,pat没有逗号.逗号后第一个字符是口令有效期的最大周数,第二个字符决定了用户再次修改口信以前,原口令应使用的最小周数(这就防止了用户改了新口令后马上 又改回成老口令).其他字符代表口令最新修改时间.要能读懂口令中逗号后的信息,必须首先知道如何用passwd_esc计数,计数的方法是: .=0 /=1 0-9=2-11 A-Z=12-37 a-z=38-63系统管理员必须将前两个字符放进/etc/passwd文件,以要求用户按期的修改口令,另外两个字符当用户修改口令时,由passwd命令填入.注意:若想让用户修改口令,可在最后一次口令被修改时,放两个".",则下一次用户登陆时将被要求修改本身的口令.有两种特殊状况: . 最大周数(第一个字符)小于最小周数(第二个字符),则不容许用户修改口令,仅超级用户能够修改用户的口令. . 第一个字符和第二个字符都是".",这时用户下次登陆时被要求修改口令,修改口令后,passwd命令将"."删除,此后再不会要求用户修改口令. (2)UID和GID /etc/passwd中UID信息很重要,系统使用UID而不是登陆名区别用户.通常来讲,用户的UID应当是独一无二的,其余用户不该当有相同的UID数值.根据惯例,从0到99的UID保留用做系统用户的UID(root,bin,uucp等).若是在/etc/passwd文件中有两个不一样的入口项有相同的UID,则这两个用户对相互的文件具备相同的存取权限. 6./etc/group文件 /etc/group文件含有关于小组的信息,/etc/passwd中的每一个GID在本文件中应当有相应的入口项,入口项中列出了小组名和小组中的用户.这样可方便地了解每一个小组的用户,不然必须根据GID在/etc/passwd文件中从头到尾地寻找同组用户./etc/group文件对小组的许可权限的控制并非必要的,由于系统用UID,GID(取自/etc/passwd)决定文件存取权限,即便/etc/group文件不存在于系统中,具备相同的GID用户也能够小组的存取许可权限共享文件.小组就像登陆用户同样能够有口令.若是/etc/group文件入口项的第二个域为非空,则将被认为是加密口令,newgrp命令将要求用户给出口令,而后将口令加密,再与该域的加密口令比较.给小组创建口令通常不是个好做法.第一,若是小组内共享文件,如有某人猜着小组口令,则该组的全部用户的文件就可能泄漏;其次,管理小组口令很费事,由于对于小组没有相似的passwd命令.可用/usr/lib/makekey生成一个口令写入/etc/group.如下状况必须创建新组: (1)可能要增长新用户,该用户不属于任何一个现有的小组. (2)有的用户可能时常须要独自为一个小组. (3)有的用户可能有一个SGID程序,须要独自为一个小组. (4)有时可能要安装运行SGID的软件系统,该软件系统须要创建一个新组. 要增长一个新组,必须编辑该文件,为新组加一个入口项. 因为用户登陆时,系统从/etc/passwd文件中取GID,而不是从/etc/group中取GID,因此group文件和口令文件应当具备一致性.对于一个用户的小组,UID和GID应当是相同的.多用户小组的GID应当不一样于任何用户的UID,通常为5位数,这样在查看/etc/passwd文件时,就可根据5位数据的GID识别多用户小组,这将减小增长新组,新用户时可能产生的混淆. 7.增长,删除,移走用户 (1)增长用户 增长用户有三个过程: . 在/etc/passwd文件中写入新用户的入口项. . 为新登陆用户创建一个HOME目录. . 在/etc/group中为新用户增长一个入口项. 在/etc/passwd文件中写入新的入口项时,口令部分可先设置为NOLOGIN,以避免有人作为此新用户登陆.在修改文件前,应mkdir /etc/ptmp,以避免他人同时修改此文件.新用户通常独立为一个新组,GID号与UID号相同(除非他要加入目前已存在的一个新组),UID号必须和其余人不一样,HOME目录通常设置在/usr或/home目录下创建一个以用户登陆名为名称的目录作为其主目录. (2)删除用户 删除用户与加用户的工做正好相反,首先在/etc/passwd和/etc/group文件中删除用户的入口项,而后删除用户的HOME目录和全部文件.rm -r /usr/loginname 删除整个目录树.若是用户在/usr/spool/cron/crontabs中有crontab文件,也应当删除. (3)将用户移到另外一个系统 这是一个复杂的问题,不仅是拷贝用户的文件和用户在/etc/passwd文件中的入口项.首先一个问题是用户的UID和GID可能已经用于另外一个系统,如果出现这种状况,必须给要移的用户分配另外的UID和GID,若是改变了用户的UID和GID,则必须搜索该用户的所有文件,将文件的原UID和GID改为新的UID和GID.用find命令能够完成这一修改: find . -user olduid -exec chown newuid {} \; find . -group oldgid -exec chgrp newgid {} \; 也许还要为用户移走其它一些文件:/usr/mail/user和/usr/spool/cron/crontabs/user.若是用户从一个不是本系统管理员的系统移来,则应对该用户的目录结构运行程序来检查.一个不安全系统的用户,可能有与该用户其它文件存在一块儿的SUID/SGID程序,而这个SUID/SGID程序属于另外一个用户.在这种状况下,若是用cpio或tar命令将用户的目录结构拷贝到本系统,SUID/SGID程序也将会拷贝到本系统而没有任何警告信息.应当在容许用户使用新系统之前先删除这种文件的SUID/SGID许可.总之,始终坚持检查所移用户的文件老是更安全些.也能够用su命令进入用户的户头,再拷贝用户文件,这样文件的全部者就是该用户,而不是root. 8.安全检查 像find和secure这样的程序称为检查程序,它们搜索文件系统,寻找出SUID/SGID文件,设备文件,任何人可写的系统文件,设有口令的登陆用户,具备相同UID/GID的用户等等. (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利用率,运行的进程数等统计数据. (2)其它检查命令 *du:报告在层次目录结构(当前工做目录或指定目录起)中各目录占用的磁盘块数.可用于检查用户对文件系统的使用状况. *df:报告整个文件系统当前的空间使用状况.可用于合理调整磁盘空间的使用和管理. *ps:检查当前系统中正在运行的全部进程.对于用了大量CPU时间的进程, 同时运行了许多进程的用户,运行了很长时间但用了不多CPU时间的用户进程应当深刻检查.还能够查出运行了一个无限制循环的后台进程的用户,未注销户头就关终端的用户(通常发生在直接连线的终端). *who:能够告诉系统管理员系统中工做的进展状况等等许多信息,检查用户的登陆时间,登陆终端. *su:每当用户试图使用su命令进入系统用户时,命令将在/usr/adm/sulog文件中写一条信息,若该文件记录了大量试图用su进入root的无效操做信息,则代表了可能有人企图破译root口令. *login:在一些系统中,login程序记录了无效的登陆企图(若本系统的login程序不作这项工做而系统中有login源程序,则应修改login).天天总有少许的无效登陆,若无效登陆的次数忽然增长了两倍,则代表可能有人企图经过猜想登陆名和口令,非法进入系统. (3)安全检查程序的问题 关于以上的检查方法的一个警告,如有诱骗,则这些方法中没有几个能防诱骗.如find命令,若是碰到路径名长于256个字符的文件或含有多于200个文件的目录,将放弃处理该文件或目录,用户就有可能利用创建多层目录结构或大目录隐藏SUID程序,使其逃避检查(但find命令会给出一个错误信息,系统管理员应手工检查这些目录和文件).也可用ncheck命令搜索文件系统,但它没有find命令指定搜索哪一种文件的功能.若是按期存取.profile文件,则检查久未登陆用户的方法就不奏效了.而 用户用su命令时,除非用参数-,不然su不读用户的.profile. 有三种方法可寻找久未登陆的账户: . UNIX记账系统在文件/usr/adm/acct/sum/login中为每一个用户保留了最后一次登陆日期.用这个文件的好处是,该文件由系统维护,因此可彻底确定登陆日期是准确的.缺点是必须在系统上运行记账程序以更新loginlog文件,若是在清晨(午夜后)运行记账程序,一天的登陆日期可能就被清除了. . /etc/passwd文件中的口令时效域将能告诉系统管理员,用户的口令是否过时了,若过时,则意味着自过时以来,户头再未被用过.这一方法的好处在于系统记录了久未用的户头,检查过程简单,且不须要记账系统所须要的磁盘资源,缺点是也许系统管理员不想在系统上设置口令时效,并且这一方法仅在口令的最大有效期(只有几周)才是准确的. . 系统管理员能够写一个程序,天天(和从新引导系统时)扫描/etc/wtmp,本身保留下用户最后登陆时间记录,这一方法的好处是不须要记账程序,而且时间准确,缺点是要本身写程序.以上任何方法均可和/usr/adm/sulog文件结合起来,查出由login或su登陆户头的最后登陆时间.若是有人存心破坏系统安全,第一件要作的事就是寻找检查程序.破坏者将修改检查程序,使其不能报告任何异常事件,也可能中止系统记账,删除记账文件,使系统管理员不能发现破坏者干了些什么.这里最重要的一点是:系统管理没越熟悉本身的用户和用户的工做习惯,就越能快速发现系统中任何不寻常的事件,而不寻常的事件意味着系统已被人窃密. (4)系统泄密后怎么办? 发现有人已经破坏了系统安全的时候,这时系统管理员首先应作的是面对肇事用户.若是该用户所作的事不是蓄意的,并且公司没有关于"破坏安全"的规章,也未形成损坏,则系统管理员只需清理系统,并留心该用户一段时间.若是该用户形成了某些损坏,则应当报告有关人士,而且应尽量地将系统恢复到原来的状态.若是肇事者是非受权用户,那就得作最坏的假设了:肇事者已设法成为root且本系统的文件和程序已经泄密了.系统管理员应当想法查出谁是肇事者,他形成了什么损坏?还应当对整个文件作一次全面的检查,并不仅是检查SUID和SGID,设备文件.若是系统安全被一个敌对的用户破坏了,应当采用下面的步骤: . 关系统,而后从新引导,不要进入多用户方式,进入单用户方式. . 安装含有本系统原始UNIX版本的带和软盘. . 将/bin,/usr/bin,/etc,/usr/lib中的文件拷贝到一个暂存目录中. . 将暂存目录中全部文件的校验和(用原始版本的suM程序拷贝作校验和, 不要用/bin中的suM程序作)与系统中全部对就的文件的校验和进行比较,若是有任何差异,要查清差异产生的缘由.若是两个校验和不一样,是因为安装了新版本的程序,确认一相是否的确是安装了新版本程序.若是不能找出校验和不一样的缘由,用暂存目录中的命令替换系统中的原有命令. . 在确认系统中的命令还未被窜改以前,不要用系统中原命令.用暂存目录中的shell,并将PATH设置为仅在暂存目录中搜索命令. . 根据暂存目录中全部系统命令的存取许可,检查系统中全部命令的存取许可. . 检查全部系统目录的存取许可,若是用了perms,检查permlist文件是否被窜改过. . 若是系统UNIX(/unix)的校验和不一样于原版的校验和,而且系统管理员从未修改过核心,则应当认为,一个非法者"很能干",从暂存缓冲区从新装入系统.系统管理员能够从逐步增长的文件系统备份中恢复用户的文件,可是在检查备份中的"有趣"文件以前,不能作文件恢复. . 改变系统中的全部口令,通知用户他们的口令已改变,应找系统管理员获得新口令. . 当用户来要新口令时,告诉用户发生了一次安全事故,他们应查看本身的文件和目录是否潜伏着危害(如SUID文件,特洛依***,任何人可写的目录),并报告系统管理员任何异乎寻常的状况. . 设法查清安全破坏是如何发生的?若是没有肇事者说明,这也许是不可能弄清的.若是能发现肇事者如何进入系统,设法堵住这个安全漏洞.第一次安装UNIX系统时,能够将shell,sum命令,全部文件的校验和存放在安全的介质上(带,软盘,硬盘和任何能够卸下并锁焉起来的介质).因而没必要再从原版系统带上从新装入文件,能够安装备份介质,装入shell和sum,将存在带上的校验和与系统中文件的校验和进行比较.系统管理员也许想本身写一个计 算校验和的程序,破坏者将不能知道该程序的算法,若是将该程序及校验和保存在带上,这一方法的保密问题就减少到一个物理的安全问题,即只需将带锁起来...... 9.加限制的环境 (1)加限制的shell(rsh) 该shell几乎与普通的shell相同,可是该shell的设计能限制一个用户的能力,不容许用户有某些标准shell所容许的行为: . 不能改变工做目录(cd). . 不能改变PATH或SHELL shell变量. . 不能使用含有"/"的命令名. . 不能重定向输出(>和>>). . 不能用exec执行程序. 用户在登陆时,招待.profile文件后系统就强加上了这些限制,若是用户在.profile文件正被解释时按了BREAK键或Delete键,该用户将被注销. 这些简单的限制,使用写受限制用户的.profile文件的系统管理员能够对用户能使用什么命令,进行彻底的控制.应当注意:系统V加限制的shell实际上不是很安全,在敌对的用户时不要用.系统V版本2之后的版本中加限制的shell更安全些.但若容许受限制的用户使用某些命令(如env,cp,ln),用户将能逃避加限制的shell,进入非限制的shell. (2)用chroot()限制用户 若是的确想限制一个用户,可用chroot()子程序为用户创建一个彻底隔离的环境,改变了进程对根目录的概念,所以可用于将一个用户封在整个文件系统的某一层目录结构中,使用户没法用cd命令转出该层目录结构,不能存取文件系统中其他部分的任何文件.这种限制方式比加限制的shell好得多.用户使用的命令应由系统管理员在新的root目录中创建一个bin目录,并创建用户可用命令的链到系统的/bin目录中相应命令文件上(若在不一样的文件系统则应拷贝命令文件).还应创建新的passwd文件,保留系统登陆户头(为了使ls -l正确地报告与受限制的子文件系统中的文件相关的正确登陆名)和用户账户,但系统账户的口令改成NOLOGIN以使受限制的用户不能取得系统登陆的真实口令,使"破密"程序的任何企图成为泡影.utmp文件是who所须要的,该文件含有系统中已登陆用户的列表.新的/etc/ profile文件也不是建链文件,以便受限制的用户能够执行不一样的启动命令./dev目录中的终端设备文件被连接到新的/dev目录下,由于命令who产生输出时要查看这些文件.在系统V及之后的UNIX版本中,login命令有chroot()的功能.若是口令文件中用户入口项的登陆shell域(最后一个域)是*,login将调用chroot()把用户的根目录设置成为口令文件中用户入口项登陆目录域指定的目录.而后再调用exec()执行login,新的login将在新子系统文件中执行该用户的登陆.chroot()并非把root封锁在一个子文件系统中,因此给受限制用户用的命令时应加以考虑,具备root的SUID许可的程序可能会给予用户root的能力.应当将这种可能减低到最小程度,交给用户使用的命令应当取自清除了SUID陷井的系统命令.连接文件可减小磁盘占用区,但要记住,当与敌对用户打交道时,连接到chroot目录结构(尤为是命令)的系统文件是很危险的.若是创建一个像这样的限制环境,应确保对安装到新的/bin的每条命令都作过测试,有些程序可能有系统管理员不曾想到的出乎意料的执行结果.为了使这些命令能运行,还得在加限制的子文件系统中加服务目录或文件如:/tmp, /etc/termcap, /usr/lib/terminfo,/dev/mem,/dev/kmem,/dev/swap,用户所登陆的/dev中的tty文件以及/unix.有些程序在子文件系统中运行时不会很好,若是将假脱机程序和网络命令拷贝到加限制的子文件系统中,并放在为两条命令专建的目录层结构下,它们可能也运行不了. 10.小系统安全 任何足够小,运行于办公室的UNIX系统就是小系统.这类小系统也包括全部台式UNIX机器.根据安全观点,使小系统很特别而值得特别的有如下几点: . 小系统的用户比大系统的用户少,一般是很小一组用户,使系统管理员能熟悉每一个人,安全问题能够直接地面对面处理. . 因为小UNIX系统管理更简单,可能只须要一个系统管理员,于是维护系统安全的责任只有一我的担负. . 若是既是用户又是系统管理员,将不能花大量时间考虑系统安全. . 若是本身拥有系统而且是系统管理员,就可能有权直接将违反规的用户从系统中删除,而没有几个大系统的管理员能有这种权利. . 若是本身是系统的惟一用户,则将既是用户又是管理员,维护系统安全的任务就很简单了,只须确保系统中全部登陆户头的口令是好的. . 若是不能将系统锁起来,就把敏感的数据存放在软盘上,把软盘锁起来. . 即便系统中有若干个用户,但若是系统的终端之产是有线链接,而且用户们保持门上锁,则系统也将是安全的,至少在本组用户内是安全的. . 小系统一般有可移动的介质(软盘),可用mount命令将其安装到系统上,提供一种安全的方法让用户本身在系统上安装软盘,不然系统管理员要一天到晚地干这些琐碎的安装盘事务.容许用户安装软盘的一般作法是给用户一个SUID程序,该程序基本完成与系统管理员安装用户软盘一样的操做,首先检查软盘上有无SUID/SGID/设备文件,若发现任何奇怪的文件,则拒绝安装该软盘. . 当小系统开电源后,系统通常在从硬盘引导之前,先试图从软盘引导.这就意味着计算机将首先试图从软盘装入程序,若软盘不在驱动器中,系统将从硬盘装入UNIX内核.软盘几乎能够含有任何程序,包括在控制台启动root shell的UNIX系统版本.若是破坏者有一把螺丝起子和有关系统内部的一些知识,则即使系统有被认为防止安全事故发生的特殊"微码"口令,也可能被诱骗去从软盘引导. . 即便小系统晚上不锁,凡从不将我的的或秘密的信息存放在大系统上的人他们不可能认识全部系统上的用户),也不会想把这样的信息存放在小系统上. . 小系统的系统管理员在使用UNIX系统方面常不如大系统管理员有经验,而安全地管理系统须要必定的使用系统的知识. 11.物理安全 对于运行任何操做系统的小型或大型计算机,物理安全都是一个要考虑的重要问题,物理安全包括:锁上放置计算机的屋子,报警系统,警卫,全部安置在不能上锁的地方的通信设施,包括有线通信线,电话线,局域网,远程网,应答MODEM,钥匙或信用卡识别设备,给用户的口令和钥匙分配,任何前置通信设施的加密装置,文件保护,备份或恢复方案(称为安全保险方案,用做应付偶然的或蓄意的数据或计算设备被破坏的状况),上锁的输出仃,上锁的废物箱和碎纸机.物理安全中所饮食的总考虑应是:在安全方案上所付出的代价不该当多于值得保护的(硬件或软件的)价值.下面着重讨论保护用户的各类通信线.对于任何可在不上锁的地方存取的系统,通信是特别严重的安全薄弱环节.当容许用户经过挂到地方电话公司的拨号MODEM存取系统时,系统的安全程度就将大大地削弱,有电话和MODEM的任何人就可能非法进入该系统.应当避免这一状况,要确保MODEM的电话号码不被列于电话薄上,而且最好将电话号码放在不一样于本公司普通电话号码所在的交换机上.总之,不要假设没人知道本身的拨入号码!大多数家庭计算机都能编程用一个MODEM成天地依次调用拨号码,记录下链接上其它MODEM的号码.若是可能,安装一个局 域PBX,使得对外界的拨号产生一秒钟的拨号蜂音,而且必须输入一个与MODEM相关联的扩展号码. 12.用户意识 UNIX系统管理员的职责之一是保证用户安全.这其中一部分工做是由用户的管理部门来完成,可是做为系统管理员,有责任发现和报告系统的安全问题,由于系统管理员负责系统的运行.避免系统安全事故的方法是预防性的,当用户登陆时,其shell在给出提示前先执行/etc/profile文件,要确保该文件中的PATH指定最后搜索当前工做目录,这样将减小用户能运行特洛依***的机会.将文件创建屏蔽值的设置放在该文件中也是很合适的,可将其值设置成至少将防止用户无心中创建任何人都能写的文件(022/026).要当心选择此值,若是限制太严,则用户会在本身的.profile中从新调用umask以抵制系统管理员的意愿,若是用户大量使用小组权限共享文件,系统管理员就一要设置限制小组存取权限的屏蔽值.系统管理员必须创建系统安全和用户的"痛苦量"间的平衡(痛苦量是安全限制引发的愤怒的函数).按期地用grep命令查看用户.profile文件中的umask,可了解系统安全限制是否超过了用户痛苦极限.系统管理员可每星期随机抽选一个用户,将该用户的安全检查结果(用户的登陆状况简报,SUID/SGID文件列表等)发送给他的管理部门和他本人.主要有四个目的: . 大多数用户会收到至少有一个文件检查状况的邮件,这将引发用户考虑安全问题(虽然并不意味着用户们会采起增强安全的行动). . 有大量可写文件的用户,将一星期获得一次邮件,直到他们取消可写文件的写许可为止.冗长的烦人的邮件信息也许足以促使这些用户采起措施,删除文件的写许可. . 邮件将列出用户的SUID程序,引发用户注意本身有SUID程序,使用户知道是否有不是本身创建的SUID程序. . 送安全检查表可供用户管理本身的文件,并使用户知道对文件的管理关系到数据安全.若是系统管理员打算这样作,应事先让用户知道,以便他们了解安全检查邮件的目的. 发送邮件是让用户具备安全意识,不要抱怨发送邮件. 管理意识是提升安全性的另外一个重要因素.若是用户的管理部门对安全要求不强烈,系统管理员可能也忘记强化安全规则.最好让管理部门创建一套每一个人都必须遵照的安全标准,若是系统管理员在此基础上再创建本身的安全规则,就强化了安全.管理有助于增强用户意识,让用户明确,信息是有价值的资产.系统管理员应当使安全保护方法对用户尽量地简单,提供一些提升安全的工具,如:公布锁终端的lock程序,让用户本身运行secure程序,将pwexp(检查用户口令信息的程序)放入/etc/profile中,使用户知道本身的口令时间.多教给用户一些关于系统安全的知识,确保用户知道本身的许可权限和umask命令的设置值.若是注意到用户在作蠢事,就给他们一些应当怎样作才对的提示.用户知道的关于安全的知识越多,系统管理员在保护用户利益方面作的事就越少. 13.系统管理员意识 (1)保持系统管理员我的的登陆安全 若系统管理员的登陆口令泄密了,则窃密者离窃取root只有一步之遥了,由于系统管理员常常做为root运行,窃密者非法进入到系统管理员的户头后,将用特洛依***替换系统管理员的某些程序,系统管理员将做为root运行这些已被替换的程序.正是由于这个缘由,在UNIX系统中,管理员的户头最常受到***.即便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的户头. . 常常改变root的口令. . 确认su命令记下的想运行su企图的记录/usr/adm/sulog,该记录文件的许可方式是600,并属root全部.这是非法者喜欢选择来替换成特洛依***的文件. . 不要让某人做为root运行,即便是几分钟,即便是系统管理员在一旁注视着也不行! (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程序存于可拆卸的介质上. . 记住,只要系统有任何人均可调用的拨号线,系统就不可能真正的安全.系统管理员能够很好地防止系统受到偶然的破坏.可是那些有耐心,有计划, 知道本身在干什么的破坏者,对系统直接的有预谋的***却经常能成功. . 若是系统管理员认为系统已经泄密,则应当设法查出肇事者.若肇事者是本系统的用户,与用户的管理部门联系,并检查该用户的文件,查找任何可疑的文件,而后对该用户的登陆当心地监督几个星期.若是肇事者不是本系统的用户,可以让本公司采起合法的措施,并要求全部的用户改变口令,让用户知道出了安全事故,用户们应当检查本身的文件是否有被窜改的迹象.若是系统管理员认为系统软件已被更改了,就应当从原版系统带(或;软盘)上重装入全部系统软件,保持系统安全比道歉更好.