--------------------------------------------------------------------------------
目录
介绍
配置
启用Authpf
将Authpf链接进主规则集
配置载入规则
访问控制列表
显示登入信息
指定Authpf做为用户的Shell
建立authpf的登录分类
Seeing Who is Logged In
Example
--------------------------------------------------------------------------------
介绍
Authpf(8) 是一个认证网关的用户shell。一个认证网关就像一个一般网络上的网关(也被称作路由器), 除了用户必须先经过网关的认证, 网关才会允许通讯通过。当用户的shell设置成 /usr/sbin/authpf (例如, 代替原来的 ksh(1), csh(1), 等) 用户登录使用SSH, authpf 将作出必要的修改以激活 pf(4) 规则集, 这样用户的通信就可以通过过滤规则和/或使用NAT或重定向转换。一旦用户退出或者他们的会话断开, authpf 将删除所有为用户载入的规则并移除所有用户开启的连接状态。因此, 只有在用户在其SSH会话开启时才有能力通过网关通讯。
Authpf载入用户的过滤/NAT规则到唯一的锚点。这个锚的命名采用组合用户的Unix用户名和authpf的进程ID号的格式"username(PID)"。每个用户的锚储存在authpf锚内, authpf锚依次被锚定在主规则内。"完全合格的锚路径"就变成了:
main_ruleset/authpf/username(PID)
可以为每个客户或基于全局配置authpf载入的规则。
使用authpf的例子包括:
要求用户在访问Internet前先进行认证。
允许特定的用户 —— 像系统管理员 -- 访问受限的网络。
仅允许已知的用户访问网络的其余部分或者从一个无线网段访问Internet。
允许员工从家里、路上等公司网络上的资源。办公室外的用户不仅要能访问公司的网络, 还能被重定向到指定的资源 (例如, 他们自己的桌面), 这基于对用户名的认证。
在设置诸如库文件或其它带有互联网通道的地方, PF可以被配置成允许guest用户进行有限的Internet访问。 Authpf可以提供给注册用户的全功能访问的权限。
Authpf通过 syslogd(8)在每个认证成功的用户登录或退出时记录他们的用户名和IP地址。有了这些信息, 管理员可以了解什么人在何时登录了系统以及使用户对其网络通讯负责。
配置
配置authpf的所需的基本步骤罗列如下。想了解完整的authpf的配置请参阅 authpf用户手册。
启用Authpf
如果没有提供 /etc/authpf/authpf.conf 文件Authpf是不会运行的, 即使有是空文件(零尺寸)也不行, 这个文件必须提供(有内容)否则authpf会在用户认证成功后马上退出。
下列的配置指令可以放进 authpf.conf:
anchor=name - 使用指定的 锚 name 替代"authpf"。
table=name - 使用指定的 表格 name 替代 "authpf_users"。
将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 宏。
除了 $user_ip 宏, authpf 还能利用 authpf_users 表格(如果它存在) 来存储所有被认证用户的IP地址。请确认在使用这个表格前它已经被定义了:
代码: 全选
table <authpf_users> persist
pass in on $ext_if proto tcp from <authpf_users> \
to port smtp flags S/SA keep state
这个表格只能在规则集里使用, 应该应用于所有已认证用户。
访问控制列表
可以禁止用户使用authpf, 方法是通过在 /etc/authpf/banned/ 目录里创建一个文件, 并以被禁止用户的username命名这个文件。authpf断开他们前会把这个文件的内容显示给这个用户。这提供了一条捷径告诉这个用户为什么他们不能访问以及联系谁可以恢复他们的访问权限。(译者理解:禁止多个用户就建立多个文件;这里的"他们"可能是使用同一用户名的几个人, 或者是不同的用户名的多个用户。)
反过来, 也可以仅允许指定的用户访问, 方法是将他们的用户名添加到 /etc/authpf/authpf.allow 文件。如果 /etc/authpf/authpf.allow 这个文件不存在, 或者这个文件里有一个 "*", 则只要用户没有被明确地禁止登录, authpf将允许任何通过SSH成功登陆的用户访问。
如果authpf无法确定是否允许或拒绝一个用户名, 它会打印一条简短的信息, 然后断开与该用户的连接。 一个用户名如果同时出现在 /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正常工作, 它必须被指定为登入用户的shell, 当用户通过了 sshd(8) 的认证后, authpf将作为这个用户的shell。它会检查是否这个用户被允许使用authpf, 从相关文件中载入规则集等。
可以通过两种方式将authpf指定为用户的shell:
使用 chsh(1), vipw(8), useradd(8), usermod(8)等手动对每个客户进行指定。
将一些用户指派到同一个登录分类中, 然后在 /etc/login.conf 里更改这个登录分类的shell选项。
建立authpf的登录分类
启用了authpf的系统上有普通用户帐号和authpf用户帐号, 为所有authpf用户设置一个单独的登录分类是有益处的, 这样可以针对这些用户进行全局调控并且可以为普通用户和authpf用户设置不同的策略。下面是一些策略的例子:
shell - 指定一个用户的登录shell。不管在 passwd(5) 数据库内定义的用户shell是什么, 强制用户使用authpf。
welcome - 指定用户登入后显示哪一个 motd(5) 文件。这可用来显示仅与authpf用户相关的信息。
登录分类在 login.conf(5) 文件中创建。 OpenBSD自定义了一个authpf登录分类:
代码: 全选
authpf:\
:welcome=/etc/motd.authpf:\
:shell=/usr/sbin/authpf:\
:tc=default:
查看登录用户
一旦一个用户登入了系统并且authpf已经调整了PF规则, authpf将把自己的进程名称换成该用户的用户名和IP地址:
代码: 全选
# ps -ax | grep authpf
23664 p0 Is+ 0:00.11 -authpf: [email protected] (authpf)
用户charlie从位于192.168.1.3的机器上登入。通过向authpf进程发送一个SIGTERM信号可以将该用户踢出, Authpf也会删除为此用户载入的规则集并中断所有此用户打开的状态化连接。
代码: 全选
# kill -TERM 236644
例子
本例中Authpf被使用在OpenBSD网关上来认证一个大型校园网上的无线网络的用户。一旦用户认证成功, 这里假设他们不在禁止名单上, 他们就被允许使用SSH浏览站点(包括安全站点)以及访问任何校园DNS服务器。
这里的 /etc/authpf/authpf.rules 文件包含了如下内容:
代码: 全选
wifi_if = "wi0"
pass in quick on $wifi_if proto tcp from $user_ip to port { ssh, http, \
https } flags S/SA keep state
管理员查理需要能访问校园的SMTP和POP3服务器以及上网冲浪和使用SSH, 为此将在 /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 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"
dns_servers = "{ 10.0.1.56, 10.0.2.56 }"
table <authpf_users> persist
scrub in all
# filter
block drop all
pass out quick on $ext_if inet proto tcp from \
{ $wifi_if:network, $ext_if } flags S/SA modulate state
pass out quick on $ext_if inet proto { udp, icmp } from \
{ $wifi_if:network, $ext_if } keep state
pass in quick on $wifi_if inet proto tcp from $wifi_if:network to $wifi_if \
port ssh flags S/SA keep state
pass in quick on $wifi_if inet proto { tcp, udp } from <authpf_users> \
to $dns_servers port domain keep state
anchor "authpf/*" in on $wifi_if
这个规则集很简单, 完成了下面的工作:
拒绝所有(默认拒绝)。
在外部接口上放行来自无线网络及网关自己的出站 TCP, UDP, 和 ICMP 通讯。
放行所有自无线网络至网关的SSH通讯。这条规则是允许用户登录的, 必须设置。
放行所有自认证用户至校园DNS服务器的进站DNS请求。
为无线网络上的进站通讯创建锚点 "authpf"。
这个主规则集的思路是禁止所有并尽可能地减少通讯量。通讯可以自由地去往外部接口, 但是会被默认拒绝策略阻挡在无线接口的入口上。一旦用户得到认证, 他们的通讯将被允许进入无线网接口并可以通过网关到达网络的其它部分。规则里贯穿使用了quick 关键字以便当一个新连接通过网关时PF不必逐条评估每个命名的规则。