分页: 1 / 1

《The BOOK Of PF》中文版 —— 17. 用authpf保护你的无线网络

发表于 : 2010-07-13 9:42
whoami
用authpf保护你的无线网络

通常, 除了我们前面提到的方法,还可用其它的方式保护加密无线网络。对于防护很弱的WEP来说,安全专家认为它仅能给攻击者发送一个信号,也就是告诉他们你的网络资源并非提供给所有人使用的。
在36页上我们谈论过的 “建立简单的无线网络”是可以工作的。它允许合理的客户端连接, 但是这样一来它本身也存在一个问题, 因为这种配置并没有提供真正的内建筛选客户端功能。
这如我们前面所提到的那样, MAC地址过滤并不足以抵御攻击者。修改MAC地址实在是太容易了。 OpenBSD的开发者们选择了一种完全不同的解决方案,从OpenBSD 3.1开始他们引入了authpf来取代尝试访问硬件标识的方法,例如网卡的MAC地址, OpenBSD开发者们确认这种强壮的并具有高度灵活性的用户认证机制已经完善并更适合于这项工作。authpf工具是一个用户shell,它可以让系统装载基于每个用户的PF规则, 可以有效地控制每个用户的到底可以干什么。
要使用authpf, 你创建用户时将authpf指定为他们使用的shell。为了获得网络访问权, 这个用户需要用ssh登录到网关。一旦用户完成ssh认证, authpf将载入你为这个用户或相关的用户级别定义的规则。
这些规则应用于用户登录时的IP地址, 并且在ssh连接期间持续有效。一旦这个ssh会话终止, 这些规则将被卸载, 而在绝大多数情况下,来自这个用户的IP地址的所有的非ssh通讯会被拒绝。通过合理的设定, 只有那些发起自认证用户的通讯才会被放行。
值得一提的是在OpenBSD中, authpf是一个系统默认提供的登录级别, 正如后面你会注意到的用adduser程序创建一个用户那样。
对其它系统来说,这个authpf级别并非默认就有的, 你需要将下面这几行加入到你的login.conf文件中:

代码: 全选

authpf:\
:welcome=/etc/motd.authpf:\
:shell=/usr/sbin/authpf:\
:tc=default:
下面这几个小节包含了一些示例,不知道你是否可以直接使用, 但是我希望你可以因此受到启发。

一个基本的认证网关
要用authpf建立一个认证的网关包括创建和维护除了基本的pf.conf以外的其它文件。 主要的额外文件就是authpf.rules; 其它的文件相对来说省心一些,一旦你创建它们后不用花费太多的时间。
我们先创建一个空白的 /etc/authpf/authpf.conf 文件,authpf正常运行需要这个文件, 但是实际上它不需要任何内容, 所以用touch就足矣了。
下面的文件多少和 /etc/pf.conf 文件有关。首先, 我们创建接口的宏:

代码: 全选

ext_if = "re0"
int_if = "ath0"
此外, authpf需要一个表格(table)以保存认证用户的IP地址:

代码: 全选

table <authpf_users> persist

如果你需要nat规则, 你可以就在authpf.rules里简单的进行设置, 但是在我们的示例中仍在文件pf.conf里进行设置也没有什么不妥,像这样:

代码: 全选

nat on $ext_if from $localnet to any -> ($ext_if)
下面, 我们创建authpf宏, 一旦用户经过认证将导入authpf.rules里面的这些宏:

代码: 全选

nat-anchor "authpf/*"
rdr-anchor "authpf/*"
binat-anchor "authpf/*"
anchor "authpf/*"
这是我们在pf.conf文件的结尾为authpf进行的设置。
对于过滤部分, 我们开始阻止全部通讯,然后设置需要的放行规则。目前我们唯一真正需要的仅是在内部网络放行ssh:

代码: 全选

pass quick on $int_if inet proto { tcp, udp } to $int_if port ssh
从现在开始, 决定权就在你手里了。你是否想在认证前为客户端做名称解析使用域名? 如果需要,你还必须在pf.conf里放行域名解析相关的tcp和udp通讯。
作为一个相对简单和常用的规则, 你的规则里可以包含我们这里剩下基本规则集, 但是修改一下放行规则以便放行来自<authpf_users>表格内地址的通讯,而不是放行所有来自本地网的通讯:

