SElinux的semanage使用详解

semanage是 SELinux 策略管理的核心命令行工具,用于永久性地修改 SELinux 策略元素(如文件上下文、端口、布尔值等)。它与 chcon(临时修改)的关键区别在于:semanage的更改会写入策略配置,即便文件系统重新标记(relabel)或重启后依然生效。

一、安装与基本语法

安装(部分系统默认未安装):

RHEL/CentOS:

yum install policycoreutils-python
#或rocky
dnf install policycoreutils-python-utils

Ubuntu:

apt install policycoreutils

基本语法semanage [对象] [选项] [参数]

常用对象包括 fcontext(文件上下文)、port(端口)、boolean(布尔值)、login(登录映射)等

二、核心通用参数

-a      添加规则(add)
-d      删除规则(delete)
-m      修改规则(modify)
-l      列出规则(list)
-t      指定 SELinux 类型(type,最常用)
-p      指定协议(tcp/udp,port 专用)
-s      指定 SELinux 用户(仅 login/user 对象)
-v      显示详细过程(verbose)

查看文件类型

#目录当前的 SELinux 类型
ls -Z /path/to/file
ls -Zd /path/to/dir
#查看进程当前的 SELinux 类型
ps -eZ | grep 进程名
ps -eZ | grep httpd
#查看上下文:
semanage fcontext -l | grep <关键词>
#查看端口:
semanage port -l | grep <类型/端口>
#查看所有布尔值:
semanage boolean -l
#查看映射
semanage login -l

三、常用操作

1. 文件上下文(fcontext)

用于定义文件路径与 SELinux 类型的持久映射,修改后需配合 restorecon生效。

添加规则semanage fcontext -a -t <类型> "<路径(/.*)>"

例:让 /web目录及其子文件永久适用 httpd_sys_content_t类型:

semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?"
restorecon -Rv /web

semanage fcontext -a -t bin_t /data/feishu

#查看规则:
semanage fcontext -l | grep <关键词>
#删除规则:
semanage fcontext -d -t <类型> "<路径(/.*)>"

2. 网络端口(port)

管理 SELinux 允许的端口标签,解决服务使用非标准端口时的访问拒绝问题。

添加端口semanage port -a -t <端口类型> -p <协议> <端口号>

允许 http 服务使用 TCP 8080 端口:

semanage port -a -t http_port_t -p tcp 8080
#查看端口:
semanage port -l | grep <类型/端口>
#删除端口:
semanage port -d -t <类型> -p <协议> <端口号>

修改ssh端口

#先添加
semanage port -a -t ssh_port_t -p tcp 422
#后修改
semanage port -m -t ssh_port_t -p tcp 22

3. 布尔值(boolean)

动态开关 SELinux 策略中的特定功能,无需修改策略源码。

修改布尔值semanage boolean -m --on/--off <布尔变量>

例:开启 ftp 完全访问权限:

semanage boolean -m --on ftpd_full_access
#查看所有布尔值:
semanage boolean -l

4. 登录映射(login)

管理 Linux 用户到 SELinux 用户的映射关系。

添加映射semanage login -a -s <SELinux用户> <Linux用户>

例:将 linux 用户 user01映射为 SELinux 用户 staff_u

semanage login -a -s staff_u user01
#查看映射
semanage login -l

四、注意事项

1、semanage fcontext仅更新策略数据库,不会直接修改现有文件标签,必须执行 restorecon才能应用变更。

2、路径支持正则表达式,(/.*)?表示匹配目录本身及其下所有子文件和子目录。

3、操作需 root 权限,建议使用 sudo或切换到 root 用户执行。