2006年9月24日星期日

附 录

Linux 常用命令快速查询
 
cal

 
功能:显示某年某月的日历
语法:[选项] [月[年]]
选项:-j 显示出给定月中的某一天是一年中的第几天
-y 显示出整年的日历

 
chgrp

 
功能:改变文件或目录所属的组
语法:chgrp[选项]group filename
选项:-R 递归式地改变指定目录及其下的所有子目录和文件的改组

 
chmod

 
功能:改变文件或目录的访问权限
语法:chmod [who] [+-=] [mode] 文件名
选项:操作对象 who 可是下述字母中的任何一个或者它们的组合。
u 表示“用户(user)”,即文件或目录的所有者
g 表示“同组(group)用户”,即与文件属主有相同组 ID 的所有用户
o 表示“其它(other)用户”
a 表示“所有(all)用户”,它是系统默认值
操作符号可以是:
+ 添加某个权限
- 取消某个权限
= 赋予给定权限并取消其他所有权限
设置mode所表示的权限可以使用下述字母的任意组合:
r 可读
w 可写
x 可执行
s 在文件执行时把进程的属主或组 ID 置为该文件的文件属主
u 与文件属主拥有同样的权限
g 与和文件属主同组的用户拥有一样的权限
o 与其他用户拥有一样的权限

 
chown
 
功能:更改某个文件或目录的属主和属组
语法:chown [选项] 用户或组文件
选项:-R 递归式地改变指定目录及其下的所有子目录和文件的拥有者
-v 显示 chown 命令所做的工作

 
clear

 
功能:是清除屏幕上的信息
语法:clear

 
date

 
功能:显示和设置系统日期和时间
语法:date [选项] 显示时间格式
选项:-d datestr 显示由 datestr 描述的日期
-s datestr 设置 datestr 描述的日期
-u 显示或设置通用时间

 
echo

 
功能:在显示器上显示一段文字,起到提示的作用
语法:echo [-n] 字符串
选项:-n 输出文字后不换行

 
fdformat
 
功能:低级格式化软盘
语法:fdformat [-n] device
选项:-n 软盘格式化后不作检验
device 指定要进行格式化的设备,通常是下述设备之一
/dev/fd0d360
/dev/fd0h1200
/dev/fd0D360
/dev/fd0H360
/dev/fd0D720
/dev/fd0H720
/dev/fd0h360
/dev/fd0h720
/dev/fd0H1440

 
free

 
功能:查看当前系统内存的使用情况
语法:free [选项]
-b 以字节为单位显示
-k 以K字节为单位显示
-m 以兆字节为单位显示

 
mesg
 
功能:设定是否允许其他用户使用 write 命令给自己发送信息
语法;mesg [y l n]

 
passwd

 
功能:改变用户口令
语法:passwd [用户名]

 
shutdown

 
功能:安全地关闭或重启 Linux 系统
语法:shutdown [选项] [时间] [警告信息]
选项:
-k 并不真正关机,而只是发出警告信息给所有用户
-r 关机后立即重新启动
-h 关机后不重新启动
-f 快速关机,重启后跳过 fsck
-n 快速关机,不经过 init 进程
-c 取消一个已经运行的 shutdown

 
sort

 
功能:逐行对文件中的内容进行排序
语法:sort [选项] 文件
选项:
-m 若给定文件已排好序,则合并文件
-c 检查给定文件是否已排好序,如果它们没的排好序,则打印一个出错信息
-u 对排序后具有相同内容的行,只保留其中的一行
-o 将排序后的结果输出到指定的文件中,而不是标准输出
-d 按字典顺序排序,比较时仅字母、数字、空格和制表符有意义
-f 将小写字母和大写字母同等对待
-I 比较时忽略非打印字符
-r 按逆序输出排序结果

 
su
 
功能:让普通用户暂时拥有 root 用户或者其他用户的权限
语法:su [选项] [-] [使用者帐号]
选项:
-c 以指定用户执行某个命令
- 加这减号的目的是使环境变量和欲转换的用户相同
-m 保留环境变量不变

 
sync

 
功能:把内存中的数据强制写回硬盘,以免数据丢失
语法:sync

 
uniq

 
功能:删除文件中的重复行
语法:uniq [选项] 文件
选项:
-c 在输出结果中每行行首加上本行在文件中出现的次数
-d 只显示重复行
-u 只显示文件中不重复的各行
-n 前n个字段与每个字段前的空白一起被忽略,一个字段是一个非空格、
非制表符的字符串,彼此由制表符和空格隔开(字段从0开始编号)
+n 前n个字符被忽略,之前的字符被跳过(字符从0开始编号)
-f n 与 -n 相同,这里 n 是字段数
-s n 与 +n 相同,这里 n 是字符数

 
uptime

 
功能:显示系统已经运行了多长时间
语法:uptime

 
wall

 
功能:向全部已登录的用户发送信息
语法:wall 字符串

 
write

 
功能:向系统中的指定用户发送信息
语法:write 用户帐号[终端名称]

第三节 防火墙

  即使是世界上最好的认证和加密方案,也很难保证系统不会受到黑客高手的攻击。目前,阻止他们的最好办法还是使用防火墙,拒绝来自网络外的非法访问。Linux 在构建防火墙方面做得相当优秀,完全有能力同那些价格不菲的商业防火墙软件一决高低。
 