代码: 全选

pass quick inet proto { tcp, udp } from <authpf_users> to any port $udp_services
pass inet proto tcp from <authpf_users> to any port $client_out
要想设置一个更有个性的方案, 你可以将剩下的规则集放到/etc/authpf/authpf.rules文件,或者在 /etc/authpf/users/ 目录下为每个用户在自己的目录内定制自己的authpf.rules文件。如果你的用户通常需要一些保护措施, 通用的 /etc/authpf/authpf.rules 文件可以包含类似如下的内容:

代码: 全选

client_out = "{ ssh, domain, pop3, auth, nntp, http, https }"
udp_services = "{ domain, ntp }"
pass quick inet proto { tcp, udp } from $user_ip to any port $udp_services
pass inet proto tcp from $user_ip to any port $client_out
宏 $user_ip 是authpf内置的,会扩展为那些通过认证用户的IP地址 。这些规则应用于任何在网关上完全通过认证的用户。
一个更好更简洁的实现方法是对有不特殊要求的用户使用特定的规则集。如果在/etc/authpf/users/下的一个用户的目录中存在一个authpf.rules文件, 则将对该用户执行这个文件内的规则。

这个规则是为了幼稚windows用户peter设置的, 他只需浏览网页和访问一台特定主机高端端口的特定服务, 你可以在文件 /etc/authpf/users/peter/authpf.rules 里按照此需要为其设置,像这样:

代码: 全选

client_out = "{ domain, http, https }"
pass inet from $user_ip to 192.168.103.84 port 9000
pass quick inet proto { tcp, udp } from $user_ip to any port $client_out

另一方面, Peter的同事Christina运行OpenBSD,而且一般知道她自己正在干什么 , 即便她有时在奇怪的端口上进行通讯。 你应该给她更大的权限,将下面的规则放进 /etc/authpf/users/christina/authpf.rules 文件中:

代码: 全选

pass from $user_ip os = "OpenBSD" to any
这意味着Christina几乎通过TCP可以做任何她喜欢的事情, 只要她的OpenBSD机器还经过了认证。

外松内紧
在某些情况下需要在连接层将网络设置为开放且不加密, 同时通过authpf强制执行一些限制。
下例中的情形与你在机场或其它公众社区遇到的很相似, 在这里地方任何人全可以访问接入点并获得一个相应的的IP地址, 但是任何企图对web的访问都会被重定向到一个特定的web页,直到这个用户获得某种形式的认证。详说明4
下面这个pf.conf文件还是基于原始基准, 只是增加了两个重要的基于authpf的设置附加项: 一个宏以及一个重定向。

代码: 全选

ext_if = "re0"
int_if = "ath0"
auth_web="192.168.27.20"
dhcp_services = "{ bootps, bootpc }" # DHCP server + client
table <authpf_users> persist
rdr pass on $int_if proto tcp from ! <authpf_users> to any port http ->
$auth_web
nat on $ext_if from $localnet to any -> ($ext_if)
nat-anchor "authpf/*"
rdr-anchor "authpf/*"
binat-anchor "authpf/*"
anchor "authpf/*"
pass quick on $int_if inet proto { tcp, udp } to $int_if port dhcp_services
pass quick inet proto { tcp, udp } from $int_if:network to any port domain
pass quick on $int_if inet proto { tcp, udp } to $int_if port ssh
说明4
非常感谢Vegard Engen的好想法以及告诉我他的配置, 我们提供在这里,也许不完整,主要是借鉴了他的思路。
这里的宏auth_web和重定向确保了来自所有未列在<authpf_users> 表格内地址的web访问被重定向到一个未认证用户的指定地址。
你可以在这个地址上建立了一个web服务器,它可以提供任何你想要的服务,从一个带有联系人信息、怎样访问该网络等等的站点指南单一页面到一个接受信用卡并能创建新帐号的系统。
值得一提的是尽管域名解析可以通过这个设置实现, 但是所有的web访问企图在最终仅能到达auth_web的地址。一旦用户退出了认证过程, 你可以增加一般的规则,或者为某个用户制定自己的规则,你仅需在authpf.rules文件里按需设置。