[上一小节: FTP问题] [总目录] [下一小节: 使用 CARP 和 pfsync 构建冗余防火墙]
Authpf(8) 是一个认证网关的用户shell。一个认证网关就像一个一般网络上的网关(也被称作路由器), 除了用户必须先经过网关的认证, 网关才会允许通讯通过。当用户的shell设置成 /usr/sbin/authpf (例如, 代替原来的 ksh(1), csh(1), 等) 用户登录使用SSH, authpf 将作出必要的修改以激活 pf(4) 规则集, 这样用户的通信就可以通过过滤规则和/或使用NAT或重定向转换。一旦用户退出或者他们的会话断开, authpf 将删除所有为该用户加载的规则并移除所有该用户开启的状态化连接。因此, 只有该用户在保持其SSH会话开启时才有能力通过网关通讯。
Authpf从唯一的一个anchor点加载该用户的规则。这个anchor的命名采用组合用户的Unix用户名和authpf的进程ID号的格式"username(PID)"。每个用户的anchor储存在 authpf 这个anchor内, 这个authpf anchor依次被anchored(锚定)在主规则内。"完全合格的anchor路径"就变成了:
main_ruleset/authpf/username(PID)
可以为每个客户或基于全局配置authpf的加载规则。
使用authpf的例子包括:
Authpf通过 syslogd(8)在每个认证成功的用户登录或退出时记录(log)他们的用户名和IP地址。有了这些信息, 管理员可以了解什么人在何时登录了系统, 这样就可以使登录用户对其网络通讯行为负责。
如果没有 /etc/authpf/authpf.conf 这个文件,Authpf是不会运行的, 这个文件可能是空的(zero size),否则authpf会在用户认证成功后马上退出。
可以将下列的配置指令放进 authpf.conf 里:
anchor "authpf/*"
无论上面的anchor规则放在规则集的什么位置, PF评估到它时将从主规则集里跳转出来评估authpf规则。
第一条规则仅在用户$USER (这里用该用户名的username替代)登录时才会被j加载, 这个单用户规则配置的作用是当一个特定的用户 —— 例如一个系统管理员 —— 需要一组与默认规则集不同的规则。第二个文件包含了默认规则, 这个默认规则是针对所有没有自己的authpf.rules文件的用户, 如果用户的特定文件存在, 它将取代默认文件。至少上面的文件要有一个存在, 否则authpf不会运行。
这里的规则同其它PF规则集里的一样, 但是有一个例外: Authpf 允许使用两个预定义的macros:
我们推荐的做法是只对认证用户通过网关的通讯使用 $user_ip macro。
除了 $user_ip macro, authpf 还能利用 authpf_users table(如果它存在) 来存储所有被认证用户的IP地址。请确认在使用前已经定义了这个表格:
tablepersist pass in on $ext_if proto tcp from \ to port smtp
可以禁止用户使用authpf, 方法是通过在 /etc/authpf/banned/ 目录里创建一个文件, 并以被禁止用户的username命名这个文件。这个文件的内容会在authpf断开他们的连接前显示给这个用户。这提供了一个方便的方法通知这个用户为什么他们不能访问这里,以及联系谁可以恢复他们的访问权限。
反过来, 也可以仅允许特定的用户访问, 方法是将他们的用户名添加到 /etc/authpf/authpf.allow 文件。如果 /etc/authpf/authpf.allow 这个文件不存在, 或者这个文件里有一个 "*", 则只要用户没有被明确地禁止登录, authpf将允许任何通过SSH成功登陆的用户访问。
如果authpf无法确定一个username是否被允许登录, 它会打印一条简短的信息, 然后断开与该用户的连接。 一个用户名如果同时出现在 /etc/authpf/banned/ 和 /etc/authpf/authpf.allow 内, 后者的设定将被废除, 也就是这个用户将被拒绝。
如果一个用户经authpf认证成功, 它会打印一条问候信息告知用户已认证成功。
Hello charlie. You are authenticated from host "64.59.56.140"
你也添加其它一些信息, 将定制的信息放在 /etc/authpf/authpf.message 文件里, 这个文件的内容将在默认欢迎信息后显示。
可以通过两种方式将authpf指定为用户的shell:
登录分类在 login.conf(5) 文件中创建。OpenBSD自带了一个authpf登录分类,它的定义是:
authpf:\ :welcome=/etc/motd.authpf:\ :shell=/usr/sbin/authpf:\ :tc=default:
通过编辑用户的 passwd(5) 数据库选项中的 class区域可以为用户指定一个登录分类, 一个方法是用 chsh(1) 命令来实现。
# ps -ax | grep authpf 23664 p0 Is+ 0:00.11 -authpf: charlie@192.168.1.3 (authpf)
这里显示用户charlie从位于192.168.1.3的机器上login。通过向authpf进程发送一个SIGTERM信号可以将该用户强制log out,Authpf也会删除为此用户加载的规则集并杀掉所有此用户打开的状态化连接。
# kill -TERM 236644
这里的 /etc/authpf/authpf.rules 文件包含了如下内容:
wifi_if = "wi0" pass in quick on $wifi_if proto tcp from $user_ip to port { ssh, http, \ https }
除了上网冲浪和使用SSH,管理员查理还需要能访问校园的SMTP和POP3服务器, 下列的规则设定在 /etc/authpf/users/charlie/authpf.rules 文件里:
wifi_if = "wi0" smtp_server = "10.0.1.50" pop3_server = "10.0.1.51" pass in quick on $wifi_if \ proto tcp from $user_ip to $smtp_server port smtp pass in quick on $wifi_if \ proto tcp from $user_ip to $pop3_server port pop3 pass in quick on $wifi_if \ proto tcp from $user_ip to port { ssh, http, https }
主规则集是 /etc/pf.conf , 进行了如下设置:
# macros wifi_if = "wi0" ext_if = "fxp0" dns_servers = "{ 10.0.1.56, 10.0.2.56 }" tablepersist # filter block drop all pass out quick on $ext_if inet proto { tcp, udp, icmp } \ from { $wifi_if:network, $ext_if } pass in quick on $wifi_if inet proto tcp \ from $wifi_if:network to $wifi_if port ssh pass in quick on $wifi_if inet proto { tcp, udp } \ from to $dns_servers port domain anchor "authpf/*" in on $wifi_if
这个规则集很简单, 完成了下面的工作:
这个主规则集的思路是先禁止所有通讯, 然后尽可能地减少通讯量。通讯可以自由地去往外部接口, 但是会被默认拒绝策略阻挡在无线网络接口的入口上。一旦用户得到认证, 他们的通讯将被允许进入无线网接口, 然后才可以通过网关到其它地方。规则里从头到尾地使用了quick 关键字,所以当一个新连接通过网关时PF不必逐条评估每个命名的规则。
[上一小节: FTP问题] [总目录] [下一小节: 使用 CARP 和 pfsync 构建冗余防火墙]