======================================================================
信息过滤问题
--------------
FreeBSD的包过滤工具具有强大的规则设置来过滤你想阻塞的信息,你可以使用
ipfw来实现,不过你需要在内核中有一定的选项设置,如:
需要在编译内核时打开下面选项重新定制内核。
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的接口(摘自王波-FreeBSD使用大全连载)。
你可以建立/etc/firewall.rules建立自己的规则,并把文件设置为600属性,
下面的规则仅供参考:
ipfw -q -f flush
ipfw -q add 00100 allow ip from any to any via lo0
ipfw -q add 00220 deny log ip from me to any in
#syn fin组合的包一般来说是nmap和queso扫描器使用,所以过滤
ipfw -q add 00225 deny log tcp from any to any in tcpflags syn,fin
# 检查通信状态
ipfw -q add 00230 check-state
ipfw -q add 00235 deny tcp from any to any in established
ipfw -q add 00240 allow ip from any to any out keep-state
# 控制icmp包,只能通过icmp类型来限制
ipfw -q add 00300 allow icmp from any to any icmptype 3
ipfw -q add 00301 allow icmp from any to any icmptype 4
ipfw -q add 00302 allow icmp from any to any icmptype 11
# 允许DHCP通过
ipfw -q add 00401 allow udp from 192.168.2.1 67 to any 68
ipfw -q add 00402 allow udp from 192.168.1.1 67 to any 68
# allow ident requests
ipfw -q add 00500 allow tcp from any to any 113 keep-state setup
# log anything that falls through
ipfw -q add 09000 deny log ip from any to any
其实关于规则有很多文章可以参考,这里就不在叙述。
你可以使用下面命令马上激活规则:
# sh /etc/firewall.rules
如果你要在你日志里查看有关丢弃包的记录,你需要如下设置:
# sysctl -w net.inet.ip.fw.verbose=1
如果你要所有这些设置在机器启动时候激活,编辑/etc/rc.conf增加如下条目:
firewall_enable="YES"
firewall_logging="YES"
firewall_script="/etc/firewall.rules"
最好你如果要记录这些信息进行调试,不要忘了在/etc/syslog.conf中增加如下
条目:
!ipfw
*.* /var/log/ipfw.log
记得在/etc/newsyslog.conf中设置如下选项:
/var/log/ipfw.log 600 3 100 * Z
=========================================================================
用户资源限制问题
---------------
从 4.3 BSD Net/2开始,BSD Unix引入了登录类别这种分类机制来管理用户使用的资源、记账和环境设置。FreeBSD系统使用/etc/login.conf中描述的数据来将用户按照登录环境、强制性的资源限制以及记账管理等分为不同的登录类别,每个用户的登录类别记录在/etc/master.passwd中的该用户的设置中。以下是一个缺省安装的/etc/login.conf的部份内容。
bash-2.03# cat login.conf
---------------------snip----------------------
default:\
:copyright=/etc/COPYRIGHT:\
:welcome=/etc/motd:\
:setenv=MAIL=/var/mail/$,BLOCKSIZE=K,FTP_PASSIVE_MODE=YES:\
:path=~/bin /bin /usr/bin /usr/local/bin /usr/X11R6/bin:\
:nologin=/var/run/nologin:\
:cputime=unlimited:\
:datasize=unlimited:\
:stacksize=unlimited:\
:memorylocked=unlimited:\
:memoryuse=unlimited:\
:filesize=unlimited:\
:coredumpsize=unlimited:\
:openfiles=unlimited:\
:maxproc=unlimited:\
:priority=0:\
:ignoretime@:\
:umask=022:
#
# A collection of common class names - forward them all to ';default';
# (login would normally do this anyway, but having a class name
# here suppresses the diagnostic)
#
standard:\
:tc=default:
xuser:\
:tc=default:
staff:\
:tc=default:
daemon:\
:tc=default:
news:\
:tc=default:
dialer:\
:tc=default:
#
# Root can always login
#
# N.B. login_getpwclass(3) will use this entry for the root account,
# in preference to ';default';.
root:\
:ignorenologin:\
:tc=default:
---------------------snip----------------------
利用login.conf可以方便地对用户的登录环境和资源许可进行设置,缺省的设置对用户所能使用的资源几乎没有限制,可以把login.conf改为如下内容:
---------------------snip----------------------
default:\
:cputime=infinity:\
:datasize-cur=64M:\
:stacksize-cur=64M:\
:memorylocked-cur=10M:\
:memoryuse-cur=100M:\
:filesize=infinity:\
:coredumpsize=infinity:\
:maxproc-cur=64:\
:openfiles-cur=64:\
:priority=0:\
:requirehome@:\
:umask=022:\
:tc=auth-defaults:
---------------------snip----------------------
上面设置了default登录类别中的几个参数,如果没有在master.passwd文件中明确指定用户的登录类别,就使用这个缺省类别来作为用户的登录类别。
cputime设置了用户的每个进程可以使用的CPU时间,缺省是无限制(infinity)。如果加以限制,有些需要大量CPU时间进行运算的进程就不能正常执行到结束。
datasize-cur设置了用户使用的数据段最大为64M,但-cur设置不是强制的,用户实际使用的数据有可能超过这个值,但最大不能超过datasize-max设置的值(缺省没有设置)。如果没有-cur和-max 后缀,仅仅定义datasize,则表示datasize-cur和datasize-max同样都为datasize 设置的值。同样stacksize定义了对栈的限制。
memorylocked-cur设置了用户每进程可以锁定的最大内存。
memoryuse-cur设置了每进程使用的最大内存。
filesize-cur设置了用户产生的文件大小。
coredumpsize设置了在应用程序发生问题时产生的core dump文件的大小。
maxproc-cur设置了用户可以同时执行的最大进程数。
openfiles-cur设置了每进程最多打开的文件数。
priority设置用户进程的优先级。
requirehome设置用户登录时是否需要主目录,@符号表示不需要主目录。
umask项设置缺省的umask,用于用户创建文件的属性。
tc设置系统认证策略为使用缺省的认证策略。
如果要创建新类别,并不需要对每个值都重新设置,系统缺省先应用default类别的设置,然后再应用具体类别的设置,因此只需要设置与default类别不同的项就可以了。
---------------------snip----------------------
users:\
:manpath=/usr/share/man /usr/X11R6/man /usr/local/man:\
:cputime=4h:\
:openfiles=32:\
:maxproc=48:\
:tc=default:
---------------------snip----------------------
上面是设置了一个新类users,可以看出它为用户设置了环境变量MANPATH,并重置了cputtime 、openfile、maxproc和tc的值。每次更改login.conf之后,都要进行更新登录类别数据库的操作。
bash-2.03# cap_mkdb /etc/login.conf
由于登录类别保存在master.passwd文件中,通常在使用adduser添加用户的时候设置用户的登录类别。如果要进行更改,必须使用vipw来修改/etc/master.passwd文件的第5个域。下面为master.passwd 中的一行,该行指定这个用户的登录类别为user:
缺省为:
bash-2.03# cat master.passwd
# $FreeBSD: src/etc/master.passwd,v 1.25 1999/09/13 17:09:07 peter Exp $
inburst:TioxhDpCtDaRE:1004:0::0:0:stardust:/home/stardust:/usr/local/bin/bash
改为:
inburst:TioxhDpCtDaRE:1004:0:users:0:0:stardust:/home/stardust:/usr/local/bin/bash
设定系统中用户的可用空间也是系统免受本地拒绝服务攻击重要的一方面,在未设定 quota 的系统上的用户可以随意的灌爆硬盘。要把 quota这项功能打开,可以修改 /etc/rc.conf 中的这项设定:
check_quotas="NO" # Check quotas (or NO).
改成
check_quotas="YES" # Check quotas (or NO).