1、认识防火墙

 
  防火墙可以是一台计算机,一台路由器,或其它专用设备,虽然形式可以多种多样,但目的是为了阻止来自网络外部的非法访问。大多数防火墙都被设置在专用的 Internet 和公用的 Internet 之间,它依据事先定义好的一系列规则,将那些不受欢迎的数据包挡在网络之外,从而提高网络的安全性。

 
  防火墙的作用主要取决管理员的设置,它可以被设置成很开放的,几乎允许所有的数据包通过,也可以被设置成很保守的,仅仅允许极少数的数据包通过。

 
  让网络中的一台计算机专门承担防火墙的职责是一个较好的做法,这是因为防火墙通常用来控制外界对内部网络的访问,它的安全性应该尽可能的高。黑客都清楚如果他们能够控制防火墙,也就相当于控制了整个网络。为了看好这个大门,管理员应该始终牢记下面这此戒律:
 
  第一、关闭防火墙上所有不需要的服务;

  第二、限制对防火墙拥有访问权限的人数;
  第三、不要在防火墙上使用其它地方使用过的口令;
  第四、要确保防火墙在物理上的安全。
 
  目前常用的防火墙有两种主要形式:代理服务器和包过滤器。代理服务器工作在整个网络体系中的应用层,通常都是针对具体协议的,也就是说 FTP、Telne 和HTTP 都有各自专用的代理服务器。包过滤工作在整个网络体系结构中的网络层,它可以查看来自网络外的任何一个 IP 包,然后按照一套事先定义好的规则来决定是允许 IP 包通过,还是简单地将其丢弃。

 
  作为一个优秀的网络操作系统,Linux 从一开始就支持数据包过滤功能。RedHat Linux AS 4 自带了 IPchains 和 iptables 两个软件包,它们都具有对网络中的数据包进行过滤的功能,是构建防火墙系统的基石。

 
2、配置防火墙
 
  以前 Linux 系统管理员在配置防火墙时基本上没有什么工具可言,在部分都是使用命令或者直接修改配置文件,Webmin 的出现总算多少缓解了这一尴尬局面。打开浏览器登录 Webmin,然后单击『网络』图标进入网络管理页面,如图 8-3-1 所示。

 
图 8-3-1 配置防火墙
 
  单击『Linux Firewall』图标,如果之前没有对 IPtables 设置,将看到如图8-3-2 所示的页面。单击『Setup Firewall』按钮,Webmin 将开始初始化IPtables 的配置文件 /etc/sysconfig/iptables。
 
图 8-3-2 初始化 IPtables
 
  不要将防火墙想的很神秘,其实说穿了无非就是对要转发的数据包(FORWARD)、进入网络的数据包(INPUT)和从网络发出的数据包(OUTPUT)进行控制,如图 8-3-3所示。

 
图 8-3-3 定义过滤规则
 
  由于所有的处理规则都是相同的,因此只要学会对一种数据包进行处理,其它两种自然也就不在话下了。

 
  我们以进入网络的数据包为例,一起来看看如何为防火墙定义过滤规则。单击『Incoming packets (input)』区域中的『Add rule』按钮,进入『Add Rule』页面。在『Action to take』内选择符合该过滤规则时采取的动作,最常用的动作是『Accept』和『Drop』,分别表示“接受”和“丢弃”符合过滤规则的数据包,如图 8-3-4 所示。
 
图 8-3-4 采取的动作
 
  为防火墙设置的每条过滤规则,实际上都可以简单地描述为:符合某些条件时,采取相应的动作。过滤规则中的动作在前面已经选好了,接下去自然就是定义过滤规则应该满足的条件了。说起来容易,但真正做起来可就不那么轻松了,因为可能的条件实在太多。不要着急,让我们各个击破。

 
  在『Source address or network』和『Destination address or network』区域中,可以设置符合该过滤规则的数据包应该具有的源地址和目标地址,如图8-3-5 所示。

 
图 8-3-5 源地址和目标地址
 
  源地址和目标地址既可以是某一主机的 IP 地址,也可以是以 CDIR 形式表示的网络地址。在地址前面的条件下拉框中,可以选择『』、『Equals』和『Does not equsl』,分别表示忽略、等于和不等于三种情况。

 
  在『Incoming interface』和『Outgoing interface』区域中,可以设置符合过滤规则的数据包应该来自哪个网络接口,以及应该发送到哪个网络接口,如图8-3-6 所示。
 
图 8-3-6 网络接口
 
  出于安全性的考虑,大多数防火墙一般都装有两块网上,一块用来连接外部网络,另一块则用来连接内部网络,因为这样可以很好地将外部网络和内部网络隔开。
 
  在『Network protocol』区域中,可以设置符合过滤规则的数据包应该属于哪个网络协议,如图 8-3-7 所示。

 
图 8-3-7 网络协议
 
  网络管理员通常不希望某类可能产生安全问题的协议数据包穿越防火墙,因此这个设置项非常实用。
 
  在『Source TCP or UDP port』和『Destination TCP or UDP port』区域中,可以设置符合该过滤规则的数据包应该有的源端口和目标端口号。可以同时指定多个端口,也可以指定一个端口的范围,如图 8-3-8 所示。

 
图 8-3-8 源端口和目标端口
 
  如果源端口和目标端口相同,则只需在『Source and destination port (s)』区域中设置就足够了,不用将两者分开对待。
 
  如果熟悉 TCP 协议,那肯定知道 TCP 数据包中有一些标记(flag)字段,这些也可以成为防火墙对数据包进行过滤时的依据,如图 8-3-9 所示。

 
图 8-3-9 TCP 标记
 
  其它一些设置项由于不是经常用到,这里就不作介绍了。在设置好过滤规则后,单击『Add Rule』页面中的『新建』按钮,就可以在『Linux Firewall』页面中看到刚刚添加的过滤规则了,如图 8-3-10 所示。
 
图 8-3-10 防火墙过滤规则
 
  使用同样的办法可以添加多条过滤规则。需要注意的是,防火墙是按照一定的顺序来应用过滤规则的。对于同一个数据包,可能前一条规则允许它通过防火墙,而后一条规则不允许,此时防火墙将按照前一条规则来处理它。当同时存在多条过滤规则时,规则之间的应用顺序非常重要。通过单击规则列表『Move』列中的上下箭头,可以改变过滤规则的应用顺序,如图 8-3-11 所示。
 
图 8-3-11 规则应用顺序
 
3、启用防火墙
 
  在设置好防火墙的过滤规则后,需要激活这些新的配置。单击『LinuxFirewall』页面底部的『Apply Configuration』按钮,防火墙将按照最新定义的过滤规则,对经过的每个数据包进行处理,并采取相应的动作,如图 8-3-12 所示。

 
