荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: georgehill (New Century New Dream), 信区: Linux
标  题: 第十章 安全性(转寄)
发信站: BBS 荔园晨风站 (Sat Jan  6 14:51:52 2001), 站内信件

【 以下文字转载自 georgehill 的信箱 】
【 原文由 georgehill.bbs@smth.org 所发表 】
发信人: ruster (尘埃*星辰*领悟), 信区: Linux
标  题: 第十章 安全性(转寄)
发信站: BBS 水木清华站 (Thu Dec 21 13:54:10 2000)

第10章 安全性问题

  本章要点:

  本章介绍Linux系统安全的一些基础知识。

      本章具体包括以下内容。

    安全性基本概念

    对系统的访问控制

    加密和解密

    常见的攻击手段和反措施

    安全性的网络资源

  10.1 安全性问题概述

  安全性的问题总是被媒体的炒作弄的沸沸扬扬。可惜本书不是小说,无法提供一些有
趣的故事给你。相反,本节的内容可能是相当乏味的。如果你能看下去,我对你的耐心
表示感谢,如果不能,我也不准备道歉。

  10.1.1 安全性级别

  我们首先要考虑一下什么是我们关心的安全性。如果你是系统管理员,你必须考虑某
个用户的数据是否会被别的用户看到,比如说,没有人喜欢自己的私人电子邮件被别人
张贴到大学食堂的门口,更不用说被别人领走银行里的存款了。

  另外一种安全性相关的问题是如何保证系统能够正确运行。如果在每天晚上9:00-11:
00大学女生宿舍的电话交换机停机会怎么样?厂商可能会被愤怒的大学生砸扁。

  许多人总是对安全性的内容存有浪漫的想象,或者大惊小怪。事实上,由于Linux是一
种UNIX系统,这就决定了你永远也不可能得到真正的安全。许多商业化的UNIX或者其它
类型的操作系统都以自己的安全性进行标榜,特别是,在一段时间以前,关于某几种操
作系统的“C2级”安全性的宣传充斥了各种IT媒体。那么,所谓的C2级别的安全性是什
么呢?

  所谓安全性级别,是美国国防部制订的用来评估一个系统的安全性的基本分类,共有
 ABCD 四级, 每个级别里面还可以有子级别,例如C级里面有C1和C2两个级别。级别之间
的关系是A 级最高, D 级最低,其中 B,C 两级又分两个子级。各级别的具体定义大致如
下:

  D :标准的DOS属于这一级别。简单地说,这个级别的系统就是一个单用户操作系统,
任何坐在终端前面的人都可以随意破坏数据的完整性。当然,Windows 95 和CP/M之类的
东西也属于 D 级。

  C :这个级别开始引入了简单的身份控制能力,它被分为 C1 C2 两级:

  C1 :1. 所有的用户都被分组;

        2. 对于每个用户,必须登记后才能使用系统;

      3. 系统必须记录每个用户的登记;

      4. 系统必须对可能破坏自身的操作发出警告.

    C2 :在 C1 的基础上,增加以下几条要求:

      1. 所有的对象都有且仅有一个物主;

      2. 对于每个试图访问对象的操作,都必须检验权限,对于不符合权限要求的访
问,必须予以拒绝;

      3. 有且仅有物主和物主指定的用户可以更改权限;

      4. 管理员可以取得对象的所有权,但不能归还;

      5. 系统必须保证自身不能被管理员以外的用户改变;

      6. 系统必须有能力对所有的操作进行记录,并且只有管理员和由管理员指定
的用户可以访问该记录.

  B :这个级别进一步强化了身份控制的能力,与C级类似,它被分为 B1 B2 两级:

    B1 :在 C2 的基础上,增加以下几条要求:

      1. 不同的组成员不能访问对方创建的对象,但管理员许可的除外;

      2. 管理员不能取得对象的所有权.

   B2 :在 B1 的基础上,增加以下几条要求:

      1. 所有的用户都被授予一个安全等级;

      2. 安全等级较低的用户不能访问高等级用户创建的对象.

  A :这个级别简直就是一个“理论值”,据说目前商品化的系统还没有一个是A级的。
它在 B2 的基础上,增加以下要求:

     系统的整体安全策略一经建立便不能修改.

  看了安全级别的定义,是不是觉得很失望?这个安全级别的定义仅仅是对身份控制的
一种强化,而且这个定义是一个典型的学院派定义(不愧是美国政府的定义),大而无
当。更糟糕的是它的奇怪的C1、C2分类,容易看出,这里的分类效果是把正常的UNIX,
比如Solaris,BSD刚好给划分到了两个级别中间(我们姑且不说Linux)。

  不管怎么说,让我们来考虑一下这个安全性级别。很明显,如果我们硬要对某种操作
系统定义安全性,那么大部分UNIX都潜在地是C2安全性的。如果某个系统没有达到C2安
全性,有两个原因,要么系统管理员没有正确地对系统进行配置,要么是由于一些UNIX
的固有后门,如setuid和setgid。当然这句话可以反过来说,C2安全性仅仅是一种普通
的UNIX经过适当配置应该达到的安全性,也就意味着C2安全性其实并不是什么“安全”
。如果按照挑剔一点的眼光来看,B2级别才是核心应用可以接受的起点。不过,首先是
没有哪种UNIX系统能够达到B2级别,其次是B2级别意味着这个系统难以想象地不方便,
想一想系统管理员无权控制一个文件是什么样的后果!

  按照一般的说法,Windows NT和SCO UNIX是C2级别的。据说有个版本的solaris也是C
2安全级别的。你可能会奇怪为什么只有这样少的系统“具有C2安全级别”。回答是,这
些系统得到了所谓的“C2安全性认证”。这个认证具有许多不可思议的地方,首先是它
可能要消耗数年的时间(windows NT只有3.5版本通过了C2安全认证,4.0和2000都没有
,因为等不起),在这个过程中相应的软件系统通常早已过时;其次是C2安全性认证只
授予“一个计算机系统”而不是“一个操作系统”,换句话说,这个认证只是对软硬件
都已经安装完毕的一台计算机。正因为如此,对于通用的软件,尤其是在x86上运行的操
作系统,C2安全性认证没有多少实际意义。

  关于C2安全性还有一个问题,如同你知道的那样,TCP/IP协议本质上是没有身份控制
的,你不可能在网上的每个数据包里面加上发送者的身份认证信息吧。即使是windows
NT 3.5,所谓的C2安全性也仅仅是对于没有联网的一台计算机。有什么连在Internet上
的系统通过了安全级别验证吗?我没有查过…………

  10.1.2 你安全吗?

  从上面的解释中,你可以看到,让许多人津津乐道的C2安全性其实仅仅是大部分UNIX
的共性。幸运的是,在大部分UNIX系统应用中,C2安全性尽管并不可靠,但是确实比没
有要好。然而,即使一个系统是C2级安全性的,这能保证它真的能对用户的身份进行控
制吗?

  在UNIX中,我们可以明确地回答这个问题,不能。因为任何软件都会有错误,会存在
一些漏洞或者设计上的后门。这些漏洞和后门才是我们真正要面对的主要问题,它和系
统是什么级别的安全性其实无关。举个简单的例子,通过主板的CMOS Setup程序可以对
你的PC加上密码,这样可以防止别的用户趁你不在的时候使用你的计算机。问题是,许
多早期的BIOS里面都有通用密码,输入通用密码就可以解除你设置的密码,那么这样的
密码还有什么实际意义呢?

  UNIX系统总是被这样的问题所困扰。举个例子来说,在最早的一些Sun OS上的http服
