Linux semanage 命令介绍
semanage(Security Enhanced Linux Manage)是一个用于配置 SELinux 策略的工具。它可以帮助你调整端口上下文、布尔值、文件上下文等。它常用于修改服务绑定的非默认端口、映射 Linux 用户到 SELinux 用户身份、设置网络端口、接口、主机和文件的安全上下文映射。
Linux semanage 命令适用的 Linux 版本
semanage 命令不是预装在大多数 Linux 发行版上的,你需要手动安装这个工具。它是 policycoreutils-python(在旧的 Linux 发行版中)和 policycoreutils-python-utils(在新的 Linux 发行版中)的一部分。这些包包含了 SELinux 的核心策略工具。如果你的 Linux 计算机上没有安装 semanage,你可能会得到以下错误:
semanage: command not found
你可以根据你的 Linux 发行版来选择合适的安装命令:
# 基于 apt 的发行版(如 Debian、Ubuntu、Raspbian、Kali Linux 等):
sudo apt-get install policycoreutils-python-utils
# 基于 yum 的发行版(如 RedHat,CentOS 7 等):
sudo yum install policycoreutils-python
# 基于 dnf 的发行版(如 Fedora,CentOS 8 等):
sudo dnf install policycoreutils-python-utils
# 基于 apk 的发行版(如 Alpine Linux):
sudo apk add --update policycoreutils-python
# 基于 pacman 的发行版(如 Arch Linux):
sudo pacman -S policycoreutils-python
# 基于 zypper 的发行版(如 openSUSE):
sudo zypper in policycoreutils-python
# 基于 pkg 的 FreeBSD 发行版
sudo pkg install policycoreutils-python
# 基于 pkg 的 OS X/macOS 发行版:
brew install policycoreutils-python
要确认 semanage 是否安装成功,你可以输入:
semanage -h
Linux semanage 命令的基本语法
semanage 命令的基本语法格式如下:
semanage {user|port|fcontext|boolean|permissive...} -l [-n]
其中,user 用于管理用户的角色和等级,port 用于管理网络接口类型定义,fcontext 用于管理文件上下文映射定义,boolean 用于管理布尔值来选择性地启用功能,permissive 用于设置进程类型的强制模式。
Linux semanage 命令的常用选项或参数说明
semanage 命令有很多选项或参数,可以用于不同的目的。下表列出了一些常用的选项或参数,按照字母顺序排序:
选项或参数 | 说明 |
---|---|
-a | 添加一个新的记录 |
-d | 删除一个已有的记录 |
-e | 排除一个路径 |
-f | 指定一个文件类型 |
-h | 显示帮助信息 |
-l | 列出所有的记录 |
-m | 修改一个已有的记录 |
-n | 不显示标题 |
-o | 指定一个输出文件 |
-p | 指定一个协议 |
-r | 指定一个角色 |
-t | 指定一个类型 |
-v | 显示详细信息 |
Linux semanage 命令实例详解
下面是一些 semanage 命令的实例,结合了最常搜索的关键词来作为标题。你可以通过这些实例来学习和使用 semanage 命令。
实例1:列出所有的端口
要列出你的 Linux 计算机上的所有端口,你可以输入:
[linux@bashcommandnotfound.cn ~]$ sudo semanage port -l
输出:
SELinux Port Type Proto Port Number
afs3_callback_port_t tcp 7001
afs3_callback_port_t udp 7001
afs_bos_port_t udp 7007
afs_fs_port_t tcp 2040
afs_fs_port_t udp 7000, 7005
afs_ka_port_t udp 7004
...
这个命令会显示 SELinux 的端口类型、协议和端口号。
实例2:创建或添加一个新的端口
要创建或添加一个新的端口,你需要指定类型、协议和端口号。例如,要将 udp 协议的 7956 端口分配给 http_port_t 类型,你可以输入:
[linux@bashcommandnotfound.cn ~]$ sudo semanage port -a -t http_port_t -p udp 7956
这个命令会在 SELinux 策略中添加一个新的记录,允许 http 服务使用 udp 协议的 7956 端口。
实例3:修改一个已有的端口
要修改一个已有的端口,你需要指定类型、协议和端口号。例如,要将 tcp 协议的 80 端口从 http_port_t 类型修改为 ftp_port_t 类型,你可以输入:
[linux@bashcommandnotfound.cn ~]$ sudo semanage port -m -t ftp_port_t -p tcp 80
这个命令会在 SELinux 策略中修改一个已有的记录,允许 ftp 服务使用 tcp 协议的 80 端口。
实例4:删除一个已有的端口
要删除一个已有的端口,你需要指定协议和端口号。例如,要删除 udp 协议的 7956 端口,你可以输入:
[linux@bashcommandnotfound.cn ~]$ sudo semanage port -d -p udp 7956
这个命令会在 SELinux 策略中删除一个已有的记录,不再允许任何服务使用 udp 协议的 7956 端口。
实例5:列出所有的布尔值
要列出 SELinux 策略中的所有布尔值,你可以输入:
[linux@bashcommandnotfound.cn ~]$ sudo semanage boolean -l
输出:
SELinux boolean State Default Description
abrt_anon_write (off , off) Allow abrt to anon write
abrt_handle_event (off , off) Allow abrt to handle event
abrt_upload_watch_anon_write (on , on) Allow abrt to upload watch anon write
antivirus_can_scan_system (off , off) Allow antivirus to can scan system
antivirus_use_jit (off , off) Allow antivirus to use jit
auditadm_exec_content (on , on) Allow auditadm to exec content
...
这个命令会显示 SELinux 的布尔值名称、当前状态、默认状态和描述。
实例6:修改一个布尔值
要修改一个布尔值,你需要指定布尔值名称和状态。例如,要将 httpd_can_network_connect 布尔值设置为 on,你可以输入:
[linux@bashcommandnotfound.cn ~]$ sudo semanage boolean -m --on httpd_can_network_connect
实例7:列出所有的文件上下文
要列出 SELinux 策略中的所有文件上下文,你可以输入:
[linux@bashcommandnotfound.cn ~]$ sudo semanage fcontext -l
输出:
SELinux fcontext type Context
/usr/sbin/abrt-dump-oops regular file system_u:object_r:abrt_dump_oops_exec_t:s0
/usr/sbin/abrt-dump-journal-oops regular file system_u:object_r:abrt_dump_oops_exec_t:s0
/usr/sbin/abrt-dump-journal-xorg regular file system_u:object_r:abrt_dump_oops_exec_t:s0
/usr/sbin/abrt-dump-journal-core regular file system_u:object_r:abrt_dump_oops_exec_t:s0
/usr/sbin/abrt-handle-event regular file system_u:object_r:abrt_handle_event_exec_t:s0
/usr/sbin/abrt-watch-log regular file system_u:object_r:abrt_watch_log_exec_t:s0
...
这个命令会显示 SELinux 的文件上下文名称、类型和安全上下文。
实例8:创建或添加一个新的文件上下文
要创建或添加一个新的文件上下文,你需要指定文件路径和类型。例如,要将 /var/www/html 目录及其子目录和文件分配给 httpd_sys_content_t 类型,你可以输入:
[linux@bashcommandnotfound.cn ~]$ sudo semanage fcontext -a -t httpd_sys_content_t "/var/www/html(/.*)?"
这个命令会在 SELinux 策略中添加一个新的记录,允许 http 服务访问 /var/www/html 目录下的内容。
实例9:修改一个已有的文件上下文
要修改一个已有的文件上下文,你需要指定文件路径和类型。例如,要将 /var/www/html 目录及其子目录和文件从 httpd_sys_content_t 类型修改为 httpd_sys_rw_content_t 类型,你可以输入:
[linux@bashcommandnotfound.cn ~]$ sudo semanage fcontext -m -t httpd_sys_rw_content_t "/var/www/html(/.*)?"
这个命令会在 SELinux 策略中修改一个已有的记录,允许 http 服务读写 /var/www/html 目录下的内容。
实例10:删除一个已有的文件上下文
要删除一个已有的文件上下文,你需要指定文件路径。例如,要删除 /var/www/html 目录及其子目录和文件的文件上下文,你可以输入:
[linux@bashcommandnotfound.cn ~]$ sudo semanage fcontext -d "/var/www/html(/.*)?"
这个命令会在 SELinux 策略中删除一个已有的记录,不再允许任何服务访问 /var/www/html 目录下的内容。
实例11:列出所有的用户
要列出 SELinux 策略中的所有用户,你可以输入:
[linux@bashcommandnotfound.cn ~]$ sudo semanage user -l
输出:
SELinux User Prefix MCS Level MCS Range SELinux Roles
guest_u user s0 s0 guest_r
root user s0 s0-s0:c0.c1023 staff_r sysadm_r system_r unconfined_r
staff_u user s0 s0-s0:c0.c1023 staff_r sysadm_r system_r unconfined_r
sysadm_u user s0 s0-s0:c0.c1023 sysadm_r
system_u user s0 s0-s0:c0.c1023 system_r unconfined_r
unconfined_u user s0 s0-s0:c0.c1023 system_r unconfined_r
user_u user s0 s0 user_r
xguest_u user s0 s0 xguest_r
这个命令会显示 SELinux 的用户名称、前缀、MCS 等级、MCS 范围和 SELinux 角色。
实例12:创建或添加一个新的用户
要创建或添加一个新的用户,你需要指定用户名称、前缀、MCS 等级、MCS 范围和 SELinux 角色。例如,要创建一个名为 test_u 的用户,前缀为 user,MCS 等级为 s0,MCS 范围为 s0,SELinux 角色为 user_r,你可以输入:
[linux@bashcommandnotfound.cn ~]$ sudo semanage user -a -P user -R user_r -L s0 -r s0 test_u
这个命令会在 SELinux 策略中添加一个新的记录,定义一个名为 test_u 的用户。
实例13:修改一个已有的用户
要修改一个已有的用户,你需要指定用户名称和要修改的属性。例如,要将 test_u 用户的 SELinux 角色从 user_r 修改为 staff_r,你可以输入:
[linux@bashcommandnotfound.cn ~]$ sudo semanage user -m -R staff_r test_u
这个命令会在 SELinux 策略中修改一个已有的记录,修改 test_u 用户的 SELinux 角色。
实例14:删除一个已有的用户
要删除一个已有的用户,你需要指定用户名称。例如,要删除 test_u 用户,你可以输入:
[linux@bashcommandnotfound.cn ~]$ sudo semanage user -d test_u
这个命令会在 SELinux 策略中删除一个已有的记录,删除 test_u 用户。
实例15:列出所有的进程类型
要列出 SELinux 策略中的所有进程类型,你可以输入:
[linux@bashcommandnotfound.cn ~]$ sudo semanage permissive -l
输出:
Customized Permissive Types
abrt_helper_t
abrt_t
abrt_upload_watch_t
abrt_watch_log_t
abrt_handle_event_t
...
这个命令会显示 SELinux 的进程类型名称,这些类型是被设置为宽容模式的,即允许 SELinux 记录违反策略的行为,但不阻止它们。
Linux semanage 命令的注意事项
- semanage 命令需要 root 权限或 sudo 权限才能执行。
- semanage 命令只能修改 SELinux 的本地策略,不能修改全局策略。
- semanage 命令修改的文件上下文需要用 restorecon 命令来应用到实际的文件系统上。
- semanage 命令的输出可以用 grep 命令来过滤或搜索,例如:
[linux@bashcommandnotfound.cn ~]$ sudo semanage port -l | grep http
- semanage 命令的输出可以用 sort 命令来排序,例如:
[linux@bashcommandnotfound.cn ~]$ sudo semanage port -l | sort -k 3 -n
- semanage 命令的输出可以用 awk 命令来提取或格式化,例如:
[linux@bashcommandnotfound.cn ~]$ sudo semanage port -l | awk '{print $3,$1,$2}'
评论区