LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: probing

╭∩╮(︶︿︶)╭∩╮FreeBSD使用大全FreeBSD╭∩╮(︶︿︶)╭∩╮

[复制链接]
 楼主| 发表于 2003-2-11 23:22:55 | 显示全部楼层

FreeBSD连载(69):使用smbclient访问Windows资源

访问Windows系统资源

  通过配置Samba服务器,可以提供Windows客户机来访问FreeBSD系统上共享的资源。也能够在 FreeBSD上通过SMB协议访问Windows系统上的共享资源。只是习惯上Unix计算机用做服务器,Windows 计算机用做客户机,很少有让Unix访问Windows计算机的需要。但是越来越多的计算机使用者不但使用 Unix作服务器,也使用Unix来处理很多其他任务,那么就可能会需要访问其他Windows计算机上的资源。

#
使用smbclient访问Windows资源

  samba软件中用于访问网络上其他SMB资源的软件为smbclient,它是一个类似于ftp操作方式,通过远程操作的方式进行文件传递的软件。为了获得网络上可以访问的计算机列表,首先需要使用 smbclient来获得一个Windows计算机共享出来的资源,这需要使用-L参数访问IPC$资源,对于使用用户级认证的Windows NT或Samba服务器,可以使用-N参数指定使用空口令登录,或者使用-U%参数,使用空用户名和空口令访问服务器:

$ smbclient -L windows_host -N

  如果没有使用-N或-U%,smbclient将提示口令,一般可以直接回车,也可以给予正确的口令。因为一般计算机均允许匿名浏览IPC$资源,即能给所有的计算机提供自己所了解的浏览数据。smbclient将显示一个浏览数据列表和该机的共享资源列表。

  如果不清楚一个Windows计算机的NetBIOS名字,可以使用-I加要访问计算机的IP地址来代替-L 参数及使用的NetBIOS名字。或者可以使用nmblookup先来解析NetBIOS名字。

$ nmblookup fbsdsrv
Sending queries to 192.168.3.255
192.168.3.1 fbsdsrv<00>

  要想使用smbclient来访问windows时,也需要使用UNC来标识Windows资源的位置。此时就需要了解 Windows UNC在Unix下进行表示的不同之处。不同之处在于Unix的shell下反斜线为特殊字符,它被定义为转义恢复字符,表示将一些转义字符恢复为其本身字符的意义。因此必须使用两个反斜线才能等同于一个反斜线。因此一个UNC实际使用时应使用双倍的反斜线。

$ smbclient \\\\localhost\\wb -U wb
Added interface ip=192.168.3.1 bcast=192.168.3.255 nmask=255.255.255.0
Password:
Domain=[MYGROUP] OS=[Unix] Server=[Samba 2.0.2]
smb: \> help
ls             dir            du             lcd            cd
pwd            get            mget           put            mput
rename         more           mask           del            rm
mkdir          md             rmdir          rd             prompt
recurse        translate      lowercase      print          printmode
queue          cancel         quit           q              exit
newer          archive        tar            blocksize      tarmode
setmode        help           ?              !
smb: \> quit

  然后就可以使用与ftp相似的命令,如dir,cd,get,put等命令来传输文件。

  Samba可以用于帮助备份Windows系统,除了使用smbclient之外,Samba还提供了一个 shell脚本smbtar,它使用smbclient以及tar,直接将Windows系统中的文件备份到FreeBSD 系统中的磁带设备中。

  要使用Windows下的打印机资源,要首先使用smbclient以将打印文档发送给Windows计算机,并执行print命令。samba软件包中提供了一个shell脚本smbprint用来使用合适的命令帮助FreeBSD 将打印文件发送给Windows打印机。FreeBSD下这个脚本被安装到/usr/local/share/examples/samba/printing 目录下,可以根据需要将这个脚本复制到/usr/local/bin或其他目录下,提供给用户使用。

  对于经常使用的Windows打印机,还可以在printcap文件中为它增加一个入口,使用smbprint 作过滤器,这样就将打印输出直接交给smbprint,用户不必手工进行控制,而是直接使用FreeBSD系统的打印系统lpr等命令进行打印和管理。这样还可以将这台FreeBSD计算机用做一个打印网关,所有的支持LPD方式打印的Unix均可通过这台服务器的smbprint打印机入口,将打印文档发送给Windows打印机。

未完,待续。。。  
 楼主| 发表于 2003-2-11 23:26:34 | 显示全部楼层

FreeBSD连载(70):用SharityLight装SMB文件系统

使用SharityLight安装SMB文件系统

  使用smbclient进行使用Windows计算机上的文件资源的方式还是一种命令行的控制方式,必须将文件下载到本地才能进行处理。更方便的方法是将远程文件服务器上的资源装载到本地的目录树上,这样就能如同处理本地文件一样对远程文件进行处理了。Unix上的NFS就是这样的处理方式,Windows系统的映射网络驱动器也是使用的这种处理方式。

  在Unix中,提供这种远程网络文件系统的标准做法是重新完成一个文件系统驱动程序,这样由驱动程序来完成装载远程SMB文件系统的目的,运行在Linux上的smbfs就是这么做的。然而也存在另一种思路,即是将一个网络文件系统协议翻译为现有的网络文件系统协议,如NFS,然后由系统中的NFS驱动程序进行装载。这种想法完全也能实现装载SMB网络文件系统的目的,由于不必更改内核程序而使用十分成熟的原有驱动程序,而会带来更具稳定性的特征。

  Sharity就是将SMB协议翻译为NFS协议,然后在Unix上装载上共享资源的软件,因为这个软件没有运行在内核中,因此其速度会受到一点影响,但正因为如此,即使已经安装到本地文件系统的远程Windows系统的崩溃也不会对Unix造成影响,由于Windows系统并不稳定,因此这种特性是非常有益的。

  需要使用Packages Collection来安装这个软件,当前的免费Sharity为Sharity Light,而最新版本的Sharity为商业软件,Sharity Light使用了GNU软件的部分代码,因此也遵从GNU许可,是对外提供源代码的软件。

  Sharity的网址位于http://www.obdev.at/Products/Sharity.html

  安装Sharity Light将安装两个应用程序shlight和unshlight到/usr/local/sbin 目录中,一个用于安装文件系统,另一个用于卸载已安装的文件系统。Sharity的使用方法非常简单,不需要任何设置。

# /usr/local/sbin/shlight //fbsdsrv/wb /dist -U wb
Password:
Using port 1908 for NFS.
bash-2.02# mount
/dev/da0s2a on / (local, writes: sync 1192 async 12795)
/dev/da0s2f on /usr (local, writes: sync 18054 async 80408)
/dev/da0s2e on /var (local, writes: sync 15954 async 33980)
procfs on /proc (local)
shlight-39011 on /dist
bash-2.02# /usr/local/sbin/unshlight /dist

  注意,sharity使用斜线代替UNC中的反斜线,标识UNC,这与Samba的做法不同。

未完,待续。。。  
 楼主| 发表于 2003-2-11 23:27:18 | 显示全部楼层

FreeBSD连载(71):DHCP的工作过程

设置DHCP

  动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)是用于对多个客户计算机集中分配IP地址以及IP地址相关的信息的协议,这样就能将IP地址和TCP/IP的设置统一管理起来,而避免不必要的地址冲突的问题,因此常常用在网络中对众多DOS/Windows计算机的管理方面,节省了网络管理员手工设置和分配地址的麻烦。

  除了能够方便管理之外,DHCP还能略微达到节省IP地址的目的。假设网络中有50个计算机,但只有40个 IP地址,但是这50台计算机不会同时启动,IP地址应该满足要求。如果使用静态IP地址的设置方式,还是会遇到分配地址的困难,因为计算机的使用是随机的,无论怎样分配地址都无法避免出现冲突现象,而使用DHCP就能避免这个问题。 DHCP也能用于统一设置其他的一些IP设置,如缺省路由、DNS服务器等等,使用它能减少一个大型网络的管理任务。

  DHCP是从原有的BootP协议发展起来的,原来的目的是为无盘工作站分配IP地址的协议,当前更多的用于集中管理IP地址。然而DHCP协议也有其缺点,例如一台DHCP客户计算机没有一个固定的IP地址,而对于提供网络服务的服务器来讲,经常变化的IP地址并不适合。并且当前的DNS协议并不能和DHCP协作,为DHCP客户直接提供主机名解析任务。

    *
      DHCP的工作过程

  DHCP工作时要求客户机和服务器进行交互,由客户机通过广播向服务器发起申请IP地址的请求,然后由服务器分配一个IP地址以及其他的TCP/IP设置信息。整个过程可以分为以下步骤:

  IP地址租用申请:DHCP客户机的TCP/IP首次启动时,就要执行DHCP客户程序,以进行TCP/IP 的设置。由于此时客户机的TCP/IP还没有设置完毕,就只能使用广播的方式发送DHCP请求信息包,广播包使用 UDP端口67和68进行发送,广播信息中包括了客户机的网络界面的硬件地址和计算机名字,以提供DHCP服务器进行分配。

  IP地址租用提供:当接收到DHCP客户机的广播信息之后,所有的DHCP服务器均为这个客户机分配一个合适的IP地址,将这些IP地址、网络掩码、租用时间等信息,按照DHCP客户提供的硬件地址发送回DHCP客户机。这个过程中对DHCP服务器没有对客户计算机进行限制,因此客户机能收到多个IP地址提供信息。

  IP地址租用选择:由于客户机接收到多个服务器发送的多个IP地址提供信息,客户机将选择一个IP地址,拒绝其他提供的IP地址,以便这些地址能分配给其他客户。客户机将向它选择的服务器发送选择租用信息。

  IP地址租用确认:服务器将收到客户的选择信息,如果也没有例外发生,将回应一个确认信息,将这个IP地址真正分配给这个客户机。客户机就能使用这个IP地址及相关的TCP/IP数据,来设置自己的TCP/IP堆栈。

  更新租用:DHCP中,每个IP地址是有一定租期的,若租期已到,DHCP服务器就能够将这个IP地址重新分配给其他计算机。因此每个客户计算机应该提前不断续租它已经租用的IP地址,服务器将回应客户机的请求并更新该客户机的租期设置。一旦服务器返回不能续租的信息,那么DHCP客户机只能在租期到达时放弃原有的IP地址,重新申请一个新 IP地址。为了避免发生问题,续租在租期达到50%时就将启动,如果没有成功将不断启动续租请求过程。

  释放IP地址租用:客户机可以主动释放自己的IP地址请求,也可以不释放,但也不续租,等待租期过期而释放占用的IP地址资源。

  由于DHCP依赖于广播信息,因此一般的情况下,客户机和服务器应该位于同一个网络之内。然而可以设置网络中的路由器为可以转发BootP广播包,使得服务器和客户机可以位于两个不同的网络中。然而配置转发广播信息,不是一个很好的解决办法,更好的办法为使用DHCP中转计算机,DHCP中转计算机和DHCP客户机位于同一个网络中,来回应客户机的租用请求,然而它不维护DHCP数据和拥有IP地址资源,它只是将请求通过TCP/IP转发给位于另一个网络上的DHCP服务器,进行实际的IP地址分配和确认。

未完,待续。。。  
 楼主| 发表于 2003-2-11 23:29:30 | 显示全部楼层

FreeBSD连载(72):设置和使用DHCP

设置和使用DHCP

  在FreeBSD的Packages Collection中,有两个不同的DHCP客户机和服务器软件,一个为ISC-DHCP,另一个为WIDE-DHCP,两个软件都包括了DHCP客户软件和服务器软件,其中ISC-DHCP 更为常用一些,这里就以ISC-DHCP为例介绍在FreeBSD上安装和设置DHCP。

  为了支持DHCP,首先要确认系统内核支持伪设备bpfilter,如果没有,就需要重新编译内核。伪设备bpfilter 是一个允许应用程序接收网络的原始数据包的界面,这样应用程序就能接收目的地址非本机IP地址的数据包了。DHCP使用bpfilter的原因是在DHCP设置好计算机的TCP/IP之前,由于计算机本身没有定义IP地址,而TCP/IP堆栈本身不会接收不具备本机IP地址的数据包。要接收DHCP服务器发送回客户的数据包,就需要绕过TCP/IP堆栈,而必须使用伪设备bpfilter。

pseudo-device    bpfilter    4

  定制内核之后,还要保证/dev/目录下具有对应bpfilter的设备文件。

# cd /dev
# sh MAKEDEV bpf0 bpf1 bpf2 bpf3

  从Packages Collecion中安装DHCP软件,这将DHCP软件中的dhcpd,dhclient和dhcprelay 安装到/usr/local/sbin目录下。

$ ls /usr/local/sbin/dhc*
/usr/local/sbin/dhclient   /usr/local/sbin/dhcpd
/usr/local/sbin/dhcrelay

    * 设置服务器

  为了设置DHCP服务器dhcpd,首先就要设置其配置文件/etc/dhcpd.conf。这个配置文件语法简单,比较容易理解。

server-identifier 192.168.3.1;

subnet 192.168.3.0 netmask 255.255.255.0 {
        range 192.168.3.10 192.168.3.20;
        default-lease-time 600;
        max-lease-time 7200;
        option subnet-mask 255.255.255.0;
        option broadcast-address 192.168.3.255;
        option routers 192.168.3.1;
        option domain-name-servers 192.168.3.1;
        option domain-name "exampleorg.org.cn";
}
host a1 {
        hardware ethernet 00:90:27:4e:92:09;
        fixed-address 192.168.3.32;
        option subnet-mask 255.255.255.0;
        option broadcast-address 192.168.3.255;
        option routers 192.168.3.1;
        option domain-name-servers 192.168.3.1;
        option domain-name "exampleorg.org.cn";
}

  基本的dhcpd.conf首先使用server-identifier定义了本服务器的IP地址,这对于有多个IP地址的服务器系统十分重要,一般不必设置这个参数,dhcpd能自动侦测。然后定义要分配IP地址的客户机组,每组拥有一个可用的IP地址范围。有两种客户机组的划分方式,一种为指定子网段来区分,一种为指定主机来区分。

  这个例子中的第一组定义了一个子网192.168.3.0/24,这个子网段内,可供DHCP服务器分配的I P地址范围为192.168.3.10到192.168.3.20,这个地址范围也可以不是连续的,不连续的地址可以使用多个range设置参数来设置。此外,还设置了这一组内分配的IP地址的租期限制default-lease-time 和max-lease-time,可以使用缺省值,而不必改动。后面的option参数设置DHCP的附加功能,例如设置DHCP客户的网络掩码、广播地址、DNS服务器、域名等等。事实上这些option设置选项也可以被用作全局选项设置,即放置在server-identifier之后,对所有的客户机组起作用。

  例子的第二组是针对某个特定主机a1进行的设置,这个主机被限定为以太网地址为hardware ethernet 参数值的计算机,将给这个计算机分配一个固定地址。这种分配方式实际等价于固定地址分配方式,唯一的好处就是能够对IP地址进行集中管理,不必每个计算机分别设置了。这里同样也可以使用option参数,设置TCP/IP的参数。

  dhcpd.conf中还能有更多的组,包括对非本网段的子网上的客户机指定的组。

  当设置了dhcpd.conf之后,就能启动dhcpd守护进程了,由于计算机会有多个网络界面,需要指定dhcpd 服务器的网络界面,以便回应相应界面上的DHCP请求。

# /usr/local/sbin/dhcpd fxp0

  在调试阶段,可以使用-d参数,这样dhcpd就不会进入后台运行,而一直保留在前台,并显示各个与客户计算机通信的过程。当一切都调试完毕之后,就能去除-d参数,并将执行命令放入rc.local启动脚本中,以便系统能够自动执行。

  此后,dhcpd正常运行的时候,会将每一次客户请求及其回应的IP地址分配的记录,都记录在/var/run/dhcpd.leases 文件中。为了使dhcpd能正常进行日志记录,应该在启动dhcpd之前使用touch 命令,生成一个新的日志文件。以后就可以查看这个日志文件的内容,以得到当前DHCP服务器的状态和客户机IP地址分配的情况。以下是一个日志文件的部分内容。

       lease 192.168.3.11 {
          starts 3 1998/11/26 05:46:28;
          ends 4 1998/11/27 05:46:28;
          hardware ethernet 0:80:c2:12:fd:d;
          uid 1:0:80:c2:12:fd:d;
       }

  touch命令的优点是在存在相关的文件时,不删除或更改文件内容,只更新其访问时间设置,只有在文件不存在时才生成新文件。

  然后就能设置网络中的客户计算机使用DHCP协议,获取合法的IP地址了。通常Windows计算机的TCP/IP设置中能直接设置支持DHCP协议,如果为Unix(包括FreeBSD)设置DHCP客户软件,就需要dhclient的支持。

    * 设置客户软件

  ISC-DHCP中同样也提供了一个客户程序dhclient,用于FreeBSD系统从DHCP服务器上动态获取一个IP地址。这个程序同样也要求内核支持bpfilter伪设备。

  dhclient使用的配置文件为/etc/dhclient.conf,然而最一般的情况下可以不使用它,软件本身的缺省配置就满足一般情况下请求IP地址的需要了。缺省设置下dhclient在获得了IP地址之后,会自动执行/etc/dhclient-script 这个脚本程序,以针对刚获取的动态IP地址进行必要的设置。很多依赖于IP地址的网络服务,就可以在这个脚本中启动,或者针对重新分配的动态IP地址对已有的网络服务进行修正。虽然使用者也许不希望使用这个脚本设置网络,但如果不存在这个脚本程序,或者这个程序不可执行,那么dhclient就不能正常执行。

  因此对于最一般的客户机,一般只连接到一个网络上,仅具备一个网络界面,可以使用一个空的dhclient.conf 和空的declient-script文件,就能完成设置IP地址和其他TCP/IP参数的任务了。

