16.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) 联机手册中的说明, 以了解进一步的信息。

16.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>.