图 8-3-12 应用新的过滤规则
 
  如果希望在系统启动的时候,防火墙就能自动运行并激活这些过滤规则,那就应该在『Linux Firewall』页面底部的『Activate at boot』按钮旁边选择『是』单选框,然后单击『Activate at boot』按钮,如上图所示。
 
  再强调一下,不管使用哪种策略和技术,绝对安全的系统都是不存在的。一个真正较为安全的系统是需要根据不同网络的具体情况,以及不同用户对安全性的需求进行定制。优秀的网络管理员应该做到比黑客更精明,即所谓的“魔高一尺,道高一丈”。

 
  现在你已经读完本书了,有什么感觉?我想,你会发现成为一名合格的 Linux管理员已经不再是一伯难事了!

第二节 安全网络连接

  加密是保证网络连接安全的一种重要手段,如果能在数据发送前利用特定的算法对其进行加密,那么数据的机密性将更有保证。SSH 使用经过加密后的连接在两台计算机间进行通信,这样任何人想利用网络嗅探器来监视通信过程都将变得非常困难,因为所有数据都是经过加密处理的。
 
1、认识安全网络连接
 
  如果只能用一句话来描述安全的网络连接,那么就是要确保数据在从一个主机发送到另一个主机时,与通信无关的第三方无法读取。使用嗅探器虽然还是同样能中途截取数据包,但这些加密后的数据都是不可读的。经过加密处理之后,黑客们就无法轻松地获取诸如用户口令这类敏感数据,因而所有在网络上传输的数据都将是安全可靠的。
 
  安全网络连接常用于需要发送机密数据的场合。由于 Internet 是一个全世界所有人都可以使用的公共网络,因此数据加密显得尤为重要,毕竟像电子商务这类应用,首先考虑的就是如何确保信用卡及用户信息的机密性。
 
  传统的 rlogin、rsh 和 Telnet 是三个臭名昭著的不安全典型,它们不经过加密就进行系统登陆和数据传输。假如你是一名 root 用户并有使用 Telnet 登录系统进行管理的嗜好,那么你的用户我和密码实际上都是通过纯文本方式在网络中传递的。如果被黑客盯上,并通过网络嗅探器截获了数据包,那么整个系统离发生灾难的那一天也就不远了。
 
  SSH(Secure Shell)可以很好地解决这些令人头疼的问题。它能够对在网络上传输的数据进行加密,这样就为重要信息提供了较高的保密性和安全性。SSH 最初由芬兰一家公司开发,但由于受版权和加密算法的限制,现在使用更广的是其免费的替代产品 OpenSSH。与传统的远程登陆软件(如Telnet和rlogin)相比,OpenSSH 是一个更加安全的解决方案。它能对远程登录过程中的数据包进行加密,从而确保用户名和密码不至于泄密,即便是登录成功之后,所有在网络中传输的数据包仍将继续被加密。
 
  OpenSSH 的许多特性都确保了数据在网络中的安全性,如果你的 Linux 系统是运行在一个不怎么安全的网络环境中,那就该动手升级到 OpenSSH。
 
2、安装 OpenSSH
 
  OpenSSH 是一个用于实现安全网络连接的软件包套件,它包含如下几个组成部分:
 
  SSH 客户工具(SSH):远程登录程序,能够实现安全的远程登录和会话加密,是 rlogin 和 Telnet 的安全替代;
 
  安全拷贝工具(scp):远程文件拷贝工具,用于在网络内的计算机间安全地复制文件,支持用户名和密码;
 
  安全传输工具(sftp):用于进行安全的文件传输,是 ftp 的安全替代;
 
  OpenSSH服务器(sshd):OpenSSH 的后台服务进程。
 
  由于 OpenSSH 在 Linux 操作系统上的应用已经相当普遍了,因此许多发行版(包括 Red Hat Linux AS 4)都自带了 OpenSSH 软件包套件。OpenSSH 通常是默认安装的,可以在命令行方式下用 rpm 命令查询一下是否已经安装了 OpenSSH:
 
  [root@kevin rpm]#rpm -qalgrep openssh
  openssh-3.5p1-6
  openssh-clients-3.5p1-6
  openssh-server-3.5p1-6
  openssh-askpass-3.5p1-6
  openssh-askpass-gnone-3.5p1-6
 
  Red Hat Linux AS 4 提供的 OpenSSH 套件由 openssh-3.5p1-6.i386.rpm、openssh-clients-3.5p1-6.i386.rpm、 openssh-server-3.5p1-6.i386.rpm、 openssh-askpass-3.5p1-6.i386.rpm 和 openssh-askpass-gnome-3.5p1-6.i386.rpm 五个 RPM 包组成。如果当前 Linux 系统还没有安装 OpenSSH,那么可以执行下面的命令来手工安装它。
 
  [root@kevin ~]#mount /dev/cdrom /mnt/cdrom/
  [root@kevin ~]#cd /mnt/cdrom/RedHat/RPMS/
  [root@kevin RPMS]#rpm -Uvh openssh-3.5p1-6.i386.rpm
  [root@kevin RPMS]#rpm -Uvh openssh-clients-3.5p1-6.i386.rpm
  [root@kevin RPMS]#rpm -Uvh openssh-server-3.5p1-6.i386.rpm
  [root@kevin RPMS]#rpm -Uvh openssh-askpass-3.5p1-6.i386.rpm
  [root@kevin RPMS]#rpm -Uvh openssh-askpass-gnome-3.5p1-6.i386.rpm
 
3、配置 OpenSSH 服务器
 
  由于涉及到 Linux 系统的安全性,要管理好 OpenSSH 服务器可不是件轻松的差事,而如何安全有效地设置 OpenSSH 的配置文件则是管理员面临的第一个大难题。OpenSSH 服务器的配置文件位于 /etc/ssh/ 目录下面,你可以直接手工修改它们,不过刚开始时建议还是先用 Webmin 来代劳。打开浏览器并登录 Webmin 后,单击『服务』图标进入服务管理页面,在这里可以对 OpenSSH 服务器进行配置,如图8-2-1 所示。
 
图 8-2-1 OpenSSH 服务器
 
  单击『SSH Server』图标,进入『SSH Server』页面,Webmin 允许对 OpenSSH服务器的各种参数进行设置,这样就不用与那些枯燥乏味的配置文件纠缠不清了,如图 8-2-2 所示。
 