# touch /etc/dhclient.conf
# touch /etc/dhclient-script
# chmod +x /etc/dhclient-script
# /usr/local/sbin/dhclient fxp0
Listening on BPF/fxp0/00:90:27:4e:92:09/unattached
Sending on   BPF/fxp0/00:90:27:4e:92:09/unattached
Sending on   Socket/fallback/fallback-net
DHCPDISCOVER on fxp0 to 255.255.255.255 port 67 interval 22
DHCPOFFER from 192.168.3.1
DHCPREQUEST on fxp0 to 255.255.255.255 port 67
DHCPACK from 192.168.3.1
bound to 192.168.3.32 -- renewal in 3600 seconds.

  在更复杂的情况下,就要指定更多的内容,例如当系统有多个网卡时,要指定dhclient应该从哪个子网中获得IP地址设置,就需要使用设置文件dhclient.conf。一般除非有多个局域网网络界面,都应该使用空设置文件,避免产生配置错误。以下为一个简单的dhclient.conf的例子,可以用于多网络界面的情况:

# Defaults
timeout 60;
reboot 10;

retry 60;
select-timeout 5;
initial-interval 2;

script "/etc/dhclient-script";

interface "fxp0" {
request subnet-mask, broadcast-address, routers, domain-name-servers,
         domain-name, host-name;
require domain-name-servers;
}

  这个设置文件主要用于重新定义一些参数,比较容易理解,更改也比较容易。

  成功的手工执行dhclient之后,就可以考虑将其和系统启动文件相结合了。因为很多网络服务是依赖于网络配置的,应该在启动这些网络服务之前使用DHCP配置好TCP/IP。使用dhclient-script启动服务的想法虽然也能解决问题,然而这就不能使用系统的启动rc文件中的相关设置启动网络服务,而在这个dhclient-script 中重新启动,因此比较麻烦。更简便的做法是仅仅在dhclient-script中设置hostname,而让系统启动文件完成其他网络服务的启动。这样就要求将dhclient与系统rc文件结合起来。

#hostname="my.domain.name"
network_interfaces="fxp0 lo0"    # List of network interfaces (lo0 is
loopback).
ifconfig_lo0="inet 127.0.0.1"   # default loopback device configuration.
#ifconfig_fxp0="inet 192.168.3.12  netmask 255.255.255.0"
defaultrouter="NO"              # Set to default gateway (or NO).

这样就需要更改rc.conf文件,更改一些设置语句。首先要注释hostname设置,而在dhclient.script中进行设置,也不必设置defaultrouter,它通过DHCP协议自动设置。同时要保证network_interfaces参数中,设置了要通过dhclient来获取IP地址的网络界面fxp0,以允许rc系统文件能启动该与该界面相关的设置文件,然而却必须注释设置该界面的参数ifconfig_fxp0,因为这个设置参数是用于设置静态IP地址的选项,因此要屏蔽它,而使用start_if.fxp0配置脚本来设置网络界面。

缺省情况下,不存在start_if.fxp0等start_if设置网络脚本,但是这些脚本在rc.network已经做好了设置,针对每个网络界面启动,而不需要在rc.conf中做特别设定。对于dhclient,可以创建一个简单的启动脚本start_if.fxp0为:

#! /bin/sh
/usr/local/sbin/dhclient fxp0

  这样,dhclient就和系统启动文件结合起来了,在系统启动的时候会自动设置好TCP/IP,此后再启动相关的网络服务。此时需要注意的是删除原来可能在rc.local或者在/usr/local/etc/rc.d目录中的dhclient启动命令,以避免冲突。

  在FreeBSD系统上不推荐使用动态IP地址,因为FreeBSD能提供大量有用的网络服务,都会与IP地址或域名有关,不适合使用动态IP地址。如果必须要作为DHCP客户以保持IP地址的统一管理,建议使用dhcpd针对硬件地址的设置方式,在DHCP服务器上为FreeBSD系统设定一个固定IP地址。

    * 设置DHCP中转

  当网络中存在多个子网的时候,由于客户计算机只能通过广播发送DHCP请求,这些请求一般不能跨越路由器。为了在DHCP服务器存在的子网之外的DHCP客户分配IP地址,可以设置路由器转发DHCP请求,即转发相应的UDP 端口67和68的广播数据包。但这样设置就增加了网络广播,不利于减少网络流量。

  此外,还有另外一种方法来使得DHCP客户计算机能使用子网之外的DHCP服务器来分配IP地址。这就是使用 DHCP中转计算机来转发DHCP的请求。DHCP中转计算机能听取DHCP广播,由于它了解DHCP服务器的IP地址,因此能通过正常的IP数据包将原广播包转发到服务器中,然后再将服务器的回应信息回复客户机。这样DHCP客户机就以为本子网中也存在一个DHCP服务器。

  在ISC-DHCP软件中,提供的中转程序为dhcrelay,这是一个简单的程序,不需要额外的设置。启动 dhcrelay的标准方式为使用命令行指定将DHCP服务请求中转到的目的DHCP服务器,由于DHCP中允许多个 DHCP服务器同时为客户提供地址,而不会产生冲突,就可以使用多个DHCP服务器进行中转。

# dhcrelay dhcpsrv1 dhcpsrv2

  如果这台中转服务器为多网络界面计算机,那么dhcrelay将侦听所有网络界面的DHCP请求,有时不希望 dhcrelay中转某些界面上的请求,就可以设置dhcrelay侦听的网络界面,这需要指定-i参数。

# dhcrelay -i xl0 dhcpsrv1

    * 提供备份的DHCP设置

  在一个具备多个子网的大型网络中,提供冗余是一个非常重要的问题。由于DHCP协议中DHCP服务器负责分配 IP地址,一旦DHCP服务器出现故障,那么所有的客户就无法正确获得IP地址,从而不能访问网络。

  但可以同时设置多个DHCP服务器来提供一个冗余能力。然而DHCP服务器本身是不提供备份能力的,不能互为备份。他们占用的IP地址资源也不能重叠,以免发生客户机IP地址冲突的现象。提供容错能力是通过分割可用的IP地址到不同的DHCP服务器上,通过多个DHCP服务器同时为一个网络服务,从而使得一个服务器发生故障还能正常执行操作。通常为了进一步增强可靠性,还可以将不同的DHCP服务器放置在不同子网中,互相使用中转提供服务。

  例如在两个子网上各自有一个DHCP服务器,标准的做法可以不使用DHCP中转,各个子网上的服务器为各个子网服务就行了。然而为了达到容错的目的,可以互相为另一个子网提供服务,通过设置中转或路由器转发广播以达到互为服务的目的。

  例如位于192.168.3.0网络上的srv1的配置可能为:

subnet 192.168.3.0 netmask 255.255.255.0 {
        range 192.168.3.10 192.168.3.199;
}
subnet 192.168.4.0 netmask 255.255.255.0 {
        range 192.168.4.200 192.168.4.220;
}

  位于192.168.4.0网络上的srv2的配置可能为:

subnet 192.168.4.0 netmask 255.255.255.0 {
        range 192.168.4.10 192.168.4.199;
}
subnet 192.168.3.0 netmask 255.255.255.0 {
        range 192.168.3.200 192.168.3.220;
}

  注意,上述设置都是设置样例,标准情况下还需分别指定各个option,用于设置IP地址及其相关设置。

  可以看出两个服务器都能对两个网络上的客户机分配IP地址,而各自又有一个主要服务的网络。每个网络上的IP 地址主要放在本地的服务器上,但也有少部分地址放在另一个子网中的服务器上(地址资源不能冲突),这样提供了一定的容错能力。

  实际的多子网网络中,并不必要每个子网都设置一个服务器,并使用另外的服务器备份,一般网络中有2-3个DH CP服务器就够用了。其他子网可以通过DHCP中转的方式,给该子网提供DHCP服务。

未完,待续。。。  
 楼主| 发表于 2003-2-11 23:31:10 | 显示全部楼层

FreeBSD连载(73):认证与加密

第8章 系统与网络安全

  当将计算机连接到Internet上的时候,那么计算机就对整个网络开放连接许可。这在通过网络为用户提供网络服务的同时,也带来了计算机系统会遭受非法使用或破坏的危险。然而既然要对外提供服务,就只能通过维护和管理来增加安全性,而不能因为害怕风险就不提供网络服务。因此安全问题是连接到Internet的网络系统需要特别注意的问题之一。

  毫无疑问,FreeBSD是一种具备相当高的安全性的操作系统,提供了各种不同的访问控制、加密和认证等安全特性。然而,出于使用方便的考虑,FreeBSD并没有将安全问题看作唯一的需求,有些传统Unix提供的服务,虽然会带来一定的安全问题,但也不能简单的屏蔽。假如需要,可以根据具体情况堵上这些具备轻微危险的漏洞,进一步增强安全性。

  FreeBSD不但能对自己系统提供安全保障,也能用作提供网络安全的工具。它的网络能力非常强大,能用于设置功能全面的防火墙系统,保障网络内其他计算机系统的安全性。

    *
      网络安全概念

  网络安全的问题随着Internet的发展,也越来越受到人们的关注。这主要原因是由于Internet和Unix 是一个开放的系统,所有的使用者都能对系统进行研究并提出问题,这样就针对安全性提出了很多问题。在Internet 上也发生过相当多的安全问题,使得安全问题进一步为大家所关注。如果基于此就对Internet缺乏信心,也是不必要的,Internet虽然不是一个安全性很高的网络系统,然而也不是象想象的那样不可信赖的,主要是因为Internet 的开放性,使得很多安装问题比较公开。而只要正确使用它,同样也能保证安全性。

  对待安全问题有两种不同的态度,一种为封闭的态度,认为将问题隐藏起来是最好的解决安全问题的办法。隐藏起来不被发现当然就避免了安全问题,然而人们也没有办法去证明不会有人发现这个问题,或者说保证掌握安全漏洞的人不会出于各种考虑而利用这个安全问题。很多商业软件都采用这种态度,事实上很多软件本身安全性很低,到了安全专家和攻击者那里,其漏洞就很容易被发现。另一种更为积极的态度,认为安全问题不应该隐藏起来,只有通过从不了解到了解并解决安全问题的不断的、动态过程,才能真正保证系统的安全性。由于这种态度,一方面系统的使用者至少可以了解哪些是安全的,哪些存在问题,从而避开问题而不必担心被欺骗,同样采用这种方法开发的软件,其安全漏洞能被很快发行并被纠正,如果一个软件经过了众多Internet使用者的考验,其中不乏专家,使用者就不必担心其中还有十分严重的安全漏洞了。

  Unix用户大部分都是持后一种态度的Internet使用者,不断学习是网络安全的一个独立的、而又非常重要的方面。尽管网络上的攻击者能够从Internet上获得关于网络安全漏洞的技术方法,同样管理员也能获得这些技术,并能及时弥补漏洞。事实上很多导致系统漏洞的问题其实是Internet上早以解决的问题,通过参加相关的安全组织或通过网络定期查阅其报告,就能不受这些系统安全漏洞的影响。

  Internet上最著名的一个安全组织是CERT,它提供安全方面的建议,并通过Internet发布报告,这些报告内容包括各种操作系统的问题和漏洞,以及相应的解决办法。其主页为http://www.cert.org ,建议所有关心网络安全的使用者都经常查阅他们提供的资源,从中选择与自己使用的系统相关的内容。

  很多网络安全问题发生的原因不在于入侵者攻击手段的高明,而是由于系统管理员的不称职造成的,而合格的系统管理员能跟踪自己操作系统暴露出来的问题,并根据Internet上的建议堵上这些漏洞,国外的很多公司还聘用专业的网络安全顾问,这些顾问的任务之一就是及时发现系统问题,提示管理员进行系统修正。

    * 认证与加密

  为了区分合法用户和非法使用者,就需要对用户进行认证。标准的Unix认证用户的过程是,用户输入口令,口令传输到系统程序中,由系统程序对口令进行加密,并与系统中的口令密文进行比较来判断口令是否正确。在这种方法中,如果要通过网络认证,就要将口令以明文形式在网络中传输,因此就存在被窃听的危险。

  此外,流行的认证方式还有S/key,Kerberos,Radius等方式,其中S/key是使用一次性的口令,这样即使口令被窃听也无关紧要,其然而使用起来却比较烦琐,使用S/key的用户可能需要打印出长长的口令来帮助输入正确的口令。Kerberos和Radius认证方式能保证口令不被窃听,但他们是在服务器和客户机都支持相应的认证方式的条件下才能使用,因而需要更复杂的设置。

  当前Kerberos V认证方式比较流行,Windows 2000中也将采用这种认证方式。但在FreeBSD 中提供的是Kerberos IV认证方式。需要注意的是,Kerberos V和Kerberos IV差异较大,是两个互不兼容的独立版本。

  通常使用的加密算法为DES算法,经实践证明它是一种很有效加密算法,虽然Unix上使用的密钥长度为56位,还不足够安全。因为在Internet上,已经有人通过多台计算机合作计算,通过几个月时间破解了使用它加密的内容。但对于一般的安全性,加上选择得当的口令,56位的DES算法也足够用了。如果要提供更高的安全性,可以使用更长的密钥,或者使用另外的算法,如IDEA算法、三重DES算法等。

  与安全有关的算法还包括一类单向散列算法,如MD2、MD4、MD5等,这些算法的目的是用于从已有数据中生成与其他数据不同的少量标识数据,从而区分不同的数据,这样就能通过这些标识数据分辨不同数据。由于不同的数据使用上面的算法生成的标识数据只有极少的可能相同,这些算法一般被用于数字签名,用于保证网络中的文件传输没有发生错误。这些算法也能用于口令认证,其中MD4用于认证时存在安全性不高的问题,因而用于认证时一般使用MD5算法。

  FreeBSD缺省使用MD5算法用作口令认证,这并不影响系统的正常执行。

  对于DES等算法来讲,加密和解密是使用同一个密钥,这个密钥必须秘密保存,一旦泄露就不能保证数据的安全,但要让其他使用者获得加密的信息,就必须告诉他这个密钥,这样就很容易泄露密钥。因此在加密传输中,密钥的传输是一个与数据安全非常相关的问题。另一种不同的思路是使用多个密钥,例如两个密钥,一个加密过的数据只能由另一个来解密,其中一个密钥由用户保存,为私有密钥,另一个向所有要进行加密传输信息的使用者公开,称为公开密钥。当他们要向这个用户发送信息时,能使用该用户的公开密钥加密信息,那么只有这个用户能使用自己的私有密钥能解开信息。同样这个用户用自己的私有密钥加密信息,那么其他用户只能使用他的公开密钥才能解开,这样就保证了信息是由这个用户发出的,而不是其他人的伪造信息。最著名的公开密钥加密算法为RSA算法。

  使用公开密钥算法进行传输,就能避免数据被窃听的问题,常用的使用公开密钥算法的软件有ssh,pgp,以及其他使用SSL的应用程序。

  加密算法的选择是一个非常关键的问题,由于加密算法涉及非常高深的数学问题,因此不是任何人都能发明一个加密算法。有的人以为使用一个不公开算法本身的专有加密算法会增加安全性,其实不然,未经验证的加密算法很可能存在漏洞,在专业密码学家那里有很多种方法可以进行破解,在密码学领域内有很多失败的例子,即使是非常专业的密码学专家,发明一种加密方法也不是一个简单的事情,未经验证的算法在其他专业密码学家的破解下,很容易面临失败的危险。因此,应该尽量选择已被证明是成熟的加密方法。

未完,待续。。。  
 楼主| 发表于 2003-2-11 23:34:14 | 显示全部楼层

FreeBSD连载(74):安全问题

