如何配置SELinux以阻止非root用户访问Linux系统上的特定端口?
如何配置SELinux以阻止非root用户访问Linux系统上的特定端口?
当然可以用SELinux实现这个需求!我来给你一步步拆解操作,让非root用户没法访问指定端口(比如你例子里的80端口),但root用户能正常访问。
先确认SELinux处于强制模式
首先得确保SELinux是Enforcing状态,不然所有规则都不会生效:
getenforce
如果输出是Permissive,先临时切换到强制模式:
setenforce 1
要是想永久生效,记得编辑/etc/selinux/config,把SELINUX=permissive改成SELINUX=enforcing,重启系统后就会一直保持强制模式。
创建自定义SELinux策略模块
我们需要给目标端口设置一个专属的SELinux类型,再通过规则限制普通用户的访问权限:
- 编写策略规则文件
创建一个名为restrict_port.te的文件,内容如下:
module restrict_port 1.0; require { type unconfined_t; # root用户的SELinux类型 type user_t; # 普通用户的SELinux类型 type staff_t; # 另一种常见的普通用户类型 class tcp_socket name_connect; } # 阻止普通用户连接我们标记的受限端口 deny user_t restricted_port_t:tcp_socket name_connect; deny staff_t restricted_port_t:tcp_socket name_connect; # 允许root用户不受限制访问 allow unconfined_t restricted_port_t:tcp_socket name_connect;
要是你的系统里还有其他普通用户类型(比如guest_t),记得在require里加上,再添一条对应的deny规则。
- 配置端口上下文映射
创建restrict_port.fc文件,把80端口映射到我们自定义的restricted_port_t类型:
80/tcp system_u:object_r:restricted_port_t:s0
- 编译并加载模块
依次执行以下命令完成编译和加载:
# 编译成模块文件 checkmodule -M -m -o restrict_port.mod restrict_port.te # 打包成SELinux可识别的包 semodule_package -o restrict_port.pp -m restrict_port.mod # 加载模块到系统 semodule -i restrict_port.pp
- 应用端口上下文设置
用semanage命令把80端口的SELinux类型改成我们自定义的:
semanage port -a -t restricted_port_t -p tcp 80
测试效果
现在切换到普通用户,执行curl http://127.0.0.1/,应该会得到连接失败的提示;而root用户执行同样的命令,就能正常访问你的本地web服务啦。
恢复配置(如果需要)
要是之后想取消这个限制,执行以下步骤:
# 删除自定义模块 semodule -r restrict_port # 把80端口改回默认的http_port_t类型 semanage port -d -t restricted_port_t -p tcp 80 semanage port -m -t http_port_t -p tcp 80
备注:内容来源于stack exchange,提问作者Conor Lennon




