标  题: 系统管理员安全
 
 

    本文从系统管理员的角度讨论安全问题.系统管理员是管理系统的人:启动
系统,停止系统运行,安装新软件,增加新用户,删除老用户,以及完成保持系统发
展和运行的日常事务工作.

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的口令.
    . 确认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程序存于可拆卸的介质上.
    . 记住,只要系统有任何人都可调用的拨号线,系统就不可能真正的安全.系
      统管理员可以很好地防止系统受到偶然的破坏.但是那些有耐心,有计划,
      知道自己在干什么的破坏者,对系统直接的有预谋的攻击却常常能成功.
    . 如果系统管理员认为系统已经泄密,则应当设法查出肇事者.若肇事者是
      本系统的用户,与用户的管理部门联系,并检查该用户的文件,查找任何可
      疑的文件,然后对该用户的登录小心地监督几个星期.如果肇事者不是本
      系统的用户,可让本公司采取合法的措施,并要求所有的用户改变口令,让
      用户知道出了安全事故,用户们应当检查自己的文件是否有被窜改的迹象.
      如果系统管理员认为系统软件已被更改了,就应当从原版系统带(或;软盘
      )上重装入所有系统软件,保持系统安全比道歉更好.
 

--------------------------------------------------------------------
标  题: 程序员安全
 

    UNIX系统为程序员提供了许多子程序,这些子程序可存取各种安全属性.有
些是信息子程序,返回文件属性,实际的和有效的UID,GID等信息.有些子程序可
改变文件属性.UID,GID等有些处理口令文件和小组文件,还有些完成加密和解密.
    本文主要讨论有关系统子程序,标准C库子程序的安全,如何写安全的C程序
并从root的角度介绍程序设计(仅能被root调用的子程序).

1.系统子程序

  (1)I/O子程序
    *creat():建立一个新文件或重写一个暂存文件.
             需要两个参数:文件名和存取许可值(8进制方式).如:
     creat("/usr/pat/read_write",0666)  /* 建立存取许可方式为0666的文件 */
     调用此子程序的进程必须要有建立的文件的所在目录的写和执行许可,置
     给creat()的许可方式变量将被umask()设置的文件建立屏蔽值所修改,新
     文件的所有者和小组由有效的UID和GID决定.
     返回值为新建文件的文件描述符.
    *fstat():见后面的stat().
    *open():在C程序内部打开文件.
            需要两个参数:文件路径名和打开方式(I,O,I&O).
     如果调用此子程序的进程没有对于要打开的文件的正确存取许可(包括文
     件路径上所有目录分量的搜索许可),将会引起执行失败.
     如果此子程序被调用去打开不存在的文件,除非设置了O_CREAT标志,调用
     将不成功.此时,新文件的存取许可作为第三个参数(可被用户的umask修
     改).
     当文件被进程打开后再改变该文件或该文件所在目录的存取许可,不影响
     对该文件的I/O操作.
    *read():从已由open()打开并用作输入的文件中读信息.
     它并不关心该文件的存取许可.一旦文件作为输入打开,即可从该文件中读
     取信息.
    *write():输出信息到已由open()打开并用作输出的文件中.同read()一样
     它也不关心该文件的存取许可.

  (2)进程控制
    *exec()族:包括execl(),execv(),execle(),execve(),execlp()和execvp()
              可将一可执行模快拷贝到调用进程占有的存贮空间.正被调用进
              程执行的程序将不复存在,新程序取代其位置.
     这是UNIX系统中一个程序被执行的唯一方式:用将执行的程序复盖原有的
     程序.
     安全注意事项:
       . 实际的和有效的UID和GID传递给由exec()调入的不具有SUID和SGID许
         可的程序.
       . 如果由exec()调入的程序有SUID和SGID许可,则有效的UID和GID将设
         置给该程序的所有者或小组.
       . 文件建立屏蔽值将传递给新程序.
       . 除设了对exec()关闭标志的文件外,所有打开的文件都传递给新程序.
         用fcntl()子程序可设置对exec()的关闭标志.
    *fork():用来建立新进程.其建立的子进程是与调用fork()的进程(父进程)
            完全相同的拷贝(除了进程号外)
     安全注意事项:
       . 子进程将继承父进程的实际和有效的UID和GID.
       . 子进程继承文件方式建立屏蔽值.
       . 所有打开的文件传给子进程.
    *signal():允许进程处理可能发生的意外事件和中断.
              需要两个参数:信号编号和信号发生时要调用的子程序.
     信号编号定义在signal.h中.
     信号发生时要调用的子程序可由用户编写,也可用系统给的值,如:SIG_IGN
     则信号将被忽略,SIG_DFL则信号将按系统的缺省方式处理.
     如许多与安全有关的程序禁止终端发中断信息(BREAK和DELETE),以免自己
     被用户终端终止运行.
     有些信号使UNIX系统的产生进程的核心转储(进程接收到信号时所占内存
     的内容,有时含有重要信息),此系统子程序可用于禁止核心转储.

  (3)文件属性
    *access():检测指定文件的存取能力是否符合指定的存取类型.
              需要两个参数:文件名和要检测的存取类型(整数).
     存取类型定义如下:
       0: 检查文件是否存在
       1: 检查是否可执行(搜索)
       2: 检查是否可写
       3: 检查是否可写和执行
       4: 检查是否可读
       5: 检查是否可读和执行
       6: 检查是否可读可写可执行
       这些数字的意义和chmod命令中规定许可方式的数字意义相同.
     此子程序使用实际的UID和GID检测文件的存取能力(一般有效的UID和GID
     用于检查文件存取能力).
     返回值: 0:许可  -1:不许可.
    *chmod():将指定文件或目录的存取许可方式改成新的许可方式.
             需要两个参数:文件名和新的存取许可方式.
    *chown():同时改变指定文件的所有者和小组的UID和GID.(与chown命令不
             同).
     由于此子程序同时改变文件的所有者和小组,故必须取消所操作文件的SUID
     和SGID许可,以防止用户建立SUID和SGID程序,然后运行chown()去获得别
     人的权限.
    *stat():返回文件的状态(属性).
            需要两个参数:文件路径名和一个结构指针,指向状态信息的存放
            的位置.
     结构定义如下:
       st_mode:   文件类型和存取许可方式
       st_ino:    I节点号
       st_dev:    文件所在设备的ID
       st_rdev:   特别文件的ID
       st_nlink:  文件链接数
       st_uid:    文件所有者的UID
       st_gid:    文件小组的GID
       st_size:   按字节计数的文件大小
       st_atime:  最后存取时间(读)
       st_mtime:  最后修改时间(写)和最后状态的改变
       st_ctime:  最后的状态修改时间
     返回值: 0:成功    1:失败
    *umask():将调用进程及其子进程的文件建立屏蔽值设置为指定的存取许可.
             需要一个参数: 新的文件建立屏值.

  (4)UID和GID的处理
    *getuid():返回进程的实际UID.
    *getgid():返回进程的实际GID.
     以上两个子程序可用于确定是谁在运行进程.
    *geteuid():返回进程的有效UID.
    *getegid():返回进程的有效GID.
     以上两个子程序可在一个程序不得不确定它是否在运行某用户而不是运行
     它的用户的SUID程序时很有用,可调用它们来检查确认本程序的确是以该
     用户的SUID许可在运行.
    *setuid():用于改变有效的UID.
     对于一般用户,此子程序仅对要在有效和实际的UID之间变换的SUID程序才
     有用(从原有效UID变换为实际UID),以保护进程不受到安全危害.实际上该
     进程不再是SUID方式运行.
    *setgid():用于改变有效的GID.

2.标准C库

  (1)标准I/O
    *fopen():打开一个文件供读或写,安全方面的考虑同open()一样.
    *fread(),getc(),fgetc(),gets(),scanf()和fscanf():从已由fopen()打
             开供读的文件中读取信息.它们并不关心文件的存取许可.这一点
             同read().
    *fwrite(),put(),fputc(),puts,fputs(),printf(),fprintf():写信息到
             已由fopen()打开供写的文件中.它们也不关心文件的存取许可.
             同write().
    *getpass():从终端上读至多8个字符长的口令,不回显用户输入的字符.
             需要一个参数: 提示信息.
     该子程序将提示信息显示在终端上,禁止字符回显功能,从/dev/tty读取口
     令,然后再恢复字符回显功能,返回刚敲入的口令的指针.
    *popen():将在(5)运行shell中介绍.

  (2)/etc/passwd处理
    有一组子程序可对/etc/passwd文件进行方便的存取,可对文件读取到入口
    项或写新的入口项或更新等等.
    *getpwuid():从/etc/passwd文件中获取指定的UID的入口项.
    *getpwnam():对于指定的登录名,在/etc/passwd文件检索入口项.
     以上两个子程序返回一指向passwd结构的指针,该结构定义在
     /usr/include/pwd.h中,定义如下:
         struct passwd {
             char * pw_name;        /* 登录名 */
             char * pw_passwd;      /* 加密后的口令 */
             uid_t  pw_uid;         /* UID */
             gid_t  pw_gid;         /* GID */
             char * pw_age;         /* 代理信息 */
             char * pw_comment;     /* 注释 */
             char * pw_gecos;
             char * pw_dir;         /* 主目录 */
             char * pw_shell;       /* 使用的shell */
         };
    *getpwent(),setpwent(),endpwent():对口令文件作后续处理.
     首次调用getpwent(),打开/etc/passwd并返回指向文件中第一个入口项的
     指针,保持调用之间文件的打开状态.
     再调用getpwent()可顺序地返回口令文件中的各入口项.
     调用setpwent()把口令文件的指针重新置为文件的开始处.
     使用完口令文件后调用endpwent()关闭口令文件.
    *putpwent():修改或增加/etc/passwd文件中的入口项.
     此子程序将入口项写到一个指定的文件中,一般是一个临时文件,直接写口
     令文件是很危险的.最好在执行前做文件封锁,使两个程序不能同时写一个
     文件.算法如下:
       . 建立一个独立的临时文件,即/etc/passnnn,nnn是PID号.
       . 建立新产生的临时文件和标准临时文件/etc/ptmp的链,若建链失败,
         则为有人正在使用/etc/ptmp,等待直到/etc/ptmp可用为止或退出.
       . 将/etc/passwd拷贝到/etc/ptmp,可对此文件做任何修改.
       . 将/etc/passwd移到备份文件/etc/opasswd.
       . 建立/etc/ptmp和/etc/passwd的链.
       . 断开/etc/passnnn与/etc/ptmp的链.
     注意:临时文件应建立在/etc目录,才能保证文件处于同一文件系统中,建
          链才能成功,且临时文件不会不安全.此外,若新文件已存在,即便建
          链的是root用户,也将失败,从而保证了一旦临时文件成功地建链后
          没有人能再插进来干扰.当然,使用临时文件的程序应确保清除所有
          临时文件,正确地捕捉信号.

  (3)/etc/group的处理
    有一组类似于前面的子程序处理/etc/group的信息,使用时必须用include
    语句将/usr/include/grp.h文件加入到自己的程序中.该文件定义了group
    结构,将由getgrnam(),getgrgid(),getgrent()返回group结构指针.
    *getgrnam():在/etc/group文件中搜索指定的小组名,然后返回指向小组入
                口项的指针.
    *getgrgid():类似于前一子程序,不同的是搜索指定的GID.
    *getgrent():返回group文件中的下一个入口项.
    *setgrent():将group文件的文件指针恢复到文件的起点.
    *endgrent():用于完成工作后,关闭group文件.
    *getuid():返回调用进程的实际UID.
    *getpruid():以getuid()返回的实际UID为参数,确定与实际UID相应的登录
              名,或指定一UID为参数.
    *getlogin():返回在终端上登录的用户的指针.
     系统依次检查STDIN,STDOUT,STDERR是否与终端相联,与终端相联的标准输
     入用于确定终端名,终端名用于查找列于/etc/utmp文件中的用户,该文件
     由login维护,由who程序用来确认用户.
    *cuserid():首先调用getlogin(),若getlogin()返回NULL指针,再调用
     getpwuid(getuid()).
    *以下为命令:
    *logname:列出登录进终端的用户名.
    *who am i:显示出运行这条命令的用户的登录名.
    *id:显示实际的UID和GID(若有效的UID和GID和实际的不同时也显示有效的
        UID和GID)和相应的登录名.

  (4)加密子程序
    1977年1月,NBS宣布一个用于美国联邦政府ADP系统的网络的标准加密法:数
    据加密标准即DES用于非机密应用方面.DES一次处理64BITS的块,56位的加
    密键.
    *setkey(),encrypt():提供用户对DES的存取.
     此两子程序都取64BITS长的字符数组,数组中的每个元素代表一个位,为0
     或1.setkey()设置将按DES处理的加密键,忽略每第8位构成一个56位的加
     密键.encrypt()然后加密或解密给定的64BITS长的一块,加密或解密取决
     于该子程序的第二个变元,0:加密 1:解密.
    *crypt():是UNIX系统中的口令加密程序,也被/usr/lib/makekey命令调用.
     crypt()子程序与crypt命令无关,它与/usr/lib/makekey一样取8个字符长
     的关键词,2个salt字符.关键词送给setkey(),salt字符用于混合encrypt()
     中的DES算法,最终调用encrypt()重复25次加密一个相同的字符串.
     返回加密后的字符串指针.

  (5)运行shell
    *system():运行/bin/sh执行其参数指定的命令,当指定命令完成时返回.
    *popen():类似于system(),不同的是命令运行时,其标准输入或输出联到由
             popen()返回的文件指针.
     二者都调用fork(),exec(),popen()还调用pipe(),完成各自的工作,因而
     fork()和exec()的安全方面的考虑开始起作用.