图 8-2-2 OpenSSH 服务器配置
 
  在『SSH Server』页面中单击『Authentication』图标,进入『Authentication』页面,此处的参数都是与用户登录或身份认证相关的。在『Allowauthentication by password』和『Allow RSA authentication』区域中,可以设置是否允许在 SSH 登录过程中使用口令验证和 RSA 安全验证这两种身份验证方式。有时为了方便起见,系统中某些用户的口令是空的,在『Permit logins with empty passwords』区域中,可以选择是否允许这类用户通过 SSH 远程登录,如图8-2-3 所示。
 
图 8-2-3 口令验证
 
  Linux 系统中的最高统治者是 root,他拥有至高无上的权力,可以随心所欲地做任何事情,这也是为什么那么多黑客都将获得 root 用户权限作为攻击系统时的首要目标。虽然 SSH 在登录过程中对用户名和密码都作了加密,但为了更好地保护好系统,建议还是在『Allow login by root』下拉框中选择『否』,拒绝 root 用户使用 SSH 进行远程登录,如图 8-2-4 所示。
 
图 8-2-4 拒绝 root 用户远程登录
 
  早在使用 rlogin 和 rsh 的年代,人们就想出了通过在 /etc/hosts.equiv 和$HOME/.rhosts 两个文件中指定“等价”主机的办法,来简化登录过程,但前提是这些主机间必须是互相信任的。在『Authentication』页面中的『Allow login just by hosts.equiv and .rhosts』区域中,可以指明是否只使用 hosts.equiv 和 .rhosts 进行安全验证就足够了;而在『Check hosts.equiv and .rhosts forRSA authentication』区域中,可以指明是否应该用 hosts.equiv 和 .rhosts 并加上 RSA 进行安全验证;如果希望在验证过程中忽略 hosts.equiv 和 .rhosts,则可以在『Ignore .rhosts files』区域中进行选择,如图 8-2-5 所示。
 
图 8-2-5 可信任主机
 
  在设置好 OpenSSH 服务器的身份认证参数后,单击『保存』按钮返回到『SSHServer』页面。接下去就该对 OpenSSH 服务器的网络参数进行设置了,单击『Networking』图标进入页面后,可以在『Listen on addresses』区域中指定OpenSSH 服务器监听的地址,还可以在『Listen on port』区域中指定 OpenSSH 服务器监听的端口,如图 8-2-6 所示。
 
图 8-2-6 监听地址和端口
 
  OpenSSH 能够支持 SSH v1 和 SSH v2 两种协议,可以在『Networking』页面中的『Accept protocols』区域中选择 OpenSSH 服务器所使用的 SSH 协议版本,如图 8-2-7 所示。同时将『SSH v1』和『SSH v2』两个复选框选中,能够最大限度地同 SSH 客户端保持协议上的兼容。
 
图 8-2-7 SSH 协议版本
 
  其实黑客有时采用的攻击手段并不是那么高明。例如为了成功地登录系统,他们可以在一个称为“字典”的数据库中事先保存好所有可能出现的用户名和密码的组合,然后借助一些工具的帮助一个接一个地尝试,直至找到某个匹配的用户名和密码为止。这种穷举的办法虽然看起来有点笨,但却令不少黑客屡屡得手。究其原因在于人们通常设置的用户名和密码并不是很复杂,大部分都逃不出黑客手中的那本“字典”。
 
  OpenSSH 服务器采用了一个很简单的策略来避免这类现象的发生,那就是要求用户必须在指定的时间内完成登录,否则连接将被中断。在『Networking』页面中的『Time to wait for login』区域中,可以指定 OpenSSH 服务器能够容忍的登录时间,如图 8-2-8 所示。注意,如果将该值设为0,则表示没有时间限制。
 
图 8-2-8 允许的登录时间
 
  在为 OpenSSH 服务器设置好网络参数后,单击『保存』按钮返回到『SSHServer』页面。默认情况下,OpenSSH 服务器会允许系统中的所有用户通过 SSH 进行远程登录。如果觉得这样不是很安全,则可以单击『SSH Server』页面中的『Access Control』图标,进入『Access Control』页面,然后在『Only allow users』和『Only allow members of groups』区域中指定允许通过 SSH 远程登录的用户和组,或在『Deny users』和『Deny members of groups』区域中指定拒绝通过 SSH 远程登录的用户和组,如图 8-2-9 所示。
 
图 8-2-9 访问控制
 
  注意,只有用户及其所属的组都被允许时,才可以成功地登录到 OpenSSH 服务器。设置好 OpenSSH 服务器的访问控制规则后,单击『保存』按钮保存设置。
 
  单击『SSH Server』页面中的『Miscellaneous Options』图标,可以对OpenSSH 服务的其它一些杂项参数进行设置。在『Miscellaneous Options』页面中的『System log facility』区域中,可以指定在记录系统日志时所使用的助记代码。在阅读系统日志时,助记代码可以帮助管理员区分不同的记录。而日志记录级别则可以从『Logging level』区域中选择,如图 8-2-10 所示。日志级别会影响到将被记录信息的多少和种类,对大我数场合来说,『INFO』是一个较好的选择。
 
图 8-2-10 系统日志
 
  在『Miscellaneous Options』页面中还有两个很重要的设置项,那就是在『Server key size』区域中定义服务器端密钥位数的『bits』,以及『Server keyregeneration interval』区域中定义的服务器自动重新生成密钥的时间间隔,如图 8-2-11 所示。
 
图 8-2-11 密钥和度和生存期
 
  密钥的位数将影响到 OpenSSH 服务器的安全级别,而定时重新生成密钥则是为了防止黑客用盗用的密码来解密被截获的信息。设置好服务器端密钥的长度和生存期后,单击『保存』按钮确认。
 
  除了可以对 OpenSSH 服务器进行配置外,使用 Webmin 还可以对 OpenSSH 客户端进行配置,如图 8-2-12 所示。
 
图 8-2-12 配置 OpenSSH 客户端
 
  为了能够正确地通过 SSH 登录 OpenSSH 服务器,不仅需要在服务器端对OpenSSH 服务器进行配置,还需要在客户端对 OpenSSH 的客户机进行配置。当然,这些都可以借助 Webmin 来完成。
 
  单击『SSH Server』页面中的『Client Host Options』图标,进入『Client Host Options』页面,在『SSH Client Hosts』区域中可以看到能够进行配置的SSH 客户,如图 8-2-13 所示。
 