安全问题

  当要维护网络安全的时候,需要加以了解的关键问题就是网络漏洞可能存在于位于何处。只有了解攻击者会从何处入手,才能采取相应的措施加强系统的安全。下面部分针对可能存在的安全漏洞进行了简单的概括,这些地方都是网络安全需要注意的方面。

    * 物理安全性:网络窃听与地址欺骗

  物理安全性的安全性非常重要,但这个问题中的大部分内容与网络安全无关,例如如果服务器被盗窃了,其上面的硬盘就能被窃贼使用物理读取的方式进行分析读取。这只是一个极端的例子,更一般的情况可能是非法使用者接触了系统的控制台,重新启动计算机并获得控制权,或者通过物理连接的方式窃听网络信息。

  最近国内报告了几例 “黑客” 事件,攻击者通过将物理线路连接到目的线路上,并利用对这些专有的计算机系统的了解来窃取信息。事实上这种攻击方式不能算一个真正的网络攻击,并不用说网络黑客了。

  在物理安全方面,与网络相关的问题主要在于传输数据的安全性。由于TCP/IP协议是一种包交换网络,各个数据包在网络上都是透明传输的,将经过各个不同的网络,由那些网络上的路由器转发,才能到达目的计算机。由于数据包都是直接经过这些网络,那么这些网络上的计算机都有可能将其捕获,从而窃听到正在传输的数据。这个物理上的传输安全问题对网络安全非常重要,因为当前的TCP/IP协议本身并没有对安全传输进行考虑,很多应用程序,如telnet、ftp 等,甚至使用明文来传递非常敏感的口令数据。获取网络上流过全部数据的方法通常被称为网络分析(sniffing)。

  由于物理网络的传输限制,并不是在网络上的任意位置都能捕获数据包信息的。对于最常用的以太网,较老的共享式以太网能在任意一个位置窃听所有流经网络的信息包,而新式的交换式以太网能够在交换机上隔离流向不同计算机的数据,因此安全性更高。然而无论怎样的网络,路由器总是一个非常关键的位置,所有流入流出网络的数据都经过这个特殊的计算机,如果攻击者在路由器上进行窃听就会造成非常严重的安全问题。

  交换式以太网并不能保证不能百分之百不被窃听,高明的窃听者能通过欺骗以太网交换机来完成窃听的任务,然而这需要针对具体交换机的弱点进行攻击,事实上很难进行。

  防范窃听的方法是对传输的数据进行加密,最简单的情况下就不要使用明文来传输重要的认证信息。在FreeBSD 下可以使用Kerberos认证保证口令传输不被窃听。更进一步,可以使用支持加密传输的应用程序传输重要的数据,如ssh。在数据要通过的不安全网络上设定虚拟专用网也能解决这个问题。当前,从IP层支持数据安全的协议为IPSec ,FreeBSD下也有一个开发组KAME是支持IPSec的(KAME的网址位于http://www.kame.net/ )。以后会有越来越多的应用程序支持IPSec,不再有传输安全的问题。

  涉及物理安全性的另一个问题是网络地址欺骗,很多网络服务将安全性依赖于区分不同计算机的方式,可信任的计算机能够访问网络资源,不可信任的计算机被拒绝访问。然而非法入侵者可以通过欺骗的方式,使得目的计算机认为它是可信任的计算机,从而达到入侵的目的。

  网络地址欺骗可以分为两种,一种为假冒其他计算机网卡的硬件MAC地址,这样就能使得这台计算机能完全冒充另外那台计算机,突破依赖于MAC地址的访问限制。很多网卡可以通过驱动程序更改MAC地址,操作系统也能通过软件的方法更改其驱动程序中保存的MAC地址。因此MAC地址是不可靠的,不能依赖于它来保护具备敏感性的数据信息。显然,假冒MAC地址方法只能存在于同一个局域网之中,不能跨越网络。

  然而对TCP/IP来讲,通信还是主要依赖于IP地址,因此更普遍的地址欺骗还是要通过假冒IP地址的方法进行的。对于任何操作系统来讲,更改IP地址非常简便。在同一个子网当中,更改IP地址之后,它就能假冒那台被信任计算机。然而在同一个子网之外,假冒IP地址就需要更复杂的技术,首先它需要了解假冒的IP数据包是否能发送到目的计算机上,这需要依赖于它和目的计算机的路由器的设置,很多的路由器不能分辨IP数据包是否是从正确的子网发送出来的(或者没有屏蔽这些非法的IP数据包),这样假冒的IP数据包就能到达目的计算机。由于假冒的IP数据包中的IP地址与发送的计算机不相符,因此回应的数据包不会返回假冒IP地址的计算机,这样就需要假冒的计算机只能依靠猜测来攻击目的计算机。

  在地址欺骗中,如果要被假冒的计算机正在运行,势必要发生冲突。入侵者为了避免出现这些问题,可能会首先攻击要被假冒的计算机,使其当机或超负荷运行,而不能响应服务请求。然后才能无妨碍的进行攻击过程。

    * 操作系统安全性:软件BUG和后门

  任何软件系统都可能存在种种系统漏洞,提供相应服务的同时也就可能暴露某个问题。由于FreeBSD继承了非常成熟的BSD代码,以及采用了开放源代码的策略,FreeBSD是非常安全的系统,然而这也不能绝对保证系统中没有问题存在。而那些不公开代码的商业软件,由于测试远远少于开放代码的软件,就可能存在更多的问题。因而,入侵者就能利用这些漏洞来侵入计算机,或者利用这些漏洞破坏计算机。

  但还没有登录入这台计算机的攻击者,他们会扫描这台计算机的端口,以寻找这台计算机提供的网络服务,然后从这些网络服务出发,寻找提供这些网络服务的系统守护进程的漏洞,进而入侵系统。

  事实上Internet网络中充斥着这些端口扫描程序,在国内,大部分端口扫描程序是用来寻找代理服务器的,由于国内网络的现状(CERNET中出国访问按流量收费),这些行为虽然也是为非法使用代理服务器做准备,然而也是值得原谅的。

  对于已经进入这台计算机的入侵者,由于一般情况下入侵者进入系统只能获得普通用户的权限,并不能控制系统。入侵者需要获取更大的权利,来控制整个系统。Unix下root用户具备最大的权限,能完成所有可以执行的操作,因此就是入侵者攻击的目标。能获得root用户的权限的基本方法是通过执行root用户拥有的、并且具备SetUID属性的执行程序,一般这些程序只完成特定操作,或者也要预先验证用户的身份,因此入侵者并不能直接得逞。然而如果这些SetUID 的程序存在漏洞,那么入侵者可以通过缓冲区溢出等手段,使这些程序执行入侵者设定的非正常操作,来达到获得root 身份的目的。此外,得到root身份还能通过系统驱动程序的漏洞、以root用户权限执行的守护进程漏洞等方法达到目的。

  SetGID的程序不能使入侵者得到root权限,但可以使入侵者得到其他非法权限,使得入侵者能完成更多的操作,为获得root权限起到辅助作用。

  除了这些利用软件漏洞的方法之外,入侵者还可以通过欺骗用户,使其执行入侵者的程序,来达到获得非法权限的目的。这些入侵者的程序是一些特洛伊木马程序,它模仿正常程序的行为,但暗中窃取了口令等重要的数据。入侵者常常设定特洛伊木马来获得更大的权限。

  为了预防这些安全问题,需要尽量减少计算机提供的服务数量,不必要的服务就不要提供。同时尽量减少系统中存在的SetUID、SetGID程序的数量,不要执行未经验证的程序,尤其不能以root身份执行。

  一些软件能比系统提供的软件提供更详细的访问记录和更细致的访问限制,以增加网络安全性。例如tcp wrapper ,sudo等。另一些软件能自动分析计算机提供的服务中存在的漏洞,因而能帮助系统管理员及时弥补被发现的漏洞。如Satan、Cops等。

    * 服务阻塞

  服务阻塞技术并不一定要利用系统的漏洞,它可能只利用了系统提供的正常功能。很多情况下,提供服务并没有对使用服务的使用者占用的资源进行限制,允许用户使用尽可能多的资源。这因为服务器信任使用它的用户,然而恶意的攻击者能通过自己不停的申请并占用系统资源,使得服务器不能正常向外提供正常服务,或者当机。

  在操作系统中也存在这种攻击方式,例如一个用户不断占用磁盘空间,直至系统空间被填满,其他需要空间的用户就不能正常工作。或者一个用户不断生成子进程,直至系统进程表被填满,其他用户无法启动进程为止。

  优秀的系统和服务程序,应该考虑到这些问题,因此也可以认为这种问题属于软件设计考虑不周,然而这毕竟与软件漏洞还是有所不同。如果一个服务程序过多的考虑了各种资源的限制,其效率和可用性都会大大减低的。

  在服务阻塞方面的网络攻击方法被外部入侵者常用的是IP-SYN攻击,它能使计算机的TCP/IP堆栈处于拥塞状态,而无法正常相应其他请求。
 楼主| 发表于 2003-2-11 23:35:15 | 显示全部楼层

FreeBSD连载(75):防火墙技术

防火墙技术

  将本地网络连接到Internet之后,Internet上的计算机就能自由访问本地网络中的计算机了。显然,由于本地网络属于同一个组织,本地网络中的计算机相互之间都可以信任,而外部Internet上的计算机可能来自任意地方,因此不可信任。如何给可信任的本地网络中的计算机提供资源,而不给其他Internet上的计算机提供访问或入侵的机会,同时又不妨碍本地网络中的计算机正常访问Internet,就成为了建立内部网络的一个要求。

  当然,针对每个计算机进行设置,也可以达到屏蔽外部网络访问的目的。然而这样做一方面不太方便,对每个计算机都要进行设置,另一方面不太安全,内部网络中不是每台计算机使用的操作系统都具备良好的保护措施,而外部网络中的计算机可以通过这些不安全的操作系统进入内部网络,提供了攻击的途径。因此更好的办法是御入侵者于网络之外,在内部网络和外部网络中架设一个防火墙,所有的访问都需要经过它进行验证,对内部网络提供了保护作用。

    * 包过滤技术

  为了对内部网络提供保护,就有必要对通过防火墙的数据包进行检查,例如检查其源地址和目的地址、端口地址、数据包的类型等,根据这些数据来判断这个数据包是否为合法数据包,如果不符合预定义的规则,就不将这个数据包发送到其目的计算机中去。由于包过滤技术要求内外通信的数据包必须通过使用这个技术的计算机,才能进行过滤,因而包过滤技术必须用在路由器上。因为只有路由器才是连接多个网络的桥梁,所有网络之间交换的数据包都得经过它,所以路由器就有能力对每个数据包进行检查。

  通常的路由器都支持基本的包过滤能力,路由器在转发IP数据包的时候,缺省状态并不涉及数据包中的内容,只是按照IP包的目的地址和本身的路由表进行转发。为了使得它进行包过滤,就必须定义一系列过滤规则,使得路由器能进行过滤。通常情况下,过滤能针对IP地址、端口地址、连接类型等进行设定,还能够针对数据包进行转发,将数据包转发到合适的计算机中。

  在包过滤的条件下,内部网络的计算机还是直接和外部计算机相通信的。由于这是直接在IP层工作,可以适合所有的应用服务,灵活性和效率都较高。但也存在缺点,比如不能了解应用协议的具体形式,也不能提供清晰的日志记录等。

    * 代理服务

  代理服务是另一种防火墙技术,与包过滤不同,它直接和应用服务程序打交道。它不会让数据包直接通过,而是自己接收了数据包,并对其进行分析。当代理程序理解了连接请求之后,它将自己启动另一个连接,向外部网络发送同样的请求,然后将返回的数据发送回那个提出请求的内部网计算机。

  虽然代理服务器不必连接到两个网络上就能提供代理服务,然而要想通过代理服务器限制网络之间的通信,提供代理服务的计算机必须连接到两个网络上,所有的网络之间通信都需要通过它的代理才行,而不能直接连接到Internet上。因此代理服务器也不能打开包转发能力,如果代理服务器同时也是路由器,那么内部计算机就可以通过它的路由能力而非代理能力在不同的网络之间通信,代理服务器就起不到防火墙的作用。除非特定情况下,才能设置路由能力,此时也应该配置了更严格的包过滤规则,以保护网络安全。

  在有代理服务的情况下,内部网络的计算机必须配置具体的代理服务使用的代理服务器,它只同代理服务器打交道,而由代理服务器发送请求并返回结果。代理服务器必须要了解它要代理的服务,并为每一种服务都提供详细的访问日志记录,并能针对不同的使用者进行认证。

  一般来讲,由于代理服务器要针对一个请求启动一个代理服务连接,因此代理服务器效率不高,但是如果针对具体的服务应用,可以在代理服务器上配置大量的缓冲区,通过缓冲区可以提高其工作效率,提供更高的性能。例如对于使用HTTP 代理服务器时,代理服务器就能在缓冲区中查找到同样的数据,因而不必再次访问Internet,减少了对宝贵的Internet 带宽的占用。代理服务器不仅是一个防火墙技术,它还能用来提高访问Internet的效率。

  常用的代理服务器有http代理,ftp代理等,所有的代理服务能力都需要客户软件的支持,这也意味着当用户要使用代理功能的时候,需要设置客户软件,如浏览器,如果客户软件不支持代理功能,就无法使用代理服务器。然而,为了减轻配置负担、利用代理服务器的缓冲能力,可以设置一种透明代理服务器,这种方式不需要设置客户软件,通过设置路由器,将本来发送到其他计算机的IP数据包,依据IP地址和端口转发到代理服务器中。

    * 网络地址翻译

  在TCP/IP开始开发的时候,没有人会想象到它发展的如此之快。当前使用的IPv4地址空间为32位大小,因而地址资源已经十分紧张了。而下一代的IPv6还没有得到大家的认可。FreeBSD虽然有支持IPv6的开发计划,正由于整个Internet上IPv6还没有实施,因此FreeBSD还没有将以开发的IPv6合并入正式发布的系统中去。

  为了解决地址紧张的问题,提出了网络地址翻译(Network Address Translation, NAT)的方法。NAT能处理每个IP数据包,将其中的地址部分进行转换,将对内部和外部IP进行直接映射,从一批可使用的IP地址池中动态选择一个地址分配给内部地址,或者不但转换IP地址,也转换端口地址,从而使得多个内部地址能共享一个外部IP地址。

  动态分配外部IP地址的方法只能有限的解决IP地址紧张的问题,而让多个内部地址共享一个外部IP地址的方式能更有效的解决IP地址紧张的问题。让多个内部IP地址共享一个外部IP地址,就必须转换端口地址,这样内部不同IP 地址但具有同样端口地址的数据包就能转换为同一个IP地址而端口地址不同,这种方法又被称为端口地址转换(Port Address Translation, PAT),或者称为IP伪装(IP masquerading)

  网络地址翻译也是一个重要的防火墙技术,因为它对外隐藏了内部的网络结构,外部攻击者无法确定内部计算机的连接状态。并且不同的时候,内部计算机向外连接使用的地址都是不同的,给外部攻击造成了困难。同样NAT也能通过定义各种映射规则,屏蔽外部的连接请求,并可以将连接请求映射到不同的计算机中。

  网络地址翻译都和IP数据包过滤一起使用,就构成一种更复杂的包过滤型的防火墙。仅仅具备包过滤能力的路由器,其防火墙能力还是比较弱,抵抗外部入侵的能力也较差,而和网络地址翻译技术相结合,就能起到更好的安全保证。

    * 主动监测技术

  无论是包过滤,还是代理服务,都是根据管理员预定义好的规则提供服务或者限制某些访问。然而在提供网络访问能力和防止网络安全方面,显然存在矛盾,只要允许访问某些网络服务,就有可能造成某种系统漏洞,然而如果限制太严厉,合法的网络访问就受到不必要的限制。代理型的防火墙的限制就在这个方面,必须为一种网络服务分别提供一个代理程序,当网络上的新型服务出现的时候,就不可能立即提供这个服务的代理程序。事实上代理服务器一般只能代理最常用的几种网络服务,可提供的网络访问十分有限。

  为了在开放网络服务的同时也提供安全保证,必须有一种方法能监测网络情况,当出现网络攻击时就立即告警或切断相关连接。主动监测技术就是基于这种思路发展起来的,它维护一个记录各种攻击模式的数据库,并使用一个监测程序时刻运行在网络中进行监控,当一旦发现网络中存在与数据库中的某个模式相匹配时,就能推断可能出现网络攻击。由于主动监测程序要监控整个网络的数据,因此需要运行在路由器上,或路由器旁能获得所有网络流量的位置。由于监测程序会消耗大量内存,并会影响路由器的性能,因此最好不在路由器上运行。

  主动检测方式作为网络安全的一种新兴技术,由于需要维护各种网络攻击的数据库,因此需要一个专业性的公司维护。理论上这种技术能在不妨碍正常网络使用的基础上保护网络安全,然而这依赖于网络攻击的数据库和监测程序对网络数据的智能分析,而且在网络流量较大时,使用sniffing技术的监测程序可能会遗漏数据包信息,因此这种技术主要用于要求较高,只用于对网络安全要求非常高的网络系统中,常用的网络并不需要使用这种方式。

未完,待续。。。  
 楼主| 发表于 2003-2-11 23:39:25 | 显示全部楼层

FreeBSD连载(76):设置基本系统

FreeBSD系统是一种安全性非常好的通用操作系统,在Internet上很少发生FreeBSD系统被攻击的报告,事实上最近一端时间内CERT的安全报告中几乎没有发生在FreeBSD系统上的安全报告。一方面是因为 FreeBSD安全性很好,另一方面也是由于FreeBSD用户对于系统安全比较了解的缘故。

  与其他Unix系统相比,FreeBSD系统的传统味道更足一些,设计者以追求完美的态度去完成每一种设计,稳定性和安全性就是其中的重要因素。因此,初始安装好的FreeBSD系统已经具备比较高的安全性,一般用户不需要特别设置,便具备了相当高的安全性。而且经过一些简单的设置之后,安全性可以更高。一些商业操作系统软件声称经过了某个安全认证,其实这些认证也只是保证最基本的安全性。当前的各种Unix版本(不包括较老的版本)经过一些设置工作,同样也能达到通过测试目的,只是包括FreeBSD在内的自由软件系统,没有资金、也没有必要去参加这类测试。

  对系统安全要求更高,而又不打算自己调整系统设置的使用者,可以选择另一种BSD Unix──OpenBSD ,它使用最大安全性的策略,其缺省设置中应用了大量的系统安全措施,也因为如此,它稍微难用一些。

    *
      设置基本系统

  增强FreeBSD的安全性可以从两个方面出发,一个为使用FreeBSD提供的安全措施,这些安全措施可能在缺省情况下可能并没有打开,但能够提供额外的安全性。另一种为安装其他辅助的安全软件,这些额外的软件可以在特定方面增加系统安全,或帮助检查系统安全的工具。

    * 用户登录控制

  为了提高系统的安全性,一个重要的方面就是区分不同的用户,对于要使用不同服务的用户区别对待。有些用户只使用远程登录服务的就不必具备控制台访问的权限,有些用户只在某些子网上使用系统的就不必允许在任何位置进行登录,有些帐户只是用于系统维护目的,没有任何使用者需要使用相应帐户登录,就不必允许登录请求。

  当区分不同用户的情况,最大限度的提供了登录限制之后,就能对入侵者利用窃取的帐户从其他位置进行攻击设置了障碍,提供更大的安全性。

    * 控制台安全控制

  系统的控制台是一个非常重要的安全弱点所在的位置,因为一个使用者能接触控制台,那么就表示他得到管理人员的特殊信任。系统缺省赋予了控制台终端以较大的安全信任。此外,接触控制台还能从物理上访问系统硬件,包括重新启动系统、将硬盘窃取分析其中的数据等等。然而,物理安全等措施不是在这里要讨论的内容。

  为了避免偶然的非法访问控制台造成的安全问题,所需要设置的第一件任务就是取消控制台的信任设置,这个设置位于/etc/ttys中。

console none     unknown off secure

  初始设置为secure表示root用户可以在控制台登录,另外,它还表示系统重新启动之后,如果管理员要求进入单用户状态,将不询问root的口令进行验证,这是一个重要的安全漏洞。将secure更改为insecure可以使得进入单用户状态时首先验证root口令,它带来的后果是,一旦系统损坏了passwd文件(主要是master.passwd 文件),root口令无法认证,就没有办法进入单用户状态进行修复工作,此时使用安装盘启动fixit 系统进行才能进行修正。

  使用另外一个运行在软盘上的小FreeBSD系统也能完成修复系统的任务,后面将介绍定制单软盘FreeBSD 系统的方法,这种小系统被称为PICOBSD,可以用于设置网关或防火墙,以及可以用作专有系统的嵌入式操作系统。

  此外,为了防止用户无意中重新启动系统,还需要取消Ctrl-Alt-Del热键的重新启动能力,这需要重新定制内核时使用以下选项。

options                SC_DISABLE_REBOOT

  注意,这是针对使用标准控制台syscon的系统才有效果。

  当屏蔽了系统的热启动能力,那么重新启动或关闭系统便需要使用系统命令来完成,此时能启动系统的使用者便需要 root权限。而root口令知道的人越多,系统越不安全。此时可以使用软件包sudo来帮助解决这个问题,sudo 能限制某些特定用户使用root权限完成指定的操作,它使用用户本身的口令,而非root口令验证用户。

  即使屏蔽了热启动能力,并且重新启动进入单用户状态也需要询问口令,系统仍然存在安全性问题。非法使用者可以首先切断电源,然后使用安装盘或其他不使用现有文件系统的FreeBSD系统盘启动系统,获得相关数据,或更改pas swd文件,以便在重新启动之后获得root权限。保护这些攻击,需要其他手段,例如设置计算机的启动口令,拆除系统上的软盘驱动器、光盘驱动器等。然而,对于能进行物理攻击的入侵者,他的行为就如同一个正常系统管理员修复系统的行为一样,没有绝对的办法能杜绝这样大胆妄为的举动。

  如果管理员不能信任计算机系统的物理安全,为了防止信息外泻,唯一的方法是进行加密,可以通过Unix命令crypt 对具备敏感信息的文件加密。然而更简便的方法是使用一种加密文件系统,这类加密文件系统对于正常操作就如同标准文件系统一样,对任何应用程序的文件操作完全透明,然而数据是以加密方式保存到物理设备中。而且在网络中传送的也都是加密后的密钥,不必担心泄露密钥。FreeBSD下可以使用的加密文件系统为TCFS,但它这不是FreeBSD的标准配置,需要从http:// tcfs.dia.unisa.it/中单独获得。

    * 登录控制

  为了加强控制台的安全,还应该阻止一般用户在控制台上登录入系统。为了达到这个目的,需要设置登录访问限制文件/etc/login.access。该文件由login程序读取,限制用户的登录位置,该文件中具备下面语句将屏蔽除了wheel组、admin之外的用户在console登录的权力。

-:ALL EXCEPT wheel admin:console

  第一个字符“-“号,用于指明该句是用于屏蔽,相反,“+“用于打开登录许可,由于这个文件主要用于控制登录位置的目的,所以打开登录许可的方式很少用得到。此后用冒号分隔的第二部分为帐号域,可以使用用户名和组名,以及使用 login.access的关键字All、ALL EXCEPT等定义用户。第三部分为登录位置,这里仅仅用于限制console。

  这个文件不但能用来限制在控制台登录,也能用来限制从其他位置登录入系统,还可以限制一些帐户在所有的位置都不能登录,这样就能更好的保证安全性。

-:wheel:ALL EXCEPT LOCAL .local.net

  这句设置了对管理员组wheel的登录位置限制,只能在本地或者本地的local.net域内计算机上建立登录连接。设置对能执行特定操作管理员的登录限制也能增强系统安全性。

-:daemon bin lpd nobody nogroup:ALL

  这个设置限制一些特殊的系统用户在所有节点上都不能登录,系统中的很多帐户事实上是用于系统维护的目的,并没有任何用户需要使用他们登录,显然这也能增加安全性。

  然而,使用login.access并不能表示该帐户就无法被非法使用了,很多网络服务不使用这个文件进行用户限制,而是使用自己的用户限制方式,因此入侵者可以通过这些网络服务攻击相关帐户。入侵者也可以通过先以其他用户身份登录,再使用su命令绕过这个限制。所以使用这个限制文件并不是一劳永逸的做法,事实上在保证网络安全方面,不存在百分之百的解决方案,只能通过各个方面配置,尽量提高安全性。

  即使提供了有效的登录控制,对于某些不必要的缺省帐户或长期不再使用的帐户,最好还是将其删除,以最大可能的避免安全问题。例如用于UUCP的帐户uucp,只有很少的系统需要这个帐户。可以放心的是,FreeBSD系统中不存在没有口令保护的缺省帐户,这将满足一般用户的安全需要。

    * 安全认证方式

  由于FreeBSD是一个多用户系统,不但能由控制台用户使用,还可以通过网络,提供其他用户使用。而允许其他用户通过网络使用系统的时候,必须要对用户进行验证。此时的一个重要的安全问题就是口令以明文形式在网络中传输的问题。

    * S/key和Kerberos

  为了避免口令被窃听,有很多解决方法可以避免这个问题。一个很有意思的解决方法是使用一次性的口令系统,如 S/key,即使口令被窃听也不会对安全造成影响。FreeBSD缺省就支持S/key系统,每个用户都可以选择是否使用这个系统保证自己的口令安全性。为了使用S/key系统,首先需要使用keyinit初始化针对这个用户的口令串。

bash-2.02$ keyinit
Updating wb:
Old key: de415501
Reminder - Only use this method if you are directly connected.
If you are using telnet or rlogin exit with no password and use keyinit -s.
Enter secret password:
Again secret password:
ID wb s/key is 99 de415502
GAS SAM RUSK BASH NEWS WAIT

  由于这个命令是用于初始化S/key系统,要输入一个S/key口令短语(这个口令可以设置的非常长,通常建议使用一个句子以保证安全性),这个口令将影响以后产生的一次性口令,因此这个命令应该在一个安全连接的终端上(如控制台)执行,而不应该在通过普通telnet等网络连接的登录会话上执行。在两次输入S/key的口令之后,keyinit 将产生第一个一次性口令,keyinit输出的最后一行就是这个一次性口令,上面的ID行中的99指一次性口令的序列号,de415502是这个一次性口令对应的 “种子” 。口令的 “种子” ,和S/key口令短语相结合就用于产生不同的一次性口令序列。

  当使用了keyinit初始化S/key之后,就可以立即使用S/key一次性口令登录了。也可以使用key 命令产生其他一次性口令,这需要指定一次性口令的序列号和种子。

bash-2.02$ key 99 de415502
Reminder - Do not use this program while logged in via telnet or rlogin.
Enter secret password:
GAS SAM RUSK BASH NEWS WAIT

  key将提示用户输入口令短语,因此这个命令也不应该通过网络来使用,只能用于直接连接的时候。然而不必为此担心,因为无论在那台计算机上,使用同样的序列号、种子和口令短语产生的口令序列都是同样的,因此可以在本地计算机上,产生用于远程FreeBSD计算机登录的一次性口令。

  注意,S/key系统用于产生一次性口令使用的单向Hash函数可能不同,最常用的有MD4、MD5和DES 算法,使用不同算法产生的一次性口令序列不会相同。FreeBSD的S/key系统使用MD4算法,因此如果要在客户计算机为FreeBSD服务器产生S/key一次性口令,需要使用采用MD4算法的key程序。

  这样当系统进行认证时,将提示skey序列号和种子。这样用户就能使用正确的一次性口令登录了。一旦一个口令用过,这个口令就不再被使用,而使用下一个序列号的口令。

Login: wb
s/key 99 de415502
Password:

  由于每次使用过的口令将不再使用,而通过S/key认证的连接本身是不安全的连接,不应该用于再次产生新口令。那么如果仅通过本地计算机产生S/key口令,就限制了客户机上必须安装有S/key系统。事实上可以在建立安全连接的时候,一次可以产生多个S/key一次性口令,将这些口令记录或打印在密码本上,随用随查,只要密码本不丢失,就没有口令泄露的问题。产生多个S/key一次性口令需要使用-n参数执行key:

bash-2.02$ key -n 5 80 de415503
Reminder - Do not use this program while logged in via telnet or rlogin.
Enter secret password:
76: FIR SIGH BABE SUNG FUSS BAY
77: SOCK HOME WAGE CAN BALL WORE
78: DORA JUNO JAY YET HEAD SLUR
79: COWL TROY HURT SLAB SCAR GAGE
80: TOE BAKE FRAU PEG DOE I

  这将产生5个一次性口令的序列,80为口令序列的结束序号。此后需要经常更新所使用的口令序列,即更改 S/key的种子,以产生新的口令序列。

  更改S/key种子仍然还需要使用keyinit命令,然而此时有了一次性口令,就不需要在安全的终端上进行了,需要使用-s参数,使得keyinit使用一次性口令来获得S/key口令短语,而不必直接输入S/key口令短语。只要保证S/key口令短语的安全,就能保证整个S/key一次性口令序列不会被再现。

bash-2.02$ keyinit -s
Updating wb:
Old key: de415502
Reminder you need the 6 english words from the key command.
Enter sequence count from 1 to 9999: 100
Enter new key [default de415503]:
s/key 100 de415503
s/key access password: GAS SAM RUSK BASH NEWS WAIT

ID wb s/key is 100 de415503
GAS SAM RUSK BASH NEWS WAIT

  keyinit -s命令中,需要输入一次性口令序列中口令的数量,以及新种子的值。而用于认证的S/key 一次性口令为提示的一次性口令,这里为de415503,序列号为100。

  需要注意的是,缺省情况下即使使用S/key认证,原有的Unix口令认证方式仍然有效,如果S/key认证不成功,系统就接下来使用原有的老Unix口令认证方式。对于一些图形界面的应用程序,不能提示S/key口令的序列号,那么用户也无法输入正确的一次性口令,此时使用老口令就有必要了。

  然而,也能限制用户必须使用S/key口令,不能使用普通Unix明文口令,以更大程度上增强安全性。为了强制用户使用S/key口令,需要创建一个/etc/skey.access文件。

# touch /etc/skey.access

  当存在这个文件时,S/key认证系统就不再调用标准Unix认证系统。然而这个文件中可以设置一些例外的情况,允许使用Unix认证系统,例如在内部网络中允许使用Unix明文认证系统,等等。针对IP地址、用户和终端来设置可以使用Unix明文认证系统的权力。针对用户打开这个设置的情况一般是因为该用户不需要特别安全的情况,针对终端打开这个设置的情况通常发生在拨号访问FreeBSD系统的情况,由于认证口令不通过网络,因此也不需要 S/key加密。

permit internet 198.162.0.0 255.255.0.0
permit user aaa
permit port ttyd0

  对于一些需要自动进行认证的应用程序,需要将口令暂时保存起来,定时自动进行认证工作,但由于S/key的口令是一次性方式的,而客户软件不能根据S/key的提示,输入正确的口令,此时使用老口令也是必要的。如有些使用POP3 协议的客户端能定时从邮件服务器中下载邮件,这样就必须使用标准Unix口令。显然这明显是一个非常严重的安全漏洞,特别是明文口令不但是在网络上传输,而且是定时、多次传输的时候,问题更为明显。对于这样的情况,最好立即转换为支持加密口令的协议,对POP3来讲可以使用APOP协议。

  FreeBSD下使用的另一种安全认证方式为Kerberos方式,这是一种安全的认证模式,然而它需要客户和服务器都支持这个认证方式才行。当前流行的Kerberos为Kerberos V,而FreeBSD下使用的为Kerberos IV ,因此与其他Kerberos客户存在兼容的问题,使得这个认证系统大部分情况下用于多台FreeBSD 系统之间进行认证。这里就不再介绍其使用方法了,需要使用这个能力的用户可以查看FreeBSD Handbook ,以获得相关的内容。

  FreeBSD下也可以安装Kerberos V认证系统,它位于Posts Collecion中的sec urity部分中。

    * 可加载认证模块PAM

  3.1-release之后的FreeBSD版本支持可加载的认证方式模块PAM,这种机制能使得系统能非常灵活的支持多种认证方式,具备非常大的可扩展性。PAM的设置文件为/etc/pam.conf,这里定义了各种条件下使用的认证方式。

# Configuration file for Pluggable Authentication Modules (PAM).
#
# This file controls the authentication methods that login and other
# utilities use.  See pam(8) for a description of its format.
#
# Note: the final entry must say "required" -- otherwise, things don't
# work quite right.  If you delete the final entry, be sure to change
# "sufficient" to "required" in the entry before it.
#
# $FreeBSD: src/etc/pam.conf,v 1.1 1998/11/20 23:20:01 jdp Exp $

# If the user can authenticate with S/Key, that's sufficient.
login        auth        sufficient        pam_skey.so

# Check skey.access to make sure it is OK to let the user type in
# a cleartext password.  If not, then fail right here.
login        auth        requisite        pam_cleartext_pass_ok.so

# If you want KerberosIV authentication, uncomment the next line:
#login        auth        sufficient        pam_kerberosIV.so                try_first_pass

# Traditional getpwnam() authentication.
login        auth        required        pam_unix.so                        try_first_pass

  这是系统缺省的pam.conf文件,这里定义了三个认证过程,按照顺序系统将首先使用pam_skey.so ,然后pam_cleartext_pass_ok.so,最后是标准unix认证pam_unix.so。第一个是用于使用S/key系统认证,第二个不是一个认证,而是用于限制用户访问的,它检查/etc/skey.access ,以禁止非许可的节点、用户登录,因此其第三个参数为requisite,而非pam_skey.so对应的sufficient ,如果第二个设置许可,才能进入第三项定义的标准Unix认证方式。

  注意,如果存在/etc/pam.d目录,PAM将在这个目录中寻找设置信息,而忽略pam.conf。

  这些认证系统的动态连接库均位于系统中的/usr/lib/目录下,如果需要,可以增加其他认证方式。

# ls -l /usr/lib/*pam*
-r--r--r--  1 root  wheel  59938 Feb 15 18:41 /usr/lib/libpam.a
lrwxrwxrwx  1 root  wheel     11 Apr 14 16:24 /usr/lib/libpam.so -> libpam.so.1
-r--r--r--  1 root  wheel  33451 Feb 15 18:41 /usr/lib/libpam.so.1
-r--r--r--  1 root  wheel   2895 Feb 15 18:41 /usr/lib/pam_cleartext_pass_ok.so
-r--r--r--  1 root  wheel   6587 Feb 15 18:41 /usr/lib/pam_radius.so
-r--r--r--  1 root  wheel   3798 Feb 15 18:41 /usr/lib/pam_skey.so
-r--r--r--  1 root  wheel   6497 Feb 15 18:41 /usr/lib/pam_tacplus.so
-r--r--r--  1 root  wheel   3333 Feb 15 18:41 /usr/lib/pam_unix.so

  其中每个以pam_开头的库均对应一种认证方式,可以看出系统中还能提供其他几种认证方式,如RADUIS、 TACPLUS等方式。使用libpam能帮助用户开发其他PAM认证程序。

  PAM是一种新的、更为灵活的认证机制,以前的FreeBSD版本并不支持这种方式。PAM虽然更为灵活,但对于一般目的,缺省的支持s/key和标准认证方式的设置就能满足需要了,一般不必改动配置文件。然而有些时候,譬如 ISP,通常使用RADUIS服务器来保存用户的认证数据,此时使用RADUIS进行认证就能带来非常大的益处。因为 PAM涉及系统认证,因而对安全性非常重要,不能轻易加入一个非信任的认证模块,因为除了模块本身的问题之外,认证模块中很容易加入后门。建议经常检查/etc/pam.conf,/etc/pam.d/目录,以及/usr/lib/*pam* 文件是否被非法改动,以保证系统安全。

    * 网络服务与应用程序安全

  由于提供服务与保障系统安全性是有冲突的,提供的服务越多,就会存在越多的潜在的危险性。因此为了增加系统安全,就要尽量减少系统提供的服务。

  提供网络服务的守护进程主要有两种启动方式,一种为从系统启动文件中启动,另一种为通过inetd超级守护进程启动应用程序。

    * 系统rc文件

  通常的系统启动文件启动的守护进程有sendmail、syslogd、lpd等,要改变系统启动的服务进程,需要更改的文件包括/etc/rc.conf、/etc/rc.local,以及/usr/local/etc/rc.d 与/usr/X11R6/etc/rc.d目录下的以.sh结尾的启动文件(这两个启动脚本目录是由rc.conf 中的local_startup定义,因此也有可能被设置为了其他的值)。除非特殊情况,其他的rc文件不应该被改动,如果其他的rc文件被非法更改,很可能是入侵行为。

  特别需要注意/etc/default/rc.conf,/etc/rc.conf.local文件,因为这些文件也能用于设置启动服务,而不被管理员所注意,因此可能是入侵者用于放置后门程序的位置。

  为了减少守护进程,就需要将rc.conf中相关选项设置为NO,例如要屏蔽sendmail,就可以设置 sendmail_enable=”NO”。此外,缺省的rc.local文件中没有内容,因此在这里也不应该有降低系统安全的设置,/usr/local/etc/rc.d/和/usr/X11R6/etc/rc.d/目录下的执行脚本为安装其他软件包时所安装的,对于不希望提供的网络服务,应该将执行脚本更改为以其他后缀结尾的文件,只有以 .sh结尾的执行脚本才会在启动时自动执行。

  一个安全的FreeBSD系统,应该具有干净的rc.local文件,/usr/local/etc/rc.d 与/usr/X11R6/etc/rc.d目录,以及尽量减少基本启动进程的rc.conf文件。

  守护进程直接放在rc文件中启动,将具备root的权限,危险性较大。如果能使用用户的身份可以执行守护进程的相应操作,就应该使用用户的身份执行它。这可以通过使用su命令启动服务进程的方式,代替直接启动服务进程的命令。

su user services_process

    * inetd服务器

  然而,Unix系统中绝大多数服务进程还是通过超级服务器进程inetd来启动的。它的设置文件为/etc/inetd.conf ,以下为这个文件的一部分。

#
#        $Id: inetd.conf,v 1.30 1998/09/30 16:12:40 wosch Exp $
#
# Internet server configuration database
#
#        @(#)inetd.conf        5.4 (Berkeley) 6/30/90
#
ftp        stream        tcp        nowait        root        /usr/libexec/ftpd        ftpd -l
telnet        stream        tcp        nowait        root        /usr/libexec/telnetd        telnetd
shell        stream        tcp        nowait        root        /usr/libexec/rshd        rshd
login        stream        tcp        nowait        root        /usr/libexec/rlogind        rlogind
finger        stream        tcp        nowait/3/10 nobody /usr/libexec/fingerd        fingerd -s
#exec        stream        tcp        nowait        root        /usr/libexec/rexecd        rexecd
#uucpd        stream        tcp        nowait        root        /usr/libexec/uucpd        uucpd
#nntp        stream        tcp        nowait        usenet        /usr/libexec/nntpd        nntpd
comsat        dgram        udp        wait        root        /usr/libexec/comsat        comsat
ntalk        dgram        udp        wait        root        /usr/libexec/ntalkd        ntalkd

  这个文件中的每一行对应一个服务程序。为了增强系统安全,建议除了必要的服务,如telnetd、ftpd之外,其他比如rshd、rlogind等r命令服务程序,fingerd等守护进程都应该加以注释。telnet和ftp 也应该与S/key等认证方式相结合,来保证口令的安全性。除非需要,不要提供匿名ftp服务。

  当使用rlogin,rsh等r命令的时候,/etc/hosts.equiv文件和用户个人目录下的.rhosts 文件中的设置将对系统安全有严重的影响。

  如果要求更安全的系统,甚至可以屏蔽inetd,不使用inetd来提供任何服务,通过其他安全途径来完成远程访问FreeBSD。要屏蔽inetd,需要在rc.conf中改变inetd_enable变量的值为NO。即使使用inetd的时候,最好让inetd记录相关日志,这需要使用参数-l启动inetd,在rc.conf中可以设置inetd_flags为”-l”。

  当需要启动某个守护进程的时候,inetd.conf中的第五列参数对安全性有重要影响,这个参数设置启动这个进程的用户标识,应该尽量不要使用root用户,以减少具备root身份的进程。

  为了避免服务程序出现问题,还要经常更新软件的版本,或应用补丁程序,以堵上可能出现的漏洞,因此有些服务程序的老版本存在已经发现的安全问题,如果不及时弥补,入侵者就能利用这些漏洞达到入侵系统的目的。虽然每个FreeBSD 版本使用的都是最新版本的服务软件,但服务器软件是不断升级的,因此就需要及时升级服务器软件。

  在inetd启动的服务中,telnetd和ftpd是最重要的两个,它们提供最基本的网络服务。telnetd 本身的安全问题较少,与它相关的安全问题有访问认证问题,可以通过S/key,login.access等方式加以保护,而ftpd则的安全问题就更为敏感一些。

  如果需要启动ftp服务,虽然在inetd.conf中启动ftpd已经使用了-l参数,使ftpd将日志记录发送给syslogd,但是还需要配置syslogd才能接收ftpd发送的记录。如果/etc/syslog.conf 文件中没有下面的设置行用于记录ftp的日志,请修改syslog.conf加入。

ftp.*           /var/log/ftpd

  然后还需要执行下列命令,使得syslogd重新启动,使其能开始记录下ftpd发送的记录信息。

# touch /var/log/ftpd
# killall -HUP syslogd

  ftp对访问进行了种种限制,这些限制对于网络安全都是非常重要的,当用户的shell不在/etc/shells 中的时候,ftp拒绝提供服务,当用户的用户名位于/etc/ftpusers文件中时,或者是/etc/ftpusers 中记录的组的成员,ftp同样也拒绝提供服务,这样就对使用ftp的用户进行了限制,尤其对于安全敏感的用户。如果/var/run/nologin文件存在时,ftp将拒绝一切用户访问。

  ftp认证是通过标准认证过程进行的,因此也可以使用S/key等安全认证的方式。同样,/etc/ftphosts 可以设置对来自不同位置的主机访问ftp服务的限制。

  很多情况下需要FreeBSD服务器提供匿名ftp服务功能,如果此时普通用户能通过更安全的方法访问系统,就应该屏蔽普通用户使用ftp服务的权力,而只允许匿名ftp,可以使用-A选项启动ftp服务器,此时ftp将拒绝正常用户登录,避免ftp服务器出现安全问题的可能性及减少安全问题的影响。当使用-S选项时,ftp将所有匿名访问的传输日志也记录在/var/log/ftpd文件中。这两个选项对于提供匿名ftp服务非常有用。对于提供匿名ftp 的服务器,还可以不再使用FreeBSD提供的ftpd服务器,而使用wuftpd或ncftpd等其他种类的ftp 服务器,同样也需要针对这些服务器设置其安全性。

    * 改变程序的根文件系统

  当不得不提供一些服务的时候,为了增加安全性,可以考虑提供chroot的服务。chroot意味着改变运行程序的根文件系统,当一个程序运行在chroot的环境下时,它所了解的文件系统只是chroot设置给它的某级目录开始,它就不能访问这个目录之外文件系统中的内容,使得即使这个程序出现安全问题,也不会影响文件系统中的其他重要数据的安全性。显然不是每种服务都适合这种形式,有的服务提供访问的文件资源不固定在某个目录下,就不能使用这个形式。

  由于设置一个服务程序使用chroot的时候,它就以为给它指定的目录就是它的根目录,因此它无论访问哪个文件,都将在相对的目录中查找,包括它要访问的重要系统文件。这样就必须为这个chroot程序建立一个小的,但完全满足其要求的系统目录结构,这个目录将和系统目录结构类似,也具有/etc/、/usr/、/var/、/dev/、/tmp/、/usr/lib/ 等等,并具备应用程序要访问的相应文件。

  如果程序是动态连接的,就需要/usr/lib目录中存在动态连接库,应用程序还可能会访问/etc目录下的配置文件,/dev目录下的设备文件,以及其他可能的文件。必须在应用程序的新的根目录下设置所有必须的目录结构和复制需要访问的文件。当然文件内容可以是系统原来文件的一个子集,而非原有的整个文件,以尽可能的保障安全。例如服务程序要访问的passwd文件只是系统passwd文件的一部分,等等。

  当chroot的程序需要访问某个用户的口令数据时,就需要将/etc/passwd文件中有关这个用户的内容复制到用户chroot目录下etc子目录下,然而口令文件并不止passwd一个文件,将包括master.passwd,pwd.db 及spwd.db。由于pwd.db和spwd.db使用了数据库形式,就使得复制部分用户数据变得比较困难。

  改变根文件系统的服务程序有两种类型,一种为本身不具备改变根文件系统的能力,但由于不访问过多的文件,能使用系统的chroot命令来启动程序,使其运行在某个目录下。另一种类型为程序本身就支持这个能力,这样就不需要使用手工使用chroot命令,系统在特定条件下或使用一定参数启动时就自动进行chroot操作。然而这些类型进行目录设置时需要进行的操作是相同的。而要设置网络服务所使用的文件环境,就要对该服务程序有详细的了解,这才是最为困难的问题。

  这里以配置改变根文件系统的namd为例,简介设置改变根文件系统的网络服务的步骤,这个设置步骤的原始文档为http://www.psionic.com/papers/dn ... 用于OpenBSD和Fr eeBSD,没有使用Ports Collection,但给了较详细的解释),和http://www.antisocial.net/~modred/papers/named.html (使用了FreeBSD的Ports Collection,给出了详细的步骤)。以下只着重介绍操作过程,并没有详细给出操作步骤,需要设置chroot named的使用者可以参阅这些相关网页的内容。

  
# 编译静态连接的named和namd-xfer,这需要增加编译连接标志-static,重新编译bind8 软件。这个过程也可以使用Ports Collecion来完成,然而要注意的是使用Ports Collection 编译的named和直接编译的named对目录结构的处理有所不同,这将影响后面建立目录结构的处理过程。使用静态连接的执行程序的好处是不必考虑为chroot环境复制对应的动态连接库,简化了chroot文件系统设置。

  
# 建立chroot目录结构,首先在根目录下建立/chroot/named目录,作为这个服务的根目录,然后在这个目录中建立dev,etc,etc/namedb,usr,usr/libexec, var, var/run等目录,注意这些目录结构是与应用软件中的设置相关的,如果使用Ports Collection 定制的named和named-xfer,它使用目录结构是与Bind8的缺省设置不同的,需要建立/usr/local/libexec 而非/usr/libexec目录。

  
# 然后向新的文件系统中复制相应的文件、建立相关的设备。如果是动态连接的程序,还需要考虑复制/usr/lib下的动态连接库和相关的ld程序。可以通过ldd命令查询程序需要的动态连接库。然而增加文件就降低了系统安全性,因此一般应该使用静态连接的程序,新的环境中应具备尽可能少的文件。

  
# 设置环境,包括增加程序执行的用户和组,目录结构的属主和权限设置等等。可以为named 添加用户named和组named。

  
# 手工执行chroot的named,执行命令为”/chroot/named -unamed -g named -t /chroot/named” ,-t参数指出named应该使用/chroot/named作根目录执行chroot操作,一切正确之后,再更改启动脚本。

  
# 更改启动脚本,屏蔽原有的named的执行权限,使得新named成为系统的网络服务程序,并设置正确的启动参数。

    * 用户相关的安全问题

  系统管理员有时也不希望用户占用太多的系统资源,在有些Unix系统中入侵者能通过普通帐户,启动大量的进程或产生大量的文件,从而使系统死掉或不能提供正常操作,而FreeBSD下则不必有此担忧,因为可以通过login.conf 和用户的口令数据来设置用户类别,限制用户对系统资源的占用,同样占用的硬盘资源可以通过quota来限制。

  at和cron机制能帮助用户自动启动应用程序和服务进程,如果必要,可以屏蔽用户使用at和cron的权限。也要注意检查root用户的at和cron设置,这里也是入侵者可能用于设置后门程序的一个位置。

  系统中,除了服务进程可能具备root身份之外,再就是具备SetUID身份的程序能进入root身份。由于 SetUID和SetGID与系统安全息息相关,因此系统中也应该具备尽量少的SetUID和SetGID程序。要不定期使用find命令查找,或者检查/var/log下的日志文件,了解系统中这些程序文件的更改情况。

  实际上很多SetUID程序不会被使用的,例如很少有人使用uucp,如果使用的是局域网也很少使用ppp和 pppd,因此对于这些不常用到的SetUID程序,应该取消其SetUID位,甚至取消执行属性,以避免用户来执行它。

  为了避免不必要的SetUID程序,一个办法是可以在安装一个文件系统时就设定不承认这个文件系统中的SetUID 程序。安装文件系统时可以使用nosuid选项,就能让文件属性中的SetUID和SetGID位失效。因此为了利用这个优点,可以创建使用使用nosuid位的/home文件系统,让所有的用户使用,而其他可以存在SetUID 程序的文件系统,如/usr,则不允许用户写入。同样也要创建一个/var/tmp文件系统,将系统的/tmp目录指向这个目录,/var/tmp也应该是nosuid的,以避免用户在/tmp目录中保存SetUID程序。其他的文件系统,如使用NFS装载的文件系统,也要使用nosuid安装选项。

  划分多个磁盘分区、安装到不同目录上也能防止入侵者企图填满磁盘空间的阻塞攻击。同样,对于用户使用的磁盘文件系统,应该使用qutoa来限制用户个人占用的磁盘空间。

  这个nosuid安全选项应该加入到/etc/fstab文件中,一使得每次都能生效。需要注意的是nosuid 安装选项不能影响一些解释性语言程序的这个属性,如perl程序,当解释性语言程序具备SetUID属性,语言解释器为其设置身份,由于真正的setuid()调用是由语言解释器执行的,因此如果语言解释器具备root权限(具备 SetUID属性),那么就能使解释器将具备SetUID位的程序设置入root权限。这不是系统的问题,而是语言解释器的问题,屏蔽语言解释器本身的SetUID属性可以避免这个问题。

  当系统作为NFS服务器,设置共享出去的NFS文件系统时,应该使用maproot或mapall参数,以便隔离危险,使得即使在远程系统被侵入的情况下,防止从这个允许安装文件系统的客户上对本机的入侵。还可以考虑使用安全的NFS协议,使用DES算法进行服务器和客户机的认证。如果系统不使用NFS及其他RPC服务时,最好屏蔽相关的选项,如portmap_enable选项。

    * 安全日志记录

  Unix系统使用Syslog记录应用软件发送的日志记录,日志记录对于安全管理非常重要,因为管理员可以从这些日志中发现系统遭受攻击的痕迹及证据。然而syslogd本身也是一个服务程序,能接收网络上的消息,因此其本身也存在安全问题。

  这样,syslog就存在两个矛盾的问题,为了安全起见syslogd不应该接收网络上的其他计算机发送的日志记录。由于接收消息是通过UDP传送并且没有加密保护,因此syslog消息可能是伪造的,即便攻击者不使用伪造信息进行欺骗,仅仅使用服务阻塞的方法,就能导致正常的日志记录系统不能正常使用,此后攻击者就能放心进行入侵操作而无需担心留下踪迹。那么即使syslogd没有因为这种阻塞攻击而崩溃,大量无意义的syslog记录,也使得其他有用的日志记录被迅速淹没或清除(为了防止日志文件占用过多的磁盘空间,系统中缺省情况下会自动进行日志的清理工作)。

  为了使得syslogd不理会其他计算机的记录,可以使用-s参数重新启动syslogd。在rc.conf 中更改syslogd_flags的值为"-s"。

  FreeBSD系统中用于管理syslog日志文件的程序为newsyslog,它由crontab来启动,它检查由newsyslog.conf中指定的日志文件,当这些文件达到一定大小时,就截断原文件,重新启动syslogd ,并压缩保存原有记录。为了避免占用太多的磁盘空间,newsyslog保存的日志备份文件有数量的限制,因此就使得阻塞攻击清除日志的攻击方式成为了可能。可以增加newsyslog保存的日志备份文件的数量,和进行备份时文件的大小,增大系统日志文件的容量。

  然而,当一台计算机仅仅使用自己硬盘来记录日志的话,那么一旦入侵者成功入侵这台计算机,他就能按照syslogd 的配置文件syslog.conf的设置,清除相关的日志记录,以便为以后继续潜伏在系统中做打算。甚至可以直接删除/var/log目录下文件以及其他syslog.conf中指明的文件,消灭入侵踪迹及证据。这样,将syslog 日志记录保留在其他计算机系统中也是一个有效增强安全审计的重要因素。

  因此,可以设定一台用于记录日志的计算机,其syslogd屏蔽外部计算机的日志请求,只记录本地可信任的计算机系统的日志。这样,就需要在使用"-s"参数屏蔽任意计算机请求的同时,使用"-a"加上信任的计算机主机名,或者子网号,域名等,这样就只会记录这些计算机的日志记录。为了安全起见,这台计算机最好是专用于这一项服务,不执行任何服务程序,以避免遭受入侵。然而由于syslogd对系统要求不高,因此这台计算机可以不必使用很高的硬件配置,除了需要足够的硬盘空间以容纳大量日志记录。

  此外,还可以通过将特别重要的syslog的记录直接发送到行式打印机的方式,避免入侵者清除日志记录。

  由于日志记录会迅速增加,特别是在遭受攻击的时候更为显著,因此需要使用一些日志分析工具来帮助分析这些日志文件,以快速定位发生的安全问题,否则面临庞大的日志文件,很难找到有用的日志记录。logcheck或其他具备相似功能的程序就用来完成这个任务。http://www.psionic.com/abacus/ab ... ogcheck的主页。

    * 其他服务程序问题

  有些软件本身很可能存在安全问题,应该尽量使用该软件的最新稳定版本并及时进行打补丁,或者使用具备同样功能,但更安全的软件来代替这种软件,例如使用qmail或postfix来代替sendmail。

  有时候软件的新版本由于增加了新功能,会变得更不稳定或具备其他的安全漏洞,对于这种情况就不能盲目升级软件。

  X Window也对网络安全有一定影响,特别是X服务器的认证问题,不要为了方便起见而直接使用xhost+ 命令,这样就会其他使用者能窥视用户正在进行的操作。除了上面提到的措施之外,还可以将FreeBSD系统放置到防火墙之内,或者直接利用FreeBSD系统的包过滤能力,屏蔽一些不友好节点的访问,或者屏蔽所有的外部连接请求,而不影响本机对外部的访问。将FreeBSD设置为防火墙是一个重要的安全措施,因为这不但能对本机提供保护,也能对网络内其他客户计算机提供保护。毫无疑问,FreeBSD系统的包过滤能力非常优秀,结合FreeBSD具备的网络地址翻译的能力,就使得它能构建仅次于硬件防火墙的防火墙系统。本章的后续部分中将详细讨论将FreeBSD设置为防火墙系统的各种方法。

    * 内核安全级别

  FreeBSD内核有一个安全级别(securelevel)的概念,这是指系统内核运行使用的安全等级,不同的等级具备不同的保护和检查机制。因为这是内核的检查机制,因此相当严格,没有办法能绕过这个机制提供的保护,因此就对保护FreeBSD的安全性十分有用。

  内核的安全级别按照提供安全保护的程度分为-1、0、1、2共分为四个级别,安全级别能提供的保护有:

  系统文件:系统文件可以设置保护标志 “ 不可更改 “ 和 “ 只能附加 “ ,具有这些保护标志的文件在系统的文件属性之外,还受这些保护标志的保护。安全级别可以规定这些标志能否取消。

  磁盘设备文件:磁盘设备文件具备两种访问方式,随机访问的方式对应的块设备文件和顺序访问方式对应的字符设备文件,其中字符设备文件可以直接读取硬件设备,因此对于安全至关重要。内核安全级别可以决定是否允许以直接读取硬件的方式操作硬盘设备文件。

  直接内存访问:/dev/mem和/dev/kmem是系统内存的映射文件,访问它们就能直接访问系统内存,一些需要获取系统信息和需要进程间共享内存机制的程序需要访问这两个设备文件以直接访问内存,然而访问内存空间显然也影响系统的安全运行。内核安全级别可以决定是否允许访问系统内存。

  安全级别-1为一种永久性的不安全级别,系统内核不提供任何额外的保护。系统缺省就处于这个级别,此时系统文件的保护标志能被root用户取消,所有的设备,包括磁盘设备和内存映射设备,均能按照其属性来访问。

  安全级别0为不安全的级别,它和等级-1一样没有对系统提供额外的安全保护,但它影响到内核进程init的行为。当内核处于级别-1时,内核init程序不会自动更改运行级别,因此一直到进入能够登录的状态,系统安全级别仍然为-1。这是系统的缺省行为,没有打开安全级别保护机制。但如果安全级别不为-1,init在进入单用户状态时将改变为0级别,在进入多用户模式时改变为安全级别1。因此安全级别0为设置了安全级别保护之后,单用户状态下的安全级别。

  安全级别1为安全的级别,提供了对系统的保护能力。此时系统文件的那两个保护标志不能被取消,已安装文件系统对应的磁盘设备,以及/dev/mem,/dev/kmem不可以用写入模式打开。

  安全级别2与级别1类似,只是进一步增加了对磁盘设备低级操作的限制,不管该磁盘设备是否安装,都不允许直接以写入方式访问,这样就无法进行fdisk、disklabel以及newfs等操作。

  可以使用sysctl来查看当前系统的安全级别,但如果没有经过特别设置,FreeBSD的缺省安全级别应该为-1:

# sysctl kern.securelevel
kern.securelevel: -1

  安全级别中最重要的一点是,除了内核的init进程之外,即使是root用户,也只能不断提高安全级别,没有办法将安全级别降低。这样就基本上保证远程入侵者在没有重新启动计算机的情况下,无法降低系统运行级别。如果root 想提高系统运行的安全级别,也需要使用sysctl命令。

# sysctl -w kern.securelevel=0
kern.securelevel: -1 -> 0

  安全级别的意义就在于对文件和设备的保护,如果要对文件提供保护,就需要对文件设置保护标志schg。设置这个标志需要使用chflags命令,系统文件如/kernel,系统安全的时候就具备这个保护标志。即使在非安全级别下要更改这些文件的时候,也要首先取消保护标志才能进行正常操作。

# mv /kernel /kernel.bak
mv: rename /kernel to /kernel.bak: Operation not permitted
# chflags noschg /kernel
# mv /kernel /kernel.bak
# mv /kernel.bak /kernel
# chflags schg /kernel

  上面操作先取消了kernel文件的不可更改标志schg,显然这是在非安全级别下的操作。当安全级别处于 1或2时,就不能使用chflags改变文件的保护标志了。

# chflags noschg /kernel


chflags: /kernel: Operation not permitted

  可以使用带-o参数的ls来查看文件具备的标志。

# ls -lo /kernel


-r-xr-xr-x 1 root wheel schg 1061679 Jun 30 01:27 /kernel

  因此可以将系统安全相关的很多程序都设置保护标志,这样入侵者就不能轻易更改这些文件了。建议将/bin,/sbin下的文件都设置这个标志。

# chflags schg /bin
# chflags schg /bin/*
# chflags schg /sbin
# chflags schg /sbin/*

  这里首先将相关目录本身设置保护标志,这样入侵者就不能通过将目录更改名字的方法创造一个新的/sbin或 /bin目录。

  当文件具备了保护标志,并且安全级别高于1时,保护标志就无法取消,这些文件就不能更改,因此就带来一些必要的操作无法进行,例如重新生成内核的操作等。此时就必须再重新启动系统进入单用户状态执行这些操作。

  通常情况下,如果FreeBSD系统只提供网络服务,那么使用安全级别1或2毫无问题。然而如果要运行X Server ,由于X Server使用了共享内存机制,需要访问/dev/mem和/dev/kmem,这样就会带来问题。这时的一种解决办法是在启动X Server之后(例如使用Xdm),再升高安全级别,以避开这个问题,但此时 X Server已经打开了/dev/mem和/dev/kmem,安全级别的保护就不再是完美无缺的了。

  如果不使用X Server之类的程序,那么就可以将设置安全级别的命令直接放入系统的启动rc文件中,以便自动提高安全级别。这需要在rc.conf文件中设置两个变量:kern_securelevel_enable和kern_securelevel。

kern_securelevel_enable=”YES”
kern_securelevel=0

  上面将安全级别设置为0,那么在启动之后将自动更改为1,这是一种标准的做法。

未完,待续。。。  
 楼主| 发表于 2003-2-11 23:40:49 | 显示全部楼层

FreeBSD连载(77):安全工具

安全工具

  虽然只使用FreeBSD基本系统提供的功能,就能将计算机系统设置为具有非常高的安全性的系统。然而网络上也存在各种用于增强或检查系统安全性的软件工具,有些工具是标准程序的更安全替代品,增强了系统安全性,有些是对系统或网络进行监视和检查的工具。使用这些工具,毫无疑问会进一步增强系统的安全性。FreeBSD的Packages Collection或Ports Collection通常将这些工具放在security子类中。

    * 系统工具软件

  虽然FreeBSD系统本身提供了对访问的认证、控制和记录,然而由于在Unix系统中,服务程序基本上是独立的,使用标准的安全控制方式的服务程序能从FreeBSD的认证控制机制中获益,但是有些服务程序并没有使用这些安全认证方式。对于独立进行认证控制的软件,除了使用其本身的控制能力之外,还有一些独立的软件具备为其他程序服务的控制访问功能。

  还有一些系统工具,能用于自动检查系统,帮助管理员发现系统中存在的问题,这些软件也是非常有用的工具。此外,还有一些工具软件属于系统工具,但对于增进系统安全也有很大意义,例如sudo,能在一定程度上增加root口令的安全性。

    * TcpWrapper

  tcp_wrapper对于多种服务器软件是非常有用的访问控制工具,它能以统一的方式保护各种不同服务器。对于没有受防火墙保护的独立主机系统,tcpwrapper的保护更为重要。因为配置了tcp_wrapper之后,任何向inetd发起的连接首先是连接到tcp_wrapper提供的tcpd上之后,再连接到具体的服务进程上,这样tcpd就有机会查看远程系统是否被允许访问,并能将连接的情况通过syslog记录下来,包括请求的种类,时间和连接的来源地址。

  这个程序事实上代替了系统提供的守护进程,来轻松和高效的监控外部网络与服务器的连接。由于它提供了详细的日志记录,也是用于抓住入侵者,并提供可靠的证据的一种方法。tcpwrapper的思想与代理型防火墙的思路是相同的,都是通过替换正常服务器的做法来完成控制任务。

  当使用Packages Collection安装了tcpwrapper之后,它的守护进程tcpd就被安装到了/usr/local/libexec目录下,然后就能使用tcpd来代替原有的守护进程提供网络服务了。

  FreeeBSD 3.2-RELEASE之后,tcp_wrapper进入了FreeBSD的基本系统中,而不再需要额外安装。

  有几种不同的使用tcpd的办法,最基本的办法是通过更改inetd.conf来启动tcpd。例如要想让tcpd来保护 fingerd,那么就需要将inetd.conf中对应fingerd的设置更改为tcpd:

  finger stream tcp nowait/3/10 nobody /usr/local/libexec/tcpd fingerd -s

  tcpd能在标准的系统文件目录中查找正确的守护进程以提供服务,如果进程不在标准的目录路径下,就需要在最后一列中指定所要执行文件的全路径,如/usr/libexec/fingerd。此后,对finger端口的访问,将被记录进系统的日志文件,具体为syslog.conf中对auth指定的记录文件,例如下面的syslog设置将tcpd的信息发送到/var/log/auth.log 文件中(需要保证auth.log文件已存在)。

  auth.* /var/log/auth.log

  tcpd使用/usr/local/etc/目录下的hosts.allow和hosts.deny文件来控制对服务器的访问,访问控制是基于IP 地址和域名的。以下为一个hosts.allow控制文件的例子。可以看出设置文件比较简单易懂,tcpwrapper也提供了一个程序tcpdchk,来检查用户更改过的设置文件是否正确。

  ALL: domain.com

  telnet: 192.168.3.0/255.255.255.0 EXCEPT 192.168.3.10

  此外有着相似功能,但用于替换inetd的软件为xinetd,它能用于代替原有的inetd来启动各种服务程序,但提供了更详细的日志记录。

    * 系统安全检查工具

  Internet上针对每个系统均报告了大量的安全相关的问题,如果将这些已知的安全问题有效的组织起来,使用程序对系统自动进行检查,就能极大的帮助网络管理员查找现有的问题,使得系统更为安全。网络上存在多种这类的工具,如Satan、cops,就用于这个目的。然而由于它们的强大功能,这些工具也能被企图入侵他人系统的使用者利用,因此为了避免入侵者,系统管理员应该尽早使用这些软件,以起到预防作用。

  cops是一个由系统管理员运行,检查系统内部设置的程序。它针对已知的Unix存在问题进行检查,如检查系统中是否存在没有口令的帐户,是否有非法SetUID程序,以及是否存在Internet上已经报告过的系统漏洞,是否存在有问题的软件等等。系统管理员能使用cops来检查系统的配置有无问题。

  Satan则与cops不同,Satan是从系统外部进行检查系统是否存在安全问题的程序,它能对网络存在的脆弱性自动进行搜索、分析并提供安全报告。这种从外部分析系统的软件一般称为扫描器,由于Satan功能强大并提供了可扩展的框架,因此在Internet上十分流行。它的另一个特点就是它通过Web浏览器工作,使用者只需指明要搜索的主机以及搜索深度和相近规则的级别,Satan就能自动收集尽可能多的目标信息。

  由于Santa是一个安全工具,因此它对扫描目标计算机并没有刻意隐藏,这样就在目标计算机的系统日志中留下了大量的扫描连接记录,尤其是当目标计算机使用了tcpwrapper的时候。这些日志能用于标识是否遭到扫描攻击。一些更隐蔽的软件工具能通过不进行完全连接等方式隐藏扫描记录,要发现它们就更为困难,因而对系统安全更为危险。

    * 加密数据传输

  一般情况下,用户需要从客户机上访问服务器,数据是以透明的方式通过网络传输的,这样数据包经过的网络中的计算机都有可能截取传送的信息。由于这个问题来源于低层网络的结构,只能通过协议的加密来防止信息泄露。然而当前大部分网络协议并不支持加密传送,因此使用窥探的方式获取网络上的信息,虽然是一种被动的方式,却是对网络安全的重要威胁。

    * Tcpdump

  任何事情都具有两面性,事实上能够获得网络上传输的数据的工具对于维护网络运行也非常重要,网络需要这些工具软件来帮助分析网络状态、解决各种网络故障,它们是网络工程师的好帮手。在市场上销售的有好几种专用的网络分析设备,来实现截获数据并进行分析的目的。虽然这些硬件实现的设备虽然功能强大,但价格昂贵,而使用软件通过标准计算机的网络接口来实现这种功能,相对来讲对于一般使用者还是可以承受的。

  tcpdump就是一种免费的网络分析工具,尤其其提供了源代码,公开了接口,因此具备很强的可扩展性,对于网络维护和入侵者都是非常有用的工具。tcpdump存在于基本的FreeBSD系统中,由于它需要将网络界面设置为混杂模式,普通用户不能正常执行,但具备root权限的用户可以直接执行它来获取网络上的信息。因此系统中存在网络分析工具主要不是对本机安全的威胁,而是对网络上的其他计算机的安全存在威胁。

  普通情况下,直接启动tcpdump将监视第一个网络界面上所有流过的数据包。

bash-2.02# tcpdump
tcpdump: listening on fxp0
11:58:47.873028 202.102.245.40.netbios-ns > 202.102.245.127.netbios-ns: udp 50
11:58:47.974331 0:10:7b:8:3a:56 > 1:80:c2:0:0:0 802.1d ui/C len=43
                         0000 0000 0080 0000 1007 cf08 0900 0000
                         0e80 0000 902b 4695 0980 8701 0014 0002
                         000f 0000 902b 4695 0008 00
11:58:48.373134 0:0:e8:5b:6d:85 > Broadcast sap e0 ui/C len=97
                         ffff 0060 0004 ffff ffff ffff ffff ffff
                         0452 ffff ffff 0000 e85b 6d85 4008 0002
                         0640 4d41 5354 4552 5f57 4542 0000 0000
                         0000 00
^C

  tcpdump支持相当多的不同参数,如使用-i参数指定tcpdump监听的网络界面,这在计算机具有多个网络界面时非常有用,使用-c参数指定要监听的数据包数量,使用-w参数指定将监听到的数据包写入文件中保存,等等。

  然而更复杂的tcpdump参数是用于过滤目的,这是因为网络中流量很大,如果不加分辨将所有的数据包都截留下来,数据量太大,反而不容易发现需要的数据包。使用这些参数定义的过滤规则可以截留特定的数据包,以缩小目标,才能更好的分析网络中存在的问题。tcpdump使用参数指定要监视数据包的类型、地址、端口等,根据具体的网络问题,充分利用这些过滤规则就能达到迅速定位故障的目的。请使用man tcpdump查看这些过滤规则的具体用法。

  显然为了安全起见,不用作网络管理用途的计算机上不应该运行这一类的网络分析软件,为了屏蔽它们,可以屏蔽内核中的bpfilter伪设备。一般情况下网络硬件和TCP/IP堆栈不支持接收或发送与本计算机无关的数据包,为了接收这些数据包,就必须使用网卡的混杂模式,并绕过标准的TCP/IP堆栈才行。在FreeBSD下,这就需要内核支持伪设备bpfilter。因此,在内核中取消bpfilter支持,就能屏蔽tcpdump之类的网络分析工具。

  并且当网卡被设置为混杂模式时,系统会在控制台和日志文件中留下记录,提醒管理员留意这台系统是否被用作攻击同网络的其他计算机的跳板。

  May 15 16:27:20 host1 /kernel: fxp0: promiscuous mode enabled

  虽然网络分析工具能将网络中传送的数据记录下来,但是网络中的数据流量相当大,如何对这些数据进行分析、分类统计、发现并报告错误却是更关键的问题。网络中的数据包属于不同的协议,而不同协议数据包的格式也不同。因此对捕获的数据进行解码,将包中的信息尽可能的展示出来,对于协议分析工具来讲更为重要。昂贵的商业分析工具的优势就在于它们能支持很多种类的应用层协议,而不仅仅只支持tcp、udp等低层协议。

  从上面tcpdump的输出可以看出,tcpdump对截获的数据并没有进行彻底解码,数据包内的大部分内容是使用十六进制的形式直接打印输出的。显然这不利于分析网络故障,通常的解决办法是先使用带-w参数的tcpdump 截获数据并保存到文件中,然后再使用其他程序进行解码分析。当然也应该定义过滤规则,以避免捕获的数据包填满整个硬盘。FreeBSD提供的一个有效的解码程序为tcpshow,它可以通过Packages Collection来安装。

# pkg_add /cdrom/packages/security/tcpshow*
# tcpdump -c 3 -w tcpdump.out
tcpdump: listening on fxp0
# tcpshow < tcpdump.out
---------------------------------------------------------------------------
Packet 1
TIME:        12:00:59.984829
LINK:        00:10:7B:08:3A:56 -> 01:80:C2:00:00:00 type=0026
        <*** No decode support for encapsulated protocol ***>
---------------------------------------------------------------------------
Packet 2
TIME:        12:01:01.074513 (1.089684)
LINK:        00:A0:C9:AB:3CF -> FF:FF:FF:FF:FF:FF type=ARP
ARP:        htype=Ethernet ptype=IP hlen=6 plen=4 op=request
        sender-MAC-addr=00:A0:C9:AB:3CF sender-IP-address=202.102.245.3
        target-MAC-addr=00:00:00:00:00:00 target-IP-address=202.102.245.3
---------------------------------------------------------------------------
Packet 3
TIME:        12:01:01.985023 (0.910510)
LINK:        00:10:7B:08:3A:56 -> 01:80:C2:00:00:00 type=0026
        <*** No decode support for encapsulated protocol ***>

  tcpshow能以不同方式对数据包进行解码,并以不同的方式显示解码数据,使用者可以根据其手册来选择最合适的参数对截获的数据包进行分析。从上面的例子中可以看出,tcpshow支持的协议也并不丰富,对于它不支持的协议就无法进行解码。

  除了tcpdump之外,FreeBSD的Packages Collecion中还提供了Ethereal 和Sniffit两个网络分析工具,以及其他一些基于网络分析方式的安全工具。其中Ethereal运行在X Window 下,具有不错的图形界面,Sniffit使用字符窗口形式,同样也易于操作。然而由于tcpdump对过滤规则的支持能力更强大,因此系统管理员仍然更喜欢使用它。

  对于有经验的网络管理员,使用这些网络分析工具不但能用来了解网络到底是如何运行的,故障出现在何处,还能进行有效的统计工作,如那种协议产生的通信量占主要地位,那个主机最繁忙,网络瓶颈位于何处等等问题。因此网络分析工具是用于网络管理的宝贵系统工具。

  为了防止数据被滥用的网络分析工具截获,关键还是要在网络的物理结构上解决。常用的方法是使用交换机或网桥将信任网络和不信任网络分隔开,可以防止外部网段窃听内部数据传输,但仍然不能解决内部网络与外部网络相互通信时的数据安全问题。

  如果没有足够的经费将网络上的共享集线器升级为以太网交换机,可以使用FreeBSD系统执行网桥任务。这需要使用option BRIDGE编译选项重新定制内核,此后使用bridge命令启动网桥功能。

    * ssh

  由于网络上的数据传输是不安全,因此出现了S/key等方式来保护口令的安全。然而这些认证系统只是保证了口令等特别敏感信息的安全,而不能保证连接之后的传输数据安全性。为了保证数据传输的安全性,就必须先将数据加密之后再进行传输。

  对传输加密可以从两个方面入手,一个是在网络低层进行加密,应用程序不需了解加密的细节,因此可以兼容现有的应用程序,这种考虑方式包括建立虚拟专用网(VPN)的各种协议,如PPTP、L2TP,以及以后将采用的IPSec 协议。另一种考虑方式是从网络应用程序入手,应用程序首先加密信息然后在进行传输,通过特定的服务程序和客户程序来建立安全连接,这种方式的代表就是ssh,此外还包括支持SSL(加密Socket层)的各个应用程序,如Telnet SSL,ApachSSL等。

  SSL在FreeBSD下的实现为openssl,它是在FreeBSD之类的免费操作系统下安装其他基于SSL应用程序的基础。

  PGP也是一个具备重要影响的加密程序,其本身虽然是为网络环境而设计的,但其程序本身不涉及网络。通常它和电子邮件的客户程序合作,构成安全的电子邮件系统。

  这些加密程序一般要使用Ports Collection下载安装,而没有现成的二进制软件包,主要原因是这些软件使用的公开密钥算法在美国有专利限制,其专利属于RSA研究所,因此FreeBSD就不将它们作成二进制软件包,以避免法律纠纷。即使使用Ports Collection下载这些软件的时候,也需要设定一个环境变量USA_RESIDENT ,以区分是不是美国居民,make程序好决定从何处下载这些程序,当然,手工下载就不必顾及这些。RSA 算法在其他国家没有专利限制,因此可以随意使用。

  如果需要反复安装这些加密工具,可以更改/etc/make.conf中的设置,使其自动设置这个变量,以方便安装过程。

  在这些工具中,最重要的还是ssh,因为它提供了Unix系统最基本访问功能的安全实现,如终端访问、文件传输功能。当使用ssh访问服务器时,服务器首先发送自己的公用密钥,客户可以使用这个密钥加密自己产生的随机密码,此后客户和服务器使用这个密码,用传统的算法,如IDEA、DES等方法来加密通信数据。对于任何希望增强安全性的系统来讲,使用ssh来代替telnet,ftp以及rlogin,rsh,rcp等命令,都是最优先要考虑的措施。网络安全敏感的系统一般都要屏蔽telnet,rlogin等方式,而使用ssh提供远程访问。

  ssh有两个不同的版本,ssh1和ssh2,这两个版本互不兼容。由于ssh1更为流行,在非Unix系统之外也拥有不同的客户程序,一般需要使用ssh1,否则就会遇到与其他ssh的服务器系统和客户软件不兼容的问题。ssh2 功能更为强大,然而其提供的额外功能一般不需要,ssh1提供的能力已经是绰绰有余的了。Ports Collection中这两个版本使用同样的安装位置,不能同时安装。

  安装了ssh之后,ssh将自动产生它所使用的公用密钥,这个密钥和ssh的设置文件保存在/usr/local/etc/ 目录中,不需要改动这些设置,直接启动ssh守护进程sshd就可以正常提供ssh登录服务了。通过Ports Collection安装的ssh的sshd位置为/usr/local/sbin/sshd。启动sshd之后,ssh客户程序就能登录和使用这台系统,可以 立即使用命令ssh来连接本地系统。

bash-2.02$ ssh localhost
wb@localhost's password:
Last login: Wed May 19 08:14:13 1999 from 202.102.245.72
Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
        The Regents of the University of California.   All rights reserved.

FreeBSD 3.1-RELEASE (wb) #6: Thu Apr 22 18:29:12 CST 1999
Welcome to FreeBSD!

  Ports Collection会在/usr/local/etc/rc.d目录下放置ssh的启动文件sshd.sh ,用以在系统启动时自动启动sshd。

  sshd使用端口22来监听用户的连接请求,需要调整网络中防火墙系统的设置,打开对ssh服务器端口22的连接请求,以便让网络之外的客户能够发送请求并建立连接。由于ssh系统相当安全,不必担心这样作会带来安全问题。

  当在低速网络上使用ssh的时候,就会希望网络连接的效率更高,可以在客户端启动ssh时使用压缩选项-C,这将使用与gzip相同的压缩算法对数据先进行压缩再传输,能用来提高传输非压缩数据的效率。

  同样文件传输也能通过加密的方式进行,ssh提供了scp用于复制远程文件,它的参数与rcp使用的参数相同,用与email地址相似的方式标识远程主机及确定的用户,然后再是文件位置。

bash-2.02$ scp vpn.txt wb@remotehost:vpn.txt
wb@mx's password:
vpn.txt                   |          1 KB |   1.5 kB/s | ETA: 00:00:00 | 100%

  对于使用Windows系统的客户,可以从Internet中下载运行在Windows下的ssh客户程序。支持ssh的仿真终端软件有:
TTSSH http://www.zip.com.au/~roca/ttssh.html
SecureCRT http://www.vandyke.com/
F-Secure http://www.DataFellows.com)

  ssh的另一项强大能力是可以在客户机和服务器之间建立加密传输通道,从而能将本地的数据转发到远端的服务器上。这种功能最常用于将X Window的数据包进行转发,以便能在本地X服务器上通过ssh连接到远程,然后在ssh的连接终端上启动远程计算机上的X应用程序,但显示到本地X服务器上。此时X系统的通信数据是通过ssh建立的加密通道进行传输的,而不是普通情况下直接通过网络进行的传输,因此就保证了安全性。这种X11转发功能不需要任何设置,包括设置DISPLAY 环境变量或-dislay参数,因此同时兼具安全性和方便性。

bash-2.02$ ssh remotehost /usr/X11R6/bin/xterm
wb@remotehost's password:
Waiting for forwarded connections to terminate...
The following connections are open:
  X11 connection from remotehost port 3979

  此外,还可以使用ssh转发其他不同的TCP连接,这样就不必担心数据在通过不安全的网络部分时的安全问题了。这首先需要使用ssh的-L参数定义本地端口和要转发的远程服务器端口的对应关系。

bash-2.02$ ssh remotehost -L 1234:192.168.3.1:23
wb@remote's password:

  如果使用上例建立ssh连接之后,任何对本地端口1234的连接请求,将首先转发给ssh,然后再由ssh服务器连接远端计算机的相应端口上。

    * 使用ssh和ppp建立安全连接

  由于ssh能在客户和服务器之间建立加密连接,因此它能和其他程序合作,如ppp,建立安全的网络通道。这种建立VPN的方式虽然不符合任何标准,然而却十分有效。对于FreeBSD系统之间,以及FreeBSD与其他Unix 系统之间,都可以使用这种方式建立虚拟专有网络连接。

  无论使用ppp或者是pppd,都能用于和ssh协作建立VPN。然而ppp更易于使用和设置,FreeBSD 下,通常使用ppp程序建立ppp连接,因此这里就介绍使用ppp程序建立虚拟安全连接的方法。

  在/etc/ppp/目录下的ppp缺省配置文件ppp.conf中,已经提供了一个和外部程序协作,建立安全ppp连接的基本例子。就是由ppp启动外部程序建立连接,通过认证之后自动在远端执行ppp服务器,从而建立ppp 连接。这种方法中ppp通过set device命令设置使用管道启动外部命令,但是这种管道方法不能和ssh很好的合作。因为进行认证的口令是ssh直接从终端设备上读取的,而在通道方式中ppp供应口令是通过标准输入/输出进行的,因此这些认证信息到达不了ssh中,就造成不能通过ssh认证建立连接。

  为了修正这个问题,让ppp程序能够建立ssh加密连接,一个解决办法是使用外部拨号程序,首先使用外部程序首先进行ssh认证,认证之后再将标准输入输出交回ppp,而外部程序可以生成伪设备文件直接控制ssh进行验证,然而需要使用者进行一些编程工作,并使用这个伪设备文件作为通信设备。另一种方式是通过设置ssh系统信任,使其不需要进行标准方式的口令认证(可以使用事先分发的公开密钥进行认证),显然这不是一个简单且安全的解决办法。更好、更简单的办法是使用ssh的TCP/IP转发能力,结合ppp建立IP通道的能力,从而建立安全的专有连接。

  为了建立ssh转发条件下的安全专有连接,首先回顾使用ppp建立IP通道的方法,这个方法在前面设置ppp 时介绍过。可以根据这些设置来设置客户端ppp配置文件ppp.conf,建立与本机的IP通道。

vpnclient:
set timeout 0
set log phase chat connect lcp ipcp
set dial
set ifaddr 192.168.4.10 192.168.4.1 255.255.255.0
set device localhost:3333

  上面vnpclient的拨号设备设置为本地端口3333,与建立标准IP通道时的设置是不同,这里设置的是本地计算机的端口。而服务器端的设置为:

vpnserver:


set timeout 0

set log phase lcp ipcp command

set ifaddr 192.168.4.1 192.168.4.10 255.255.255.0

allow mode direct

enable proxy

  为了建立安全连接,与设置IP通道类似,服务器端也需要设置使用inetd之类的超级服务器程序来启动ppp 服务器,回应客户端的请求以在IP通道上建立PPP连接。需要修改/etc/services,增加启动ppp服务器的端口号。

ppploop 6671/tcp # loopback ppp daemon

  然后修改/etc/inetd.conf文件,增加对ppp服务器启动的支持,并重新启动inetd。

ppploop stream tcp nowait root /usr/sbin/ppp ppp -direct vpnserver

  但是,由于ppp客户是向本地计算机发送连接请求,而非直接将请求发送给PPP服务器,因此就需要启动ssh,并建立相应的数据包转发功能,将转发的目标端口设置为服务器上ppp监听的端口。

bash-2.02$ ssh remotehost -L 3333:remotehost:6671
wb@remotehost's password:

  此后,可以在本地使用ppp连接本地的转发端口,直接建立安全连接。

bash-2.02# ppp -b vpnclient
Working in background mode
Using interface: tun0
PPP enabled.
bash-2.02# ifconfig tun0
tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500
        inet 192.168.4.10 --> 192.168.4.1 netmask 0xffffff00

未完,待续。。。  
 楼主| 发表于 2003-2-11 23:41:42 | 显示全部楼层

FreeBSD连载(78):设置和使用ipfw/natd

设置防火墙功能

  通过设置,FreeBSD系统能够具备更高的安全性,防止外界入侵者进入系统,即使入侵者利用人为的问题进入系统,FreeBSD严密的保护也将使他们无所作为,不能对系统造成严重的破坏。然而,除了用于保护系统本身的能力之外,FreeBSD还能用于保护同一个网络内的其他计算机。此时这个FreeBSD系统就必须作为内部网络的缺省网关,担负将内部网络连接到外部网络的任务。

  FreeBSD系统实现了包过滤能力与网络地址转换能力,如果仅将这些能力用作保护系统本身,显然不是这些功能的设计目的,保护本地系统只是保护本地网络的一部分功能。包过滤能力是针对路由器等网络设备来设计的,而网络地址转换也是重要的防火墙功能,这些设计就使得FreeBSD能被十分方便的设置为防火墙系统。此外,FreeBSD上也能运行其他类型的防火墙软件,如代理型防火墙软件fwtk等,作为代理服务器来保护本地网络内的系统。

  即使FreeBSD系统不是用作防火墙,它所支持防火墙能力也同样能用来保护本地系统的安全。

#
设置和使用ipfw/natd

  在专用路由器系统开始流行之前,Internet上的路由器大部分是基于Unix的软件路由器,其中多数是BSD Unix。显然这是由于BSD Unix在Internet上占据的重要地位决定的,即便是在专用硬件路由器流行的今天,当由于价格等因素不能考虑硬件路由器时,BSD系统仍然是用作软件路由器的首选系统。

  由于路由器处于网络之间,所有网络间需要交换的数据包都要通过它转发,因此就可以进行一定的限制,即按照预定义的一定规则处理每个数据包,符合要求的允许通过,不符合要求的就进行丢弃。这样路由器就能用作一个简单的防火墙系统,保护内部计算机。BSD系统中最早使用ipfw过滤器来定义不同的过滤规则,随后ipfw也被移植到其他平台上,并根据开发者的理解不同而独立发展。当前不同系统上的ipfw已经大不相同了,并出现了具备相同功能的其他过滤器, FreeBSD下的ipfw也经过了不断发展,具备了更强的过滤能力,尤其是它能和natd守护进程相结合,提供网络地址转换能力,具备更完善的防火墙能力。

# 使用ipfw设置过滤

  由于包过滤要对每个数据包都进行判断,因此在网络流量较大时需要较高的处理器处理能力,FreeBSD的包过滤能力是在内核中实现的,这样才能具备最高的效率和性能。因此为了在FreeBSD上使用这个防火墙功能,需要在编译内核时打开下面选项重新定制内核。

options IPFIREWALL
options IPFIREWALL_VERBOSE
options “IPFIREWALL_VERBOSE_LIMIT=100”
options IPFIREWALL_DEFAULT_TO_ACCEPT

options IPDIVERT

  其中第一项设置IPFIREWALL是用于打开基本的包过滤支持的,只有使用它才能在内核中支持包过滤。IPFIREWALL_VERBOSE 和IPFIREWALL_VERBOSE_LIMIT设置记录过滤日志,及日志记录的限制。IPFIREWALL_DEFAULT_TO_ACCEPT是设置IPFIREWALL的缺省行为,在数据包不符合所有的过滤规则的情况下进行转发,显然这是一种宽松的限制,此时系统主要用于屏蔽特定地址和特定服务,而提供其他的缺省网络能力。如果没有定义这个选项,系统就只能允许符合已定义规则的数据包通过,而屏蔽其他任何数据包,这样在没有定义过滤规则的情况下,系统不能和其他计算机相互通信。最后一个选项IPDIVERT是用于定义IPFIREWALL与natd的接口。

  当编译安装了内核之后,还需要设置内核具备数据包的转发能力。需要在rc.conf中设置gateway_enable 的值为YES,这样就能在系统启动时自动打开包转发能力。也可以直接执行下面命令来打开内核包转发能力。

# sysctl -w net.inet.ip.forwarding=1


net.inet.ip.forwarding: 0 -> 1

# ipfw过滤规则

  IPFIREWALL的过滤规则是由ipfw命令来设置的,例如下面的规则允许所有127.0.0.1的数据传输。
# /sbin/ipfw add 1000 pass all from 127.0.0.1 to 127.0.0.1

  ipfw命令中,首先指定对这个规则的处理方式,ipfw add为向内核中的过滤规则中添加,此外,ipfw delete用于删除一条规则,ipfw list用于显示当前定义的所有过滤规则,ipfw flush将清除所有的过滤规则,而ipfw file用于从文件file中读取定义的过滤规则。

  此外,ipfw定义的规则都有自己的序号,其序号可以在处理方式之后指定,如ipfw delete 1000 就是删除第1000条过滤规则,内核中可以同时支持65535条过滤规则。有时可以不使用规则的序号,那么ipfw 就处理当前规则,而处理过一次规则之后,就立即将当前规则序号增加100,这样就对于添加过滤规则时十分方便,不必指定序号,ipfw add将每隔100添加一条过滤规则。

  每个过滤规则中,要首先给出这条规则的处理指令,allow指令(或者使用同义词pass, permit,accept)为许可某类数据包通过;deny指令(或同义词drop)为不允许某类数据包通过,将该类数据包丢弃; reject指令与deny指令有所不同,但它不是简单的将数据包丢弃,而是在丢弃原有数据包的同时,回应ICMP host unreachable,通知发送计算机不能通过它与目的计算机进行通信,这样就免得发起连接请求的计算机一直发送连接请求,造成不必要的数据流量。使用count指令能对该类数据包进行简单记数,这个功能主要用于对网络使用进行记帐。log指令用于将连接发送到系统的日志记录中。

  其中count和log指令与其他指令不同,其他指令都是对数据包进行处理的指令,因此每个数据包只要匹配这个指令,就立即将数据包或转发,或丢弃,不再进行其他处理,而count和log只是记录指令,只是将记录下这个数据包,而数据包本身还将继续受到其他过滤规则的处理。

  过滤规则的第二部分是规定数据包的协议类型,指定规则是用于处理哪种数据包的,FreeBSD可以处理TCP,UCP,ICMP 类型的数据,以及在/etc/protocols文件中定义的其他数据包的类型,上例中使用all ,匹配所有类型的数据包。对于TCP或UDP,还可以在后面定义地址时指定应用的端口号(可以使用数字或/etc/services 中定义端口名字),进一步增加过滤能力。

  过滤规则的第三部分是规定过滤规则适用的地址范围,这可以通过指定源和目的计算机的IP地址范围或数据包通过的网络界面来进行指定。

  
# 用from规定数据包的来源地址,可以是主机地址或网络;

  
# 用to规定数据包的目的地址,可以是主机地址或网络;

  
# 用in或out规定数据包是流向本机,还是向外发送的;

  
# 用via、recv、xmit规定数据包经过、接收、发送的网络介面,rece可以是接收本地发送的数据包,而xmit一定是向外发送,因此应该和out选项合用;

  例如:屏蔽任何来自192.168.1.5的数据的指令为:

# ipfw add deny all from 192.168.1.5

  而许可来自192.168.1.0网络上的远程登录的指令为:

# ipfw add allow tcp from 192.168.1.0/24 telnet

  应用过滤规则的顺序是按照过滤规则的序号,从小到大进行匹配,一旦一个数据包匹配一个过滤规则,就立即按照该规则转发或丢弃,不再需要继续考虑以下的规则(count和log规则除外)。因此在前面的例子中,192.168.1.5 就不能使用telnet连接,因为首先碰到的是不允许的规则,如果两个命令次序相反,则它就能够进行telnet连接。

  最后一条过滤规则,第65535条规则,缺省被设为”deny all from any to any”时,为不允许对任何连接,此时在没有定义其他规则之前,不允许所有的网络连接。但是编译内核时使用IPFIREWALL_DEFAULT_TO_ACCEPT 选项,就能将这条规则改为”allow all from any to any”,允许转发不符合其他规则的所有数据。这两种不同的设置属于两种不同的考虑方式,一种适用于安全性要求较高的系统中,缺省情况不允许外界连接,另一种主要限制部分节点的访问,缺省情况允许任意网络连接,普通系统使用这样的设置更多些。

    * rc.firewall

  当启动了系统的包过滤能力之后,就需要在系统启动时将这些过滤规则自动载入内核,可以将这些添加过滤规则的指令写入启动文件rc.local或者其他启动文件中。但系统的启动文件中本来就具备载入这些过滤规则的相关启动文件 rc.firewall,这个文件中根据防火墙的基本要求,设置了常用的过滤规则,可以减轻防火墙管理员的设置工作。

  为了让系统执行rc.firewall中的设置,需要在rc.conf中设置参数firewall为YES,以及设置firewall_type的值,这个参数值将传递给rc.firewall,使rc.firewall执行不同的设置。一般情况下可以将firewall_type设置为open,对网络访问不进行限制,而client主要用于计算机不对外提供网络服务,保护本计算机只用于访问外部系统而拒绝所有的访问请求,设置为simple则定义了简单的防火墙规则,可以使用这台计算机保护防火墙内部的计算机,这三个选项比较常用。下面为缺省rc.firewall 中的有关过滤规则的设置。

############
# Define the firewall type in /etc/rc.conf.  Valid values are:
#   open     - will allow anyone in
#   client   - will try to protect just this machine
#   simple   - will try to protect a whole network
#   closed   - totally disables IP services except via lo0 interface
#   UNKNOWN  - disables the loading of firewall rules.
#   filename - will load the rules in the given filename (full path required)
#
# For ``client'' and ``simple'' the entries below should be customized
# appropriately.

  这里解释了rc.conf中对firewall参数的可能设置值,可以设置为不同的设置值,或者可以使用一个文件名作为firewall_type的值,指定一个包括了ipfw规则的文件,而设置使用者自己定制的过滤规则。

############
# Only in rare cases do you want to change these rules
$fwcmd add 100 pass all from any to any via lo0
$fwcmd add 200 deny all from any to 127.0.0.0/8

  这两个规则用于设置本地网络lo0的数据包能进行传输,但屏蔽所有从其他网络界面通向本地网络lo0的通信。这是最基本的设置,防止在路由或IP地址设置不正确的情况下,外部计算机访问127.0本地网络。

# Prototype setups.
if [ "${firewall_type}" = "open" -o "${firewall_type}" = "OPEN" ]; then

        $fwcmd add 65000 pass all from any to any

  设置open为防火墙的类型时,即使没有设置IPFIREWALL_DEFAULT_TO_ACCEPT内核选项,也允许对数据包进行转发,因为这里设置的规则序号为65000,小于缺省的65535规则。

elif [ "${firewall_type}" = "client" ]; then

    ############
    # This is a prototype setup that will protect your system somewhat against
    # people from outside your own network.
    ############

    # set these to your network and netmask and ip
    net="192.168.4.0"
    mask="255.255.255.0"
    ip="192.168.4.17"

  当设置了client为防火墙的类型,那么就需要更改这里的IP地址和子网掩码的设置,使其符合自己计算机的实际情况。client类型主要用于单机系统,保护本机不受外部计算机侵袭的设置。它的保护与tcpwrapper类似,但比tcpwrapper更为基本和高效,但是它不能提供详细的连接记录日志。

# Allow any traffic to or from my own net.
$fwcmd add pass all from ${ip} to ${net}{mask}
$fwcmd add pass all from ${net}{mask} to ${ip}

  这两个规则用于许可计算机与本地网络的通信。

# Allow TCP through if setup succeeded
$fwcmd add pass tcp from any to any established

  上面这两个规则允许连接已经设定成功的TCP连接的数据包能够保持连接,数据传输能够继续进行。 established参数就用于说明数据包为已经设置成功的TCP连接数据包。

# Allow setup of incoming email
$fwcmd add pass tcp from any to ${ip} 25 setup

  允许外部计算机能向内地smtp端口发起连接请求,setup用于说明定义的数据包为请求连接的数据包。

# Allow setup of outgoing TCP connections only
$fwcmd add pass tcp from ${ip} to any setup

  允许本地计算机能向外部网络发起连接请求。

# Disallow setup of all other TCP connections
$fwcmd add deny tcp from any to any setup

  此后屏蔽所有其他种类的TCP连接请求数据包,因此如果要打开其他TCP连接请求,就需要在这个规则之前进行定义。

# Allow DNS queries out in the world
    $fwcmd add pass udp from any 53 to ${ip}
    $fwcmd add pass udp from ${ip} to any 53

    # Allow NTP queries out in the world
    $fwcmd add pass udp from any 123 to ${ip}
    $fwcmd add pass udp from ${ip} to any 123

    # Everything else is denied as default.

  此后定义对UDP数据包的过滤规则,只许可DNS和NTP协议通过,而屏蔽其他UDP数据包。

  上面这些指令都是client类型的过滤规则,综合上面的指令,这就表示为屏蔽外部计算机向本地除smtp之外的TCP连接请求,而允许本地计算机向外发起连接请求,屏蔽除DNS和NTP之外的其他UDP数据包。这些过滤规则可以有效的保护一个不对外提供服务的客户系统。但是,如果要对外提供网络服务,就需要更改这里的设置,打开需要提供服务的端口,例如打开TCP端口22,以使得ssh客户能连接到系统中。

elif [ "${firewall_type}" = "simple" ]; then

    ############
    # This is a prototype setup for a simple firewall.  Configure this machine
    # as a named server and ntp server, and point all the machines on the inside
    # at this machine for those services.
    ############

    # set these to your outside interface network and netmask and ip
    oif="ed0"
    onet="192.168.4.0"
    omask="255.255.255.0"
    oip="192.168.4.17"

    # set these to your inside interface network and netmask and ip
    iif="ed1"
    inet="192.168.3.0"
    imask="255.255.255.0"
    iip="192.168.3.17"

  防火墙类型simple用于设置一个简单的防火墙系统,用于保护内部网络中的计算机。由于防火墙系统需要连接多个网络界面,一个用于连接外部网络,而其他用于连接内部网络。这个简单的防火墙只针对两个网络界面进行了过滤规则的设置,内部网络的界面iif,外部网络的界面oif,因此它只适合只有两个网络界面的防火墙系统。

  当真正要使用这个防火墙设置的时候,首先就要修改iif与oif的IP地址,网络掩码等相关设置,与本地系统实际使用的设置相同。

# Stop spoofing
$fwcmd add deny all from ${inet}{imask} to any in via ${oif}
$fwcmd add deny all from ${onet}{omask} to any in via ${iif}

  这两个过滤规则用于丢弃涉及IP地址欺骗的数据包,这包括来自于外部网络界面,但源地址为内部网络地址,或者来自于内部网络界面,但源地址为外部网络地址的数据包。由于这些数据包涉及IP地址欺骗,每个路由器都应该丢弃这样的数据包。

# Stop RFC1918 nets on the outside interface
    $fwcmd add deny all from 192.168.0.0:255.255.0.0 to any via ${oif}
    #$fwcmd add deny all from any to 192.168.0.0:255.255.0.0 via ${oif}
    $fwcmd add deny all from 172.16.0.0:255.240.0.0 to any via ${oif}
    $fwcmd add deny all from any to 172.16.0.0:255.240.0.0 via ${oif}
    $fwcmd add deny all from 10.0.0.0:255.0.0.0 to any via ${oif}
    $fwcmd add deny all from any to 10.0.0.0:255.0.0.0 via ${oif}

  RFC1918中定义了一些只用于内部网络的IP地址,这些地址不能用于Internet上的计算机,而只能用于内部网络中。这里禁止从外部网络界面上向内部地址进行数据传输,以防止外部网络向内部网络的地址进行连接,也是防火墙的重要功能之一。

  注意,上例中与系统提供的缺省设置是不同的,将其中对应于实际使用的内部地址的一行加上了注释。这是因为该设置与natd相互冲突,使得natd发送的数据(具备内部网络地址)也被过滤。可以简单的注释对应本地网络地址的设置项,以使得它们能够相互协议,而将保护功能留给natd来完成。如果不使用natd,就不必使用上面的注释。

# Allow TCP through if setup succeeded
    $fwcmd add pass tcp from any to any established

    # Allow setup of incoming email
    $fwcmd add pass tcp from any to ${oip} 25 setup

    # Allow access to our DNS
    $fwcmd add pass tcp from any to ${oip} 53 setup

    # Allow access to our WWW
    $fwcmd add pass tcp from any to ${oip} 80 setup

    # Reject&Log all setup of incoming connections from the outside
    $fwcmd add deny log tcp from any to any in via ${oif} setup

    # Allow setup of any other TCP connection
    $fwcmd add pass tcp from any to any setup

  此后屏蔽除了email,www,dns之外的其他向内部网络的TCP连接请求,而只允许向外进行连接。当实际内部网络要向外提供服务时,再添加连接许可。

# Allow DNS queries out in the world
    $fwcmd add pass udp from any 53 to ${oip}
    $fwcmd add pass udp from ${oip} to any 53

    # Allow NTP queries out in the world
    $fwcmd add pass udp from any 123 to ${oip}
    $fwcmd add pass udp from ${oip} to any 123

    # Everything else is denied as default.

  然后定义UDP连接的限制,同样也只允许DNS和NTP数据包通过,这可以用于屏蔽类似BO之类的远程操纵程序。

elif [ "${firewall_type}" != "UNKNOWN" -a -r "${firewall_type}" ]; then
        $fwcmd ${firewall_type}


fi

  如果使用者喜欢自己定制过滤规则,而不是在系统提供的规则基础上更改,那么可以将规则放入一个文件中,在rc.conf文件中设置firewall_enable=”YES”的基础上,将firewall_type的值改为放置ipfw规则的文件名。这样系统启动时就能够使用ipfw自动执行这些配置。但如果只是对过滤规则的少量更改,就可以直接修改rc.firewall文件。

    * 使用natd设置地址转换

  natd与ipfw相互配合,能够实现网络地址翻译的能力。内核通过一个特定的divert类型的端口,将需要转换的数据包交给natd,而natd转换之后,再发送回内核,由内核再进行转发。它的好处不但是能提供防火墙能力,还能使得内部计算机能共享外部网络地址,这在IP地址空间比较紧张的当前是一个非常有用的技术。

  当应用网络地址翻译时,可供选择的内部IP有:10.0.0.0到10.255.255.255,172.16.0.0到 172.31.255.255,192.168.0.0到192.168.255.255。这些地址由RFC1918中定义为内部地址,不会出现在Internet上。

  FreeBSD下有几种软件能实现部分或全部NAT功能,功能最简单的是用户级ppp提供的alias功能,使用alias参数启动ppp将使ppp将所有来自其他网络介面的数据包中的源IP地址改变为tun0网络界面的IP ,转发到ppp连接上去。这种IP伪装的方式虽然功能简单,但对于拨号将内部网络和Internet连接的用户非常适合。

  设置natd需要以下的步骤,首先设置好包过滤支持,包括内核中的IPFIREWALL和rc.conf中的 gateway_enable参数设置。它需要内核支持IPDIVERT选项,如果没有设置这个选项,就需要重新编译支持这些选项的内核;然后需要为natd指定一个divert端口,用于接收和发送从内核转发过来的包。这需要在/etc/services 中增加一个divert端口的设置:

natd      8668/divert

  然后需要将所有的数据包都发送给相应的divert端口natd,然后由监听这个端口的守护进程natd 接收并转换。

# /sbin/ipfw -f flush
# /sbin/ipfw add divert natd all from any to any via fxp0
# /sbin/ipfw add pass all from any to any

  上面的命令中使用了一个新的ipfw指令divert,这个指令就对符合这个规则的数据包通过divert规定的端口natd进行地址转换。但是divert指令和log和count指令相似,它并没有终止过滤规则,而是继续进行数据包过滤,只是此后的过滤将是针对转换后的数据包进行的了。

  执行了这些ipfw指令之后,而由于还没有启动natd守护进程,那么网络的正常连接都不再能进行了,发送到 divert的端口natd的数据包就被丢掉。直到启动natd进程,通过它进行处理之后,数据包才会正常发送。

  最简单的启动natd的指令为:

# natd -interface fxp1

  此时,natd将内部的向外连接中的内部地址转换为fxp1上的IP地址,而内部网络的计算机必须设置这个防火墙为它们的路由器,以便将数据包交给它进行转发。但由于整个网络对外只表现为一个地址,外部网络并不需要了解这台防火墙的路由能力。

  如果要在系统启动时自动设置地址转换,就需要将这些ipfw/natd的过滤规则与系统启动文件结合在一起。缺省的启动文件已经支持了ipfw/natd,因而仅仅需要打开启动文件中相关设置就可以了。这不但需要在rc.conf 中设置gateway_enable,firewall_enable,还需要设置natd_enable为YE S,以使得自动启动natd守护进程,还需要指定natd使用的网络界面natd_interface的值,帮助将正确的数据包发送给natd,并使系统执行natd时使用正确的参数。而设置项natd_flags用来指定其他natd 需要的参数,例如用于指定natd设置文件等,简单情况下不需要使用这个设置项。

  当打开natd_enable时,将在其他过滤规则之前添加这个过滤规则,但是其他规则同样也会生效,因为当数据包从natd发送回系统之后,系统再对其应用过滤规则。

  不过,由于在natd转换IP地址之后还应用过滤规则,因此这些数据包还有可能被过滤。尤其在同时设置了 firewall_type为simple以执行rc.firewall中的防火墙过滤设置的时候,就需要注意其中与na td相冲突的设置。simple过滤规则中存在屏蔽外部计算机对RFC1918规定的IP地址进行访问的设置,然而n atd将正常通信的数据包中的地址转换为了内部IP地址,因而缺省设置将阻止这些数据包发送到内部计算机中。

  为了和natd协作,必须修改其中过滤设置,以保证经natd转换过的数据包能发到内部计算机上。一般情况下,可以简单的rc.firewall将针对发送到本地网络的过滤规则设置注释掉就可以了,而从本地网络发送到外部网络的数据包在应用过滤规则之前,就已经进行完地址转换了,因此就不受规则影响。前一部分中介绍rc.firewall时,给出了进行注释的例子。另一种方法是调整过滤规则和顺序,将屏蔽这些内部地址的规则放置到divert指令之前。

    * natd的高级设置

  使用-interface参数(或者使用其简写形式-n)启动的natd,可将所有内部网络向外的请求转换为该interface界面使用的IP地址,与外界进行通信。这种方式中,所有的连接中的内部地址不但转换的IP地址,同时也要转换端口地址,以避免地址冲突,并且外部网络只能连接到防火墙,而不能访问内部计算机上的服务。natd还有种种高级设置,使得系统能使用更复杂的地址转换功能。更复杂的情况是防火墙拥有一个合法子网,具有多个可利用的IP地址,此时防火墙对外表现为一个路由器,负责一个内部子网。

  使用natd时,计算机至少必须拥有一个合法的外部地址,用于将内部地址转换为外部地址时使用,当使用 -interface时,这个值被设置为该网络界面绑订的IP地址,如果该网络界面上的IP地址可能改变(例如它被设置为d hcp客户端,或者是PPP连接),-dynamic参数能使natd跟踪该界面上的地址更改。如果不使用-interface 参数指定网络界面,就必须直接使用-alias_address指定natd使用的外部IP地址。alias_address 定义的地址可以是防火墙本身外部网络界面上拥有的合法IP地址之一,也可以是作为路由器的防火墙的内部网络所拥有的合法IP地址之一。

  natd可以使用-redirect_address参数,设置静态IP地址转换,例如使用参数”-redirect_address iip oip”,将内部地址iip与外部地址oip进行映射,则所有发送给oip的连接将被转给内部的iip。

# natd -alias_address 202.102.245.60 -redirect_address 192.168.3.2 202.102.245.17

  上面的命令将使得防火墙使用202.102.245.60作为内部计算机向外连接的缺省地址,而192.168.3.2 被映射为202.102.245.17,可以允许外部网络上的计算机对其进行访问。

  此时外部网络应该将发送往这两个ip地址的数据都发送到这个防火墙上,一般情况下这个防火墙应对外表现为一个路由器,负责将包括这两个IP地址在内的网络连接到外部网络上,而外界网络上的路由器也具有达到它的正确路由。但也可以通过Proxy ARP或在防火墙外部网络界面上绑订多个ip地址的方法来实现。

  为了让外部路由器了解这个防火墙负责的网络,除了在外部路由器上设置静态路由之外,还可以使用动态交换路由协议,将防火墙的路由数据与外部路由器动态交换。这就需要使用与外部路由器相同的路由交换协议,常用的内部路由交换协议有rip, rip 2,以及ospf,其中routed用于支持rip协议,而gated可以支持其他种类的协议。由于路由交换协议是整个网络统一规定的,因此必须根据统一使用。

  另一个非常有用的参数是-redirect-port,它是用于将对某个IP地址固定端口的连接请求,转发至指定内部计算机中。这个参数非常灵活,针对tcp或udp进行设置。例如将对-alias_address定义地址的 http请求转发到内部地址192.168.3.3的另一个端口8080上。

# natd -alias_address 202.102.245.60 -redirect_port tcp 192.168.3.3:8080 80

  当然也可以为其他地址,如202.102.245.17,设置映射。

# natd -alias_address 202.102.245.60    \
-redirect_port tcp 192.168.3.3:8080 202.102.245.17:80

  进一步可以使用-redirect_port为特定的外部计算机的特定连接进行映射。

  还可以使用-f或-config参数指定natd的配置文件,从文件中而非从命令行读取natd的设置,使得设置更为清晰明了。下面的设置文件例子中使用了另外几个很有用的参数。

alias_address                 202.102.245.60
deny_incoming                 yes
unregistered_only        yes
same_ports                        yes
use_sockets                        yes

  deny_incoming用于拒绝向alias_address发起的所有连接请求,用来保护网络内部安全,这个参数可以和-redirect_port参数结合,控制提供的网络服务。

  unregistered_only用于只对RFC1918定义的内部网址进行地址转换,防止出现错误设置影响正常的路由设置。

  same_ports在网络转换时尽量选择与原有数据包相同的端口,这样来保证一些与端口相关的服务能够被尽可能满足,但这并不表示普通的地址转换会百分之百使用同样的端口,在将多个内部转换为一个外部地址时,总会有端口冲突发生的可能,真正要避免冲突,还必须使用-redirect_port直接指定。

  use_sockets允许natd查看ftp、irc等连接的数据内部,以根据内容设置正确的端口,这将占用较多的系统资源,因此一般不要使用这个选项。然而和same_port协作使用,可以支持更复杂的客户程序。

  其他还有一些设置选项,如log参数指定natd将日志记录到/var/log/alias.log文件中, dynamic参数用于和interface参数协作,跟踪网络界面的IP地址改变的信息,等等。

  在设置文件中指定的参数,其形式与在命令行中使用的方式相似,不同之处在于有的参数在配置文件中需指定yes 或no,而在命令行中不需特别指定就意味着使用了yes属性。如直接使用-log而非-log yes。设置好这个设置文件之后,就可以启动natd了。

# natd -f filename

未完,待续。。。  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表