免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7914 | 回复: 18
打印 上一主题 下一主题

有没有人有兴趣和我探讨一下基于pf的web服务器安全? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-05-15 10:06 |只看该作者 |倒序浏览
假想的配只是这样的,只有一块网卡 fxp0,我们现在要求使用pf和ALTQ使得这个机器只能使用ssh,http,ftp。我想这可能是大多数站长的共同需要。


第一步,我们把pf加入内核


  1. options INET6  
  2. ###############pf firewall####################
  3. device pf #PF OpenBSD packet-filter firewall
  4. device pflog #logging support interface for PF
  5. device pfsync #synchronization interface for PF
  6. #options ALTQ
  7. #options ALTQ_CBQ # Class Bases Queuing (CBQ)
  8. #options ALTQ_RED # Random Early Detection (RED)
  9. #options ALTQ_RIO # RED In/Out
  10. #options ALTQ_HFSC # Hierarchical Packet Scheduler (HFSC)
  11. #options ALTQ_PRIQ # Priority Queuing (PRIQ)
  12. #options ALTQ_NOPCC # Required for SMP build

复制代码


cd /usr/src

make buildkernel KERNCONF=web
make installkernel KERNCONF=web


第二步  设置 /etc/rc.conf


  1. pf_enable="YES"
  2. pflog_enable="YES"
复制代码



第三步  配置 /etc/pf.conf (这个有点模糊,请大家帮助)

  1. pass in quick on { $loop, $ext_if } all keep state
  2. pass out quick on { $loop, $ext_if } all keep state

  3. block drop quick on { $loop, $ext_if } all
复制代码

论坛徽章:
0
2 [报告]
发表于 2007-05-15 11:10 |只看该作者
防火墙技术(PF:OpenBSD数据包过滤)(四)2006年11月27日 星期一 下午 05:54PF: 数据包标记


------------------------------------------------------------------------------

目录

* 简介
* 给数据包打标记
* 检查数据包标记
* 过滤策略
* 标记以太网的帧

------------------------------------------------------------------------------

简介
数据包标记是给数据包打内部标记的方法,以后可以在过滤和转换规则中使用。使用标记,有可能做这样的事情,比如在接口间产生信任关系,或者确定数据包是否已经经过了转换规则处理。也可能从基于规则的过滤中移出,开始执行基于策略的过滤。
.

给数据包打标记

要给数据包打标记,使用tag 关键字:

pass in on $int_if all tag INTERNAL_NET keep state

标记 INTERNAL_NET 会增加到任何匹配上述规则的数据包中。
注意keep state的使用; keep state (或者 modulate state/synproxy state) 在标记数据包通过的规则中使用。

标记也可以通过宏来打,比如:

name = "INTERNAL_NET"
pass in on $int_if all tag $name keep state

有一组预先定义的宏也可以被使用。

* $if - 接口
* $srcaddr - 源 IP 地址
* $dstaddr - 目的 IP 地址
* $srcport - 源端口
* $dstport - 目的端口
* $proto - 协议
* $nr - 规则号

这些宏在规则集装入时扩展,而不是运行时。

标记遵循以下规则:

* 标记是粘性的。一旦一个标记被匹配的规则打到一个数据包,就不能被删除。但它可以被不同的标记替换。
* 由于标记的粘性,打了标记的数据包会一直保持,即使所有的规则都没有使用这个标记。
* 一个数据包一次最多只能打一个标记。
* 标记是内部标识符,标记不会被送到网上。

看看下面的例子:

(1) pass in on $int_if tag INT_NET keep state
(2) pass in quick on $int_if proto tcp to port 80 tag \
INT_NET_HTTP keep state
(3) pass in quick on $int_if from 192.168.1.5 keep state

* 按照规则1,$int_if 接口上收到的数据包会打上INT_NET 标记。
* $int_if 接口上收到的目标端口80的数据包根据规则1首先打上INT_NET 标记,然后根据规则2,被INT_NET_HTTP 标记替代。
* $int_if 接口上收到的来自192.168.1.5的数据包根据规则3会方向,由于这是最终匹配规则,因此如果它们的目标端口是80,则标记是INT_NET_HTTP ,否则标记是INT_NET 。

标记除了适用于过滤规则以外, nat, rdr, binat转换规则也可以用tag关键字使用标记。

检查数据包标记

要检查先前已经打的标记,可以使用tagged关键字:

pass out on $ext_if tagged INT_NET keep state

在$ext_if输出的数据包为了匹配上述规则必须打上INT_NET标记。反转匹配也可以使用!操作:

pass out on $ext_if tagged ! WIFI_NET keep state

策略过滤

过滤策略提供了编写过滤规则集的不同方法。定义的策略设定规则,说明哪种流量放行,哪种流量阻塞。数据包被基于传统的标准如源/目的IP地址,协议等等分配到不同的策略。例如,检查下面的防火墙策略:

* 自内部LAN到DMZ的流量是允许的 (LAN_DMZ)。
* 自因特网到DMZ的服务器流量是允许的。 (INET_DMZ)
* 自因特网被重定向到spamd(8)是允许的 (SPAMD)
* 其他所有流量阻塞。

注意策略是如何覆盖所有通过防火墙的流量的。括号里面的项目指示这个策略项目将使用的标记。

