OpenBSD 的 pf:禁用给定用户的网络访问(ssh 除外)。

OpenBSD 的 pf:禁用给定用户的网络访问(ssh 除外)。

如果我们使用 OpenBSD 的默认防火墙,我们如何修改它以禁用普通用户的所有网络访问,除了一件事:我们想要从随机主机 ssh 到用户!

例如,如果用户想要“wget google.com”,则它不应该具有防火墙权限。如果我们想通过 scp 从随机计算机向用户复制某些内容,防火墙需要允许它。如果用户想要 ssh 到其他一些主机,则它不应该具有访问权限。

答案1

我认为您正在寻找 auhpf。

http://www.openbsd.org/faq/pf/authpf.html

Authpf(8) 是用于验证网关的用户 shell。身份验证网关就像常规网络网关(也称为路由器),只不过用户必须首先向网关验证自己的身份,然后网关才会允许流量通过。当用户的 shell 设置为 /usr/sbin/authpf(即,不是将用户的 shell 设置为 ksh(1)、csh(1) 等)并且用户使用 SSH 登录时,authpf 将对活动 pf(4) 规则集,以便用户的流量通过过滤器和/或使用网络地址转换或重定向进行转换。一旦用户注销或会话断开连接,authpf 将删除为用户加载的任何规则,并终止用户打开的任何有状态连接。因此,只有当用户保持 SSH 会话打开时,用户才能通过网关传递流量。

# macros
wifi_if = "wi0"
ext_if  = "fxp0"
dns_servers = "{ 10.0.1.56, 10.0.2.56 }"

table <authpf_users> 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 <authpf_users> to $dns_servers port domain

anchor "authpf/*" in on $wifi_if

答案2

我无法给您一个总体计划,然后希望其他人可以填写详细信息。

看来您需要执行以下操作:

  1. 创建一个chroot
  2. 以某种方式允许只有一个与它的接口。
  3. 然后看数据包排队对于该接口或在该接口上编写您的 pf 规则。

老实说,我认为使用 FreeBSD 监狱会更容易,但你可能没有这个选择。

这可能不是一个很好的答案,但希望它能为您指明正确的方向。我本来想将此作为评论发布,但我认为它太长了。

答案3

防火墙通常查看网络数据包。他们可以看到数据包来自哪里,但除非通过数据包内省以某种方式揭示,否则他们不知道谁负责这些数据包。

您可以从为每个人锁定所有内容开始,然后根据需要添加经过身份验证的访问。例如,通过所有外部 Web 请求都必须通过的经过身份验证的代理。

相关内容