务器中有一个名字叫phf的cgi程序,由于某种原因,这个程序被设置为可以用来从远程
执行系统上的程序。特别是,某些系统的http服务程序被设置为以root身份运行,结果
是,很多服务器就这样被远程的破坏者轻易地摧毁或者侵入(直到一年以前,我还在某
些单位的服务器上看到过这个phf被允许执行)。对于这种性质的问题,C2安全性能够帮
你什么呢?

  不幸的是,厂商对于这样的问题往往抱着“眼不见为净”的态度,并且认为,只要这
些漏洞不被广泛流传,就不必理会它们。许多厂商甚至希望用户什么也不知道,这样他
们就不会发现系统中存在的问题。对于这种厂商,你除了相信他们会送给你正确的东西
之外就只能祈求上帝保佑了。

  作为一个UNIX系统的管理员,你必须不断地关注你使用的程序,不停地修补新发现的
漏洞或是堵死厂商留下的后门。如果你对此感到厌倦,你总有一天会看到你的系统被侵
入或者摧毁。没有人能对你负责,毕竟UNIX本来并不是为安全可靠而设计的。如果你这
样做了,那么你的运气会好一点,或许你直到改行还没有碰到系统被恶意侵入,或者即
使被侵入也不是你的责任。

  关于Linux和作为它基点的GNU,我们有一些需要额外说明的东西,Linux是作为开放源
代码的软件发行的,我们前面提到的大部分其它产品,如sendmail,Apache也是如此。
这意味着你在使用一个大家都很清楚的产品,任何人只要愿意就可以得到你的源代码,
并且研究里面有什么样的漏洞。这种特性是一柄双刃剑。首先,它使得每个人都有可能
发现你的系统有什么漏洞,这样漏洞被发现的机会肯定大大增加;反过来,由于源代码
是开放的,因此人们只要知道了漏洞的性质,就很容易做出对应的补丁程序。这种特性
到底好不好,那只有你自己去判断。

  一般来说,由于UNIX类型系统中的全能root账号的存在,试图攻击系统的企图大部分
是关于如何非法地取得root账号的。UNIX本身没有什么防御机制,任何一个用户只要得
到了密码就可以成为root用户。在Linux中,添加了一些安全性认证机制,但是它们是否
可靠也只能靠你自己去判断。

  另外一种常见的攻击是用某种方式使系统瘫痪。在笔者写这本书之前不久,各大网络
服务商纷纷受到了来自网络的攻击,攻击的目标是使其服务器瘫痪。在后面我们将会看
到,这一类攻击由于TCP/IP的性质实际几乎是不可能真正防范的。

  当面对攻击的时候,详细的系统日志是发现和处理攻击的重要信息来源。因此,一旦
进入系统,攻击者通常立刻修改系统日志。为此,你应该用一台专用的机器专门处理日
志信息,其他的机器将日志自动转发到它上面,这样日志信息一旦产生就立刻被扫走,
可以确保攻击者的行为被正确地记录下来。

  对系统不断地patch是系统管理员的重要工作,对于GNU系统更是如此。GNU系统的特色
就是每个人都有可能发现你的系统的漏洞,同时一旦发现漏洞修补也比较容易。实际上
,不仅对于Linux,任何UNIX类型系统的安全性都要依赖于不断的patch。问题是许多用
户被厂商宣称的虚假的安全性所迷惑。要记住,安全就存在于你的努力之中。


  10.2 访问控制

  现在我们来考虑关于用户身份控制的基本问题。在Linux中存在三种与安全性相关的的
访问控制问题,首先是UNIX通过口令的对用户的身份控制问题;其次是利用一些身份认
证工具对用户连接地址的控制;另外的控制就是对用户的记账信息。

  10.2.1 保护你的口令

  UNIX的用户口令是对系统的第一道屏障。最原始的攻击手段就是对口令进行猜测,然
后获取一个账号。因此,一个口令脆弱的账号将是入侵者攻击的第一跳。最常见的脆弱
口令是口令和用户名相同或者仅仅差一个数字,对于职业的密码猜测者,这种密码就是
开放着的大门。

  在Linux中,系统管理员可以任意修改用户的口令,当系统管理员给用户设置了一个脆
弱的口令的时候,Linux会出现一个警告,但是并不会拒绝这个口令:

  bash# passwd test

  Changing password for user test

  New UNIX password: test

  BAD PASSWORD: it is too short

  Retype new UNIX password: test

  passwd: all authentication tokens updated successfully

  加斜体的是我们输入的内容。

  相反,当用户使用passwd程序更改自己的口令的时候,Linux将强制用户使用一个在它
看来不那么脆弱的口令:

  $ passwd

  Changing password for wanghy

  (current) UNIX password:wanghy

  New UNIX password:wanghy

  BAD PASSWORD: it is based on your username

  New UNIX password:

  一般来说,Linux的passwd程序要求用户使用至少7个字符的密码,而且不能基于某个
字典单词,也不能由用户名稍做变形得到。尽管这可能会使你的用户感到困扰,但是它
确实是对愚蠢用户的一种防范措施。不过,你必须注意,这些功能并总是可用的,它依
赖于Linux中使用的一些安全性工具,例如在redhat中使用的是PAM。

  PAM是一个用来对安全性进行强化的工具,它包含一些特殊的连接库,一旦系统程序启
用这些运行库就能够使用它提供的安全性保护功能。对系统程序保护的方法定义在/etc
/pam.d中,例如/etc/pam.d/passwd文件定义了passwd程序启用PAM的方式,如

  $ cat passwd

  #%PAM-1.0

  auth       required     /lib/security/pam_pwdb.so shadow nullok

  account    required     /lib/security/pam_pwdb.so

  password   required     /lib/security/pam_cracklib.so retry=3

  password   required     /lib/security/pam_pwdb.so use_authtok nullok

  通常你无须修改这些文件。

  使用复杂的口令字的一个噩梦是用户为了避免忘记密码而把它们写下来。这样就失去
了复杂口令的意义。建议你用一句毫无意义的话来构成密码,比如itUpitn(I think Un
ix Password is the Nightmare) ,Oop2Naya之类的单词组合要想破译只能依靠运气,
如果这样的密码被破译那么你就怪自己运气不好吧。

  特别需要保护的是超级用户口令。由于Linux的许多管理任务都必须有超级用户权限来
完成,许多单位让多人共享root账号。这不是一个合理的选择。另外的地方让系统管理
员完成所有的工作,后果是管理员被一些简单而无聊的操作弄得晕头转向。

  我们建议使用sudo程序,这个程序可以把执行某些超级用户命令的特权赋予指定的用
户,你可以在某些Linux的发行盘上找到它,也可以自己去下载源代码并且编译。

  sudo程序的格式是:

  sudo [-u 用户名] [命令]

  执行sudo的时候,会要求你输入你自己的密码而不是超级用户的密码。-u选项是可选
的。如果使用-u选项,可以让你以别的身份登录上来执行sudo命令。这个功能把执行超
级用户命令的权利交给了普通用户,为了控制这个命令,用/etc/sudoers文件来定义哪
些用户可以执行哪些操作。

  一个典型的/etc/sudoers文件的形式是这样的:

  root ALL=(ALL) ALL

  wanghy ALL=(wanghy) /usr/sbin/tcpdump,/sbin/halt

  cook manager.mydomain.com=(cook,zhangfl) /sbin/halt

  现在定义了三个sudo的选择。从任何地方登录的root用户都可以执行系统上的任何命