需要过滤和转换规则来把数据包分配到不同的策略。

rdr on $ext_if proto tcp from to port smtp \
tag SPAMD -> 127.0.0.1 port 8025

block all
pass in on $int_if from $int_net tag LAN_INET keep state
pass in on $int_if from $int_net to $dmz_net tag LAN_DMZ keep state
pass in on $ext_if proto tcp to $www_server port 80 tag INET_DMZ keep
state

现在要设置定义策略的规则。

pass in quick on $ext_if tagged SPAMD keep state
pass out quick on $ext_if tagged LAN_INET keep state
pass out quick on $dmz_if tagged LAN_DMZ keep state
pass out quick on $dmz_if tagged INET_DMZ keep state

现在要建立整个规则集,修改分类规则。例如,如果pop3/SMTP服务器增加到了DMZ区,就需要增加针对POP3和SMTP流量的分类,如下:

mail_server = "192.168.0.10"
...
pass in on $ext_if proto tcp to $mail_server port { smtp, pop3 } \
tag INET_DMZ keep state

Email 流量会作为INET-DMZ策略的条目被放行。t
完整的规则:

# macros
int_if = "dc0"
dmz_if = "dc1"
ext_if = "ep0"
int_net = "10.0.0.0/24"
dmz_net = "192.168.0.0/24"
www_server = "192.168.0.5"
mail_server = "192.168.0.10"

table persist file "/etc/spammers"

# classification -- classify packets based on the defined firewall
# policy.
rdr on $ext_if proto tcp from to port smtp \
tag SPAMD -> 127.0.0.1 port 8025

block all
pass in on $int_if from $int_net tag LAN_INET keep state
pass in on $int_if from $int_net to $dmz_net tag LAN_DMZ keep state
pass in on $ext_if proto tcp to $www_server port 80 tag INET_DMZ keep state
pass in on $ext_if proto tcp to $mail_server port { smtp, pop3 } \
tag INET_DMZ keep state

# policy enforcement -- pass/block based on the defined firewall policy.
pass in quick on $ext_if tagged SPAMD keep state
pass out quick on $ext_if tagged LAN_INET keep state
pass out quick on $dmz_if tagged LAN_DMZ keep state
pass out quick on $dmz_if tagged INET_DMZ keep state

标记以太网帧

打标记可以在以太网级别进行,如果执行标记/过滤的机器同时做为网桥。通过创建使用tag关键字的网桥过滤规则,PF可以建立基于源/目的MAC地址的过滤规则。网桥规则可以由brconfig(8)命令产生,例如:

# brconfig bridge0 rule pass in on fxp0 src 0:de:ad:be:ef:0 \
tag USER1

然后在 pf.conf文件中:

pass in on fxp0 tagged USER1

------------------------------------------------------------------------------
$OpenBSD: tagging.html,v 1.4 2004/05/07 01:55:24 nick Exp $
==============================================================================
* 附加主题


PF: 日志

------------------------------------------------------------------------------

目录

* 简介
* 读取日志文件
* 导出日志
* 通过Syslog记录日志

------------------------------------------------------------------------------

简介

PF的包日志是由pflogd(8)完成的,它通过监听pflog0接口然后将包以tcpdump(8)二进制格式写入日志文件(一般在/val/log/pflog)。过滤规则定义的日志和log-all关键字所定义的日志都是以这种方式记录的。

读取日志文件

由pflogd生成的二进制格式日志文件不能通过文本编辑器读取,必须使用Tcpdump来查看日志。

使用如下格式查看日志信息:

# tcpdump -n -e -ttt -r /var/log/pflog

