17.10. MAC portacl 模块

模块名: mac_portacl.ko

对应的内核配置: MAC_PORTACL

引导选项: mac_portacl_load="YES"

mac_portacl(4) 模块可以用来通过一系列 sysctl 变量来限制绑定本地的 TCPUDP 端口。 本质上 mac_portacl(4) 使得 非-root 用户能够绑定到它所指定的特权端口, 也就是那些编号小于 1024 的端口。

在加载之后, 这个模块将在所有的 socket 上启用 MAC 策略。 可以调整下列一些配置:

实际的 mac_portacl 策略, 是在 security.mac.portacl.rules sysctl 所指定的一个下列形式的字符串: rule[,rule,...] 其中可以给出任意多个规则。 每一个规则的形式都是: idtype:id:protocol:port。 这里的 idtype 参数可以是 uidgid, 分别表示将 id 参数解释为用户 id 或组 id。 protocol 参数可以用来确定希望应用到 TCPUDP 协议上, 方法是把这一参数设置为 tcpudp。 最后的 port 参数则给出了所指定的用户或组能够绑定的端口号。

注意:

由于规则集会直接由内核加以解释, 因此只能以数字形式表示用户 ID、 组 ID, 以及端口等参数。 换言之, 您不能使用用户、 组, 或端口服务的名字来指定它们。

默认情况下, 在 类-UNIX® 系统中, 编号小于 1024 的端口只能为特权进程使用或绑定, 也就是那些以 root 身份运行的进程。 为了让 mac_portacl(4) 能够允许非特权进程绑定低于 1024 的端口, 就必须首先禁用标准的 UNIX® 限制。 这可以通过把 sysctl(8) 变量 net.inet.ip.portrange.reservedlownet.inet.ip.portrange.reservedhigh 设置为 0 来实现。

请参见下面的例子, 或 mac_portacl(4) 联机手册中的说明, 以了解进一步的信息。

17.10.1. 例子

下面的例子更好地展示了前面讨论的内容:

# sysctl security.mac.portacl.port_high=1023 # sysctl net.inet.ip.portrange.reservedlow=0 net.inet.ip.portrange.reservedhigh=0

首先我们需要设置使 mac_portacl(4) 管理标准的特权端口, 并禁用普通的 UNIX® 绑定限制。

# sysctl security.mac.portacl.suser_exempt=1

您的 root 用户不应因此策略而失去特权, 因此请把 security.mac.portacl.suser_exempt 设置为一个非零的值。 现在您已经成功地配置了 mac_portacl(4) 模块, 并使其默认与 类-UNIX® 系统一样运行了。

# sysctl security.mac.portacl.rules=uid:80:tcp:80

允许 UID 为 80 的用户 (正常情况下, 应该是 www 用户) 绑定到 80 端口。 这样 www 用户就能够运行 web 服务器, 而不需要使用 root 权限了。

# sysctl security.mac.portacl.rules=uid:1001:tcp:110,uid:1001:tcp:995

允许 UID 为 1001 的用户绑定 TCP 端口 110 (pop3) 和 995 (pop3s)。 这样用户就能够启动接受来发到 110 和 995 的连接请求的服务了。

本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读 文档,如不能解决再联系 <questions@FreeBSD.org>.

关于本文档的问题请发信联系 <doc@FreeBSD.org>.