3.写安全的C程序
    一般有两方面的安全问题,在写程序时必须考虑:
      (1)确保自己建立的任何临时文件不含有机密数据,如果有机密数据,设置
         临时文件仅对自己可读/写.确保建立临时文件的目录仅对自己可写.
      (2)确保自己要运行的任何命令(通过system(),popen(),execlp(),
         execvp()运行的命令)的确是自己要运行的命令,而不是其它什么命
         令,尤其是自己的程序为SUID或SGID许可时要小心.
    第一方面比较简单,在程序开始前调用umask(077).若要使文件对其他人可
    读,可再调chmod(),也可用下述语名建立一个"不可见"的临时文件.
         creat("/tmp/xxx",0);
         file=open("/tmp/xxx",O_RDWR);
         unlink("/tmp/xxx");
    文件/tmp/xxx建立后,打开,然后断开链,但是分配给该文件的存储器并未删
    除,直到最终指向该文件的文件通道被关闭时才被删除.打开该文件的进程
    和它的任何子进程都可存取这个临时文件,而其它进程不能存取该文件,因
    为它在/tmp中的目录项已被unlink()删除.
    第二方面比较复杂而微妙,由于system(),popen(),execlp(),execvp()执行
    时,若不给出执行命令的全路径,就能"骗"用户的程序去执行不同的命令.因
    为系统子程序是根据PATH变量确定哪种顺序搜索哪些目录,以寻找指定的命
    令,这称为SUID陷井.最安全的办法是在调用system()前将有效UID改变成实
    际UID,另一种比较好的方法是以全路径名命令作为参数.execl(),execv(),
    execle(),execve()都要求全路径名作为参数.有关SUID陷井的另一方式是
    在程序中设置PATH,由于system()和popen()都启动shell,故可使用shell句
    法.如:
         system("PATH=/bin:/usr/bin cd");
    这样允许用户运行系统命令而不必知道要执行的命令在哪个目录中,但这种
    方法不能用于execlp(),execvp()中,因为它们不能启动shell执行调用序列
    传递的命令字符串.
    关于shell解释传递给system()和popen()的命令行的方式,有两个其它的问
    题:
       *shell使用IFS shell变量中的字符,将命令行分解成单词(通常这个
    shell变量中是空格,tab,换行),如IFS中是/,字符串/bin/ed被解释成单词
    bin,接下来是单词ed,从而引起命令行的曲解.

    再强调一次:在通过自己的程序运行另一个程序前,应将有效UID改为实际的
    UID,等另一个程序退出后,再将有效UID改回原来的有效UID.

    SUID/SGID程序指导准则
    (1)不要写SUID/SGID程序,大多数时候无此必要.
    (2)设置SGID许可,不要设置SUID许可.应独自建立一个新的小组.
    (3)不要用exec()执行任何程序.记住exec()也被system()和popen()调用.
       . 若要调用exec()(或system(),popen()),应事先用setgid(getgid())
         将有效GID置加实际GID.
       . 若不能用setgid(),则调用system()或popen()时,应设置IFS:
         popen("IFS=\t\n;export IFS;/bin/ls","r");
       . 使用要执行的命令的全路径名.
       . 若不能使用全路径名,则应在命令前先设置PATH:
         popen("IFS=\t\n;export IFS;PATH=/bin:/usr/bin;/bin/ls","r");
       . 不要将用户规定的参数传给system()或popen();若无法避免则应检查
         变元字符串中是否有特殊的shell字符.
       . 若用户有个大程序,调用exec()执行许多其它程序,这种情况下不要将
         大程序设置为SGID许可.可以写一个(或多个)更小,更简单的SGID程序
         执行必须具有SGID许可的任务,然后由大程序执行这些小SGID程序.
    (4)若用户必须使用SUID而不是SGID,以相同的顺序记住(2),(3)项内容,并
       相应调整.不要设置root的SUID许可.选一个其它户头.
    (5)若用户想给予其他人执行自己的shell程序的许可,但又不想让他们能
       读该程序,可将程序设置为仅执行许可,并只能通过自己的shell程序来
       运行.
    编译,安装SUID/SGID程序时应按下面的方法
    (1)确保所有的SUID(SGID)程序是对于小组和其他用户都是不可写的,存取
       权限的限制低于4755(2755)将带来麻烦.只能更严格.4111(2111)将使
       其他人无法寻找程序中的安全漏洞.
    (2)警惕外来的编码和make/install方法
       . 某些make/install方法不加选择地建立SUID/SGID程序.
       . 检查违背上述指导原则的SUID/SGID许可的编码.
       . 检查makefile文件中可能建立SUID/SGID文件的命令.

4.root程序的设计
    有若干个子程序可以从有效UID为0的进程中调用.许多前面提到的子程序,
当从root进程中调用时,将完成和原来不同的处理.主要是忽略了许可权限的检
查.
    由root用户运行的程序当然是root进程(SUID除外),因有效UID用于确定文
件的存取权限,所以从具有root的程序中,调用fork()产生的进程,也是root进程.

  (1)setuid():从root进程调用setuid()时,其处理有所不同,setuid()将把有
     效的和实际的UID都置为指定的值.这个值可以是任何整型数.而对非root
     进程则仅能以实际UID或本进程原来有效的UID为变量值调用setuid().
  (2)setgid():在系统进程中调用setgid()时,与setuid()类似,将实际和有效
     的GID都改变成其参数指定的值.
  *  调用以上两个子程序时,应当注意下面几点:
     . 调用一次setuid()(setgid())将同时设置有效和实际UID(GID),独立分
       别设置有效或实际UID(GID)固然很好,但无法做到这点.
     . setuid()(setgid())可将有效和实际UID(GID)设置成任何整型数,其数
       值不必一定与/etc/passwd(/etc/group)中用户(小组)相关联.
     . 一旦程序以一个用户的UID了setuid(),该程序就不再做为root运行,也
       不可能再获root特权.
  (3)chown():当root进程运行chown()时,chown()将不删除文件的SUID和/或
     SGID许可,但当非root进程运行chown()时,chown()将取消文件的SUID和/
     或SGID许可.
  (4)chroot():改变进程对根目录的概念,调用chroot()后,进程就不能把当前
     工作目录改变到新的根目录以上的任一目录,所有以/开始的路径搜索,都
     从新的根目录开始.
  (5)mknod():用于建立一个文件,类似于creat(),差别是mknod()不返回所打开
     文件的文件描述符,并且能建立任何类型的文件(普通文件,特殊文件,目录
     文件).若从非root进程调用mknod()将执行失败,只有建立FIFO特别文件
     (有名管道文件)时例外,其它任何情况下,必须从root进程调用mknod().由
     于creat()仅能建立普通文件,mknod()是建立目录文件的唯一途径,因而仅
     有root能建立目录,这就是为什么mkdir命令具有SUID许可并属root所有.
     一般不从程序中调用mknod().通常用/etc/mknod命令建立特别设备文件而
     这些文件一般不能在使用着时建立和删除,mkdir命令用于建立目录.当用
     mknod()建立特别文件时,应当注意确从所建的特别文件不允许存取内存,
     磁盘,终端和其它设备.
  (6)unlink():用于删除文件.参数是要删除文件的路径名指针.当指定了目录
     时,必须从root进程调用unlink(),这是必须从root进程调用unlink()的唯
     一情况,这就是为什么rmdir命令具有root的SGID许可的原因.
  (7)mount(),umount():由root进程调用,分别用于安装和拆卸文件系统.这两
     个子程序也被mount和umount命令调用,其参数基本和命令的参数相同.调
     用mount(),需要给出一个特别文件和一个目录的指针,特别文件上的文件
     系统就将安装在该目录下,调用时还要给出一个标识选项,指定被安装的文
     件系统要被读/写(0)还是仅读(1).umount()的参数是要一个要拆卸的特别
     文件的指针.

--------------------------------------------------------------------
标  题: 网络安全
 
 

    本文主要讨论网络和数据通讯安全,分为六个部分.第一部分概述最大,最老
的UNIX网络UUCP系统;第二部分讨论UUCP的安全;第三部分讨论新HONEY DANBER
UUCP及安全特点;第四部分讨论其它的UNIX网络,其中包括RJE和NSC;第五部分讨
论通讯的物理安全;最后一部分讨论Sun Microsystem公司的Sun OS系统的网络
安全.

1.UUCP系统概述
    UUCP系统是一组程序,完成文件传输,执行系统之间的命令,维护系统使用情
况的统计,保护安全.UUCP是UNIX系统最广泛使用的网络实用系统,这其中在两个
原因:第一,UUCP是各种UNIX版本都可用的唯一的标准网络系统,第二,UUCP是最
便宜的网络系统.只需要一根电缆连接两个系统,然后就可建立UUCP.如果需要在
相距数百或数千公里远的两个系统间传输数据,中需要两个具有拨号功能的调制
解调器.

  (1)UUCP命令
      UUCP命令之一是uucp,该命令用于两系统间的文件传输,uucp命令格式类
  似于cp命令的格式,只是uucp允许用户有系统间拷贝文件,命令的一般格式如
  下:
      uucp source_file destination_file
      source_file通常是本系统的文件(但不必一定是),destination_file通
  常是另一系统的文件或目录.指定destination_file的格式为:
      system!filename或system!directory.
      uucp给系统管理员提供了一个选项,可以限制传入和传出本系统的uucp文
  件只能传到/usr/spool/uucppublic目录结构中.若告诉uucp将传输的文件存
  放在其他目录中,系统将会送回一个邮件:remote access to path / file
  denied. uucp允许以简化符号~代替/usr/spool/uucppublic/.如:
      uucp names remote!~/john/names
      有时也可用uucp将文件从另一个系统拷贝到本系统,只要将要传入本系统
  的文件指定为源文件(用system!file)即可,如:
      uucp remotes!/usr/john/file1 file1
      如果在远地机限制了文件传输的目录,上条命令不能拷贝到文件.拷贝文
  件到本系统的最安全的方法是:在两个系统上都通过uucppublic目录进行文件
  传输:
      uucp remotes!~/john/file1 ~/pat/file1

  (2)uux命令
      uux命令可用于在另一个系统上执行命令,这一特点称为"远程命令仞行".
  uux最通常的用处是在系统之间发送邮件(mail在其内部执行uux).典型的uux
  请求如下:
      pr listing| uux - "remote1!lp -d pr1"
      这条命令将文件listing格式编排后,再连接到系统remote1的打印机pr1
  上打印出来.uux的选项"-"使uux将本命令的标准输入设备建立为远程命令的
  标准输入设备.当若干个系统中只有一个系统连接了打印机时,常用uux打印文
  件.
      当然必须严格地限制远程命令招待,以保护系统安全.如:
      本系统不应允许其它系统上的用户运行下面的命令:
      uux "yoursys!uucp yoursys!/etc/passwd (outside!~/passwd)"
      这条命令将使本系统传送/etc/passwd文件到系统outside上,一般地,只
  有几条命令允许地执行.rmail是加限制的mail程序,常常为允许通过uux执行
  的命令之一.也允许rnews(加限制的netnews伪脱机命令)在运行netnews的系
  统上执行,还允许lp在提供了打印设备的系统上运行.

  (3)uucico程序
      uucp和uux命令实际上并不调用另一个系统及传送文件和执行命令,而是
  将用户的请求排入队列,并启动uucico程序.uucico完成实际的通讯工作.它调
  用其它的系统,登录,传送数据(可以是文件或请求远程命令执行).如果电话线
  忙,或其它系统已关机,传输请求仍针保留在队列中,uucico后续的职能操作
  (通常是cron完成)将发送这些传输请求.
      uucico完成数据的发送和接收.在本系统的/etc/passwd文件中,有其它系
  统的uucico登录进入本系统的入口项,该入口项中指定的缺省shell是uucico.
  因此,其它系统调用本系统时,直接与uucico对话.

  (4)uuxqt程序
      当另一系统的uucico调用本系统请求远程命令执行时,本系统的uucico将
  该请求排入队列,并在退出之前,启动uuxqt程序执行远程命令请求.
      下面举例说明数据是如何传输的.假设本系统的一个用户发送邮件给另一
  远程系统remote1的某人,mail会执行uux,在remote1系统上远程地运行remail
  程序,要传送的邮件为remail命令的输入.uux将传输请求排入队列,然后启动
  uucico招待实际的远程调用和数据传输.如果remote1响应请求,uucico登录到
  remote1,然后传送两个文件:邮件和将在remote1上由uuxqt执行的uux命令文
  件.uux命令文件中含有运行remail请求.如果remote1在被调时已关机,uucico
  则将无法登和传送文件,但是cron会周期地(1小时)启动uucico.uucico查找是
  否有还未传送出的数据,若发现uux指定的传输目标系统是remote1,就尝试再
  调用remote1,直到调通remote1为止,或者过了一定天数仍未调通remote1,未
  送出的邮件将作为"不可投递"的邮件退回给发送该邮件的用户.

2.UUCP的安全问题
    UUCP系统未设置限制,允许任何本系统外的用户执行任何命令和拷贝进/出
uucp用户可读/写的任何文件.在具体的uucp应用环境中应了解这点,根据需要设
置保护.
    在UUCP中,有两个程序处理安全问题.第一个是uucico程序,该程序在其它系
统调用本系统时启动.这个程序是本系统uucp安全的关键,完成本系统文件传输
的传进和传出.第二个程序是uuxqt,该程序为所有的远程命令执行服务.

  (1)USERFILE文件
      uucico用文件/usr/lib/uucp/USERFILE确定远程系统发送或接收什么文
  件,其格式为:
      login,sys[c] path_name [path_name...]
      其中login是本系统的登录名,sys是远程系统名,c是可选的call_back标
  志,path_name是目录名.
      uucico作为登录shell启动时,将得到远程系统名和所在系统的登录名,并
  在USERFILE文件中找到匹配login和sys的行.如果该行含有call_back标志c,
  uucico将不传送文件,连接断开,调用远程系统(即,任何系统可以告诉本系统
  它的名是xyz,于是本系统挂起,调用实际的xyz执行文件传输),若无c,uucico
  将执行远程系统请求的文件传送,被传送的文件名被假定为以path_name开头
  的.
      用户需要了解以下几点:
      . 如果远程系统使用的登录名未列于USERFILE的登录域中,uucico将拒绝
        允许其它系统做任何事,并挂起.
      . 如果系统名未列于sys域中,uucico将使用USERFILE中有匹配的登录名
        和空系统名的第一行,如:nuucp,/usr/spool/uucppublic应用到作为
        nuucp登录的所有系统.cbuucp,c将迫使作为cbuucp登录的所有系统自
        己执行文件传输的请求.若调用系统名不匹配sys系统中的任何一个,并
        且无空入口项,uucico也将拒绝做任何事.
      . 若两个机器都设置了call_back标志,传送文件的请求决不会被执行,两
        个系统一直互相调用,直到两个系统中的一个取消call_back时,才能进
        行文件传送.
      . 如果一个用户的登录名列于USERFILE文件的login域中,则当调用本系
        统的uucico为该用户传送文件时,uucico只传送至path_name指定的目
        录中的文件.空登录名用于所有未明确列于USERFILE文件中的用户进行
        登录.所以
            pat,/usr/pat
            只允许pat传送/usr/pat目录结构中的文件.
            ,/usr/spool/uucppublic /tmp
            其他用户仅允许传送目录/usr/spool/uucppublic和/tmp中的文件.
        不要允许uucico将文件拷进/出到除了/usr/spool/uucppublic目录以
        外的其它任何目录,否则可能会有人用下面的命令拷贝走本系统的重要
        信息:
            uucp yoursys!/etc/passwd to-creep

  (2)L.cmds文件
      uuxqt利用/usr/lib/uucp/L.cmds文件确定要执行的远程执行请求命令.
  该文件的格式是每行一条命令.如果只需uuxqt处理电子邮件,该文件中就只须
  一行命令:
      rmail
      系统管理员可允许登录用户执行netnews(rnews)的命令或远程打印命令
  (lp),但决不能允许用户执行拷贝文件到标准输出的命令,如cat命令或网络命
  令uucp,否则这些人只需在他们自己的系统上敲入:
      uux "yoursys!uucp yoursys!/etc/passwd (outside!~/passwd)"
      然后就可等待本系统发送出命令文件.

  (3)uucp登录
      UUCP系统需要两个登录户头,一个是其它系统登录的户头,另一个是系统
  管理使用的户头.例如,数据传输登录户头是nuucp,管理登录户头是uucp,则在
  /etc/passwd文件中应当有二行.
      UID和GID的5号通常留给uucp,由于uucico具有管理登录的SUID许可,因此
  nuucp户头的UID和GID应当用其它值.

  (4)uucp使用的文件和目录
      /usr/lib/uucp用于存放不能由用户直接运行的各种uucp,如uuxqt和
  uucico.该目录还含有若干个确定uucp如何操作的文件,如L.cmds和USERFILE.
  这些文件只能对uucp管理户头可写(系统管理员一定不愿让用户更改远程可执
  行命令表):根据安全的观点,该目录中另一个系统管理员必须清楚的文件是
  L.sys.该文件中含有uucico能调用的每个系统的入口项.入口项数据包括
  uucico所调用系统的电话号码,登录名,未加密的口令.不用说,L.sys应当属于
  uucp管理户头所有,且应当具有400或600存取许可.
      uucp用/usr/spool/uucp目录存放工作文件.文件名以C.开头的文件是送
  到其它系统的命令文件,含有在其它系统上拷入/出数据和执行命令的请求.文
  件名以D.开头的文件用作C.文件的数据文件.文件名以X.开头的文件是来自其
  它系统的远程执行请求,由uuxqt解释.文件名以TM.开始的文件是从其它系统
  传送数据到本系统过程中uucp所使用的暂存文件.XQTDIR是uuxqt用于执行X.
  文件的目录.LOGFILE可有助于管理uucp的安全,它含有执行uucp请求成功与否
  的信息.系统管理员可时常查看该文件,了解有哪些系统正登录入本系统执行
  uucp请求?是什么请求?特别要检查这些请求是否试图做不允许的操作.

3.HONEYDANBER UUCP
    有两个主要的UUCP版本,第一个是与UNIX系统V一起颁布的,在本节将称为老
UUCP,另一个版本称为HONEYDANBER UUCP,由AT&T颁布.
    HONEYDANBER UUCP较之老UUCP有若干改进:
    <1>支持更多的拨号和网络:
       . 智能自动拨号调制解调器以及标准AT&T技术的801自动拨号器.
       . 网络,如DATAKIT VCS,UNET/ETHERNET, 3COM/ETHERNET, SYTEK, TCP
         (BSD UNIX系统).
       . 连接到LAN的拨号器.
       . X.25永久性虚拟环网(用X.25协议)
    <2>重新组织了/usr/spool/uucp目录,在该目录下,对每个远程系统有一个
       目录.
    <3>加强了安全.
       . USERFILE和L.cmds文件组合成一个文件Permissions.
       . 可以在一级级系统上指定远程可执行命令.
       . 可分别控制文件传入和文件传出.
       . 缺省的安全设置很严格.

  (1)HONEYDANBER UUCP与老UUCP的差别
      HONEYDANBER UUCP中的/usr/lib/uucp/Systems文件是原来UUCP中的
  /usr/lib/uucp/L.sys.HONEYDANBER UUCP中/usr/spool/uucp/.log下的一个
  目录代替了老UUCP的文件/usr/spool/uucp/logFILE./usr/spool/uucp/.log
  中的目录uucico,uucp,uux,uuxqt含有相应命令的记录文件,各目录对应最近
  处于活跃状态的远程系统都有一个记录文件(记录文件在这些目录中通常保存
  一个星期).
      如果一个调用本系统的远程系统未列于Systems文件中,uucico将不允许
  该远程系统执行任何操作,而是启动shell程序/usr/lib/uucp/remote.unknown,
  由UUCP提供的该shell程序的缺省版本将在/usr/spool/uucp/.Admin/Foreign
  文件中记下远程系统的登录时间,日期及系统名.只要使remote.unknown不可
  执行,就能禁止这一操作,以达到与老UUCP兼容.
      C.,D.,X.,TM.等文件存放在/usr/spool/uucp下的不同目录中,目录名就
  是文件对应的远程系统名.
      在HONEYDANBER UUCP中USERFILE与L.cmds文件合并在一起,这个新文件
  /usr/lib/uucp/Permissions提供了更灵活的授予外系统存取许可的控制.文
  件中的规则表定义了可以发出请示的各种系统.规则与选项的格式如下.
      rule=list option=yes|no option=list...
      其中rule是登录名或机器名,list是用以分隔各项的规则表(表中各项随
  rule或option而变),option是下边将讨论的各选项之一,或为一个选项表,或
  只取yes/no决定允许/不允许一项操作.

  (2)登录名规则
      LOGNAME规则用于控制作为登录shell启动的uucico.
      LOGNAME=nuucp
      指定对所有登录到nuucp户头下的系统加缺省限制:
      . 远程系统只能发送文件到/usr/spool/uucppublic目录中.
      . 远程系统不能请求接收任何文件.
      . 当uucico调用远程系统时,才发送已排入队列要发送到该远程系统的文
        件.这是uucico准确地识别远程系统的唯一方法(任何系统都可调用本
        系统并冒充是xyz系统).
      . 由uuxqtux远程系统的名义可执行的命令是缺省规定的命令,这些缺省
        命令在编译时定义(通常只有rmail,rnews命令).
      . 可用冒号分隔开若干个其它系统的uucico的登录户头.
      LOGNAME=nuucp:xuucp:yuucp
      任何设有LOGNAME规则的系统,若要登录请求UUCP传送,都会被回绝(系统
  将给信息"get lost",并挂起).
      一个LOGNAME规则就足够启动HONEYDANBER UUCP系统.事实上,当该系统运
  行时,将在Permissions文件中放一个无选项的LOGNAME规则,该规则应用于在
  /etc/passwd文件入口项shell域中有/usr/lib/uucp/uucico的所有登录户头.
      可使用若干选择忽略缺省限制,这些选项可组合,允许或限制各种操作.例
  如可用WRITE选项指定一个或多个送入文件的目录,而不用被限制送入
  /usr/spool/uucppublic目录.
      LOGNAME=nuucp WRITE=/
      这一规则允许文件送入本系统的任何目录.2-4项的限制依然保持.注意:
  远程UUCP请求可重写任何有写许可的文件,可指定多个写入文件的目录.用冒
  号分隔开:
      LOGNAME=nnuucp WRITE=/usr:/floppy
      该规则允许远程系统将文件写到/usr和/floppy目录中.
      用REQUEST=yes选项可允许远程系统的用户从本系统拷贝文件.
      LOGNAME=nuucp REQUEST=yes
      能被拷贝的文件只能是存放在/usr/spool/uucppublic目录中的文件,1,
  3,4,项的限制仍然有效.若要允许远程系统可从其它目录拷贝文件,用READ选
  择:
      LOGNAME=nuucp REQUEST=yes READ=/usr
      该规则允许远程系统拷贝/usr目录中任何其他人可读的文件.也可像
  WRITE选项一样指定目录表.
      用SENDFILES=yes选项可允许uucico在远程系统调用本系统时发送出已排
  队的文件.
      LOGNAME=nuucp SENDFILES=yes
      1,2,4项的限制依然有效.
      用CALLBACK=yes选项迫使任何登录到指定户头的系统call back.
      注意:CALLBACK=yes不能与其它选项组合作用.如果其它选项与这条选项
  列在一起,其它选项将被忽略.
      NOREAD和NOWRITE选项可分别与READ和WRITE选项一起使用.指定NOREAD选
  项下的目录表,可建立对READ选项的例外处理(即指出READ目录中不能由远程
  系统请求的目录),例如:
      LOGNAME=nuucp,REQUEST=yes READ=/ NOREAD=/etc
      该规则允许远程系统请求系统中任何其他人可读的文件,但不包括/etc中
  的文件,NOWRITE,WRITE的联合用法与上类似.
      一般来说,不要将缺省限制改得太多.若本系统被另一系统调去存贮电话
  费用或系统管理员没有办法拨出,可以用SENDFILE选项.若要对某些机器取消
  限制,则应当建立一个仅用于那些机器的uucico登录户头.例如:
      LOGNAME=nuucp SENDFILES=yes
      LOGNAME=trusted SENDFILES=yes REQUEST=yes READ=/ WRITE=/
      上面的规则允许在trusted户头下登录的系统在本系统中具有另一种文件
  存取许可,nuucp户头的口令应送给所有要与本系统uucp建立连接的系统管理
  员,trusted户头的口令则只能送给信任系统的管理员.
      如系统有信任和非信任的uucp户头,最好用PUBDIR选项为这两种户头建立
  不同的公共户头,PUBDIR允许系统管理员改变uucico对公共目录的概念(缺省
  为/usr/spool/uucppublic).例如:
      LOGNAME=nuucp SENDFILES=yes REQUEST=yes \
          PUBDIR=/usr/spool/uucppublic/nuucp
      LOGNAME=trusted SENDFILES=yes REQUEST=yes READ=/ WRITE=/ \
          PUBDIR=/usr/spool/uucppublic/trusted
      上面的选项使要送到公共目录中的文件,对于不同登录nuucp和trusted分
  别放入不同的目录中.这将防止登录到nuucp的非信任系统在信任系统的公共
  目录中拷进和拷出文件(注意:上面的选项允许nuucp请求文件传送).行尾倒斜
  杠指明下一行是该行的续行.
      用MYNAME选项可以给登录进某一户头的系统赋与一个系统名:
      LOGNAME=Xuucp MYNAME=IOnker

  (3)MACHINE规则
      MACHINE规则用于忽略缺省限制,在MACHINE规则中指定一个系统名表,就
  可使uucico调用这些系统时改变缺省限制.READ,WRITE,REQUEST,NOREAD,
  NOWRITE,PUBDIR选项的功能与LOGNAME相同.忽略CALLBACK,SENDFILES选项,
  MYNAME选项所定义的必须与LOGNAME规则联用,指定将赋给调用系统的名,该名
  仅当调用所定义的系统时才用.
      MACHINE规则的格式如下:
      MACHINE=zuul:gozur:enigma WRITE=/ READ=/
      这条规则使远程系统zuul,gozar,enigma能够发送/请求本系统上任何其
  他人可读/写的文件.一般不要让远程系统在除/usr/spool/uucppublic目录外
  的其它目录读写文件,因此,对于信任的系统也要少用MACHINE规则.
      系统名OTHER用于为指定用户外的所有其他用户建立MACHINE规则.
      COMMANDS选项用于改变uuxqt通过远程请求执行的缺省命令表.
      MACHINE=zuul COMMANDS=rmail:rnews:lp
      上面的选项允许系统zuul请求远程执行命令rmail,rnews,lp.uucico不用
  这个选项.uuxqt用该选项确定以什么系统的名义执行什么命令.
      COMMANDS选项所指定的命令将用缺省设置的路径PATH.PATH在编辑uuxqt
  时被建立通常设置为/bin:/usr/bin.在COMMANDS选项中给出全路径名可以忽
  略缺省PATH.
      MACHINE=zuul COMMANDS=umail:/usr/local/bin/rnews:lp
      同样地,对HONEYDANBER UUCP也应当象老UUCP一样不允许远程系统运行
  uucp或cat这样的命令.任何能读写文件的远程执行命令都可能威胁局域安全.
  虽然局域系统对远程系统名进行一定程序的校核,但是任何远程系统在调用局
  域系统时都可自称是"xyz",而局域系统却完全相信是真的.因此局域系统的系
  统可能认为只允许了zuul运行lp命令.但实际上任何自称是zuul的系统也被允
  许运行lp命令.
      有两种方法可以证实系统的身份.一种方法是拒绝用CALLBACK=yes与调用
  系统对话.只要电话和网络线未被破密或改变,局域系统就能肯定地确认远程
  系统的身份.另一种方法是在LOGNAME规则中用VALIDATE选项.
      若必须允许某些系统运行"危险"的命令,可联用COMMANDS和VALIDATE选项,
  VALIDATE选项用于LOGNAME规则中指定某系统必须登录到LOGNAME规定的登录
  户头下:
      LOGNAME=trusted VALIDATE=zuul
      MACHINE=COMMANDS=rmail:rnews:lp
      当一个远程系统自称是zuul登录时,uucico将查Permissions文件,找到
  LOGNAME=trusted规则中的VALIDATE=zuul,若该远程系统使用了登录户头
  trusted,uucico将认为该系统的确是zuul继续往下执行,否则uucico将认为该
  系统是假冒者,拒绝执行其请求.只要唯有zuul有trusted户头的登录口令,其
  它系统就不能假冒它.仅当登录口令是保密的,没有公布给其他非信任的系统
  管理员或不安全的系统,VALIDATE选项才能奏效.如果信任系统的登录口令泄
  漏了,则任何系统都可伪装为信任系统.
      在COMMANDS选项中给出ALL时,将允许通过远程请求执行任何命令.因此,
  不要使用ALL!规定ALL实际上就是把自己的户头给了远程系统上的每一个用户.

  (4)组合MACHINE和LOGNAME规则
      将MACHINE和LOGNAME规则组合在一行中,可以确保一组系统的统一安全,
  而不管远程系统调用局域系统还是局域系统调用远程系统.
      LOGNAME=trusted MACHINE=zuul:gozur VALIDATE=zuul:gozur \
      REQUEST=yes SENDFILES=yes \
      READ=/ WRITE=/ PUBDIR=/usr/spool/trusted \
      COMMANDS=rmail:rnews:lp:daps

  (5)uucheck命令
      一旦建立了Permissions文件,可用uucheck -v命令了解uucp如何解释该
  文件.其输出的前几行是确认HONEYDANBER UUCP使用的所有文件,目录,命令都
  存在,然后是对Permissions文件的检查.

  (6)网关(gateway)
      邮件转送可用于建立一个gateway机器.gateway是一个只转送邮件给其它
  系统的系统.有了gateway,使有许多UNIX系统的部门或公司对其所有用户只设
  一个电子邮件地址.所有发来的邮件都通过gateway转送到相应的机器.
      gateway也可用于加强安全:可将MODEM连接到gateway上,由gateway转送
  邮件的所有系统通过局域网或有线通讯线与gateway通讯.所有这些局域系统
  的电话号码,uucp登录户头,口令不能对该组局域系统外的系统公布.如果有必
  要,可使gateway是唯一连接了MODEM的系统.
      建立一个最简单的gateway是很容易的:对每个登录进系统,想得到转送邮
  件的用户,只需在文件/usr/mail/login中放入一行:
      Forward to system !login
      要发送给户头login的邮件进入gateway后,将转送给登录在系统system的
  户头login下的用户.两个登录名可以不同.
      gateway建立了一个安全管理的关卡:gateway的口令必须是不可猜测的,
  gateway应尽可能只转送邮送而不做别的事.至少不要将重要数据存放在该机
  上.在gateway上还应做日常例行安全检查,并且要对uucp的登录进行仔细的检
  查.
      gateway也为坏家伙提供了一个入口:如果有人非法进入了gateway,他将
  通过uucp使用的通讯线存取其它的局域系统和存取含有关于其它局域系统uucp
  信息的Systems文件.若这人企图非法进入其它系统,这些信息将对他具有很大
  的用处.
      经验:
      . 若要建立gateway,应确保其尽可能的无懈可击.
      . 可在gateway和局域系统间建立uucp连接,使得局域系统定期的与gateway
        通讯获取邮件,而gateway完全不用调用局域系统.这样做至少能防止一
        个坏家伙通过gateway非法进入局域系统.
      . 利用局域系统的Permissions文件对gateway的行为加以限制,使其裸露
        程度达到最小,即只转发邮件.这样可使窃密者不能利用gateway获取其
        它系统的文件.

  (7)登录文件检查
      HONEYDANBER UUCP自动地将登录信息邮给uucp.login文件,应当定期地读
  这个文件.系统管理员应当检查那些不成功的大量请求,特别是其它系统对本
  系统的文件请求.还要检查不允许做的远程命令执行请求.登录信息都保存在
  文件中,如果要查看,可用grep命令查看./usr/spool/uucp/.Log/uucico/system
  文件中含有uucico登录,/usr/spool/uucp/.Log/uuxqt/system文件含有uuxqt
  登录.下面一行命令将打印出uuxqt执行的所有命令(rmail除外):
      grep -v rmail /usr/spool/uucp/.Log/uuxqt/*
      下面一行命令将打印所有对本系统文件的远程请求:
      grep -v REMOTE /usr/spool/uucp/.Log/uucico/* | grep "<"
      总之,HONEYDANBER UUCP比老UUCP提供了更强的安全性,特别是提高了远
  程命令执行的安全性.

4.其它网络

  (1)远程作业登录(RJE)
      RJE(remote job entry)系统提供了一组程序及相应的硬件,允许UNIX系
  统与IBM主机上的JES(job entry subsystems)通讯.可通过两条命令的send和
  usend存取RJE.send命令是RJE的通用的作业提供程序,它将提供文件给JES,就
  好像这些作业文件是从卡片阅读机读入的"穿孔卡片"一样.usend命令用于在
  使用了RJE系统的UNIX系统间传送文件,它将建立一个"作业"(虚拟的一叠穿孔
  卡片),并以send命令的送文件的同样方式将该作业提供给JES.该作业卡片叠
  中的控制卡告诉JES数据传送到何处(这里,数据是正被传送的文件).文件传送
  的目的地是UNIX系统,但JES认为是一个"行式打印机".RJE系统通常以每秒
  9600位的速率与JES通讯.典型的usend命令句法如下:
      usend -d system -u login file(s)
      system是挂到IBM JES上的另一个UNIX系统名,login是另一个系统上的接
  收用户的登录名,file(s)是用户希望传送的文件.
      几个关于RJE的安全问题:
      . 缺省时,RJE将把文件传送到接收用户的HOME目录中的rje目录.该目录
        必须对其他人可写,可执行,这意味着存入rje目录的文件易受到检查,
        移动,修改.然而如果该目录的许可方式是733,其他用户就不能用ls列
        目录内容寻找感兴趣的文件.被建立的文件对所有者,小组或其他人都
        是可读的,所以通过RJE网络传送的安全文件在系统上都是可读的.为什
        么这些问题不同于UUCP和/usr/uucppublic目录?
        * UUCP定期地清除/usr/spool/uucppublic目录的内容,几天前或几星
          期前的老文件将被删除,通常用户将把自己的文件移出uucppublic目
          录,以免文件被删除,而存在用户rje目录中的文件不会被清除,所以
          有些用户从来不把自己的文件移到其它目录.
        * 用户清楚地知道uucppublic目录是一个公共目录,存入重要信息之前,
          首先注意将其加密.但是用户却总是容易忘记自己rje目录实际上也
          是公共目录,经常忘记将重要文件加密.
      . usend命令在其他人可写的目录中建立文件,并重写其他人可写的文件.
      . RJE服务子程序是执行一些功能而不是执行文件传送.RJE系统像UUCP一
        样也执行远程命令,运行RJE的大多数系统用远程命令执行转送电子邮
        件.因为RJE的传输率通常比UUCP更高.遗憾的是RJE没有像UUCP那样的
        能力限制能执行的命令和能存取的文件.一个好的经验是将连接到同一
        个JES的一组系统,看作这些系统是在同一系统上.

  (2)NSC网络系统
      NSC(network systems corporation)宽信道网络是一个高速局域网络
  (LAN).NSC可将数千个最远相距5000英尺的系统挂在一起,传输速率可高达
  50MBIT/S,NSC也可通过的通讯如微波或人造卫星通讯线连接不同系统.
      UNIX用户可通过nusend命令存取NSC宽信道,nusend命令的句法与usend命
  令相同,除用-c选项传送其他人不可存取的文件外,大多数情况下,nusend的用
  法与usend是一样的,换言之,如果无-c选项,文件就是可读的,而且文件路径名
  中列出所有目录对其他人也都是可搜索的,前边讨论过的关于RJE的安全问题
  的考虑也适合于NSC网络.
      可查看NSC记录文件,了解NSC是否正在执行任何不应执行的命令.记录文
  件保存在目录/usr/nsc/log中.下面的命令将打印出所有由NSC在本系统上执
  行的命令(rmail除外):
      grep execute /usr/nsc/log/LOGFILE|grep -v rmail

5.通讯安全
    有两种方法可以提供安全的通讯:第一种是保证传输介质的物理安全,即使
任何人都不可能在传输介质上接上自己的窃密线或"窃听",第二种方法是加密重
要数据.

  (1)物理安全
      如果所有的系统都锁在屋里,并且所有连接系统的网络和接到系统上的终
  端都在上锁的同一屋内,则通讯与系统一样安全(假定没有MODEM).但是系统的
  通讯线在上锁的室外时,就会发生问题了.
      尽管从网络通讯线提取信息所需要的技术,比从终端通讯线获取数据的技
  术高几个数量级,上述的同样的问题也倒发生在网络连接上.
      用一种简单的(但很昂贵)高技术加压电缆,可以获得通讯的物理安全.这
  一技术是若干年前,为美国国家电话系统而发展的.通讯电缆密封在塑料中,埋
  置于地下,并在线的两端加压.线上连接了带有报警器的监示器,用来测量压力.
  如果压力下降,则意味电缆可能破了,维修人员将被派出寻找与修复出问题的
  电缆.
      电缆加压技术提供了安全的通讯线.不是将电缆埋置于地下,而是架线于
  整座楼中,每寸电缆都将暴露在外.如果任何人企图割电缆,监示器会启动报警
  器,通知安全保卫人员电缆已被破坏.如果任何人成功地在电缆上接了自己的
  通讯线,安全人员定期地检查电缆的总长度,应可以发现电缆拼接处.加压电缆
  是屏蔽在波纹铝钢包皮中的,因此几乎没有电磁发射,如果要用电磁感应窃密,
  势必需用大量可见的设备.
      这样终端就不必锁在办公室,而只需将安全电缆的端头锁在办公室的一个
  盒子里.
      另一个增加外部终端物理安全的方法,是在每天下午5点使用计算机的时
  间结束时,即当所有用户回家时,断开终端的连接.这样某人若想非法进入系统,
  将不得不试图在白天人们来来回回的时间里获取终端的存取权,或不得不在下
  午5点手试图潜入计算机房(如果5点后计算机房有操作人员或有安全人员,潜
  入计算机房的企图就不可能得逞).
      光纤通讯线曾被认为是不可搭线窃听的,其断破处立即可被检测到,拼接
  处的传输会令人难以忍耐的缓慢.光纤没有电磁幅射,所以也不能用电磁感应
  窃密.不幸的是光纤的最大长度有限制,长于这一长度的光纤系统必须定期地
  放大(复制)信号.这就需要将信号转换成电脉冲,然后再恢复成光脉冲,继续通
  过另一条线传送.完成这一操作的设备(复制器)是光纤通讯系统的安全薄弱环
  节,因为信号可能在这一环节被搭线窃听.有两个办法可解决这一问题:距离大
  于最大长度限制的系统间,不要用光纤线通讯(目前,网络覆盖范围半径约100
  公里),或加强复制器的安全(用加压电缆,警报系统,警卫).

  (2)加密
      加密也可提高终端和网络通讯的物理安全,有三种方法加密传输数据:
      . 链接加密:在网络节点间加密,在节点间传输加密,传送到节点后解密,
                 不同节点对间用不同的密码.
      . 节点加密:与链接加密类似,不同的只是当数据在节点间传送时,不用明
                 码格式传送,而是用特殊的加密硬件进行解密和重加密,这种
                 专用硬件通常旋转在安全保险箱中.
      . 首尾加密:对进入网络的数据加密,然后待数据从网络传送出后再进行
                 解密.网络本身并不会知道正在传送的数据是加密数据.这一
                 方法的优点是,网络上的每个用户(通常是每个机器的一个用
                 户)可有不同的加密关键词,并且网络本身不需增添任何专门
                 的加密设备.缺点是每个系统必须有一个加密设备和相应的
                 软件(管理加密关键词).或者每个系统必须自己完成加密工
                 作(当数据传输率是按兆位/秒的单位计算时,加密任务的计
                 算量是很大的).
      终端数据加密是一特殊情况,此时链接加密法和首尾加密法是一样的方
  法,终端和计算机都是既为节点又为终止端点.
      通讯数据加密常常不同于文件加密,加密所用的方法不应降低数据的传送
  速度.丢失或被歪曲了的数据不应当引起丢失更多的数据位,即解密进程应当
  能修复坏数据,而不能由于坏数据对整个文件或登录进行不正确地解密.对于
  登录会话,必须一次加密一个字节,特别是在UNIX系统的情况下,系统要将字所
  返回给用户,更应一次加密一个字节.在网络中,每一链可能需要不同的加密关
  键字,这就提出了对加密关键词的管理,分配和替换问题.
      DES传送数据的一般形式是以代入法密码格式按块传送数据,不能达到上
  述的许多要求.DES采用另一加密方法,一次加密一位或一个字节,形成密码流.
  密码流具有自同步的特点,被传送的密码文本中发生的错误和数据丢失,将只
  影响最终的明码文本的一小段(64位).这称为密码反馈.在这种方法中,DES被
  用作虚拟随机数发生器,产生出一系列用于对明码文本的随机数.明码文本的
  每n位与一个DESn位的加密输出数进行异或,n的取值为1-64,DES加密处理的输
  入是根据前边传送的密码文本形成的64位的数值.
      发n为1时,加密方法是自同步方式:错一位或丢失1位后,64位的密码文本
  将不能被正确地解密,因为不正确的加密值将移入DES输入的末端.但是一旦接
  收到正确的64位密码,由于DES的加密和解密的输入是同步的,故解密将继续正
  确地进行.
      DES的初始输入称为种子,是一个同时由传输器和接收器认可的随机数.通
  常种子由一方选择,在加密前给另一方.而加密关键词不能以明码格式通过网
  络传送,当加密系统加电时在两边都写入加密关键词,并且在许多阶段期间加
  密关键词都保持不变,用户可以选择由主关键词加密的阶段关键词,发送到数
  据传送的另一端,当该阶段结束后,阶段关键词就不再使用了.主关键词对用户
  是不可见的,由系统管理员定期改变,选择哪一种关键词管理方法,常由所用的
  硬件来确定.如果加密硬件都有相应的设备,则用种子还是用主关键词阶段关
  键词是无关紧要的.

  (3)用户身份鉴别
      口令只是识别一个用户的一种方法,实际上有许多方法可以用来识别用户.
      . CALL BACK MODEM:则维护系统有效用户表及其相应电话号码的设备.当
             用户拨号调用系统时,CALL BACK MODEM获得用户的登录户头,挂
             起,再回头调用用户的终端.这种方法的优点是,限制只有电话号
             码存于MODEM中的人才是系统的用户,从而使非法侵入者不能从其
             家里调用系统并登录,这一方法的缺点是限制了用户的灵活性,并
             仍需要使用口令,因为MODEM不能仅从用户发出调用的地方,唯一
             地标识用户.
      . 标记识别:标记是口令的物理实现,许多标记识别系统使用某种形式的
             卡(如背面有磁条的信用卡),这种卡含有一个编码后的随机数.卡
             由连接到终端的阅卡机读入,不用再敲入口令.为了增加安全性,
             有的系统要求读入卡和敲入口令.有些卡的编码方法使得编码难
             于复制.标记识别的优点是,标识可以是随机的并且必须长于口令.
             不足之处是每个用户必须携带一个卡(卡也可与公司的徽记组合
             使用).并且每个终端上必须连接一个阅读机.
      . 一次性口令:即"询问-应答系统".一次性口令系统允许用户每次登录时
             使用不同的口令.这种系统允许用户每次登录时使用不同的口令.
             这种系统使用一种称做口令发生器的设备,设备是手携式的(大约
             为一个袖珍计算器的大小),并有一个加密程序和独一的内部加密
             关键词.系统在用户登录时给用户提供一个随机数,用户将这个随
             机数送入口令发生器,口令发生器用用户的关键词对随机数加密,
             然后用户再将口令发生器输出的加密口令(回答)送入系统,系统
             将用户输入的口令,与它用相同的加密程序,关键词和随机数产生
             的口令比较,如果二者相同,允许用户存取系统.这种方法的优点
             是:用户可每次敲入不同的口令,因此不需要口令保密,唯有口令
             发生器需要安全保护.为了增加安全性,UNIX系统甚至不需联机保
             存关键词,实际的关键词可保存在有线连接于系统的一个特殊加
             密计算机中.在用户登录期间,加密计算机将为用户产生随机数和
             加密口令.这样一种系统的优点是,口令实际不由用户输入,系统
             中也不保存关键词,即使是加密格式的关键词也可保存于系统中.
             其不足之处类似于标记识别方法,每个用户必须携带口令发生器,
             如果要脱机保存关键词,还需要有一个特殊硬件.
      . 个人特征:有些识别系统检测如指印,签名,声音,零售图案这倦的物理
             特征.大多数这样的系统极是实验性的,昂贵的,并且不是百分之
             百的可靠.任何一个送数据到远程系统去核实的系统有被搭线窃
             听的危险,非法入侵者只须记录下送去系统校核的信息,以后再重
             显示这些信息,就能窃密.注意:这同样也是标记识别系统的一个
             问题.

6.SUN OS系统的网络安全
    美国SUN MICROSYSTEM公司的SUN OS操作系统是建立在贝尔实验室的UNIX
SYSTEM V和加州大学伯克得分校的UNIX 4.3基础上的UNIX操作系统.SUN OS 4.0
版提供了专门的鉴别系统,该系统极大地提高了网络环境的安全性.它也可用来
确保其它UNIX系统或非UNIX系统的安全.它使用DES密码机构和公共关键字密码
机构来鉴别在网络中的用户和机器.DES表示数据编码标准,而公共数据编码机构
是包含两种密钥的密码系统:一种是公用的,另一种是专用的.公用的密钥是公开
的而专用密钥是不公开的.专用(秘密)的密钥用来对数据进行编码和解码.
    SUN OS系统不同于其它公共关键字编码之系统在于:SUN OS的公用和专用密
钥都被用来生成一个通用密钥,该密钥又用来产生DES密钥.

  (1)确保NFS的安全
      在网络文件系统NFS上建立安全系统,首先文件系统必须开放并保证装配
  的安全.
    . 编辑/etc/exports文件,并将-Secure任选项加在要使用DES编码机构的文
      件系统上.在屏幕上显示服务器怎样开放安全的/home目录,如:
      home -Secure,access=engineering
      其中engineering是网络中唯一能存取/home文件系统的用户组.
    . 对于每台客户机(CLIENT),编辑/etc/fastab文件时,Secure将作为一个装
      配任选项出现在每个需要确保安全的文件系统中.
    . SUN OS中包括有/etc/publickey数据库,该库对每个用户均包含有三个域:
      用户的网络名,公用密钥和编码后的密钥.当正常安装时X唯一的用户是
      nobody,这个用户可以无需管理员的干预即可建立自己的专用密钥(使用
      chkey(1)).为了进一步确保安全,管理员可为每个使用newkey(8)的用户
      建立一个公用密钥.
    . 确认keyserv(8c)进程由/etc/rc.local启动,并且仍在运行.该进程执行
      对公用密码的编码,并将编码后的专用密钥存入/etc/keystore中.
    . 此时,所有的用户(除超级用户)都必须使用yppasswd来代替passwd,以使
      得登录的口令与用户的密钥一致.其结果是在网络中每台客户机的
      /etc/passwd文件中不能有每个用户的用户名,因而应使用有缺省值的
      /etc/passwd文件.
    . 当安装,移动或升级某台机器时,要将/etc/keystore和/etc/.rootkey两
      个文件保留.
      注意:当你使用login,rlogin或telnet命令到远程机器时,你会被要求输
  入口令.一旦你输入正确的口令,你也就泄漏了你的帐号.因为此时你的密钥是
  存放在/etc/keystore中.当然这是指用户对远程机器的安全不信任时.如果用
  户觉得远程机器在安全保密方面不可靠,那就不要登录到远程机器去,而可使
  用NFS来装配你所查找的文件.

  (2)NFS安全性方面的缺陷
      SUN的远程过程调用(RPC)机制已被证明可以用来建立有效的网络服务,最
  有名的服务是NFS,它实现了不同机器,不同操作系统之间透明的文件共享.但
  NFS并非毫无缺陷.通常NFS鉴别一个写文件的请求时是鉴别发出这个请求的机
  器,而不是用户.因而,在基于NFS的文件系统中,运行su命令而成为某个文件的
  拥有者并不是一件困难的事情.同样,rlogin命令使用的是与NFS同样的鉴别机
  制,也存在与NFS一样的在安全性方面的弱点.
      对网络安全问题一个通常的办法是针对每一个具体的应用来进行解决.而
  更好的办法是在RPC层设置鉴别机构,使对所有的基于RPC的应用都使用标准的
  鉴别机构(比如NFS和Yellow pages).于是在SUN OS系统中就可以对用户的机
  器都进行鉴别.这样做的优点是使计算机网络系统更像过去的分时系统.在每
  台机器上的用户都可登录到任何一台机器;就象分时系统中任何一个终端上的
  用户都可登录到主机系统一样,用户的登录口令就是网络的安全保证.用户不
  需要有任何有关鉴别系统的基础.SUN系统的目标是让网络系统成为既安全又
  方便的分时系统.
      要注意以下几点:
      . 任何人只要他拥有root存取权并具备较好的网络程序设计知识,他就可
        以向网络中加入二进制数据或从网络中获得数据.
      . 在采用以太网结构的局域网的工作中不可能发生信息包被窜改(即被传
        送的信息包在到达目的站之前,被捕获并将其修改后按原路径发出),因
        为所有的信息包都将几乎同时到达目的站之前,被捕获并将其修改后按
        原路径发出),但在网关上发生包被窜改则是有可能的.因而应确保网络
        中所有网关都是可靠的.
      . 对网络系统最危险的攻击是同向网络中加入数据有关的事件,例如通过
        生成一个合法的信息包来冒充某个用户;或记录下用户会话的内容,并
        在晚一些时候再回答它们.这些都会严重的影响数据的完整性.
      . 至于偷看信息这类侵袭(仅仅是偷看网络中传送的内容而不冒充任何人)
        将可能造成失密,但并不十分危险,因为数据的完整性没有被破坏,而且
        用户可通过对需要保密的数据进行编码来保护数据的专用.
      总之,在任何意义上要完全明白网络传送的各种问题并不是很容易的,需
  不断实践分析.

  (3)远程过程调用(RPC)鉴别
      RPC是网络安全的核心,要明白这一点就必须清楚在RPC中鉴别机制是怎样
  工作的.RPC的鉴别机制是端口开放式的,即各种鉴别系统都可插入其中并与之
  共存.当前SUN OS有两个鉴别系统:UNIX和DES,前者是老的,功能也弱.后者是
  在本节要介绍的新系统.对于RPC鉴别机制有两个词是很重要的:证书和核对器
  (credentials和verify).这好比身份证一样,证书是识别一个人的姓名,地址,
  出生日期等;而核对器就是身份证的照片,通过这张照片就能对持有者进行核
  对.在RPC机制中也是这样:客户进程在RPC请求时要发出证书和核对器信息.而
  服务器收到后只返回核对器信息,因为客户是已知道服务的证书的.

  (4)UNIX鉴别机制
      SUN早期的各种网络服务都建立在UNIX鉴别机制之上,证书部分包含站名,
  用户号,组号和同组存取序列,而核对器是空白.这个系统存在两个问题:首先,
  最突出的问题是核对器是空的,这就使得伪造一份证书是非常容易的.如果网
  络中所有的系统管理员都是可以信赖的,那不会有什么问题.但是在许多网络
  (特别是在大学)中,这样是不安全的.而NFS对通过查寻发出mount请求的工作
  站的INTERNET地址作为hostname域的核对器来弥补UNIX鉴别系统的不足,并且
  使它只按受来自特权INTERNET口的请求.但这样来确保系统安全仍然是不够的,
  因为NFS仍然无法识别用户号ID.
      另一个问题是UNIX鉴别系统只适用于UNIX系统,但需要在一个网络中所有
  的站都使用UNIX系统是不现实的.因为NFS可运行于MS-DOS和VMS系统的机器上,
  但在这些操作系统中UNIX鉴别系统是不能运行的,例如:MS-DOS系统甚至就没
  有用户号的概念.
      由此可知,应该有这样的鉴别系统:它具有独立于操作系统证书并使用核
  对器.这就如像DES鉴别系统.

  (5)DES鉴别系统
      DES鉴别系统的安全性建立在发送者对当前时间的编码能力上,它使接收
  者能解码并对照自己的时钟来进行检验.时钟标记也使用DES编码.这样的机制
  要工作有两件事是必须的:
      . 发送者和接收者双方必须对什么是当前时间进行约定.
      . 发送者和接收者必须使用同样的编码关键字.
      如果网络有时间同步机制,那么客户机服务器之间的时间同步将自己执行.
  如果没有这样的机制,时间标记将按服务器的时间来计算.为计算时间,客户机
  在开始RPC调用之前必须向服务器询问时间,然后计算自己和服务器之间的时
  间差,当计算时间标记时,这个差值将校正客户方面的时钟.一旦客户机和服务
  器时钟不同步,服务器就开始拒绝客户机的请求,并且DES鉴别系统将使它们的
  时间同步.
      客户和服务器是怎样来获得相同的编码关键字的呢?当客户希望与服务器
  交谈时,它生成一个随机关键字来对时间标记进行编码;这个关键字称为会话
  关键字CK,客户对CK按公用关键字模式进行编码,并在第一次会话时发送给服
  务器.这个CK是唯一使用公用关键字编码的关键字.这时只有这一客户与服务
  器两者才知道它们的DES关键字,这个关键字称为共有关键字.
      第一次请求时,客户的证书包括三项:名字,用共有关键字编码的会话关键
  字和用会话关键字编码的时窗,时窗告诉服务器:以后即将给你发送许多证书;
  也许会有人用伪造的时间标记冒充新的会话向你发送证书.当你收到时间标志
  时,请查看你的当前时间是否在时间标记和时间标记加时窗之间,如果不对请
  拒绝.
      为创建安全的NFS文件,时窗缺省值为30分钟.在发出首次请求时,客户的
  核对器中包含被编码的时间标记和特定时窗(WIN+1)的编码核对器.这样做的
  原因是:如果某人想写一个程序并且在证书和核对器的编码域中填充一些任意
  的二进制值,服务器将CK解码成DES关键字,并且用它来对时窗和时间标记解码,
  最后产生随机值.在经过上千次的努力后,这些随机的时窗/时间标记对才有可
  能通过鉴别系统,因此时窗核对器将使要猜测出正确的证书变得更困难,以提
  高安全性.
      在对客户进行鉴别后,服务器将在证书表中存放四项值:客户名A,会话关
  键字CK,时窗,时间标记.在服务器中保留前三项的目的是以备将来使用.保留
  时间标记的目的是为防止再次执行,服务器只接收比以前的时间标记晚的时间
  标记.服务器将向客户返回的核对器包括一个序号ID和负的时间标记(该标记
  是被CK编码后的).客户机知道,只有服务器能返送回这样的核对器,因为只有
  服务器知道时间标记.
      第一次会话过程是很复杂的,以后就容易多了,客户每次向服务器发送它
  的ID和编码后的时间标记,而服务器则返送回编码后的时间标记.

  (6)公共关键字的编码
      SUN OS使用Diffie-Hellman法进行公共关键字的编码,该算法随机产生一
  个秘密关键字(SK),简称密钥.可用一个公式来计算出公共关键字(PK),公共关
  键字存放在公共目录中,而密钥存放在专用的目录中.由PK和SK生成普通关键
  字K,由于计算K必须知道两个密钥中的一个,所以除了服务器和客户外没有任
  何人能计算K.计算将与另一个已知常数M求模.尽管某人的密钥可能会被人采
  用对公共关键字求对数的方法来得到,但是由于M的值很大,要计算出M来几乎
  是不可能的.为了确保安全,K必须有较多位的二进制数来作DES密钥,最多可从
  K中取56位来形成DES密钥.
      PK和SK都是以在文件publickey,byname中的网络名的顺序存放,SK用登录
  号时的口令编码后存放.当你登录到一个站时,Login程序先取你的编码关键字
  后再用你的口令对其进行编码;并将解码后的密钥送给确保安全的本地密钥服
  务器,以备以后进行RPC处理时使用.(注意:一般的应用是不需要知道公共关键
  字和密钥的).除改变登录口令外,yppasswd程序还将随机地产生新的公共关键
  字和密钥关键字对.
      密钥服务器是一个驻留于本机的RPC服务器,它执行以下三种公共关键字
  操作:
      . setsecreykey(secretkey):告诉密钥服务器将密钥SK存贮起来,以备将
            来使用(通常是被login程序采用).
      . encrytsessionkey(severname,des_key):使在第一次RPC处理中将会话
            关键字传送给服务器,密钥服务器查找severname中的公共关键字,
            并将它和setsecretkey设置的client的密钥组合,以生成用于
            对des_key编码的密钥.
      . decrytsessionkey(clientname,des_key):服务器又请求密钥服务器通
            过调用本操作来对会话密钥解码.
      注意:隐含在这些调用中的使用者名必须鉴别,密钥服务器中可能使用DES
  鉴别系统的(因为会产生死馈).密钥服务器通过按uid存贮的密钥来解决这个
  问题,它只允许对本机的root所属进程的请求.然后client进程又执行setuid
  进程,该进程属于root,执行对client的请求,并将真正的client的uid告诉密
  钥服务器.
      以上三种操作都是系统调用,内核将与密钥服务器直接通信,而不是通过
  执行setuid程序来通信.

  (7)网络实体的命名
      对网络实体的命名原有的UNIX鉴别系统存在一些问题,对UNIX鉴别系统最
  基本的网络实体uid,已经陈述了这个系统的一个问题(太UNIX系统化了),而且
  这个系统还有两个问题:一个是当许多域联系起来时的uid冲突;另一个是超级
  用户不是以每个域为基础赋值,而是以每台机器为基础赋值.在缺省情况下,NFS
  以一种严密的方式解决这一问题:它不允许根通过网络以uid0存取.
      DES鉴别系统通过建立在新名字(网络名)基础上的命名机制纠正这些问题.
  简单地说,网络名是一串可打印字符,从根本上说,我们所要鉴别的正是这些网
  络名.公共关键字和密钥按网络名存贮而不是按用户名存贮.yellow page map
  netid.byname 将网络名映射为本机器中的用户名uid和同组存取序列,而非
  SUN环境会将网络名映射为其它序列.
      我们采用全局唯一的网络名来解决网络命名问题,这比选择全局唯一的用
  户号要容易的多.在SUN环境中,对每个YP域,用户名是唯一的.如将操作系统名
  在YP域中的用户号和ARPA域名组合在一起就构成了网络名.在为一个域命名时
  将ARPA域名加在本地域名之后是一个好习惯.
      象对用户赋以网络名一样,对机器也赋以网络名,这样就可解决多个超级
  用户的问题.机器的网络名其形式与用户的网络名的形式相似,正确的机器鉴
  别系统对网络中的无盘工作站是非常重要的,它必须保证无盘工作站能通过网
  络存取本机的home目录.
      非SUN环境中,网络名的产生也许与前述有较大区别,但这并不妨碍它们通
  过SUN的网络安全系统合法地存取信息,为鉴别一个来自另一个域的用户,只需
  在两个YP数据库是建立实体.一个实体是有关密钥和公开密钥的,另一个是有
  关uid和同组存取序列的.完成这项工作后,在远程域中的用户就可利用本域的
  网络服务.

  (8)DES鉴别系统的应用
      第一个应用是广义的YP更新服务,这个服务允许用户更新YP数据库中的专
  用域.
      另一个应用也是最重要的应用是:更安全的网络文件系统NFS.使用UNIX鉴
  别系统的NFS存在三个问题:
      . 证书的检验仅仅在装配时进行,这时client从服务器获得一条信息,这
        条信息是以后请求的关键:文件handle.如果有人不通过服务器就能通
        过猜想或偷听网络传输内容而获得文件handle,那么他也就能破坏UNIX
        鉴别系统.因为在NFS文件装配完毕后,当发生文件请求时,不再进行证
        书的检验.
      . 假如一个文件系统已从一个为多个client服务的服务器中装配到一台
        client中;当一个具有超级用户特权的用户使用su命令非法存取别人的
        文件时,文件系统不能提供任何保护.NFS的第三个问题是:由于它不能
        鉴别远程client的超级用户,它不得不采用一种严历的方法:拒绝所有
        的超组用户存取.
      新的鉴别系统解决了所有这些问题.某人相获得非法存取权,他不得不猜
  出正确的被编码后的时间标记并放在证书中,而这几乎是不可能的,这样他就
  不能猜出文件handle.由于新的系统可鉴别机器,上述第二,三问题也解决了.
  但是在这点上,根文件系统不能使用安全的文件,而非文件系统的根用户由IP
  地址识别.
      实际上,与每个文件系统相联系的安全级别可由系统管理员改变.文件
  /etc/exports包含有文件和可装配它们的机器名,在缺省的情况下文件系统向
  UNIX鉴别系统开放.但管理员在任意行后加上一secure就可改变为向DES鉴别
  系统开放.与DES鉴别系统相应的是一个参数:服务器能接收的最大窗口的大小.

  (9)遗留的安全问题
      尽管使用su不能破坏DES鉴别系统,但仍有几种方法可做到这点.为了通过
  鉴别,你的密钥必须存放在工作站中,这通常在登录时发生,login程序用你的
  口令对你的密钥解码,并存放起来以备使用,由于别人不能对你的密钥解码,因
  而任何人用su命令冒充你都不可能.编辑/etc/passwd文件也不可能对他有什
  么帮助,因为他必须修改存放在YP中的被编码后的密钥.如果你用你的口令登
  录到别人的工作站中,你的密钥就会存放在该工作站中,他们就能用su命令冒
  充你,由于你不可能将你的口令泄露给你不信任的机器,因而这是不可能发生
  的.但在其它机器上的人可以修改login程序将所有口令存放在他能看到的文
  件中.
      由于使用su命令不能破坏DES鉴别系统,也许最容易的方式就是猜出口令,
  因此选择安全的口令对用户是至关重要的.
      另一个最方便的方法就是试图重新执行.因此服务器的放置应在安全的地
  方.
      还有其他打破DES的方法,但都非常困难,需要花费巨型计算机几个月的时
  间来计算.
      还存在有另一个DES不曾考虑的安全问题,就是网络偷听,即使有了DES,也
  不能阻止任何人偷听网络传输的内容.大多数情况下这不是一个大的问题,因
  为网络中传送的大多数内容虽不是不可读的,但要搞清网络中传送的二进制的
  含义却不是一件轻松的工作.对登录来说,由于你希望别人不能通过网络获得
  你的口令,故你传送的是编码后的口令,正如前面所提到的一样,鉴定系统是信
  息交换的关键,网络传输内容被偷听的问题可以在每个具体应用中获得解决.

  (10)性能
      众所周知公共关键字系统的速度是很慢的,但在SUN系统中公共关键字编
  码很少发生,它仅仅发生在每个服务的第一次事务处理时,即使如此,还有缓冲
  区加速编码的进行.当client第一次与服务器接触时,client和服务器都必须
  计算出普通密钥,计算普通密钥的时间主要是计算幂关于M的模,在SUN3系统中
  使用192位模,这需花1秒钟计算普通密钥,也就是说总共需要2秒.因为client
  和服务器都必须计算普通密钥.因此,在client与服务器第一次接触时,必须等
  待这个时间,而且关键字服务器将保存计算的结果,以后就用不着每次都计算
  幂了.
      DES系统最重要的网络服务就是快速安全的NFS,DES鉴别系统,相对于UNIX
  鉴别系统多花的时间就是编码的时间.时间标记和DES块都是64位,在一次RPC
  中平均要进行四次编码操作:client对请求时间标记编码,服务器对它进行解
  码,服务器对时间标记编码,client对它解码.在SUN3系列中对一个块进行编码
  的硬件执行需1毫秒,软件执行需1.2毫秒.这样进行一次RPC调用,若由硬件执
  行需多花2毫秒,若由软件执行需多花5毫秒.进行一次NFS请求大约需20秒,这
  样由DES鉴别会使NFS请求的性能降低10%(假如有编码硬件),25%(假如没有编
  码硬件).这就是DES对网络性能的冲击,事实上并不是所有的文件操作都需通
  过网络,因而DES对系统性能的影响要低得多.另外是否采用DES鉴别系统是任
  选的,因此在需要高速的环境时可以不采用DES鉴别系统.

  (11)启动和setuid程序引起的问题
      考虑这样的情况:计算机因发生某种事件后重新启动.这时机内保存的所
  有密钥都被清除,如果采用的是DES鉴别系统,那么所有的进程都不能再利用网
  络服务.这时起关键作用的是根进程.如果根的密钥保存在机内同时没有人输
  入口令,对该密钥进行编码,那么根进程就将能够利用网络服务.对以上问题的
  答案就是将根的密钥存放在关键字服务器可读的某个文件中.这样的方式对有
  盘工作站来说是很好的,但对无盘工作站来说,即存在一个致命的问题:它的密
  钥必须通过网络存取.这样在无盘工作站启动时,如有人窃听网络传送内容,他
  就能发现编码后的密钥,尽管完成,但这一工作并不容易.
      众所周知有一种启动方式叫单用户启动,启动后根的登录shell出现在主
  终端上,这儿出现的问题是,如果安装了C2安全系统,从单用户启动仍需口令;
  当没有安装C2安全系统时,只要/etc/ttytab文件中的console项标记为secure,
  机器的启动就不需口令.
      另一个问题是无盘工作站启动不安全,因为有人可以冒充启动服务器,启
  动一个不正当的内核记录远程无盘工作站的密钥,因为仅仅在内核和关键字服
  务器运行之后,SUN系统才能对这一问题提供保护.在此以前没有任何方式可以
  鉴别回答是否来自正确的启动服务器.但我们不考虑这种情况,因为一个不知
  道源码的人,要想写这样的内核几乎是不可能的.另外犯罪者也极易留下证据,
  只要你对网络中的启动服务器进行检测,就能发现谁是服务器.
      并不是所有的setuid程序都会按我们希望的那样运行,比如一个由用户
  dave拥有的setuid程序,只要在机器启动后,dave没有进行登录,那么程序
  setuid就不能存取安全的网络服务(即采用DES鉴别系统的网络服务),好在绝
  大多数setuid程序都为root所拥有,而且根的密钥在系统忘却后总是存放在系
  统中,因而程序setuid在采用了DES系统之后,仍能象原来那样运行.

  (12)总结
      SUN的目标是要让网络系统象分时系统一样安全,这个目标已经达到.在分
  时系统中,用户被口令鉴别,有个DES鉴别系统,网络中的用户也由口令鉴别.在
  分时系统中,用户信任系统管理员,他的职业道德不允许他改变用户的口令以
  冒充该用户.在SUN系统中用户信息网络管理员,他不会改变用户在公共密钥数
  据库中的实体.很,SUN的系统从某种意义上说比系统更安全,因为在SUN的系统
  中旋转"窃听"装置来"窃听"网络中传送的口令和编码用的密钥是无用的(因为
  这些口令和密钥都已被编码).而大多数分时系统对来自终端的数据并不进行
  编码,用户必须相信,没有人在终端与主机的传送线上安装"窃听"装置.
      DES鉴别系统也许不是最终完善的鉴别系统,在将来,很可能有更好的算法
  和硬件来证明DES鉴别系统无用并放弃它.但至少可以说DES为将来的发展指出
  了一个方向.从理论上讲,协议从来规定会话密钥甚至公共密钥的编码要采用
  Diff3-Hellman方法.为了使DES鉴别系统更有力,我们要做的仅仅是使会话密
  钥的编码更有力,从理论上说这样会形成另一个协议,但是RPC的优点在于它可
  以采用任何鉴别系统而本身不会受到影响.
      至少在目前我们可以说DES鉴别系统满足了我们对网络服务的安全要求,
  在一个不友好的网络系统中建立起了一个足够安全的系统,而所付出的代价也
  不高.用户不需使用磁卡或记住上百位的数字,用户像往常一样使用口令鉴别
  自己,只是系统的性能略有降低.但是如果用户认为性能降低不可并且他的网
  络系统非常友好的话,他可以不采用DES鉴别系统.

--------------------------------------------------------------------
标  题: 用户安全
 

    本文从用户角度讨论UNIX系统安全,阐述口令,文件保护,目录保护,与用户
程序有关的某些特殊特性和使用crypt命令加密,并给出一些重要的安全忠告,
以帮 助用户保护自己的户头安全.

1.口令安全
    UNIX系统中的/etc/passwd文件含有全部系统需要知道的关于每个用户的信
息(加密后的口令也可能存于/etc/shadow文件中).
    /etc/passwd中包含有用户的登录名,经过加密的口令,用户号,用户组号,用
户注释,用户主目录和用户所用的shell程序.其中用户号(UID)和用户组号(GID)
用于UNIX系统唯一地标识用户和同组用户及用户的访 问权限.
    /etc/passwd中存放的加密的口令用于用户登录时输入的口令经计算后相比
较,符合则允许登录,否则拒绝用户登录.用户可用passwd命令修改自己的口令,
不 能直接修改/etc/passwd中的口令部份.
    一个好的口令应当至少有6个字符长,不要取用个人信息(如生日,名字,反向
拼写的登录名,房间中可见的东西),普通的英语单词也不好(因为可用字典攻击
法),口令中最好有一些非字母(如数字,标点符号,控制字符等),还要好记一些,
不能写在纸上或计算机中的文件中,选择口令的一个好方法是将两个不相关的词
用一个数字或控制字符相连,并截断为8个字符.当然,如果你能记住8位乱码自然
更好.
    不应使用同一个口令在不同机器中使用,特别是在不同级别的用户上使用同
一口令,会引起全盘崩溃.用户应定期改变口令,至少6个月要改变一次,系统管理
员可以强制用户定期做口令修改.
    为防止眼明手快的人窃取口令,在输入口令时应确认无人在身边.

2.文件许可权
    文件属性决定了文件的被访问权限,即谁能存取或执行该文件.用ls -l可以
列出详细的文件信息,如:
    -rwxrwxrwx 1 pat cs440 70 Jul 28 21:12 zombin
包括了文件许可,文件联结数,文件所有者名,文件相关组名,文件长度,上次存取
日期和文件名.
    其中文件许可分为四部分:
    -:表示文件类型.
    第一个rwx:表示文件属主的访问权限.
    第二个rwx:表示文件同组用户的访问权限.
    第三个rwx:表示其他用户的访问权限.
    若某种许可被限制则相应的字母换为-.
    在许可权限的执行许可位置上,可能是其它字母,s,S,t,T.s和S可出现在所
有者和同组用户许可模式位置上,与特殊的许可有关,后面将要讨论,t和T可出现
在其他用户的许可模式位置上,与"粘贴位"有关而与安全无关.小写字母(x,s,t)
表示执行许可为允许,负号或大写字母(-,S或T)表示执行许可为不允许.
    改变许可方式可使用chmod命令,并以新许可方式和该文件名为参数.新许可
方式以3位8进制数给出,r为4,w为2,x为1.如rwxr-xr--为754.
    chmod也有其它方式的参数可直接对某组参数修改,在此不再多说,详见UNIX
系统的联机手册.
    文件许可权可用于防止偶然性地重写或删除一个重要文件(即使是属主自己)!
    改变文件的属主和组名可用chown和chgrp,但修改后原属主和组员就无法修
改回来了.

3.目录许可
    在UNIX系统中,目录也是一个文件,用ls -l列出时,目录文件的属性前面带
一个d,目录许可也类似于文件许可,用ls列目录要有读许可,在目录中增删文件
要有写许可,进入目录或将该目录作路径分量时要有执行许可,故要使用任一个
文件,必须有该文件及找到该文件的路径上所有目录分量的相应许可.仅当要打
开一个文件时,文件的许可才开始起作用,而rm,mv只要有目录的搜索和写许可,
不需文件的许可,这一点应注意.

4.umask命令
    umask设置用户文件和目录的文件创建缺省屏蔽值,若将此命令放入
.profile文件,就可控制该用户后续所建文件的存取许可.umask命令与chmod命
令的作用正好相反,它告诉系统在创建文件时不给予什么存取许可.

5.设置用户ID和同组用户ID许可
    用户ID许可(SUID)设置和同组用户ID许可(SGID)可给予可执行的目标文件
(只有可执行文件才有意义)当一个进程执行时就被赋于4个编号,以标识该进程
隶属于谁,分别为实际和有效的UID,实际和有效的GID.有效的UID和GID一般和实
际的UID和GID相同,有效的UID和GID用于系统确定该进程对于文件的存取许可.
而设置可执行文件的SUID许可将改变上述情况,当设置了SUID时,进程的有效UID
为该可执行文件的所有者的有效UID,而不是执行该程序的用户的有效UID,因此,
由该程序创建的都有与该程序所有者相同的存取许可.这样,程序的所有者将可
通过程序的控制在有限的范围内向用户发表不允许被公众访问的信息.
    同样,SGID是设置有效GID.
    用chmod u+s 文件名和chmod u-s文件名来设置和取消SUID设置.用
chmod g+s 文件名和chmod g-s文件名来设置和取消SGID设置.
    当文件设置了SUID和SGID后,chown和chgrp命令将全部取消这些许可.

6.cp mv ln和cpio命令
    cp拷贝文件时,若目的文件不存在则将同时拷贝源文件的存取许可,包括SUID
和SGID许可.新拷贝的文件属拷贝的用户所有,故拷贝另人的文件时应小心,不要
被其他用户的SUID程序破坏自己的文件安全.
    mv移文件时,新移的文件存取许可与原文件相同,mv仅改变文件名.只要用户
有目录的写和搜索许可,就可移走该目录中某人的SUID程序且不改变其存取许可.
若目录许可设置不正确,则用户的SUID程序可被移到一个他不能修改和删除的目
录中,将出现安全漏洞.
    ln为现有文件建立一个链,即建立一个引用同一文件的新名字.如目的文件
已经存在,则该文件被删除而代之以新的链,或存在的目的文件不允许用户写它,
则请求用户确认是否删除该文件,只允许在同一文件系统内建链.若要删除一个
SUID文件,就要确认文件的链接数,只有一个链才能确保该文件被删除.若SUID文
件已有多个链,一种方法是改变其存取许可方式,将同时修改所有链的存取许可,
也可以chmod 000 文件名,不仅取消了文件的SUID和SGID许可,而且也取消了文
件的全部链.要想找到谁与自己的SUID程序建立了链,不要立刻删除该程序,系统
管理员可用ncheck命令找到该程序的其它链.
    cpio命令用于将目录结构拷贝到一个普通文件中,而后可再用cpio命令将该
普通文件转成目录结构.用-i选项时,cpio从标准输入设备读文件和目录名表,并
将其内容按档案格式拷贝到标准输出设备,使用-o选项时,cpio从标准输入设备
读取先已建好的档案,重建目录结构.cpio命令常用以下命令做一完整的目录系
统档案:
    find fromdir -print|cpio -o > archive
    根据档案文件重建一个目录结构命令为:
    cpio -id < archive
    cpio的安全约定如下:
    (1)档案文件存放每个文件的信息,包括文件所有者,小组用户,最后修改时
       间,最后存取时间,文件存取许可方式.
      *根据档案建立的文件保持存放于档案中的存取许可方式.
      *从档案中提取的每个文件的所有者和小组用户设置给运行cpio -i命令
       的用户,而不是设置给档案中指出的所有者和小组用户.
      *当运行cpio -i命令的用户是root时,被建立的文件的所有者和小组用户
       是档案文件所指出的.
      *档案中的SUID/SGID文件被重建时,保持SUID和SGID许可,如果重建文件
       的用户不是root,SUID/SGID许可是档案文件指出的用户/小组的许可.
    (2)现存文件与cpio档案中的文件同名时,若现存文件比档案中的文件更新,
       这些文件将不被重写.
    (3)如果用修改选项U,则同名的现存的文件将被重写.可能会发生一件很奇
       怪的事:如被重写的文件原与另一个文件建了链,文件被重写后链并不断
       开,换言之,该文件的链将保持,因此,该文件的所有链实际指向从档案中
       提取出来的文件,运行cpio无条件地重写现存文件以及改变链的指向.
    (4)cpio档案中可含的全路径名或父目录名给出的文件.

7.su和newgrp命令
  (1)su命令:可不必注销户头而将另一用户又登录进入系统,作为另一用户工作.
它将启动一新的shell并将有效和实际的UID和GID设置给另一用户.因此必须严
格将root口令保密.
  (2)newgrp命令:与su相似,用于修改当前所处的组名.

8.文件加密
    crypt命令可提供给用户以加密文件,使用一个关键词将标准输入的信息编
码为不可读的杂乱字符串,送到标准输出设备.再次使用此命令,用同一关键词作
用于加密后的文件,可恢复文件内容.
    一般来说,在文件加密后,应删除原始文件,只留下加密后的版本,且不能忘
记加密关键词.
    在vi中一般都有加密功能,用vi -x命令可编辑加密后的文件.关于加密关键
词的选取规则与口令的选取规则相同.
    由于crypt程序可能被做成特洛依木马,故不宜用口令做为关键词.最好在加
密前用pack或compress命令对文件进行压缩后再加密.

9.其它安全问题
  (1)用户的.profile文件
     由于用户的HOME目录下的.profile文件在用户登录时就被执行.若该文件
     对其他人是可写的 则系统的任何用户都能修改此文件,使其按自己的要求
     工作.这样可能使得其他用户具有该用户相同的权限.
  (2)ls -a
     此命令用于列出当前目录中的全部文件,包括文件名以.开头的文件,查看
     所有文件的存取许可方式和文件所有者,任何不属于自己但存在于自己的
     目录中的文件都应怀疑和追究.
  (3).exrc文件
     为编辑程序的初始化文件,使用编辑文件后,首先查找$HOME/.exrc文件和
     ./.exrc文件,若该文件是在$HOME目录中找到,则可像.profile一样控制它
     的存取方式,若在一个自己不能控制的目录中,运行编辑程序,则可能运行
     其他人的.exrc文件,或许该.exrc文件存在那里正是为了损害他人的文件
     安全.为了保证所编辑文件的安全,最好不要在不属于自己或其他人可写的
     目录中运行任何编辑程序.
  (4)暂存文件和目录
     在UNIX系统中暂存目录为/tmp和/usr/tmp,对于程序员和许多系统命令都
     使用它们,如果用这些目录存放暂存文件,别的用户可能会破坏这些文件.
     使用暂存文件最好将文件屏蔽值定义为007,但最保险的方法是建立自己的
     暂存文件和目录:$HOME/tmp,不要将重要文件存放于公共的暂存目录.
  (5)UUCP和其它网络
     UUCP命令用于将文件从一个UNIX系统传送到另一个UNIX系统,通过UUCP传
     送的文件通常存于/usr/spool/uucppublic/login目录,login是用户的登
     录名,该目录存取许可为777,通过网络传输并存放于此目录的文件属于
     UUCP所有,文件存取许可为666和777,用户应当将通过UUCP传送的文件加
     密,并尽快移到自己的目录中.其它网络将文件传送到用户HOME目录下的
     rjc目录中.该目录应对其他人是可写可搜索的,但不必是可读的,因而用户
     的rjc目录的存取许可方式应为733,允许程序在其中建立文件.同样,传送
     的文件也应加密并尽快移到自己的目录中.
  (6)特络依木马
     在UNIX系统安全中,用特络依木马来代表一种程序,这种程序在完成某种具
     有明显意图的功能时,还破坏用户的安全.如果PATH设置为先搜索系统目
     录,则受特络依木马的攻击会大大减少.如模似的crypt程序.
  (7)诱骗
     类似于特络依木马,模似一些东西使用户泄漏一些信息,不同的是,它由某
     人执行,等待无警觉的用户来上当.如模似的login.
  (8)计算机病毒
     计算机病毒通过把其它程序变成病毒从而传染系统的,可以迅速地扩散,特
     别是系统管理员的粗心大意,作为root运行一个被感染的程序时.实验表
     明,一个病毒可在一个小时内(平均少于30分钟)取得root权限.
  (9)要离开自己已登录的终端
     除非能对终端上锁,否则一定要注销户头.
  (10)智能终端
     由于智能终端有send和enter换码序列,告诉终端送当前行给系统,就像是
     用户敲入的一样.这是一种危险的能力,其他人可用write命令发送信息给
     本用户终端,信息中如含有以下的换码序列:
         移光标到新行(换行)
         在屏幕上显示"rm -r *"
         将该行送给系统
     后果大家可以想象.
     禁止其他用户发送信息的方法是使用mesg命令,mesg n不允许其他用户发
     信息,mesg y允许其他用户发信息.即使如此仍是有换码序列的问题存在,
     任何一个用户用mail命令发送同样一组换码序列,不同的要用!rm -r *替
     换rm -r *.mail将以!开头的行解释为一条shell命令,启动shell,由shell
     解释该行的其它部分,这被称为shell换码.为避免mail命令发送换码序列
     到自己的终端,可建立一个过滤程序,在读mail文件之前先运行过滤程序,
     对mail文件进行处理:
         myname="$LOGNAME";
         tr -d[\001-\007][-\013-\037]</usr/mail/$myname>>$HOME/mailbox;
         > /usr/mail/$myname;
         mail -f $HOME/mailbox
     其中tr将标准输入的字符转换手写到标准输出中.这只是一个简单的思路,
     从原则上来说,此程序应为一C程序,以避免破坏正发送到的文件,可用锁文
     件方式实现.
  (11)断开与系统的联接
     用户应在看到系统确认用户登录注销后再离开以免在用户未注销时由他人
     潜入.
  (12)cu命令
     该命令使用户能从一个UNIX系统登录到另一个UNIX系统,此时,在远地系统
     中注销用户后还必须输入"~"后回车,以断开cu和远地系统的联接.
     cu还有两个安全问题:
     *如本机安全性弱于远地机,不提倡用cu去登录远地机,以免由于本地机的
      不安全而影响较安全的远地机.
     *由于cu的老版本处理"~"的方法不完善,从安全性强的系统调用安全性弱
      的系统时,会使弱系统的用户使用强系统用户的cu传送强系统的
      /etc/passwd文件,除非确信正在使用的cu是正确版本,否则不要调用弱系
      统.

10.保持户头安全的要点
  (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调用安全性较弱的系统.
 

--
 
 

标  题: 莫里斯的话
发信站: 鼓浪听涛 (Fri Oct  4 13:04:30 1996)

    美国AT&T贝尔实验室的计算机科学家Robert Morris
              关于计算机安全问题的论述

    计算机的安全是一个越来越引起世界各国关注的重要问题,
也是一个十分复杂的课题.随着计算机在人类生活各领域中的广
泛应用,计算机病毒也在不断产生和传播,计算机网络被不断非
法入侵,重要情势资料被窃密,甚至由此造成网络系统的瘫痪等,
已给各个国家以及众多公司造成巨大的经济损失,甚至危害到国
家和地区的安全.因此计算机系统的安全问题是一个关系到人类
生活与生存的大事情,必须给予充分的重视并设法解决.
    以贝尔实验室为例,它的工作大量地涉及到计算机和软件,
大约50%的雇员在从事软件或软件支持工作.他们拥有1800多台
主机和比其技术人员人数还多的各种计算机终端.在贝尔系统在,
有运行3500多万条有效编码的通讯线路,因此,贝乐实验室是世界
上最大的软件企业之一.
    贝尔实验室的计算机环境包括有:分布在不同地区的集中化
的计算中心,它们一般装备的是大型主机和(或)高档微机,分布在
各部门的通常是小型机,直接由技术人员使用的是大量的专业工作
站,一般是微型机.所有这些计算机均以各种方式联结成网,包括
高速通讯专线联络到直接使用全国电讯网络的拨号通讯线等,这
就使雇员们甚至可以通过在家中的终端直接存取贝尔实验室的各
种计算机资源.
    一个严重的问题是,国外代理人,竞争者或其他任何人要想从
联于电讯网络的计算机系统中获取信息都是可能的,这就提出了
一个必须重视的计算机安全和保密问题.一般来说,威胁到计算机
安全的有"单纯性电子干扰",各种物理的干扰,通讯线的开放,专
业情报人员的长期探取以入拥有特权的系统管理人员的不负责
等.其中"单纯性电子干扰"是今天最普遍地威胁到计算机安全的
因素;而最令人担忧的是系统管理人员的失职,因为由于这个问题,
可使所有采用的安全技术全成为无效的.
    对于贝尔实验室所有的工作人员都必须学会怎样有效地生产
大型软件系统,并在保证软件产品的质量时,也建立有效的软件
管理办法.这些方法中包括安全方面的设计,如存取控制,防止及
检测未授权的存取企图的检查能力等.
    这些可用的方法已应用到贝尔实验室的所有部门,同时还有一
个关于软件问题的全公司委员会(CSI)来协调和规范化全体人员的
认识和方法.
    计算机安全包括物理安全和逻辑安全.对于前者只要加强计算
机机房的管理如门卫,出入者身份检查,下班锁门以入各种硬件安
全手段等预防措施;而对于后者需要用口令字,文件许可,查帐等
方法来实现.
    贝尔实验室关于计算机安全的目标是:在安全和通讯方便之间
建立平衡.毫无疑问,要求计算机系统越安全,则对通讯的限制和使
用的难度就越大.而现代信息技术的发展又使通讯线成为不可缺少
的,它包括跨组织,跨学科,跨地区的以及全球的通讯.在这里计算
机安全的重要性显然是毫无疑问的.但是计算机的安全程度应与所
涉及的信息的价值相.即应当有一个从低,中到高级的多层次的安
全系统,分别对不同重要性的信息资料给予必要的不同级的保护.
例如,在贝尔实验室,高度机密的个人信息(如付税数据)是完全的
与其它各种数据相隔离;对所有高度机密的数据的存取都被严格
地控制着.
    善于计算机安全的另一个重要问题是:我们试图保护的信息--
电子信息--本身的特殊性质,当有人窃走我们所的信息时,他并不
需要将信息从计算机文件中移走.这一特点使得难于确认信息事实
上已被窃走了,这也使道义上,道德和法律上的问题复杂化了.
    最后一点要强调的是,必须责成各级机构的高层管理人员要
经常关注和强化计算机安全技术和保密措施,否则,将会有几乎无
可挽救的危险和损失.例如,在贝尔实验室的全公司软件管理委员
会组织了一个计算机安全任务组来评定贝尔实验室整个系统的安
全性,向高层管理组报告他们发现的问题,在需要时提出一些提高
安全性的建议,并根据管理组的授权招待各种监督措施.还有一个
常设机构--安全委员会,为计算机中心建立各种安全法规,并且在
资产保护组织中配备有计算机安全专家等.即使这样,贝尔实验室
的比较安全的计算机系统还是未能完全免除各种电子干扰.他们
配有追踪电子入侵者的有经验的资产保护专家,必要时还从本地
区和联邦政府和法律执行代理人处获得帮助,以迅速的解决有关
入侵者的问题.
    当前不管对贝尔实验室或大型高技术公司来说,电子干扰问题
还未完全解决,各种好的管理方法和安全技术只是使问题缩小了,
但还不能完全消除问题.
    贝尔实验室关于计算机安全的考虑也是十分基本的:保护有
价值的信息在存贮于计算机文件中或在通讯,数据线上传输时,
不会被窃取,删改和破坏;防止计算机机时和资源被未授权者使用;
保持的计算机用户和系统管理员的高度安全意识.总而言之,是要
维护一套对整个计算机环境的一致性的有关的管理控制,包括计算
机硬件,软件和有关的人员.
    对于计算机安全,最重要最显然的起点是从涉及计算机的人员
开始,即用户,系统管理员以入超级管理员.安全的最软弱处是人们
的粗心大意.例如,登录和使用计算机后,不退出系统就离开终端不
管了;与他人共用计算机存取口令;将机密重要的资料存入不适当
的计算机文件中等.
    总结有关计算机安全方法的各主要方面,可从以下检验表供超
级管理员评定自己单位的计算机系统的安全程度如何?
    *你知道谁有你的计算机的存取权吗?不要与他人(即使是你的
助理工作人员)共用口令.如果你的同组人员需要存取其他人员的
文件,他们也应当有自己的口令.
    *你的计算机拒绝未授权的远程计算机的请求吗?如果不拒绝,
则应重新修改你的计算机的许可设置以改变这一情况.
    *你有系统管理员吗?管理和修改安全设计与设置是他(她)的
工作职责吗?最安全的系统是那些配有责任心和能力都很强的系统
管理员的计算机系统.
    *你将一些私人信息如公司计划或个人审查资料存入计算机文
件吗?假若出现糟糕的情况(如一个偶然浏览文件的人能读到你所
写入计算机的信息),那么必须尽快将重要资料保存到其他地方.
    *你的同组用户严肃对待计算机的安全问题吗?必须确保你的
同组用户懂得计算机安全的必要性以及他们应当怎样做才能保证
计算机的安全.
    除上述几项检查以外,还需进一步来检查以下各点:例如口令,
除"一人一口令"外还可使用更复杂的口令来增加计算机的安全.
许多计算机用户常常使用自己的姓,甚至配偶的姓或宠爱物的名字,
或者生日作为口令.不幸的是,这种口令很不安全,因为任何一个计
算机都能迅速地运行搜索完一个姓氏列表(即英语中2万个最普通
的单词),以及所有可能的生日.更复杂的口令选择应是长于6个字
符并同时含有数字和字母的口令,这样的口令将难于解密.口令也
不应是"永久性的",而应当以一定的时间间隔进行改变.如何修改
将由所希望的系统安全的级别来决定.
    这里值得强调的另一点是责任者的重要性.责任者是指所有涉
入计算机系统的人,现用户,管理员和超级管理员.例如:计算机的
任何使用都需要有超级用户给予的许可,以便能控制谁使用机器和
机器被用于体积目的.因而,每一台机器应有一个授权用户表,此外,
具有拨号存取方式的计算机上的公司目录表,它是一种更广泛的对
计算机的使用,目录表内容包括与具体计算机有关的机构标志,电
话,系统管理员以及监督管理等.
    在计算机安全检查表中,最后要强调的一点是,通过使用特殊的
软件包来限制对各个用户文件的普通存取,以提高安全程度.我们
可以使用软件来保护存于计算机文件中的信息,该软件限制了其他
人存取非自己所有的文件,直到该文件的所有者明确准许其他人可
以存取该文件时为止.限制存取的另一种方式是通过硬件完成,在
接收到取要求后,先询问并校核口令,然后访问列于目录中的授权
用户标志号.
    此外,有一些安全软件包也可跟踪可疑的未授权的存取企图,
例如,多次试登录或请求别人的文件.显然,我们可以限制试登录的
次数;或对试探操作加上时间限制,在此之后,系统就自动地退出.
    现有的各种技术提供了高水平的计算机安全,特别是计算机上
的军事安全保密.想要破大多数含有保密信息的计算机的安全控制,
其代价是非常昂贵的.当然维护这样高级的安全的代价通常是将各
计算机隔离以及使进入计算机的手续操作麻烦.但随着安全技术的
进一步提高,将会大大有助于减低这种代价--即使整个安全控制对
合法用户更透明一些.因为随着新一代计算机的研制也发展了的
"用户友好"界面,故在发展和加强计算机的安全系统时,也充分注意
到了用户的相同需要.
    防止和检测计算机通讯线被渗透的技术,就像识别拨号系统一
样简单.这种能力允许根据授权电话号码表来进行安全检查,也可
提供追踪未授权存取企图的记录.这种识别已存在于今天的一些
计算机化的业务通讯系统中,但只限于在那些由这种系统服务的
公司的通讯线中.
    此外 ,还可使用"信用卡终端",它可提供便宜而又防窜改的方
式,对于识别用户比通用的口令具有更高程度的可靠性.采用识别也
是有助于提高识别用户能力的.这种简单的硬件可产生软件不能伪
造的信号,这将能提高网络地址的安全程度.
    然而,计算机安全的最基本方法也许还是人的因素第一,正如前
面多次指出的,我们需要尽更大的努力去提高人们对于计算机安全
的认识,特别要提高对那些破坏安全在道德,道义上所隐含的企图的
认识和识别.各级教育部门和单位应在这方面做大量的教育工作.我
们也需要经常考核计算机人员,他们是首先要提高安全意识的人,他
们更接近于电子偷阅者,非法进入系统者,窃贼,这比一些给机会让
上述非法者进入系统的普通用户更接近非法者.同时有必要澄清涉
入计算机安全的复杂的问题,避免有人声称不知道如何防备危害计算
机安全的错误行为与作法而推卸责任.
    我们也不要忘记计算机用户及管理者们可能造成的危害.必须
不断提高那些拥有电话信息的人的计算机安全意识.对于发生物理
的破坏和失窃,则那些忘记"锁门"的人应分担信息被破坏或被窃取
的责任.
    计算机安全与保密问题是现代信息社会一个十分重要并具有
普遍意义的问题,必须认真演习,掌握和发展有关的技术和方法.
  ?

本文转自中文Linux论坛