使用tcpdump( 查看日志文件并不是实时的,若要实时查询日志信息需加上pflog0参数:

# tcpdump -n -e -ttt -i pflog0

注意:当查看日志时需要特别注意tcpdump的详细协议解码(通过在命令行增加-v参数实现)。
Tcpdump的详细协议解码器并不具备完美的安全历史,至少在理论上是这样。日志记录设备所记载的部分包信息可能会引发延时攻击,因此推荐在查询日志文件信息之前先将该日志文件从防火墙上移走。

另外需要注意的是对日志文件的安全访问。默认情况下,pflogd 将在日志文件中记录96字节的包信息。访问日志文件将提供访问部分敏感包信息的途径(就像telnet(1)或者ftp(1)的用户名和密码)。

导出日志

由于pflogd以tcpdump二进制格式记录日志信息,因此当回顾这些日志时可以使用tcpdump的很多特点。例如,只查看与特定端口匹配的包:

# tcpdump -n -e -ttt -r /var/log/pflog port 80

甚至可以限定具体的主机和端口:

# tcpdump -n -e -ttt -r /var/log/pflog port 80 and host 192.168.1.3

同样的方法可以应用到直接从pflog0接口读取的信息:

# tcpdump -n -e -ttt -i pflog0 host 192.168.4.2

注意这与包被记录到pflogd日志文件不相冲突;上述语句只以包被记录的形式显示。

除了使用标准的tcpdump(8)过滤规则外,OpenBSD的tcpdump过滤语言为读取pflogd而被扩展:

* ip -IPv4版本地址。
* ip6 - IPv6版本地址。
* on int - 包通过int接口。
* ifname int - 与 on int相同.
* rulenum num - 包匹配的过滤规则编号为num。
* action act - 对包的操作。可能是pass(通过)或者block(阻断)。
* reason res - 执行对包操作的原因。可能的原因是match(匹配), bad-offset, fragment, short, normalize(规格化), memory(内存)。
* inbound -入栈包。
* outbound - 出栈包。

举例:

# tcpdump -n -e -ttt -i pflog0 inbound and action block and on wi0

这将以实时方式显示被wi0接口阻断的入栈包的日志信息。

通过Syslog记录日志

很多情况下需要将防火墙的日志记录以ASCII代码格式存储,或者(同时)把这些日志存到远程的日志服务器上。这些可以通过两个小的脚本文件实现,是对 openbsd配置文件和syslogd(8),日志守护进程的少许修改。Syslogd进程以ASCII格式存储日志,同时可以将日志存储到远程日志服 务器。

首先我们必须建立一个用户,pflogger,使用 /sbin/nologin shell.最简单的建立用户的方法是使用adduser(8)。

完成后建立如下两个脚本:

/etc/pflogrotate
FILE=/home/pflogger/pflog5min.$(date "+%Y%m%d%H%M")
kill -ALRM $(cat /var/run/pflogd.pid)
if [ $(ls -l /var/log/pflog | cut -d " " -f -gt 24 ]; then
mv /var/log/pflog $FILE
chown pflogger $FILE
kill -HUP $(cat /var/run/pflogd.pid)
fi

/home/pflogger/pfl2sysl
for logfile in /home/pflogger/pflog5min* ; do
tcpdump -n -e -ttt -r $logfile | logger -t pf -p local0.info
rm $logfile
done

编辑root的cron 任务:

# crontab -u root -e

增加如下两行:

# rotate pf log file every 5 minutes
0-59/5 * * * * /bin/sh /etc/pflogrotate

为用户pflogger建立一个cron任务:

# crontab -u pflogger -e

增加如下两行:

# feed rotated pflog file(s) to syslog
0-59/5 * * * * /bin/sh /home/pflogger/pfl2sysl

将下行增加到 /etc/syslog.conf:

local0.info /var/log/pflog.txt

如果需要日志记录到远程日志服务器,增加:

local0.info @syslogger

确定主机syslogger已在hosts(5)中定义。

建立文件 /var/log/pflog.txt 使 syslog 可以向该文件写入日志:

# touch /var/log/pflog.txt

重启syslogd使变化生效:

论坛徽章:
0
3 [报告]
发表于 2007-05-15 11:11 |只看该作者
# kill -HUP $(cat /var/run/syslog.pid)

所有符合标准的包将被写入/var/log/pflog.txt. 如果增加了第二行,这些信息也将被存入远程日志服务器syslogger。

脚本 /etc/pflogrotate 将执行,然后删除 /var/log/pflog ,因此
rotation of pflog by newsyslog(Cool 不再必需可以被禁用。然而, /var/log/pflog.txt 替代 /var/log/pflog and rotation of it 要被启用。 改变 /etc/newsyslog.conf 如下:

#/var/log/pflog 600 3 250 * ZB /var/run/pflogd.pid
/var/log/pflog.txt 600 7 * 24

PF 将日志以ASCII格式记录到/var/log/pflog.txt. 如果这样配置 /etc/syslog.conf, 系统将把日志存到远程服务器。存储过程不会马上发生,但是会在符合条件的包出现在文件中前5-6分钟实现。
------------------------------------------------------------------------------
$OpenBSD: logging.html,v 1.15 2004/05/07 01:55:23 nick Exp $
==============================================================================

PF: 性能

------------------------------------------------------------------------------

“PF可以处理多少带宽?”
“我需要多少台计算机处理因特网连接?”

这个问题没有简单的答案。对于一些应用程序来说,一台486/66主机,带有2个比较好的ISA网卡在做过滤和NAT时接近5Mbps,但是对于其他应用程序,一个更快的计算机加上更有效的PCI网卡也会显得能力不足。真正的问题不是每秒处理的位数而是每秒处理的包数和规则集的复杂程度。

体现PF性能的几个参数:

* 每秒处理包的数量. 一个1500字节的包和一个只有1个字节的包所需要的处理过程的数目几乎是一样的。每秒处理包的数量标志着状态表和过滤规则集在每秒内被评估的次数 ,标志着一个系统最有效的需求(在没有匹配的情况下)。
* 系统总线性能. ISA 总线最大带宽 8MB/秒, 当处理器访问它时, 它必须降速到80286的有效速度,不管处理器的真实处理速度如何,PCI总线有更有效的带宽,与处理器的冲突更小。
* 网卡的效率. 一些网卡的工作效率要高于其他网卡。 基于Realtek 8139 (rl(4)) 的网卡性能较低,而基于 Intel 21143 (dc(4)) 的网卡性能较好。为了取得更好的性能,建议使用千兆网卡,尽管所连接的网络不是千兆网,这些千兆网卡拥有高级的缓存,可以大幅提高性能。
* 规则集的设计和复杂性。规则越复杂越慢。越多的包通过keep和quick方式过滤,性能越好。对每个包的策略越多,性能越差。
* 值得一提: CPU 和内存。由于PF是基于内核的进程,它不需要swap空间。所以,如果你有足够的内存,它将运行很好,如果没有,将受影响。不需要太大量的内存。 32MB内存对小型办公室或者家庭应用足够,300MHz的cpu如果配置好网卡和规则集,足够满足要求。

人们经常询问PF的基准点。唯一的基准是在一个环境下系统的性能。不考虑环境因素将影响所设计的防火墙的系统性能。

PF 曾经在非常大流量的系统中工作,同时PF的开发者也是它的忠实用户。

------------------------------------------------------------------------------
$OpenBSD: perf.html,v 1.14 2004/05/07 01:55:24 nick Exp $
==============================================================================

PF: 研究 FTP

------------------------------------------------------------------------------

目录

* FTP 模式
* 工作在防火墙之后的FTP客户端
* PF "自保护" FTP服务器
* 被运行NAT的外部PF防火墙所保护的FTP服务器
* FTP的更多信息

------------------------------------------------------------------------------

FTP 模式

FTP是一种协议,它可以追溯到因特网发展初期,那时的因特网规模小,联网的计算机彼此友好,过滤和严格安全性在那时不是必须的。FTP设计之初就没有考虑包过滤、穿透防火墙和NAT。

FTP的工作模式分为被动(passive)和主动(active)两种。通常这两种选择被用来确定哪边有防火墙问题。实际上,为了方便用户你应该全部支持这两种模式。

在active模式下,当用户访问远程FTP服务器并请求一个文件信息时,那台FTP服务器将与该用户建立一个新的连接用来传输请求的数据,这被称为数据连接。具体过程为:客户端随机选择一个端口号,在该端口监听的同时将端口号传给服务器,由服务器向客户端的该端口发起连接请求,然后传递数据。在 NAT后的用户访问FTP服务器的时候会出现问题,由于NAT的工作机制,服务器将向NAT网关的外部地址的所选端口发起连接,NAT网关收到该信息后将在自己的状态表中查找该端口对应的内部主机,由于状态表中不存在这样的记录,因此该包被丢弃,导致无法建立连接。

在passive模式下(OpenBSD的ftp客户端默认模式),由客户端请求服务器随机选择一个端口并在此端口监听,服务器通知客户端它所选择的端口号,等待客户端连接。不幸的是,ftp服务器前的防火墙可能会阻断客户端发往服务器的请求信息。OpenBSD的ftp(1)默认使用 passive模式;要强制改为active模式,使用-A参数,或者在“ftp>”提示符下使用命令“passive off”关闭 passive模式。

工作在防火墙之后的FTP客户端

如前所述,FTP对NAT和防火墙支持不好。

包过滤机制通过将FTP数据包重定向到一个FTP代理服务器解决这一问题。这一过程将引导FTP数据包通过NAT网关/防火墙。OpenBSD和PF使用的FTP代理是ftp-proxy(8),可以通过在pf.conf中的NAT章节增加下列信息激活该代理:

rdr on $int_if proto tcp from any to any port 21 -> 127.0.0.1 \
port 8021

这条语句的解释为:在内部接口上的ftp数据包被重定向到本机的8021端口

显然该代理服务器应该已在OpenBSD中启动并运行。配置方法为在/etc/inetd.conf中增加下列信息:

127.0.0.1:8021 stream tcp nowait root /usr/libexec/ftp-proxy \
ftp-proxy

重启系统或者通过下列命令发送一个‘HUP’标记来生效:

kill -HUP `cat /var/run/inetd.pid`

ftp代理在8021端口监听,上面的rdr语句也是将数据包转发到这一端口。这一端口号是可选的,因为8021端口没有被其他应用程序占用,因此不失为一个好的选择。

请注意ftp-proxy(8)是用来帮助位于PF过滤器后的ftp客户端传递信息;并不用于PF过滤器后的ftp服务器。

PF“自保护”FTP服务器

当PF运行在一个FTP服务器上,而不是单独的一台防火墙。这种情况下处理passive模式的FTP连接请求时FTP服务器将随机取一个较大的 TCP端口接收数据。默认情况下OpenBSD的本地FTP服务器ftpd(8)使用49152~65535范围内的端口,显然,必须要有对应的过滤规则放行这些端口的数据:

pass in on $ext_if proto tcp from any to any port 21 keep state
pass in on $ext_if proto tcp from any to any port > 49151 \
keep state

如果需要可以调整上述端口范围。在OpenBSD的ftpd(8)环境下,可以通过sysctl(8)进行调整 net.inet.ip.porthifirst 和net.inet.ip.porthilast。

使用NAT外部 PF防火墙保护FTP服务器

这种情况下,防火墙必须将数据重定向到FTP服务器。为了讨论方便,我们假设该FTP服务器使用标准的OpenBSD ftpd(8),并使用默认端口范围。

这里有个例子

ftp_server = "10.0.3.21"

rdr on $ext_if proto tcp from any to any port 21 -> $ftp_server \
port 21
rdr on $ext_if proto tcp from any to any port 49152:65535 -> \
$ftp_server port 49152:65535

# in on $ext_if
pass in quick on $ext_if proto tcp from any to $ftp_server \
port 21 keep state
pass in quick on $ext_if proto tcp from any to $ftp_server \
port > 49151 keep state

# out on $int_if
pass out quick on $int_if proto tcp from any to $ftp_server \
port 21 keep state
pass out quick on $int_if proto tcp from any to $ftp_server \
port > 49151 keep state
FTP的更多信息
过滤FTP和FTP如何工作的更多信息可以参考下面的白皮书。
ftp reviewed!(原文有超级链接)
------------------------------------------------------------------------------
$OpenBSD: ftp.html,v 1.14 2004/05/07 01:55:23 nick Exp $
==============================================================================

PF: pf验证: 用Shell 进行网关验证

------------------------------------------------------------------------------

目录

* 简介
* 配置
+ 将authpf连入主策略集
+ 配置加载的策略
+ 访问控制列表
+ 将authpf配置为用户shell
* 查看登陆者
* 更多信息
* 实例

------------------------------------------------------------------------------

简介

Authpf(Cool是身份认证网关的用户shell。身份认证网关类似于普通网关,只不过用户必须在网关上通过身份验证后才能使用该网关。当用户 shell被设置为/usr/sbin/authpf时(例如,代替了ksh(1),csh(1)等),并且用户通过SSH登录,authpf将对pf (4)策略集做必要的修改以便该用户的数据包可以通过过滤器或者(和)使用NAT、重定向功能。一旦用户退出登录或者连接被断开,authpf将移除加载到该用户上的所有策略,同时关闭该用户打开的所有会话。因此,只有当用户保持着他的SSH会话进程时他才具备透过防火墙发送数据包的能力。

Authpf通过向附加到锚点的命名策略集增加策略来改变pf(4)的策略集。每次用户进行身份验证,authpf建立一个新的命名策略集,并将已经配置好的filter、nat、binat和rdr规则加载上去。被authpf所加载的策略可以被配置为针对单独的一个用户相关或者针对总体。

Authpf可以应用在:

* 在允许用户访问因特网之前进行身份验证。
* 赋予特殊用户访问受限网络的权利,例如管理员。
* 只允许特定的无线网络用户访问特定的网络。
* 允许公司员工在任何时候访问公司网络,而公司之外的用户不能访问,并可以将这些用户重定向到特定的基于用户名的资源(例如他们自己的桌面)。
* 在类似图书馆这样的地方通过PF限制guest用户对因特网的访问。Authpf可以用来向已注册用户开放完全的因特网连接。

Authpf通过syslogd(8)记录每一个成功通过身份验证用户的用户名、IP地址、开始结束时间。通过这些信息,管理员可以确定谁在何时登陆,也使得用户对其网络流量负责。

配置

配置authpf的基本步骤大致描述如下。详细的信息请查看man手册。

将authpf连入主策略集

通过使用锚点策略将authpf连入主策略集:

nat-anchor authpf
rdr-anchor authpf
binat-anchor authpf
anchor authpf

锚点策略放入策略集的位置就是PF中断执行主策略集转为执行authpf策略的位置。上述4个锚点策略并不需要全部存在,例如,当authpf没有被设置加载任何nat策略时,nat-anchor策略可被省略。

配置加载的策略

Authpf通过下面两个文件之一加载策略:

* /etc/authpf/users/$USER/authpf.rules
* /etc/authpf/authpf.rules

第一个文件包含只有当用户$USER(将被替换为具体的用户名)登录时才被加载的策略。当特殊用户(例如管理员)需要一系列不同于其他默认用户的策略集时可以使用每用户策略配置。第二个文件包含没定义自己的authpf.rules文件的用户所默认加载的策略。如果用户定义的文件存在,将覆盖默认文件。这两个文件至少存在其一,否则authpf将不会工作。

过滤器和传输策略与其他的PF策略集语法一样,但有一点不同:authpf允许使用预先定义的宏:

* $user_ip – 登录用户的IP地址
* $user_id – 登录用户的用户名

推荐使用宏$user_ip,只赋予通过身份验证的计算机透过防火墙的权限。

访问控制列表

可以通过在/etc/authpf/banned/目录下建立以用户名命名的文件来阻止该用户使用authpf。文件的内容将在authpf断开与该用户的连接之前显示给他,这为通知该用户被禁止访问的原因并告知他解决问题联系人提供了一个便捷的途径。

相反,有可能只允许特定的用户访问,这时可以将这些用户的用户名写入/etc/authpf/authpf.allow文件。如果该文件不存在或者文件中输入了“*”,则authpf将允许任何成功通过SSH登录的用户进行访问(没有被明确禁止的用户)。

如果authpf不能断定一个用户名是被允许还是禁止,它将打印一个摘要信息并断开该用户的连接。明确禁止将会使明确允许失效。

将authpf配置为用户shell

authpf必须作为用户的登录shell才能正常工作。当用户成功通过sshd(8)登录后,authpf将被作为用户的shell执行。它将检查该用户是否有权使用authpf,并从适当的文件中加载策略,等等。

有两种途径将authpf设置为用户shell:

1.为每个用户手动使用chsh(1), vipw(Cool, useradd(Cool, usermod(Cool,等。
2.通过把一些用户分配到一个登录类,在文件/etc/login.conf中改变这个登录类的shell属性

查看登陆者

一旦用户成功登录,并且authpf调整了PF的策略,authpf将改变它的进程名以显示登录者的用户名和IP地址:

# ps -ax | grep authpf
23664 p0 Is+ 0:00.11 -authpf: charlie@192.168 (authpf)

在这里用户chalie从IP地址为192.168.1.3的主机登录。用户可以通过向authpf进程发送SIGTERM信号退出登录。Authpf也将移除加载到该用户上的策略并关闭任何该用户打开的会话连接。

# kill -TERM 23664

更多信息

请查询man手册

实例

OpenBSD网关通过authpf对一个大型校园无线网的用户进行身份验证。一旦某个用户验证通过,假设他不在禁用列表中,他将被允许SSH并访问网页(包括安全网站https),也可以访问该校园的任一个DNS服务器。

文件 /etc/authpf/authpf.rules包含下列策略:

wifi_if = "wi0"
dns_servers = "{ 10.0.1.56, 10.0.2.56 }"

pass in quick on $wifi_if proto udp from $user_ip to $dns_servers \
port domain keep state
pass in quick on $wifi_if proto tcp from $user_ip to port { ssh, http, \
https } flags S/SA keep state

管理员charlie除了网页冲浪和使用SSH外还需要访问校园网的SMTP和POP3服务器。下列策略被配置在/etc/authpf/users/charlie/authpf.rules 中:


wifi_if = "wi0"
smtp_server = "10.0.1.50"
pop3_server = "10.0.1.51"
dns_servers = "{ 10.0.1.56, 10.0.2.56 }"

pass in quick on $wifi_if proto udp from $user_ip to $dns_servers \
port domain keep state
pass in quick on $wifi_if proto tcp from $user_ip to $smtp_server \
port smtp flags S/SA keep state
pass in quick on $wifi_if proto tcp from $user_ip to $pop3_server \
port pop3 flags S/SA keep state
pass in quick on $wifi_if proto tcp from $user_ip to port { ssh, http, \
https } flags S/SA keep state

定义在/etc/pf.conf中的主策略集配置如下:

# macros
wifi_if = "wi0"
ext_if = "fxp0"

scrub in all

# filter
block drop all

pass out quick on $ext_if proto tcp from $wifi_if:network flags S/SA \
modulate state
pass out quick on $ext_if proto { udp, icmp } from $wifi_if:network \
keep state

pass in quick on $wifi_if proto tcp from $wifi_if:network to $wifi_if \
port ssh flags S/SA keep state

anchor authpf in on $wifi_if

论坛徽章:
0
4 [报告]
发表于 2007-05-15 11:11 |只看该作者
该策略集非常简单,作用如下:

* 阻断所有(默认拒绝)。
* 放行外部网卡接口上的来自无线网络并流向外部的TCP,UDP和ICMP数据包。
* 放行来自无线网络,目的地址为网关本身的SSH数据包。该策略是用户登录所必须的。
* 在无线网络接口上为流入数据建立锚点“authpf”。

设计主策略集的主导思想为:阻断任何包并允许尽可能小的数据流通过。在外部接口上流出数据包是允许的,但是默认否策略阻断了由无线接口进入的数据包。用户一旦通过验证,他们的数据包被允许通过无线接口进入并穿过网关到达其他网络。

------------------------------------------------------------------------------
$OpenBSD: authpf.html,v 1.7 2004/05/07 01:55:23 nick Exp $
==============================================================================
实例:家庭和小型办公室防火墙
PF: 实例:家庭和小型办公室防火墙

------------------------------------------------------------------------------

目录

* 概况
+ 网络
+ 目标
+ 准备
* 规则集
+ 宏
+ 选项
+ 规格化
+ NAT
+ 重定向
+ 过滤规则
* 完整规则集

------------------------------------------------------------------------------

概况

在这个例子中,PF作为防火墙和NAT网关运行在OpenBSD机器上,为家庭或办公室的小型网络提供服务。总的目标是向内部网提供因特网接入,允许从因特网到防火墙的限制访问。下面将详细描述:

网络

网络配置如下:

[ COMP1 ] [ COMP3 ]
| | ADSL
---+------+-----+------- fxp0 [ OpenBSD ] ep0 -------- ( 因特网 )
|
[ COMP2 ]


内部网有若干机器,图中只划出了3台,这些机器除了COMP3之外主要进行网页冲浪、电子邮件、聊天等;COMP3运行一个小型web服务器。内部网使用192.168.0.0/24网段。

OpenBSD网关运行在 Pentium 100计算机上,装有两块网卡:一个3com 3c509B(ep0),另一个 Intel EtherExpress Pro/100(fxp0)。该网关通过ADSL连接到因特网,同时通过NAT向内网共享因特网连接。外部网卡的 IP地址动态分配。

目标

* 向内部网络的每台计算机提供无限制的因特网接入。
* 启用一条“默认拒绝”策略。
* 允许下列来自因特网的请求访问防火墙:
+ SSH (TCP 端口 22): 用来远程维护防火墙。
+ Auth/Ident (TCP 端口 113): SMTP和IRC服务用到的端口。
+ ICMP Echo Requests: ping(8)用到的ICMP包类型。
* 重定向访问80端口(访问web的请求)的请求到计算机COMP3,同时,允许指向COMP3计算机的80端口的数据流过防火墙。
* 记录外部网卡接口上的过滤日志。
* 默认为阻断的包返回一个 TCP RST 或者 ICMP Unreachable 信息。
* 尽量保持策略集简单并易于维护。

准备

这里假设作为网关的OpenBSD主机已经配置完成,包括IP网络配置,因特网连接和设置net.inet.ip.forwarding 的值为1。

规则集

下面将逐步建立策略集以满足上诉要求。



定义下列宏以增强策略集的可维护性和可读性:

int_if = "fxp0"
ext_if = "ep0"

tcp_services = "{ 22, 113 }"
icmp_types = "echoreq"

priv_nets = "{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8 }"

comp3 = "192.168.0.3"

前两行定义了发生过滤的网络接口。第3、4行定义了向因特网开放的服务端口号(SSH和ident/auth)和允许访问防火墙的ICMP包类型。第5行定义了回送地址段和RFC1918定义的私有地址段。最后一行定义了主机COMP3的IP地址。

注意:如果ADSL接入因特网需要PPPoE,则过滤和NAT将发生在tun0接口上而不是ep0接口。

选项

下列两个选项用来设置阻断后的默认操作为反馈,并在外部接口设置开启日志记录:

set block-policy return
set loginterface $ext_if

流量整修

没有理由不起用对所有进入防火墙的所有包进行规格化,因此只需要简单的一行:

scrub in all

NAT(网络地址转换)

为所有内部网启用NAT可以通过下列策略:

nat on $ext_if from $int_if:network to any -> ($ext_if)

由于外部网卡的IP地址是动态获得的,因此在外部网卡接口处增加小括号以使当IP地址发生变化时PF可以自适应。

重定向

第一个需要重定向策略的是ftp-proxy(8),只有这样内部网上的FTP客户端才可以访问因特网上的FTP服务器。

rdr on $int_if proto tcp from any to any port 21 -> 127.0.0.1 port 8021

注意这条策略只捕获到21端口的数据包,如果用户通过其他端口访问FTP服务器,则在定义目的端口时需要使用list(列表),例如: from any to any port { 21, 2121 }。

第二个重定向策略捕获因特网上的用户访问防火墙80端口的数据包。用户试图访问网络的web服务器时将产生合法的访问该端口的数据包,这些连接请求需要重定向到主机COMP3:

rdr on $ext_if proto tcp from any to any port 80 -> $comp3

过滤规则

过滤规则第一行是默认否规则:

block all

这时没有任何数据包可以流过防火墙,甚至来自内部网络的数据包。下面的规则将逐个依据上面提到的目标开启防火墙上的虚拟接口。

每个Unix系统都有一个“loopback(回送)”接口,它是用于系统中应用程序间通信的虚拟网络接口。在OpenBSD中,回送接口是lo(4)。

pass quick on lo0 all

下一步,由RFC 1918定义的私有地址将在外部网卡接口的进和出方向被阻断。这些地址不应该出现在公网上,通过阻断这些地址可以保证防火墙不向外部网泄漏内网地址,同时也阻断了来自外部网中源地址为这些私有地址的数据包流入内网。

block drop in quick on $ext_if from $priv_nets to any
block drop out quick on $ext_if from any to $priv_nets

这里block drop用来通知PF停止反馈TCP RST或者ICMP Unreachabel 数据包。因为RFC 1918规定的地址不会存在于因特网上,发往那些地址的数据包将没有意义。Quick 选项用来通知PF如果这条规则匹配则不再进行其他规则的匹配操作,来自或流向$ priv_nets的数据包将被立即丢弃。

现在将打开因特网上的一些服务所用到的端口:

pass in on $ext_if inet proto tcp from any to ($ext_if) \
port $tcp_services flags S/SA keep state

通过在宏$tcp_services中定义服务端口可以更方便的进行维护。开放UDP服务也可一模仿上述语句,只不过改为proto udp。

已经有了一条rdr策略将web访问请求转发到主机COMP3上,我们必须建立另一条过滤规则使得这些访问请求可以通过防火墙:

pass in on $ext_if proto tcp from any to $comp3 port 80 \
flags S/SA synproxy state

考虑到安全问题,我们使用TCP SYN Proxy保护web服务器——synproxy state。

现在将允许ICMP包通过防火墙:

pass in inet proto icmp all icmp-type $icmp_types keep state

类似于宏$tcp_services,当需要增加允许进入防火墙的ICMP数据包类型时可以容易地编辑宏$icmp_types。注意这条策略将应用于所有网络接口。

现在数据流必须可以正常出入内部网络。我们假设内网的用户清楚自己的所作所为并且确定不会导致麻烦。这并不是必然有效的假设,在某些环境下更具限制性的策略集会更适合。

pass in on $int_if from $int_if:network to any keep state

上面的策略将允许内网中的任何计算机发送数据包穿过防火墙;然而,这并没有允许防火墙主动与内网的计算机建立连接。这是一种好的方法吗?评价这些需要依靠网络配置的一些细节。如果防火墙同时充当DHCP服务器,它需要在分配一个地址之前ping一下该地址以确认该地址没有被占用。允许防火墙访问内部网络同时也允许了在因特网上通过ssh控制防火墙的用户访问内网。请注意禁止防火墙直接访问内网并不能带来高安全性,因为如果一个用户可以访问防火墙,他也可以改变防火墙的策略。增加下列策略可以使防火墙具备访问内网的能力:

pass out on $int_if from any to $int_if:network keep state

如果这些策略同时存在,则keep state选项将不是必须的;所有的数据包都可以流经内网接口,因为一条策略规定了双向放行数据包。然而,如果没有pass out这条策略时,pass in策略必须要有keep state选项。这也是keep state的有点所在:在执行策略匹配之前将先进行state表检查,如果state表中存在匹配记录,数据包将直接放行而不比再进行策略匹配。这将提高符合比较重的防火墙的效率。

最后,允许流出外部网卡接口的数据包通过防火墙

pass out on $ext_if proto tcp all modulate state flags S/SA
pass out on $ext_if proto { udp, icmp } all keep state

TCP, UDP, 和 ICMP数据包将被允许朝因特网的方向出防火墙。State信息将被保存,以保证反馈回来的数据包通过防火墙。

完整规则集

# macros
int_if = "fxp0"
ext_if = "ep0"

tcp_services = "{ 22, 113 }"
icmp_types = "echoreq"

priv_nets = "{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8 }"

comp3 = "192.168.0.3"

# options
set block-policy return
set loginterface $ext_if

# scrub
scrub in all

# nat/rdr
nat on $ext_if from $int_if:network to any -> ($ext_if)
rdr on $int_if proto tcp from any to any port 21 -> 127.0.0.1 \
port 8021
rdr on $ext_if proto tcp from any to any port 80 -> $comp3

# filter rules
block all

pass quick on lo0 all

block drop in quick on $ext_if from $priv_nets to any
block drop out quick on $ext_if from any to $priv_nets

pass in on $ext_if inet proto tcp from any to ($ext_if) \
port $tcp_services flags S/SA keep state

pass in on $ext_if proto tcp from any to $comp3 port 80 \
flags S/SA synproxy state

pass in inet proto icmp all icmp-type $icmp_types keep state

pass in on $int_if from $int_if:network to any keep state
pass out on $int_if from any to $int_if:network keep state

pass out on $ext_if proto tcp all modulate state flags S/SA
pass out on $ext_if proto { udp, icmp } all keep state

论坛徽章:
0
5 [报告]
发表于 2007-05-15 12:33 |只看该作者
专家呢????

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
6 [报告]
发表于 2007-05-15 12:43 |只看该作者
这个讨论好 正好学学

论坛徽章:
0
7 [报告]
发表于 2007-05-15 14:09 |只看该作者
中午做了一点测试,感觉就和普通的防火墙差不多,针对一个口做文章就可以了。

另外就是ddos的防范,大家还有什么高招?

论坛徽章:
0
8 [报告]
发表于 2007-05-15 14:11 |只看该作者
看来ftp还是有问题,ftp-data过不来,看不到目录。



  1.                 *** CuteFTP 7.0 - build Mar 30 2006 ***

  2. 状态:>          正在获取列表“”...
  3. 状态:>          正在连接到 FTP 服务器 200.200.1.158:21 (ip = 200.200.1.158)...
  4. 状态:>          Socket 已连接。正在等候欢迎消息...
  5.                 220---------- Welcome to Pure-FTPd [TLS] ----------
  6.                 220-You are user number 1 of 50 allowed.
  7.                 220-Local time is now 13:34. Server port: 21.
  8.                 220-This server supports FXP transfers
  9.                 220-IPv6 connections are also welcome on this server.
  10.                 220 You will be disconnected after 15 minutes of inactivity.
  11. 状态:>          已连接。正在验证...
  12. 命令:>          USER anonymous
  13.                 230 Anonymous user logged in
  14. 状态:>          登录成功。
  15. 命令:>          PWD
  16.                 257 "/" is your current location
  17. 状态:>          Home directory: /
  18. 命令:>          FEAT
  19.                 211-Extensions supported:
  20.                  EPRT
  21.                  IDLE
  22.                  MDTM
  23.                  SIZE
  24.                  REST STREAM
  25.                  MLST type*;size*;sizd*;modify*;UNIX.mode*;UNIX.uid*;UNIX.gid*;unique*;
  26.                  MLSD
  27.                  ESTP
  28.                  PASV
  29.                  EPSV
  30.                  SPSV
  31.                  ESTA
  32.                  AUTH TLS
  33.                  PBSZ
  34.                  PROT
  35.                 211 End.
  36. 状态:>          该站点支持 features。
  37. 状态:>          该站点支持 SIZE。
  38. 状态:>          该站点可以续传中断的下载。
  39. 命令:>          REST 0
  40.                 350 Restarting at 0
  41. 命令:>          PASV
  42.                 227 Entering Passive Mode (200,200,1,158,136,53)
  43. 命令:>          LIST
  44. 状态:>          正在连接 FTP 数据 socket 200.200.1.158:34869...
复制代码

论坛徽章:
0
9 [报告]
发表于 2007-05-15 14:20 |只看该作者
原帖由 wangbin 于 2007-5-15 14:11 发表
看来ftp还是有问题,ftp-data过不来,看不到目录。


注意FTP有两种连接方式:主动/被动。主动模式需要开放20,21端口。被动模式需要开放21和一段TCP端口。

论坛徽章:
0
10 [报告]
发表于 2007-05-15 20:06 |只看该作者
感谢楼上提醒!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP