模块名: mac_portacl.ko
对应的内核配置: MAC_PORTACL
引导选项: mac_portacl_load="YES"
mac_portacl(4) 模块可以用来通过一系列 sysctl 变量来限制绑定本地的 TCP 和 UDP 端口。 本质上 mac_portacl(4) 使得 非-root 用户能够绑定到它所指定的特权端口, 也就是那些编号小于 1024 的端口。
在加载之后, 这个模块将在所有的 socket 上启用 MAC 策略。 可以调整下列一些配置:
security.mac.portacl.enabled 将完全 启用/禁用 策略。
security.mac.portacl.port_high 将设置为 mac_portacl(4) 所保护的最高端口号。
security.mac.portacl.suser_exempt 如果设置为非零值, 表示将 root 用户排除在策略之外。
security.mac.portacl.rules 将指定实际的 mac_portacl 策略; 请参见下文。
实际的 mac_portacl 策略, 是在 security.mac.portacl.rules sysctl 所指定的一个下列形式的字符串: rule[,rule,...] 其中可以给出任意多个规则。 每一个规则的形式都是:
idtype:id:protocol:port。 这里的 idtype
参数可以是 uid 或 gid, 分别表示将 id
参数解释为用户 id
或组 id。 protocol
参数可以用来确定希望应用到 TCP 或 UDP
协议上, 方法是把这一参数设置为 tcp 或 udp。 最后的 port
参数则给出了所指定的用户或组能够绑定的端口号。
注意: 由于规则集会直接由内核加以解释, 因此只能以数字形式表示用户 ID、 组 ID, 以及端口等参数。 换言之, 您不能使用用户、 组, 或端口服务的名字来指定它们。
默认情况下, 在 类-UNIX® 系统中, 编号小于 1024 的端口只能为特权进程使用或绑定, 也就是那些以 root 身份运行的进程。 为了让 mac_portacl(4) 能够允许非特权进程绑定低于 1024 的端口, 就必须首先禁用标准的 UNIX 限制。 这可以通过把 sysctl(8) 变量 net.inet.ip.portrange.reservedlow 和 net.inet.ip.portrange.reservedhigh 设置为 0 来实现。
请参见下面的例子, 或 mac_portacl(4) 联机手册中的说明, 以了解进一步的信息。
下面的例子更好地展示了前面讨论的内容:
# 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>.