模块名: 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>.