[OpenBSD]

[上一小节: FTP问题] [总目录] [下一小节: 使用 CARP 和 pfsync 构建冗余防火墙]

PF: Authpf: 认证网关的用户Shell


目录


介绍

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地址。有了这些信息, 管理员可以了解什么人在何时登录了系统, 这样就可以使登录用户对其网络通讯行为负责。

配置

配置authpf的所需的基本步骤罗列如下。想了解完整的authpf的配置请参阅 authpf用户手册

启用Authpf

如果没有 /etc/authpf/authpf.conf 这个文件,Authpf是不会运行的, 这个文件可能是空的(zero size),否则authpf会在用户认证成功后马上退出。

可以将下列的配置指令放进 authpf.conf 里:

将Authpf链接进主规则集

通过使用锚规则可以将Authpf链接进主规则集:
anchor "authpf/*"

无论上面的anchor规则放在规则集的什么位置, PF评估到它时将从主规则集里跳转出来评估authpf规则。

配置已经加载的规则

Authpf 从这个两个文件之一加载自己的规则:

第一条规则仅在用户$USER (这里用该用户名的username替代)登录时才会被j加载, 这个单用户规则配置的作用是当一个特定的用户 —— 例如一个系统管理员 —— 需要一组与默认规则集不同的规则。第二个文件包含了默认规则, 这个默认规则是针对所有没有自己的authpf.rules文件的用户, 如果用户的特定文件存在, 它将取代默认文件。至少上面的文件要有一个存在, 否则authpf不会运行。

这里的规则同其它PF规则集里的一样, 但是有一个例外: Authpf 允许使用两个预定义的macros:

我们推荐的做法是只对认证用户通过网关的通讯使用 $user_ip macro。

除了 $user_ip macro, authpf 还能利用 authpf_users table(如果它存在) 来存储所有被认证用户的IP地址。请确认在使用前已经定义了这个表格:

table  persist
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

为了让authpf正常工作, 它必须被指定为用户的login shell, 当用户通过了 sshd(8) 的认证后, authpf将作为该用户的shell。然后它会检查是否允许这个用户使用authpf, 从相关文件中载入规则集等。

可以通过两种方式将authpf指定为用户的shell:

  1. 使用 chsh(1), vipw(8), useradd(8), usermod(8)等手动对每个客户进行指定。
  2. 将一些用户指派到一个登录分类中, 然后在 /etc/login.conf 里更改这个登录分类的shell选项。

建立authpf的登录分类

启用了authpf的系统上有普通用户帐号和authpf用户帐号, 为authpf用户设置一个单独的登录分类是有好处的, 这样可以针对这些账户进行全局调控,并且可以为普通用户和authpf用户设置不同的策略。下面是一些策略的例子:

登录分类在 login.conf(5) 文件中创建。OpenBSD自带了一个authpf登录分类,它的定义是:

authpf:\
    :welcome=/etc/motd.authpf:\
    :shell=/usr/sbin/authpf:\
    :tc=default:

通过编辑用户的 passwd(5) 数据库选项中的 class区域可以为用户指定一个登录分类, 一个方法是用 chsh(1) 命令来实现。

查看登录用户

一旦一个用户登入了系统并且authpf已经调整了PF规则, authpf将把自己的进程名称换成该用户的用户名和IP地址:
# 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

例子

本例中Authpf被使用在OpenBSD网关上来认证一个大型校园网上的无线网络的用户。一旦用户认证成功, 这里假设他们不在禁止名单上, 他们就被允许除了访问任何校园DNS服务器外,还可以使用SSH浏览外面的站点(包括安全站点)。

这里的 /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 }"

table  persist

# 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 构建冗余防火墙]


[back] www@openbsd.org
$OpenBSD: authpf.html, v 1.24 2008/10/31 16:49:34 nick Exp $