令;wanghy用户可以在任何主机上以wanghy的身份执行tcpdump和halt命令;cook用户可
以在manager主机上以cook或者zhangfl的身份执行halt命令。注意在括号中那个选项是
不必要的,这个选项只是一种保护机制,例如,在第三行中的定义表示只有manager上的
cook和zhangfl才能用sudo –u cook的方式执行sudo。另外,在sudoers文件中允许使用
别名简化配置,详细的内容请参考sudo的文档。

  设置sudo比较容易出错,因此在大部分sudo的发行中提供一个visudo命令,它可以启
动一个vi的编辑屏幕并且在你存盘退出的时候自动对sudoers文件的格式进行检查。

  设置了sudo之后,就可以使用这个功能了:

  $ sudo /usr/local/bin/nmap


  We trust you have received the usual lecture from the local System

  Administrator. It usually boils down to these two things:


   #1) Respect the privacy of others.

   #2) Think before you type.


  Password:

  这里需要输入你的账号的口令,例如我们是以cook身份登录,那么输入cook的密码,
就可以执行后面的命令了。

  由于某些原因,sudo缺省下被设置为只要一次sudo成功,那么以后一段时间内(大约
5分钟)同一用户执行sudo不再需要输入口令。因为这个原因,绝对不要把特殊的危险命
令用sudo分配给普通用户。

  另外一个Linux的特有问题是关于单用户模式,如同你知道的那样,任何能够接触你的
机器的人都可以通过使用单用户模式启动系统而获得超级用户权限。解决的方法是在li
lo中使用password选项:

  password="testpass"

  这样,系统在引导的时候就会要求操作者输入口令。只有给出口令的用户才能是系统
启动。如果你仅仅是想用口令控制单用户模式的进入,你可以使用restricted选项,它
使得lilo仅在有人在lilo:下面使用smp 1之类的命令行时才要求口令,否则自动引导机
器:

  password="testpass"

  restricted

  这样,任何人试图在lilo:下面进入单用户模式都必须输入你在lilo.conf里面设置的
口令,而正常的启动则不受影响。由于口令是明文存放在/etc/lilo.conf中,你应该把
这个文件的属性设置成0600。

  10.2.2 setuid

  除了口令以外,下一个安全性方面的传统问题是setuid程序。如同我们知道的,setu
id和setgid是对正常的UNIX系统安全性开的后门,一个有缺陷的setuid程序很容易成为
入侵者的攻击目标。

  你应该定期在你的系统里面查找setuid到root的程序,下面的脚本可以完成这个工作


  find / -perm -4000

  一般来说,系统本身提供的setuid程序,例如su,passwd等等不会有什么问题,但是
你一般来说不要写一个setuid程序,如果一定要写,记住不要写一个setuid的shell程序
。而且,即使你用C来书写这种程序,如果可能,仅给用户以执行权限,不让任何人读到
你的代码。

  后一点是容易忽略的地方。如果你的setuid程序是只读的,是否这个文件是安全的?
绝对不是!考虑这样的一行代码:

  system(“ls –l”);

  看上去不会有什么问题,对吗?让我们来考虑一下一个愤怒的用户可能作什么,首先
把路径置成当前目录,然后在自己的目录里面做一个可执行程序,然后把这个程序命名
为ls,因为system调用只是简单地把命令传递给shell,所以现在这个程序执行的是用户
写出的东西。上帝保佑,但愿他没有写任何有害的东西。

  原则上是不要使用system库例程,如果不得不使用,记得在所有调用命令的地方使用
绝对路径,一个相对路径的命令调用就是危险的定时炸弹。将所有setuid程序的属性置
为只执行,特别是不要允许用户能够读这个程序,即使是二进制代码,因为攻击者很容
易用文本工具搜索出程序里面使用的system调用。

  10.2.3 身份认证工具

  如同我们现在应该已经熟悉的那样,Linux缺省不允许root账号远程登录。这是由PAM
系统设置的。这种设置某些用户在哪里使用计算机或者哪些客户机器可以使用本机的服
务的能力构成了安全性的第二道防线。

  首先可以通过PAM工具进行对系统的配置,通过在/etc/pam.d/login,/etc/pam.d/rl
ogin等文件中加入pam的库的方法可以精确设置某个用户操作系统的能力,但是我们一般
不使用这种方式,而是利用TCP wrapper。

  TCP wrapper是一个TCP连接的包装程序,例如在inetd.conf里面我们经常看到的tcpd
程序,这个程序可以根据客户连接的发起地址判断是否允许连接。连接的控制方式我们
已经看到是在/etc/hosts.allow和/etc/hosts.deny。而且,tcpd程序还能够对连接的请
求通过syslog进行记录,你只要配置syslog.conf就可以控制记录。

  在第二章我们已经看到tcpd程序的用法。它用来保护在inetd.conf里面启动的程序,
只要把tcpd加在对应服务进程的前面。例如我们想要把in.ftpd程序保护起来,就在ine
td.conf中使用这样的一行:

  ftpstream  tcp nowait  root /usr/sbin/tcpd  in.ftpd

  这里没有使用in.ftpd的路径,因为这个程序是在/usr/sbin下面,如果你的服务程序
不在系统的缺省路径(/bin,/sbin,/usr/bin,/usr/sbin)下面,在文件名的地方使用
绝对路径名。

  tcpd程序使用的身份控制文件是/etc/hosts.allow和/etc/hosts.deny,规则我们在第
二章已经介绍了。需要注意的是在这两个文件中使用的服务程序名既可以是inetd.conf
里面的程序名字,也可以是services文件里面定义的服务名字。例如telnet服务的程序
文件是in.telnetd,因此在hosts.deny里面你应该使用telnet和in.telnetd各一行才能
真正禁止相应的服务。

  TCP wrapper除了tcpd程序之外,还提供了一个用来检查/etc/hosts.deny和/etc/hos
ts文件内容的工具,称为tcpdchk:

  # tcpdchk

  warning: /etc/hosts.allow, line 0: missing newline or line too long

  除了标准的tcpd程序,还有许多类似的产品,如我们在qmail里面看到的tcpserver程
序。通过tcp包装程序,我们可以控制远程用户的访问。实际上,大部分tcp wrapper类
型的程序都可以提供类似的服务,我们可以选择自己喜欢的类型。

  10.3 加密和解密

  UNIX中到处都是明文到密文的转换。一般来说,加密可以分为可逆和不可逆两种。不
可逆加密算法实际是生成一些校验码,利用算法的设计,使得两组不同数据实际不可能
生成同样的校验码。这样的技术一般用来作为文件传输的校验或者系统口令的验证。例
如目前版本的Linux就使用MD5算法来对用户的口令进行验证。

  可逆的加密算法是由明文产生出密文,并且还可以由密文转换回原始的明文。根据加
密/解密时使用的密钥,这种加密算法分成两类。第一类的加密和解密都是用同样的密钥
,这种加密算法一般用于对私人的文件和数据进行加密,例如常见的DES加密技术就是这
种类型。通常的密钥就是一个随机数字,依靠其随机性的特点获得安全。由于美国政策
的限制,一般的DES加密密玥被限制在56位。就目前的情况来看,56位的DES并不足以提
供足够的安全性。尽管如此,大部分UNIX的加密技术都是这一种。

  单密钥加密体系的主要问题是如果想让别人阅读你的加密文件,你必须告诉他你的密
