侧边栏壁纸
Linux入门自学网博主等级

每日学一条Linux命令,终成Linux大神

  • 累计撰写 725 篇文章
  • 累计创建 143 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Linux semanage命令教程:配置 SELinux 策略的工具(附实例详解和注意事项)

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}'
0

评论区