图 8-2-13 SSH 客户
 
  单击『ALL Hosts』图标,可以对所有 SSH 客户进行配置,如图 8-2-14 所示。
 
图 8-2-14 设置 SSH 客户参数
 
  如果没有什么特殊需要,除了在『Add host to known_hosts file』和『CheckIP addresses in known_hosts file』区域中选择『是』单选框外,其它参数都使用默认值一般就可以满足绝大部分场合的需要了。
 
  OpenSSH 客户端的参数保存在配置文件 /etc/ssh/ssh_config 中,如果想知道该文件中各个参数的具体含义,可以查看 OpenSSH 的联机手册:
 
  [root@kevin ~]#man ssh_config
 
4、启动 OpenSSH 服务器
 
  OpenSSH 服务器配置好之后,就可以启动它了。在 Webmin 的『SSH Server』页面中,有一个『Start Server』按钮,单击它可以启动 OpenSSH 服务器,如图8-2-15 所示。
 
  如果此时 OpenSSH 服务器已经启动了,则将看到一个『Apply Changes』按钮,单击它可以按新的配置值重新加载 OpenSSH 服务器。
 
图 8-2-15 启动 OpenSSH 服务器
 
  当然,也可以将 OpenSSH 服务器设置成开机自动启动。单击 Webmin 的『系统』图标,进入系统管理页面,接着单击『引导和关机』图标,打开『引导和关机』页面,在服务列表中找到 OpenSSH 对应的服务 sshd。
 
  单击『sshd』链接,进入『编辑操作』页面,选择『是』单选框,就可以在系统启动时自动运行 OpenSSH 服务器了。

第八章 Linux 系统安全及其它

  世界上没有绝对安全的计算机系统,如果想获得绝对的安全性,估计唯一能够采取的措施就是不联网,不让管理员之外的任何人使用。那样计算机也就无异于一堆废铁了!作为系统管理员首先应该明白,我们只能尽量让系统在能承担最低风险的情况下正常工作,而不是追求绝对安全这一看起来很美好的海市蜃楼。
 
  任何操作系统都不可能毫无漏洞,无论是 Windows、Linux 甚至 Unix,这些漏洞可能是先天系统设计上的缺陷,也可能是人为管理不当所造成的。要做好同这些漏洞进行持久战的心理准备。
 
第一节 扫描和嗅探
 
  网络从诞生的那天起就存在一小撮破坏分子,他们或许是出于某种特定的目的,或许仅仅是为了寻找刺激和乐趣,总是喜欢乐此不疲地去探索和发现系统中的弱点,然后伺机进行破坏。正所谓未雨绸缪,管理员可以采用同样的方法来寻找系统已经存在或可能将要存在的弱点,然后采用相应的措施进行防范。
 
1、认识扫描和嗅探
 
  说起来有点滑稽,现在被系统管理员奉为法宝的系统扫描器(scanner)和网络嗅探器(sniffer),最早均出于黑客之手,是用来对系统实施攻击的。只不过后来被网络管理员“招安”之后用于正当途径,摇身一变成了捍卫系统安全的卫士。
 
  对系统进行安全性检查的工作,以前通常是由管理员定期手工完成的,显然这要花费相当多的精力和时间。为了将管理员从这一繁重的体力劳动中解脱出来,有人专门开发了能够用来自动检查系统安全设置的小工具,帮助管理员发现系统中存在的问题。这类安全工具常被称为“系统扫描器”,它们通过对系统设置进行扫描,能够对已知的系统安全问题进行检查。如检查系统中是否存在没有口令的帐户,是否有非法运行着的程序,以及是否存在已经报告过的系统漏洞等等。
 
  网络嗅探器是另外一类常用的安全工具,是用来截获网络通信数据的软件或硬件。与常用的电话网络不同,计算机网络是共享通信通道的,这就意味每台计算机在理论上都可以接收到发给其它计算机的信息。嗅探器常常被作为一种收集网络中特定数据(比如信用卡密码)的有效方法,由于它工作在整个网络环境中的最底层,几乎能够对所有正在网络上传送的数据进行拦截,因而是网络安全的一个巨大威胁。通过对网络进行嗅探,一些恶意用户能够很容易地窃取到绝密文档和敏感数据,因此网络嗅探器以前被黑客们作为网络攻击的基本手段。
 
  任何工具有弊就有利,网络嗅探器既可以作为黑客们获得非法数据的手段,但同时对网络管理员来讲又是很重要的,因为它可以帮忙诊断出网络中大量不可见的模糊性问题,还可以用来判断是否有黑客正在攻击系统。如果网络管理员怀疑网络正在遭受攻击,通过嗅探器截获数据包可以确定正在攻击系统的是什么类型的数据包,以及它们的源头。这样就可以及时做出响应或对网络进行相应的调整,从而可以尽早避免一场灾难的发生。
 
2、安装安全工具
 
  Red Hat Linux AS 4 自带了优秀的系统扫描工具 Nmap 和网络嗅探器工具Ethereal,只需在安装 Linux 系统时选择『系统工具』套件就可以安装它们了。如果不清楚当前的 Linux 系统是否安装了这两个工具,可以在命令行方式下用 rpm命令查询一下:
 
  [root@kevin ~]#rpm -qalgrep nmap
  nmap-3.00-4 (# 命令行模式下的系统扫描工具)
  nmap-frontend-3.00-4 (# 图形模式下的系统扫描工具)
  [root@kevin ~]#rpm -qalgrep ethereal
  ethereal-gnome-0.9.8-6
  ethereal-0.9.8.6 (# 网络嗅探器)
 
  如果还没有安装两个系统安全工具,那就应该以 root 用户的身份登录 KDE,然后单击 KDE 主菜单,从『系统设置』菜单下选择『添加/删除应用程序』命令,当软件包管理窗口打开之后,在『系统』区域中将『系统工具』套件选中,如图8-1-1 所示。
 
图 8-1-1 安装系统工具
 
  由于 Nmap 和 Ethereal 都是可选的软件包,因此需要单击右侧的『细节』按钮,打开『System Tools 软件包细节』窗口,在『额外软件包』区域中将『ethereal』、『ethereal-gnome』、『nmap』和『nmap-frontend』四项选中,如图 8-1-2 所示。
 
图 8-1-2 选择安全工具软件包
 
  选择好要安装的软件包后,单击『软件包管理』窗口中的『更新』按钮,然后按照提示插入 Red Hat Linux AS 4 的安装光盘,就可以完成 Nmap 和 Ethereal软件包的安装了。
 
  Red Hat Linux AS 4 的系统扫描工具 Nmap 由 nmap-3.0-4.i386.rpm 和nmap-frontend-3.00-4.i386.rpm 两个 RPM 包组成,而网络嗅探工具 Ethereal 则由 ethereal-0.9.8-4.i386.rpm 和 ethereal-gnome-0.98-6.i386.rpm 两个 RPM包组成。
 
3、端口扫描
 
  Nmap 是一个优秀的系统端口扫描工具,它可以帮助发现网络在安全性方面所存在的问题。Nmap 起初是一个黑客工具,但很快就受到系统管理员的青睐,用于以下几个方面:
 
  监视网络:使用 Nmap 可以很快地检查出网络中具有安全漏洞的计算机;
  检查防火墙:Nmap 可以帮助防火墙在不牺牲与外界通信的同时,确保已经阻断了那些应该阻断的数据包;
  测试路由器:借助 Nmap 的测试功能,管理员可以对网络中的路由器和交换机的配置进行检测。
 
  早先的 Nmap 是一个命令行工具,要完成如此丰富的功能,其命令格式当然不会很简单,初学者掌握起来自然也不那么轻松了。现在的管理员相比之下就幸运多了,因为 Red Hat Linux AS 4 为 Nmap 提供了一个图形化的用户界面 NmapFE,可以执行 nmapfe 命令来启动它,如图 8-1-3 所示。
 
图 8-1-3 Nmap 系统端口扫描工具
 
  要使用 Nmap 来对网络中的某台主机进行端口扫描,只需在『Host(S)』文本框中输入该主机的域名或 IP 地址,然后单击『Scan』按钮就可以了,端口扫描结果将在下面的文本框中显示出来,如图 8-1-4 所示。
 
图8-1-4扫描固定主机
 
  Nmap 会将所有它认为可能存在问题的端口都列出来,请仔细检查一下这些端口看它们是否真的需要向外界开放。Nmap 有一项很实用的功能就是能够判断某台计算机所使用的操作系统的类型,你只需在进行端口扫描前选中『General Options』区域中的『OS Detection』复选框就可以了。
 
  你可能已经觉察到了扫描结果中只有 TCP 端口的信息,难道 Nmap 不能扫描UDP 端口吗?当然不是了,在『Scan Options』区域中可以看到 Nmap 提供的五种不同的扫描方式,其中『connect』、『SYN Stealth』、『Ping Sweep』和『FIN Stealth』都是针对 TCP 端口的,只有『UDP Port Scan』是针对 UDP 商品。要使用 Nmap 来对网络中某台主机的 UDP 端口进行扫描,首先在『Host(s)』文本框中输入该主机的域名可 IP 地址,然后在『Scan Options』区域中选择『UDP Port Scan』单选框,再单击『Scan』按钮就可以了,如图 8-1-5 所示。
 
图 8-1-5 扫描 UDP 端口
 
  如果同时管理着网络中的多台主机,可能希望对网络中的所有主机做一次全面的端口扫描,以便发现可能存在的安全隐患。没有问题,Nmap 允许使用通配符“*”来指定要扫描的主机。假设需要对子网 218.168.100 内的所有主机进行 UDP 端口的扫描,只需在『Host (s)』文本框中输入“218.168.100.*”,然后在『Scan Options』区域中选择『UDP Port Scan』单选框,再单击『Scan』按钮就可以了,如图 8-1-6 所示。
 
图 8-1-6 扫描子网
 
  除了可以使用通配符外,Nmap 还允许用 CIDR 表示法,对需要进行扫描的主机进行更精确的控制。CIDR 是表示子网掩码的一种新形式,它用子网掩码中“1”的个数来表示子网,比如要扫描子网 218.168.100 中的所有主机,则应在『Host(s)』文本框中输入“218.168.100.0/24”如图 8-1-7 所示。为了加快端口扫描速度,还可以在『General Options』区域中将『Fast Scan』复选框选中。
 
图 8-1-7 CIDR 表示子网
 
  对主机中的所有端口进行一次完整的扫描,可能需要持续一段较长的时间。其实多数情况只需扫描某些特定的端口就可以了,因为黑客也只对那些特定服务(如WWW和DNS)的端口感兴趣。如果只想扫描端口号为 1 到 100 的 TCP 端口,可以在『Host(s)』文本框中输入要扫描的主机地址,然后在『Scan Options』区域中选择『SYN Stealth』单选框,最重要的当然是要在『General Options』区域中将『Range of Ports』复选框中,并在紧接着的文本框中输入端口的范围,如图 8-1-8所示。所有参数都填好后,单击『Scan』按钮,接着就可以在下面的文本框中看到端口扫描结果。
 
4、网络嗅探
 
  对 Linux 网络管理员来讲,使用嗅探器可以随时掌握网络的实际情况。当网络性能急剧下降时,可以通过嗅探器来分析原因,找出造成网络阻塞或者安全隐患的根源。正是因为嗅探器可以帮助网络管事员分析整个网络的状态、性能或故障,因而它已不再是帮助黑客们为非作歹的帮凶,而是变成了管理员手中一种不可或缺的强大工具。
 
  Linux 平台上的网络嗅探器非常多,简直可以说到了泛滥的地步,但口碑比较好的恐怕还是得数 Tcpdump。它是一个在命令行方式下运行的网络监视工具,能够截获在网卡上收到的所有数据包,并能够协助网络管理员对其中的内容进行分析。由于 Tcpdump 提供了一整套完善的规则来对截获的数据包进行过滤,因此对Linux 网络管理员来说,了解如何使用 Tcpdump 来捕获感兴趣的数据包就成了一门必修课。
 
  如果一定要从鸡蛋里挑骨头,那么 Tcpdump 对某些人来说的确也存在一个很大的毛病,那就是没有提供图形化的用户界面。Ethereal 的出现正好解决了这一问题,它是一个基于图形用户界面的网络嗅探器,能够完成与 Tcpdump 相同的功能,但操作界面友好很多。
 
  Ethereal 和 Tcpdump 都依赖于一个名叫 pcap 的函数库所提供的功能,因此两者在很多方面非常类似,比如都使用相同的过滤规则和关键字。
 
  Ethereal 和其它图形化的网络嗅探器都使用相同的界面模式,如果能熟练地使用 Ethereal,那么其它图形用户界面的嗅探器也就不在话下了。由于需要对网卡这一硬件设备进行操作,所以必须以 root 身份执行 ethereal 命令来起动它,如图8-1-9 所示。
 
图 8-1-9 Ethereal 主界面
 
  在用 Ethereal 从网络上截获数据包之前,应该为其设置恰当的过滤器。默认情况下 Ethereal 会捕获网络中所有的数据包,过滤规则的作用就是帮助管理员从数量众多的数据包内挑选出真正感兴趣的数据,使你不至于迷失方向。
 
  Ethereal 将过滤器分为两类:捕获过滤器(Capture Filter)和显示过滤器(Disply Filter)。当 Ethereal 在从网卡上截取数据包时,捕获过滤器将被应用,这样 Ethereal 就只会截取部分数据包。经过第一次筛选后,这些被截取的数据包要真正显示在 Ethereal 主窗口的数据包列表中,还必须满足显示过滤器的要求。捕获过滤器分别适用于不同的阶段,其语法格式也稍有不同。
 
  Ethereal 能够对过滤器进行管理,可以将它们保存到磁盘中,这样在需要时就可以随时使用。要为 Ethereal 设置捕获过滤器,单击『Edit』菜单,选择『Capture Filters』命令,打开『Edit Capture Filter List』对话框,如图8-1-10 所示。
 
图 8-1-10 管理捕获过滤器
 
  此时还没有添加任何捕获过滤器,因此对话框右侧的列表框内是空的。
 
  Ethereal 捕获过滤器使用和 Tcpdump 相同的语法规则,Tcpdump 的过滤表达式是一个正则表达式,Tcpdump 利用它作为过滤数据包的条件。如果一个数据包满足表达式的条件,则这个数据包将会被捕获,如果不指定表达式,则在网络上任何两台主机间的所有数据包都将被截获。Tcpdump 的过滤表达式中一般有如下几种类型的关键字:
 
(1)类型关键字
 
  这类关键字用于指定主机、网络或端口,包括 host、net 和 port 三个关键字。例如,可以用“host 218.168.100.1”来标明监听的主机,用“net 218.168.100.0”来标明监听的网络,用“port 23”来标明监听的端口。如果没有在表达式中指明类型,则缺省的类型为 host。
 
(2)方向关键字
 
  这类关键字用于指定截获的方向,包括 dst、src、dst or src、dst and src四个关键字。例如,可以用“src 218.168.100.1”来指明截获的数据包中的源主机地址,用“dst net 218.168.100.0”来指明截获的数据包中的目标网络地址。如果没有在表达式中指明方向,则缺省的方向为 dst or src,即两个方向的数据包都将被捕获。对于数据链路层协议(如SLIP和PPP),使用 inbound 和 outbound 来定义方向。
 
(3)协议关键字
 
  这类关键字用于指定要截获的数据包所属的协议,包括 ether、fddi、tr、ip、ip6、arp、rarp、decnet、tcp、和 udp 等关键字 fddi 指明 FDDI(分布式光纤数据接口网络)上的特定网络协议,实际上它是 ether 的别名,fddi 和 ether 具有类似的源地址和目标地址,所以可以将 fddi 协议包当作 ether 的包进行分析和处理。其它几个关键字只是指定了所要截获的协议数据包。如果没有在表达式中指明协议,则所有协议的数据包都将被截获。
 
  除了上述三种类型的关键字外,在 Tcpdump 的过滤表达式中还可以指定的一些重要关键字包括:gateway、broadcast、multicast、less、greater,这些关键安对于监听网络中的广播和多播很有帮助,详细的用法可以参考 Tcpdump 的联机手册。
 
  [root@kevin ~]#man tcpdump
 
  在捕获过滤器的表达式中,各类关键字之间还可以通过布尔运算符来构成组合表达式,以满足实际需要。布尔运算符包括取非运算符(not或!)、与运算符(and或&&)、或运算符(or或),使用布尔运算符可以将表达式组合起来构成强大的组合条件,从而能够更好地截取真正需要的数据包。
 
  一下子学了这么多过滤规则的基础知识,下面就来现学现卖一下吧!如果想要截取主机 218.168.100.1 所收到和发出的数据包,可以在『Edit Capture FilterList』窗口中的『Filter name』文本框中输入过滤规则“host 218.168.100.1”,然后在『Filter string』文本框中为该过滤规则起一个容易识别的名字,再单击『New』按钮就可以创建过滤规则了,如图 8-1-11 所示。
 
图 8-1-11 设置过滤规则
 
  如果想要截获主机 218.168.100.1 和主机 218.168.100.2 外所有其它主机间的 IP 数据包,可以先在『Edit Capture Filter List』窗口中的『Filter name』文本框中指定过滤规则的名字,然后在『Filter string』文本框中输入“ip host218.168.100.1 and ! 218.168.100.2”,再单击『New』按钮创建该过滤规则,如图 8-1-12 所示。
 
图 8-1-12 过滤 IP 数据包
 
  如果想要截获网络中所有 FTP(TCP端口号21)数据包,同样应该先在『Edit Capture Filter List』窗口中的『Filter name』文本框中指定过滤规则的名称,然后在『Filter string』文本框中输入“tcp port 21”,再单击『New』按钮开关创建该过滤规则,如图 8-1-13 所示。
 
图 8-1-13 过滤 FTP 数据包
 
  设置好所有的捕获过滤后,单击『Edit Capture Filter List』窗口中的『Save』按钮保存这些过滤器,再单击『Close』按钮关闭该对话框。除了可以设置捕获数据包时的过滤规则外,Ethereal 还允许设置显示数据包时使用的过滤规则。一个数据包只有同时满足两者才会最终显示在 Ethereal 主窗口中的数据包列表中,正是有了这样的双重过滤机制,Ethereal 能够使管理员将精力真正集中在那些关键数据包上。要为 Ethereal 设置显示过滤器,单击『Edit』菜单,选择『DisplayFilters』命令,打开『Ethereal Edit Display Filter List』对话框,如图8-1-14 所示。
 
图 8-1-14 管理显示过滤器
 
  最简单的显示过滤器是对属于某一特定协议的数据包进行过滤。假设只希望Ethereal 显示截获到的 IP 数据包,则可以在『Edit Display Filter List』窗口中的『Filter name』文本框中指定过滤规则的名称,然后在『Filter string』文本框中输入“ip”,再单击『New』按钮就可以创建该显示过滤规则,如图 8-1-15 所示。
 
图 8-1-15 显示 IP 数据包
 
  显示过滤器同样允许根据数据包中的特定信息设置过滤规则。假设只希望Ethereal 显示来自地址 218.168.100.1 的 IP 数据包,则可以单击『Add Expression』按钮,打开『Filter Express』窗口。在设置好所需要的过滤表达式后,单击『Accept』按钮确定,如图 8-1-16 所示。
 
图 8-1-16 过滤表达式
 
  返回到『Ethereal Edit Displya Filter List』窗口后,在『Filter name』文本框中指定过滤规则的名称,然后单击『New』按钮创建该过滤规则,如图 8-1-17 所示。
 
图 8-1-17 显示来自特定地址的 IP 数据包
 
  所有的显示过滤器都设置好后,单击『Save』按钮保存这些过滤器,再单击『Close』按钮关闭该对话框。Ethereal 能够同时维护很多个过滤器,这样网络管理员就可以很方便地根据实际需要选用不同的过滤器。例如,一个过滤器可能用于截获两个主机间的数据包,而另一个则可能用于截获 ICMP 包来诊断网络故障。
 
  现在可以动手截取网络中的数据包了,单击 Ethereal 的『Capture』菜单,选择『Start』命令,打开『Capture Options』对话框。首先从『Interface』下拉框中选择要进行侦听的网络接口,然后选中『Capture packets in promiscuous mode』复选框,将网卡置于“混杂”模式,如图 8-1-18 所示。
 
图 8-1-18 设置网卡
 
  网卡被设置成混杂模式后,对接收到的每一个数据包都将产生硬件中断,以提醒操作系统处理经过该网卡的每一个数据包,这就是网络嗅探器的全部秘密。
 
  如果不希望 Ethereal 转眼间就截获了成千上万个数据包,从而使自己陷入数据包的汪洋大海而无法自拔的话,那就充分利用一下刚刚设置好的捕获过滤器吧!单击『Ethereal Capture Options』窗口中的『Filter』按钮,打开『Ethereal Capture Filter』窗口,在过滤器列表中选中希望应用的过滤规则后,单击『OK』按钮确定,如图 8-1-19 所示。
 
图 8-1-19 应用捕获过滤器
 
  在『Ethereal Capture Options』窗口中,『Display options』区域内的两个选项是很重要的。如果希望每个数据包在被截获时就能够实时地显示出来,而不是在整个嗅探过程结束之后再显示所有截获的数据包,那就需要将『Update list ofpackets in real time』复选框选中。此外,如果选中『Automatic scrolling inlive capturt』复选框的话,则可以在截获数据包时自动滚屏,这样就能保证在Ethereal 主窗口的数据包列表中始终都可以看到最新截获的数据包,如图8-1-20 所示。
 
图 8-1-20 实时更新数据包列表
 
  单击『Ethereal Capture Options』窗口中的『OK』按钮,整个网络嗅探过程就开始了。在『Ethereal Capture』窗口中可以实时看到 Ethereal 到目前为止已经截获到的所有数据包的统计信息,如图 8-1-21 所示。单击『Stop』按钮可以终止对网络中数据包的截获。
 
图 8-1-21 网络嗅探
 
  嗅探过程开始之后,所有符合捕获规则的数据包都将在 Ethereal 主窗口中的数据包列表中看到。不过可能并不是所有的数据包你都感兴趣,不有关系,此时还可以应用显示过滤器,让 Ethereal 只显示符合过滤规则的数据包。看到Ethereal 主窗口底部的『Filter』按钮了吧,单击它将打开『Displya Filter』窗口,从中可以选择将要被应用的显示过滤规则,最后单击『OK』按钮确定,如图 8-1-22 所示。
 
图 8-1-22 应用显示过滤器
 
  返回到 Ethereal 主窗口后,可以在窗口底部的组合框中看到选中的显示过滤器所对应的规则表达式。此时单击『Apply』按钮,Ethereal 就会再次对所有截获的数据包进行过滤,只有符合显示过滤器的数据包,才会最终在数据包列表中显示出来,如图 8-1-23 所示。
 
图 8-1-23 过滤数据包
 
  同许多 Windows 下流行的网络嗅探器类似,Ethereal 的整个窗口也被分成三个部分:最上面为数据包列表,用来显示每个数据包的总结性信息;中间为协议树,用来对选定的数据进行协议分析;最下边是以十六进制形式表示的数据包内容,用来显示数据包在物理层上传输时的最终形式。
 
  有了功能如此强大的 Ethereal,网络对你来讲就没有任何秘密可言了。不管是数据的源地址、目的地址,或是其所属的协议,在 Ethereal 中都一览无余。图8-1-24 是在 Ethereal 中对一个 HTTP 包进行分析时的情景。
 
图 8-1-24 分析 HTTP 协议包
 
  Ethereal 提供的图形用户界面非常友好,使用它监视网络中的每个数据包不再是一件什么难事了。正所谓知己知彼方能百战不殆,要保护好 Linux 系统,使用嗅探器掌握黑客们的行踪是你应该迈好的第一步。