钥。由于网络本身的特性,这种方式并不很安全。有另外的一种加密体系,称为双密钥
体系。在这种体系中,每个用户拥有两个密钥,分别称为私用密钥和公开密钥。用公开
密钥加密的数据只能用私用密钥进行解密,反之亦然。这样,如果有两个用户A、B想要
互通消息,那么A首先公开自己的公开密钥,B根据这个公开密钥对自己的某些信息进行
加密,然后传送给A,A得到这些信息之后,可以用自己的私用密钥将信息还原为明文。
即使B发送给A的信息被别的用户截获,由于没有私用密钥,他也无法知道信息的内容。
这种双密钥体系也很多,典型的如PGP算法。大部分网络数据传输用的加密算法都是这个
类型。

  目前大部分著名的加密和解密算法都是公开的。事实上,人们已经意识到,一个不公
开算法的加密系统,其可靠性是值得怀疑的,加密系统的可靠性应该主要地依靠算法本
身来保证。

  目前,PGP加密算法的源程序(以及使用PGP对文件进行加密的的程序)可以从网络上
自由下载,但是由于法律问题,在你准备对某个文件进行加密或者准备开发一个具有数
据加密功能的软件的时候,你应该先了解有关的法律。(在笔者写这本书的时候,美国
方面正式裁决PGP的发明者无罪,不过如果你在中国开发一个这种强度的加密程序,你首
先应该考虑有没有被起诉的危险)

  假设你已经下载了PGP程序的源代码或者可执行程序,那么你就可以利用它对数据进行
加密了。

  工作的第一个任务是生成你的公用密钥和私用密钥,这可以用pgp –kg命令来生成,
不过,我用的PGP-2.6.3i有一个问题,你必须首先在你的宿主目录下面建立一个.pgp目
录,否则生成过程会失败。

  #mkdir .pgp

  #pgp -kg

  在第一步过程中,要确定pgp密钥的长度,可以选择512,768或者1024位,我们一般都
选择1024位,因为pgp加密的速度相当快,所以选择1024位不会造成性能上的损失:

  Pick your RSA key size:

      1)   512 bits- Low commercial grade, fast but less secure

      2)   768 bits- High commercial grade, medium speed, good security

      3)  1024 bits- "Military" grade, slow, highest security

  Choose 1, 2, or 3, or enter desired number of bits: 3

  下一步,需要设置你用户名和口令,用户名可以自己随便设置,口令是用来保护你的
私用密钥的,原则是尽量难猜一点,而且一定要记住自己的用户名和口令。

  Enter pass phrase:

  Enter same pass phrase again:

  Note that key generation is a lengthy process.

  然后pgp会要求你输入随机数字密钥,因为没有人喜欢输入这样长的数字,pgp的办法
是让你随机地敲打键盘产生出一个数字串,所以你可以任意敲键直到pgp的提示数字变成
0:

  We need to generate 1215 random bits.  This is done by measuring the

  time intervals between your keystrokes.  Please enter some random text

  on your keyboard until you hear the beep:

  1215

  然后,就会在你的pgp目录下面产生出私用密钥的存储文件和公用密钥的存储文件,名
字分别是pubring.pgp和secring.pgp。

  那么,假如你要把某个文件加密传送给别人应该怎么办呢?办法是首先要生成你的公
用密钥输出文件:

  pgp –kx root public

  (root是我们设定的pgp用户名)

  这样就生成了一个用来传送公用密钥的文件public.pgp。

  接下来,你就可以用pgp来加密你的数据了,例如,你要和user1通信,你首先把自己
的public.pgp交给user1,然后user1需要把这个公用密钥加入他自己的密钥环:

  pgp –ka public.pgp

  pgp会产生繁琐的询问,主要是问你是否愿意相信这个密钥,选择同意之后,这个密钥
就被加入到user1的密钥环中。

  然后,user1就可以用pgp加密一份文件了,比如,想把mychains文件加密后交给root
,需要用root的公用密钥对mychains进行加密:

  pgp –e mychains root

  这个过程会产生一个mychains.pgp文件,然后user1可以把这个文件发送给root,roo
t接收到这个文件之后,可以对其进行解密:

  pgp mychains.pgp

  这个动作将产生原来的mychains文件并且删除mychains.pgp文件。

  为了避免有人篡改pgp加密文件的情况出现,pgp使用了签名体系。所谓签名其实就是
信息的发送者通过某种算法为文件产生一个校验和(主要是利用md5单向加密算法),然
后用自己的私用密钥对这个校验和加密,并且把加密的结果放在文件中,最后用接收者
的公用密钥对整个文件(文件+校验和)加密,然后传递给对方。接收者首先用自己的私
用密钥解密整个文件,然后再用发送者的公开密钥解密校验和,最后自己计算校验和,
如果这个文件在传输中被修改了,那么校验和就不会正确。

  pgp还有很多参数,下面做一个简单的介绍:

  pgp -e[a]  源文件 收件人ID [其他收件人ID]

  用收件人的公用密钥加密源文件,得到密文。当然条件是收件人的公用密钥已经按照
前面的办法加入到你的密钥环中。这个过程将会生成一个源文件名+.pgp后缀的二进制加
密文件。如果你想要把加密的结果通过电子邮件传送给别人,可以加上 a 参数:

  pgp –ea 文件名字 收件人ID

  后将得到7bits编码的密文,后缀也变成了.asc。

  pgp -s[a]  源文件 [-u 我的ID]

   用我的私用密钥给源文件签名,如果不用缺省用户名就要用 -u 参数指定某个特定I
D的私匙。同样,加上 a 参数可以得到7bits编码输出。

   pgp -se[a] 源文件 收件人ID [其他收件人ID] [-u 我的ID]

   即先签名再加密,参数意义同上。

   pgp -sb[a] [+clearsig=on] 主文件 [-u 我的ID]

  产生与主文件分开的签名文件,a 与 -u 参数的意义同上。+clearsig=on参数的意义
是当为一份二进制主文件签名时,生成的签名是7bits可识别的形式。这个参数也可以在
 pgp.ini 文件中设置。

  pgp -c 源文件

  用IDEA加密算法对源文件加密,由用户给出口令。这里没有使用RSA算法,因此只是一
种传统加密。PGP也为你提供了这么一种相当不错的加密手段。

  pgp -a 源文件

  用 RADIX 64 编码对原文件编码,输出文件缺省用.asc作扩展名。由于PGP采用加密前
压缩方法(采用PKZIP算法),所以有时编码后的ASCII文件比原来的二进制文件还要小
。所以说PGP是个比UUencode更好的编码工具。RADIX 64编码和Email中常用的 MIME BA
SE64 编码是兼容的,用 MIME 的解码工具可以解开PGP的编码。

   pgp [-d] [-p] [-b] 密文

  解密或检查签名,-d 参数用来保留密文(缺省删除密文),-p 参数用来恢复源文件
加密时的文件名(否则PGP使用密文的根文件名,在DOS下根文件名就是指文件名中的前
半部分,比如 example.pgp 解密后自动生成 example 文件)。

  pgp -b  被签名后的文件

  从被签名的文件中分离出签名文件来。

   pgp 签名文件 [主文件]

   对照上面的 -sb 命令就很清楚了。如果主文件文件名不是与签名文件的根文件名,
可以在命令行加上主文件名。

  pgp -kg [密钥长度]

  生成密钥对,可以给出长度。

  pgp -ka  密钥传递文件

  把别人给你的密钥传递文件种的密钥加入到你的pgp密钥环。

  pgp -kx[a]  用户名  密钥传递文件

  生成自己的密钥传递文件,以后只要把这个文件交给别人对方就可以用你的公用密钥
对文件进行加密。加 a 参数将产生一个用7bits编码的密匙文件,从而方便你通过Emai
l传递它。

   pgp -kv[v]  [用户名]

  查看密钥列表。v 参数代表详细列出附着的签名。

   pgp -kvc    [用户名]

  列出密钥的“指纹”。

   pgp -kc     [用户名]

  列出你密钥环的内容和检查签名情况,例如某人的信任参数等等。

   pgp -ke  用户名

  编辑密钥环中密钥的用户名或者更换口令。

  pgp -kr  用户名

  删除一个用户

  pgp -ks 对方被签名ID [-u 你用来签名的ID]

  对一个公用密钥进行签名认证。

  pgp -krs 用户名 [密匙环]

  删除一个签名。

  pgp -kd 你的ID

  永久性地废除一个密钥,并且生成一个“废除证明”。用生成文件通知外界。

  pgp的最主要用处是发送/接收带有重要信息的电子邮件,你可以用PGP对邮件内容加密
,这样可以确保通信不会被其它人截获。

  10.4 sniffer和反措施

  如同我们在第一节介绍的那样,在一个以太网电气连接(用术语叫做“冲突域”)内
的任何人都可以毫不费力地收听到你发送到网络上的任何信息。这种操作需要某种专门
的程序,称为sniffer。

  10.4.1 sniffer

  sniffer程序用来在网络上监视流过的数据。实际上,像我们前面介绍的tcpdump就是
一种sniffer程序,不过,我们一般使用更有效的专用sniffer程序,这种程序在网络上
很容易找到。许多Linux系统也包含免费的sniffer程序,例如我们现在介绍的sniffit程
序。

  你可以从网络上下载sniffit程序,或者从Turbo Linux的发行盘中得到这个软件。

  使用sniffit程序的方法很简单,例如,你想监听从202.199.248.10发出的所有数据包


  # sniffit -s 202.199.248.10

  Supported ethernet device found. (eth0)

  Sniffit.0.3.5 is up and running.... (202.199.248.10)

  sniffit会沉默地在后台运行,并且把截取的数据包写到硬盘文件中。如果你相停止它
的运行,按下^C组合键就可以了。

  sniffit截取的信息类似下面这样:

  # ls

  202.199.248.20.1572-202.199.248.3.139

  202.199.248.20.1637-210.78.144.80.80

  202.199.248.20.1632-202.96.44.14.80

  202.199.248.20.1638-210.78.144.80.80

  每个文件的名字标志了它的发送者、接收者和端口号。文件的内容就是数据包的内容
,可以用普通的文件编辑器观察:

  #cat 202.199.248.20.1632-202.96.44.14.80

  GET /cgi/ldapapp?funcid=foldmain&sid=GAewHlESF HTTP/1.1

  Accept: application/vnd.ms-excel, application/msword, application/vnd.ms-p
