You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何配置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类型,再通过规则限制普通用户的访问权限:

  1. 编写策略规则文件
    创建一个名为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规则。

  1. 配置端口上下文映射
    创建restrict_port.fc文件,把80端口映射到我们自定义的restricted_port_t类型:
80/tcp    system_u:object_r:restricted_port_t:s0
  1. 编译并加载模块
    依次执行以下命令完成编译和加载:
# 编译成模块文件
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
  1. 应用端口上下文设置
    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

火山引擎 最新活动