owerpo

  int, */*

  Referer: http://202.96.44.14/cgi/ldapapp?funcid=main&sid=GAewHlESF

  Accept-Language: zh-cn

  Accept-Encoding: gzip, deflate

  User-Agent: Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)

  Host: 202.96.44.14

  Connection: Keep-Alive

  sniffit程序常用的命令参数有:

  -s [地址] 数据包的源地址

  -t [地址] 数据包的目标地址

  -p [端口号] 数据包的端口地址

  -f [设备名字] 监听哪一个设备

  -P [协议类型] 协议的类型,TCP、UDP还是ICMP。

  对于像电子邮件(POP3)和telnet这样的通信协议,sniffer简直就是一个噩梦。解决
的办法有两种,一种是监视系统,如果发现有人使用sniffer程序就予以处理,另一种方
法是对你在网络上传输的数据进行加密。对于单独的Linux机器,要使用sniffit或者任
何类似的sniffer程序,必须首先将网卡设置在直接将数据传送到应用程序的方式(称为
“混杂模式”),因此要在Linux上面使用sniffer必须具有超级用户权限,所以只要控
制了root权限就可以保证没有人在本地使用sniffer。但是sniffer程序是用来监视别人
的,而在以太网上任何人都可以直接把网线连接到集线器上从而实现接入,而且像Wind
ows 9x这样的系统并不需要身份验证,因此前一种方法实际是行不通的。相反,后一种
方法是目前常用的方式,我们将在下面进行介绍。

   10.4.2 ssh

  最容易受到sniffer威胁的程序是telnet和ftp之类的身份验证协议。一个sniffer程序
可以轻易地听到你的登录名和密码。为了解决这个问题,最常用的方式是让数据在网上
传输的时候进行加密。最常用的替代telnet的方法是ssh。

  ssh有两个版本,分别是ssh1和ssh2。两个版本的性质差不多,但是并不互相兼容。一
般建议使用ssh1,以免和其它版本的客户端冲突。不过目前由于支持ssh2的windows 9x
客户程序也在逐渐增加,因此用ssh2也没有什么问题。必须注意的是你不能同时安装ss
h1和ssh2。由于美国政策的问题,并不是所有的Linux发行版本中都包含ssh的发行版本
,你可以自己从网络上下载源代码然后编译。当然,如果你的发行版本中包含ssh的rpm
,你只要直接安装就可以了。

  在Linux下面的ssh包含两个部分,即ssh的服务程序和客户程序。要启动ssh服务程序
,只要执行sshd或者sshd2就可以了:

  $ sshd2

  然后就可以用ssh登录这个系统:

  $ ssh localhost

  如果以前没有登录过这个主机,那么这时会提示你下载公用密钥:

  Are you sure you want to continue connecting (yes/no)? yes

  Host '202.199.248.11' added to the list of known hosts.

  Creating random seed file ~/.ssh/random_seed.  This may take a while.

  wanghy@202.199.248.11's password:

  输入口令后,就可以进入系统了。从使用上说,ssh和telnet没有什么不同,但是ssh
将传输中的所有信息加密,方法就是我们前面说的双密钥体系,这样可以确保传输的信
息不会被别人窃听。

  除了ssh之外,sshd还提供其它一些服务,特别是sftp和scp。sftp程序是一个ftp的替
代产品,它可以完全替代ftp的功能,用法也类似:

  $sftp2 202.199.248.11

  local path  : /home/wanghy

  Accepting host 202.199.248.11 key without checking.

  wanghy's password:

  remote path : /home/wanghy

  sftp>

  可以用help命令察看sftp的命令列表,这方面与ftp类似:

  sftp>help

  ?           dir         ldelete     mkdir       quit        user

  bell        disconnect  ldir        open        recv        verbose

  bye         get         lls         page        rm

  cd          hash        lpwd        prompt      sort

  close       help        lrm         put         status

  delete      lcd         ls          pwd         timeout


  ? command  for more information on a specific command.

  scp是rcp命令的类似物,提供了安全的rcp服务:

  $ scp2 test.txt remotehost:test.txt

  rftp和rcp服务都是sshd的附带服务,连同ssh服务都通过sshd的配置文件(/etc/ssh
2/sshd2_config)来配置,你可以自己处理这个配置文件,在文件中最重要的是AllowH
ost和DenyHosts行,它们定义哪些机器可以存取本机的ssh、sftp、scp服务。通常我们
建议关闭系统的telnet、rlogin和ftp服务,而用ssh,sftp取代,对于在一个比较大的
以太网系统中的用户尤其如此。

  在很多情况下,我们都要用Windows 9x来远程控制Linux服务器,这时你需要一个Win
dows下的ssh客户程序,我建议你使用SecureCRT和TTSSH。其中TTSSH是一个可以免费下
载的程序,不过它的主站点下载速度都相当慢,建议你从国内的某个大的ftp站台上下载


  除了替换telnet程序之外,ssh还可以对X数据传输进行加密。对于准备透过网络使用
X应用程序的用户,这个功能特别有用。当你从ssh登录到对方的主机上的时候,这个传
输信道就被激活,然后你可以直接启动对方机器上的X应用程序,无须设置DISPLAY变量
,这个程序的输出就被加密发送到本地机器上,ssh再将其解密传送给本地的X服务程序


  ssh的另外一类典型应用是在目标机器和本地主机之间通过端口转发建立加密传输信道
,甚至实现VPN系统,详细的内容请参考王波先生的《FreeBSD使用大全》。


  10.4.3  SSL和https协议


  如同ssh可以替代telnet一样,为了http传输的安全,人们开发了SSL协议,它用来确
保数据在网络上安全传输。利用SSL协议,可以实现加密的http传输协议,称为https协
议。目前的常见浏览器,如IE,Netscape等等都支持https协议。

  Apache服务器本身并不支持https协议,但是有两个可以自由使用的支持SSL的相关计
划,一个 为Apache-SSL,它集成了Apache服务器和SSL,另一个为Apache+mod_ssl,它
是通过可动 态加载的模块mod_ssl来支持SSL,其中后一个是由前一个分化出的,并由于
使用模块,易用性很好。我们建议你使用这个产品。

  要使用mod_ssl,你必须首先安装openssl程序。一般下载到的ssl程序都是源代码,你
需要按照一般的方法编译安装这个程序。接下来,你需要安装apache和mod_ssl的源代码
,然后按照mod_ssl随程序提供的说明编译apache和mod_ssl。

  编译mod_ssl是一个比较繁琐的过程,在本书中不想详细地介绍这个过程,因为在mod
_ssl的安装说明中写的很清楚,这里只描述一下大致的过程:

  配置各个程序的目录。假设当前目录是/serversrc,apache1.3.9的源代码在/server
src/apache1.3.9,mod_ssl的源代码在/serversrc/mod_ssl-2.4.8-1.3.9,openssl源代
码在/serversrc/openssl-0.9.6,那么

  $ cd mod_ssl-2.4.8-1.3.9

  $./configure --with-apache=../apache_1.3.9 --with-ssl=../openssl-0.9.4

  然后可以进入apache源代码目录编译apache:

  $cd ../apache-1.3.9

  $make

  这样就生成了apache的程序,但是还需要建立认证证书:

  $make certificate

  在建立证书的过程中,会问你一些问题,如加密方式,你的单位名称等等,最后提示
:Enter PEM pass phrase:

  输入你选择的口令,确认后,证书就建立完毕了。

  杀掉原来的httpd进程,然后启动带有https的httpd进程:

  $/usr/local/apache/apachectl startssl

  会提议你输入你设定的密码,输入后https服务就启动了。

  由于普通的IE浏览器就支持SSL,所以可以用它来测试mod_ssl是否安装正确,在浏览
器栏中输入你的服务器的地址,例如

   https://ssl.yourdomain.com

  IE会提示你你正试图接收一个未经验证的安全性验证证书,选择继续,应该能够看到
mod_ssl的手册,这就说明mod_ssl已经正确工作了。

  目前大部分电子商务系统支持SSL和https。

  10.5 扫描器和其它工具

  扫描是一种比较特殊的活动。从技术上说,扫描并不是一种攻击行为,它只是对服务
器的端口发出连接请求,以便判断服务器上到底运行着哪些服务。但是,由于UNIX中存
在的众所周知的脆弱服务,因此扫描程序往往成为入侵者攻击系统的第一跳。事实上,
许多人把扫描当成一种攻击行为。特别是在教育网内,据说扫描别人的机器是一种违法
行为,如果你准备使用扫描器,再使用之前弄清对应的法律条文。

  由于上面说的原因,传统的安全人员喜欢用扫描器作为一种安全性工具,通过对自己
的服务器进行扫描,你可以确保没有不应该存在的服务在运行。许多扫描器都以安全工
具的形式出现,例如satan和nmap等等。

  nmap是一个在Linux下的常用端口扫描工具,你需要到网络上下载这个产品,并且自己
对它进行编译安装,使用的方法很简单:

  nmap [目标地址],例如

  # nmap 202.199.248.11


  Starting nmap V. 2.3BETA9 by Fyodor (fyodor@dhp.com, www.insecure.org/nmap
/)

  Interesting ports on linux.asnc.edu.cn (202.199.248.11):

  Port    State       Protocol  Service

  21      open        tcp       ftp

  22      open        tcp       ssh

  23      open        tcp       telnet

  25      open        tcp       smtp

  80      open        tcp       http

  98      open        tcp       linuxconf

  110     open        tcp       pop-3

  113     open        tcp       auth

  139     open        tcp       netbios-ssn

  1080    open        tcp       socks


  Nmap run completed -- 1 IP address (1 host up) scanned in 0 seconds

  nmap显示出了目标目标机器上的服务类型。

  与其它扫描工具相比,nmap比较容易使用,而且可以一次扫描一个网段的所有IP来确
定哪些机器的服务端口值得重视:

  # nmap 202.199.248.1-255


  Starting nmap V. 2.3BETA9 by Fyodor (fyodor@dhp.com, www.insecure.org/nmap
/)

  Interesting ports on  (202.199.248.46):

  Port    State       Protocol  Service

  80      open        tcp       http

  135     open        tcp       loc-srv

  139     open        tcp       netbios-ssn

  443     open        tcp       https

  1026    open        tcp       nterm


  Interesting ports on  (202.199.248.48):

  Port    State       Protocol  Service

  80      open        tcp       http

  135     open        tcp       loc-srv

  139     open        tcp       netbios-ssn

  443     open        tcp       https

  ……………………

  在扫描中,你可以指定一些选项,常用的选项有:

  -sT 用建立TCP连接的方式进行扫描

  -sS “半开放式”扫描,这个扫描方式的主要用处是避免被服务器的自动记录程序记
录下来。对于希望扫描别人的扫描者,这种功能时很有用的。

  -sP 只是使用ping方式确定哪些机器处于活动状态。这种功能几乎不能算是一种扫描
,不过在你想确定网络的那一部分在工作的时候是有用的。

  -sU 用发送/接收UDP数据报文的方式进行扫描

  -sR 启用RPC扫描

  -O 这个功能对入侵者相当有用,它根据远方机器的会应判断对方机器的类型。就我个
人试验的结果,这个猜测出的机器类型还是相当准确的,只是对windows NT偶尔会失效


  -p 明确指出使用哪一个端口

  nmap还有许多参数,请自己参考手册页面。

  另外的最著名的扫描工具就是satan,关于这个老资格的程序我们不想多说,你可以自
己去下载源代码然后编译它。

  在扫描到了系统上运行的服务之后,你应该干什么呢?首先,你应该回头考虑你关于
所有已知的服务的知识,判断哪些服务是可有可无的,哪些是具有高度危险性的(例如
各种r服务)。关闭所有不必要的服务,并且用比较可靠的服务替代那些高危险性的服务


  10.6 对服务器的远程攻击

  在许多的情况下,Linux是作为纯粹的网络服务器来使用的,这时,用户通常不能登录
到服务器上,而只能通过www,smtp,pop-3,samba等功能使用服务器。而入侵者的目标
就是获得服务器的一个root账号。

  10.6.1 WWW和电子邮件的安全性

  在对服务器进行远程攻击的时候,最常见的攻击目标是WWW服务和电子邮件服务系统,
原因是它们的特殊特性。

  WWW服务的主要安全性问题在于cgi程序。一个cgi程序就是一个标准的可执行程序,在
服务器的内存空间中执行,在远端启动。通常,WWW服务器会用自己的权限启动cgi程序
,例如对于Apache,这个身份一般是nobody。

  cgi程序的安全性问题出现在下面几个方面:首先是许多cgi程序(比如留言板,计数
器等等)需要写服务器上的文件,但是在Apache的配置中,cgi的执行身份是nobody,意
味着cgi程序无法写任何文件。为了解决这个问题,许多人采用设置cgi为setuid程序的
方法,甚至将它setuid到root,潜在地引入了安全性问题。

  另外的一个问题是缓冲区溢出,关于缓冲区溢出的概念可以参考下面的内容。由于缓
冲区溢出的存在,一个怀有恶意的程序可以用某些代码获得root身份,如果你的机器是
为客户提供主页空间的虚拟主机服务器,这种事情非常容易发生。

  除了cgi之外,SSI也是一种容易引发安全性问题的功能,一个SSI程序只是一个在服务
器端执行程序,虽然比cgi要简单,但前面说的安全性问题对SSI也可能存在。

  通常,我们建议使用服务器端的脚本语言,例如PHP3,JSP等来提供那些较为复杂的W
EB服务功能,由于脚本语言要通过服务器进行解释,相对来说,安全性控制要比cgi程序
好一些,而且,脚本语言因为不需要执行处理cgi的装入过程,在很多情况下,如果程序
中不包含复杂的循环和计算,效能往往会比cgi程序高一些。不过,必须记住,使用脚本
语言并不意味着你已经完全避免了安全性问题,特别是,允许用户上载自己的文件总是
不可避免地附带着被侵入的危险。

  即使你解决了前面说的两类问题,你仍然可能会受另外的安全问题的困扰。许多用在
www上的程序是由厂商提供的,如同你无法知道你的用户上载的cgi程序是否有漏洞一样
,你也无法知道你买来的程序是不是有致命的安全性问题。实际上,许多网站被突破都
是由于它们使用的WEB应用程序存在漏洞。对于这种问题,你能做的就是随时关注安全问
题的消息,随时堵上新发现的漏洞。

  另外一个容易被攻击的程序是sendmail。由于sendmail总是以root身份来执行,而且
这个程序实在是太大太复杂,所以经常会成为入侵者的突破口。一个非常容易出现问题
的东西是别名文件的邮寄到命令的功能。这个功能意味着任何用户可写的别名文件都包
含着被攻击的可能。不仅如此,sendmail中的每一样东西都可能成为攻击的目标。在有
关安全性的传统问题中,许多都和sendmail有关。随着sendmail的不断升级,现在版本
中包含的漏洞已经减少了很多,但是你仍然应该经常关注sendmail的升级,不断取得新
版本以便保证你不会受sendmail漏洞的困扰。在比较小的单位,也可以考虑使用qmail代
替sendmail,由于设计思路的问题,qmail的安全性比sendmail稍好一些。

  10.6.2 缓冲区溢出

  缓冲区溢出是困扰安全界的传统问题之一,简单地说,缓冲区溢出是指利用目标程序
编写的漏洞,使得目标机器执行那些本来不应该执行的内容。

  计算机本身并不区分代码和数据,所以只要是指令指针到达的地方,机器就会执行,
缓冲区溢出就是利用这个问题。例如象scanf()和gets()这样的函数,如果读入了一个比
预定缓冲区更长的字符串,系统将简单地把多余的字符串放到程序预留的缓冲区后面去
。在许多情况下,程序的数据区和堆栈区是相连的,因此这样的多余信息很可能破坏系
统的堆栈段。而通常情况下,程序函数调用的返回地址是在堆栈中保存的,因此破坏堆
栈段就可以使得程序的运行脱离正常的流程。

  如同我们知道的那样,用户程序在运行的时候,为了访问系统,需要发出许多系统调
用,其中,不少部分是在系统核心运行,如果这时候能够更改程序的运行过程,就可以
得到超级用户的执行权限。

  由于缓冲区溢出作为一种攻击手段可以在远端执行,所以它成为远程入侵服务器的主
要手段,特别是对于WEB服务器,因为入侵者并没有账号可以利用,使用缓冲区溢出就成
为主要的攻击手段。

  目前有一些基本的方法保护缓冲区免受缓冲区溢出的攻击和影响。在许多系统上,将
缓冲区设置为不可执行来避免这种问题。这个手段能够基本上解决缓冲区溢出问题,但
是可能会导致某些软件不能正常运行;另外的方法是让系统在每次执行缓冲区处理的时
候都进行边界检查,尤其是对数据段进行边界检查,这种方案可以确保抵挡住缓冲区溢
出的影响,但是会影响到系统的执行效率。

  解决缓冲区溢出问题的根本方法是不要写出有可能溢出的程序。在使用任何输入缓冲
之前,应该首先检查输入内容的长度,避免将多余的数据存入。这对于你自己写的程序
是可以做到的,目前也存在多种能够自动检查越界问题的编译工具。问题是,你无法对
于你买来的所有程序都做这种检查,实际上,很多系统被攻破都和缓冲区溢出有关。对
于这种问题,你唯一的方法是随时注意安全性信息,并且及时patch有问题的程序。

  假如你管理的是一个为用户提供主页服务的虚拟主机服务器,那么你的管理就困难的
多了。事实上,在这种情况下,没有真正可靠的防范方式,也许唯一可靠的办法是通过
政策对用户的行为加以限制。


  10.6.3 Core dump

  除了缓冲区溢出,UNIX系统下面的另一个有关安全性的噩梦是“Core Dumped”的问题
。当发生诸如指针越界,堆栈错误之类的问题的时候,通常UNIX会终止用户程序并且生
成一个core文件。这个文件中包含的是程序使用的存储信息,通常用于调试,用调试工
具可以通过core文件重现程序出错时的状态,以便找出问题所在。

  这个功能听起来很好,在实际应用中却成了安全性的梦魇。大部分服务进程是以核心
态运行的,这些程序能够接触到内核数据。假如某个服务进程在运行中发生了“core d
ump”的话,转储下来的core文件中就可能含有系统的关键性数据,例如口令文件的内容


  这种“core dump”引发系统被突破的情况最容易发生在ftp服务中,因为这时候服务
进程要访问口令(passwd/shadow)的内容,而且用户还可以下载产生的core文件。尽管
目前会发生core dump的服务程序已经少了很多,但是这仍然是很令人困扰的一个问题。
解决的方法,是在必要的情况下限制core文件的大小:

  ulimit –c 0

  这个命令把core文件的大小限制为零,实际上就禁止了core文件的生成。当然,对于
需要调试的场合,这个设置可能有些不方便,但是你会发现这样做是值得的。

  注意ulimit命令只能在超级用户场合,如果是普通用户,那么限制方法是

  limit coredumpsize 0

  10.7 拒绝服务攻击

  现在我们要描述一种著名的攻击方式。著名的主要原因是这种攻击曾经让世界上的几
乎所有著名信息提供商瘫痪。实际上,这种攻击方式是一大类攻击方法的统称,但是有
一些攻击方式特别有效。

  最简单也最行之有效的一种攻击手段,是通过向服务器发送超过系统负荷的请求。直
至服务器超载而瘫痪。这种攻击手段本质上说技术含量并不高,但是效果却非常好,实
际上,就目前而言,在TCP/IP的框架内部对付这种攻击几乎是不可能的。这种攻击手段
称为“拒绝服务”(D.o.S)。

  最简单的拒绝服务攻击是针对应用层的,例如,smtp协议和http协议都是标准的攻击
目标,用大量连接请求或者数据传输使得对方的服务器过载,或者耗尽对方的硬盘都是
常见的手段。

  电子邮件炸弹可以看成D.o.S的一个类型,当然它的主要目标是对方的硬盘空间,而且
也容易对抗。特别是在现在的情况下,服务器普遍采用集群方式,这种简单地开出正常
连接的方法已经对服务器没有什么威胁。相反,像SYN flood一类的强力攻击手段是现代
攻击的潮流。

  如同我们说的那样,TCP/IP是一个本质上不包含安全性验证的网络系统,它在很多方
面可以攻击的弱点,例如ICMP重定向信息,TCP/IP连接的建立等等。由于我们这本书不
是一本安全性方面的教程,我们只是介绍一下一种最著名的D.o.S形式。

  当某一台机器试图连接服务器的时候,它向服务器发出一个请求数据报文,里面应该
包含数据报文的源地址和目标地址,服务器接收到这个数据报文之后,需要向信息的源
地址发送一个回应,最后双方建立一个连接。

  现在,一个心存恶意的攻击者用自己的机器发送一个具有虚假的源地址的数据报文,
服务器接收到这个报文之后,就试图对报文中给出的源地址进行连接,当然这无法成功
。于是,服务器不得不等待TCP超时,这个过程中,为了建立TCP连接所分配的资源不会
被释放,直到超时。

  然后,攻击者加快发送数据报文的速度,使得在一次超时之前,已经有无数虚假源地
址的数据报文到达服务器,服务器的TCP/IP协议栈于是被耗尽,任何正常的请求都无法
被服务器接受并处理。效果上,这时服务器尽管还在工作,但是已经无法对外服务了。

  在几年以前,就曾经有人用这种手段使得许多著名的网站瘫痪,不久以后,各个服务
器OS开发者都给出了各自的应付方案,例如可以在TCP/IP栈满的时候随机地丢弃一个旧
的请求,或者随着TCP/IP栈进入危险状态减小TCP超时的时间间隔等等。实际上,这些方
法都不是很可靠,但是确实它们能够保证你的系统不会被这种疯狂的SYN flood攻击术淹
没(实际上,上面说的攻击手段中,还有许多种相关的做法,但是使用半开放的TCP数据
连接请求的SYN flood肯定最有效)。

  在Linux中,使用的是一种折衷的办法,准确地说,是一种拆了东墙补西墙的办法,它
使用一种名叫SYN cookies的技术代替正常的TCP/IP连接验证过程。这种技术可以确保服
务器不受一般的SYN flood的攻击术的影响,但是缺陷是牺牲了其他某些方面的安全性,
而且在正常的系统启动时是关闭的。如果要使用这个功能,你需要首先在编译内核时加
入SYN cookies的支持(见编译内核部分),然后在启动脚本中加入这样的命令行:

  echo 1 >/proc/sys/net/ipv4/tcp_syncookies

  SYN cookies不需要更改客户端的配置,也不需要更改TCP/IP协议。

  尽管单一用户发出的D.o.S现在已经和对抗技术处于平衡状态,但是在笔者写这本书的
时候,一种新的攻击潮流又使得D.o.S成为焦点。这一次的主要内容是D.D.o.S,即分布
式拒绝服务攻击。简单地说,攻击者从互连网络上的多个地方同时向服务器发动D.o.S攻
击,由于这种攻击具有比普通的D.o.S高得多的带宽和资源,要完全防止它是非常困难的


  如何对付D.D.o.S目前还没有一个可靠的方法。对于服务器管理者来说,你只能尽量避
免自己的服务器成为攻击者发动攻击的目标,其他的就自求多福吧。

  10.8 使用关于安全性的邮件列表

  安全性永远存在于你的警惕之中。不断地发现新的系统漏洞,并且堵住它们。当然,
让你自己来研究所有软件的漏洞或者研究内核源代码通常是不现实的,最好的方法是和
internet上的人交流,得到最新的漏洞和攻击信息。

  安全性的信息主要是来源于几个渠道,首先是厂商的信息发布,然后是相关的新闻组
。但是这两方面都是相当耗费时间的。如果你很忙,那么可以考虑使用安全性的邮件列
表。

  就我个人感觉,最好的的安全性邮件列表是CERT和BUGTRAQ。不过,如果你使用国内的
那种免费的邮件账号,就不要试验订阅了,因为它们每天都会发送给你几十封有关安全
性的邮件。最好你有一个自己的本地邮件服务器,然后按照我们在第七章解释的方法用
procmail过滤出所有安全性信件并且把它们存放在一起,每天(或者两三天)阅读一次


  要订阅CERT的安全性新闻,向cert-advisory-request@cert.org发送一封电子邮件,
内容(不是主题!主题栏应该空着)中简单地写上SUBSCRIBE your-email-address,yo
ur-email-address是你的邮件地址,然后等待回信确认,按照回信给出的提示去做就可
以了。

  要订阅Bugtraq,向listserv@netspace.org发一封电子邮件,内容写上subscribe bu
gtraq,等待回信,按照回信说明操作。

  另外还有其他一些邮件列表,我没有试验过,你可以自己试试看,例如root shell,
可以向majordomo@rootshell.com发送一封邮件,内容为subscribe announce。

  如果你有足够的时间,那么可以多去看看各种著名的安全性站点,不过绝大多数是英
文的。我不想在这里介绍它们,你可以去yahoo上搜索一下,几乎能找到所有比较大的安
全性站点。

  这里介绍两个中文的安全性站点:

  http://www.isbase.com

  绿色兵团主页,这个站点主要讨论网络攻击和相关的防御。

  http://www.safe999.com.cn

  曙光公司的安全性技术站点,包含大量的基础知识介绍。

--
当我越过无尽虚空的时候,我看见星辰的欲望,光荣和毁灭,这是光辉世界的宿命,
一切的一切,最终必将落入黑暗和虚无。
所以,我随着星光飞翔,去逃脱必然的终结,也许有一天,我将回到世界的原初,
等待新的星辰的诞生。
尘埃是星的起源,星的终结。


※ 来源:·BBS 水木清华站 smth.org·[FROM: 202.112.90.20]
--
※ 转载:·BBS 荔园晨风站 bbs.szu.edu.cn·[FROM: 192.168.1.115]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店