文前说明
作为码农中的一员,需要不断的学习,我工作之余将一些分析总结和学习笔记写成博客与大家一起交流,也希望采用这种方式记录自己的学习之旅。
本文仅供学习交流使用,侵权必删。
不用于商业目的,转载请注明出处。
1. 简介
- 大多数操作系统中主要的访问控制类型为 DAC(任意访问控制)。
- SELinux 是一个灵活的、可配置的 MAC(强制访问控制) 机制。
- 将程序访问资源限制在访问规则当中,由规则决定访问主体是否有对客体的访问权限。
- Linux 系统中,主体通常指程序进程,而客体通常表示系统资源(如文件、目录、套接字、共享内存等)。
1.1 DAC(任意访问控制)
- 将资源访问者分成三类, 分别是 User(owner)、Group、Other 资源针对这三类访问者设置不同的访问权限. 而访问权限又分成 Read(4)、Write(2)、Execute(1)。
- 访问者进程有自己的 uid/gid 通过 uid/gid 和 文件权限匹配,确定是否可以访问。
-
DAC 机制是基于用户标识的访问控制属性。
- 用户被授权允许访问,用户程序也被授权访问,如果程序被授权访问,那么恶意程序也同样被授予访问权。
- 每一个进程默认都拿到对应用户的所有权限,可以改动/删除该用户的所有文件资源。
1.2 MAC(强制访问控制)
- 要求系统对每一项访问资源都进行针对性验证。
- 这个针对性的验证是根据已经定义好的策略进行的。
- 即使拥有 root 权限,如果无法通过 MAC 验证,一样无法真正执行相关的操作。
- 大多数常见的 MAC 机制都实现了多层安全模型(MLS)。
- 模型中所有的主体和客体都标记有安全级别。
- MLS 对访问控制最根本的改变,是数据的所有者(或用户)不可以任意决定谁可以访问客体。
- 主体可以读取底层客体(向下读取),写入高层客体(向上写入)。
1.3 SELinux
-
SELinux 全称 Security Enhanced Linux (安全强化 Linux),是美国国家安全局(NSA)对于 MAC (Mandatory Access Control,强制访问控制系统)的一个实现,目的在于明确的指明某个进程可以访问的资源(文件、网络端口等)。
- 强制访问控制系统的用途在于增强系统抵御 0-Day 攻击(利用尚未公开的漏洞实现的攻击行为)的能力。
- SELinux 实现了一个灵活的 MAC 机制,叫做类型强制(TE)。
- 在类型强制的策略中,所有的主体和客体都有一个类型表示符与之关联。
- 如果主体想要访问客体,那么主体的类型必须被授权访问客体的类型,而无关主体用户表示符。
-
SELinux 实际上是一个特殊的策略文件,涵盖了 SELinux 内核将会实施的所有规则。启动的过程中,策略会被载入内核,内核会使用它作为访问控制的依据。
1.3.1 优势
- 相比其他强制性访问控制系统。
- 控制策略是可查询而非程序不可见的。
- 可以热更改策略而无需重启或者停止服务。
- 可以从进程初始化、继承和程序执行三个方面通过策略进行控制。
- 控制范围覆盖文件系统、目录、文件、文件启动描述符、端口、消息接口和网络接口。
- 开启 SELinux 仅在少数情况下导致系统性能约 5% 的降低。
1.3.2 强制类型安全上下文
- SELinux 中,访问控制属性叫做安全上上下文。
- 无论主体还是客体都有与之关联的安全上下文。
- 基于类型强制策略,因此在安全上下文中的类型标识符(t)决定了访问权。
- 基于标准 Linux,访问客体时,要同时满足传统的权限控制 UGO 模型和 SELinux 类型增强策略。
- 安全上下文是由三部分组成。
- 用户(u)、角色(r)、类型(t)。
- 为了方便管理,客体的角色(r)通常被定义为 object_r。
[root@nodeA ovirt-engine]# ls -Z
drwxr-xr-x. root root system_u:object_r:bin_t:s0 bin
drwxr-xr-x. root root system_u:object_r:usr_t:s0 branding
drwxr-xr-x. root root system_u:object_r:usr_t:s0 conf
drwxr-xr-x. root root system_u:object_r:usr_t:s0 dbscripts
drwxr-xr-x. root root system_u:object_r:usr_t:s0 engine.ear
drwxr-xr-x. root root system_u:object_r:usr_t:s0 files
drwxr-xr-x. root root system_u:object_r:usr_t:s0 firewalld
drwxr-xr-x. root root system_u:object_r:usr_t:s0 modules
drwxr-xr-x. root root system_u:object_r:usr_t:s0 services
drwxr-xr-x. root root system_u:object_r:usr_t:s0 setup
drwxr-xr-x. root root system_u:object_r:usr_t:s0 ui-plugins
[root@engine22 keepalived]# ps -eZ |grep ovirt
system_u:system_r:initrc_t:s0 1856 ? 00:00:00 ovirt-websocket
- 一个进程(主体)的类型通常被称为一个域(domain)," 域 "、" 域类型 "、" 主体类型" 和进程类型都是一个意思。
1.3.3 类型强制访问控制
allow <Source type> <Target type> : <Object class> {<Permission>};
allow keepalived_t var_lib_t:file { open read };
allow keepalived_t etc_t:file append;
allow keepalived_t etc_t:file setattr;
allow keepalived_t tmp_t:file setattr;
1.3.4 域转换
-
setuid 方式可以通过 chmod 命令增加操作目录/文件的 setuid 权限。
-
S 指的是 setuid 位,意思是任何执行这个文件的进程,uid 都将变成文件的所有者。
[root@engine22 ~]# chmod u+s anaconda-ks.cfg
[root@engine22 ~]# ll
总用量 4
-rwS------. 1 root root 1241 5月 23 09:47 anaconda-ks.cfg
-
te 方式,通过设置 allow 规则实现。
- 默认域转变:type_transition 指令。
- 将主体 user_t 域转变为主体 passwd_t 域
type_transition user_t passwd_exec_t : process passwd_t
1.3.5 SELinux 特性
-
Permissive(许可)模式。
- SELinux 可以运行在 Permissive 模式中,这个模式只存在访问检查但不会拒绝不允许的访问。
- sestatus 工具,可以查询系统的 SELinux 目前狀态。
Usage: sestatus [OPTION]
-v Verbose check of process and file contexts.
-b Display current state of booleans.
[root@nodeA ~]# sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 28
- selinuxenabled 工具,可以查询系统的 SELinux 是否启用。
- 可以通过返回值判断 SELinux 是否已经启动。
[root@nodeA ~]# selinuxenabled;echo $?
0
- setenforce 工具,可以设定 SELinux 的运行狀态。
usage: setenforce [ Enforcing | Permissive | 1 | 0 ]
[root@nodeA ~]# getenforce
Enforcing
[root@nodeA ~]# setenforce Permissive
[root@nodeA ~]# getenforce
Permissive
2 SELinu 策略语言
2.1 声明客体类别(Object class(es))
- 语句由关键字 class 加上需要定义的类别名组成,在声明语句的末尾没有分号。
class 类别名字
// 为目录声明一个客体类别
class dir
客体类别 |
描述 |
blk_file |
Block files(块文件) |
chr_file |
Character files(字符文件) |
dir |
Directories(目录) |
fd |
File descriptors(文件描述符) |
fifo_file |
Named pipes(命名管道) |
file |
Ordinary files(普通文件) |
filesystem |
Filesystem(for example,an actual partition)(文件系统,如分区) |
lnk_file |
Symbolic links(符号链接) |
sock_file |
UNIX domain sockets(UNIX 域套接字) |
客体类别 |
描述 |
association |
IPsec security association(IPsec 安全联盟) |
key_socket |
Sockets that are of protocol family PF_KEY , used for key management in IPsec(PF_KEY协议家族的套接字,用于管理IPsec中的秘钥) |
netif |
Network interface(网络接口,如eth0) |
netlink_audit_socket |
Netlink socket for controlling auditing(用于控制审核的Netlink套接字) |
netlink_dnrt_socket |
Netlink socket for controlling DECnet routing(控制DECnet路由的Netlink套接字) |
netlink_firewall_socket |
Netlink socket for creating user space firewall filters(用于创建用户空间防火墙过滤器的Netlink套接字) |
netlink_ip6fw_socket |
Netlink socket for creating user space firewall filters(用于创建用户空间防火墙过滤器的Netlink套接字 ) |
netlink_kobject_uevent_socket |
Netlink socket for receiving kernel event notifications in user space(用于在用户空间接收内核时间通知的Netlink套接字) |
netlink_nflog_socket |
Netlink socket for receiving Netfilter logging messages( 用于接收Netfilter日志消息的Netlink套接字 ) |
netlink_route_socket |
Netlink socket for controlling and managing network resources such as the routing table and IP address(用于控制和管理网络资源如路由表和IP地址的Netlink套接字 ) |
netlink_selinux_socket |
Netlink socket for receiving notices of policy load, enforcement mode toggle, and AVC cache flush(用于接收策略载入通知,强制模式切换和清空AVC缓存的Netlink套接字 ) |
netlink_tcpdiag_socket |
Netlink socket for monitoring TCP connections( 用于件事TCP连接的Netlink套接字) |
netlink_socket |
All other Netlink sockets(所有其他的Netlink套接字) |
netlink_xfrm_socket |
Netlink socket for getting, maintaining, and setting IPsec parameters(用于获取、管理和设置IPsec参数的Netlink套接字) |
node |
Host represented by an IP address or range of addresses(代表一个IP地址或一段IP地址的主机) |
packet_socket |
Raw sockets where the protocol is implemented in userspace(协议在用户空间执行的原始套接字) |
rawip_socket |
IP sockets that are neither TCP or UDP(既不是TCP也不是UDP的IP套接字) |
socket |
All other sockets(其他套接字) |
tcp_socket |
TCP sockets(TCP套接字) |
udp_socket |
UDP sockets(UDP套接字) |
unix_dgram_socket |
IPC datagram sockets on a local machine (UNIX domain)(本地机器上(unix域)的IPC数据报套接字) |
unix_stream_socket |
IPC stream sockets on a local machine (UNIX domain)(本地机器上(unix域)的IPC流套接字) |
客体类别 |
描述 |
ipc |
Deprecated; no longer used(不建议使用) |
msg |
Messages within a message queue (消息队列中的消息) |
msgg |
Message queues (消息队列) |
sem |
Semaphores (信号量) |
shm |
Shared memory segment (共享内存段) |
客体类别 |
描述 |
capability |
Privileges that are implemented as capabilities in Linux 特权 |
process |
Processes which are also objects in SELinux SELinux中的进程 |
security |
SELinux security server in the kernel 内核中的SELinux |
system |
System as a whole (整个系统) |
2.2 声明客体许可(Permission(s))
- 撤销授予的访问权限是安全机制灵活和动态的重要体现。当策略发生变化或客体安全上下文发生变化时,就需要撤销以前授予的权限。
- SELinux 支持多种环境下的撤销,如每次对文件进行读写操作时都会检查文件的访问权,如果文件的安全上下文发生变化,那么在下次进行读写时,相关访问权限就会被撤销。
- 有很多时候访问权是不会撤销的,通常情况下,可以避免大多数撤销问题,通过设计系统不重新标记客体实现,SELinux 提供对许可(relabelfrom 和 relabelto)来限制这个能力。
2.2.1 通用许可
- 允许创建一套与多个客体类别一起构成组的许可。
- UNIX 基本原理 " 一切都是许可 " 意味着许多与文件有关的客体类别都有一套通用许可。
common 通用名 {许可集}
- 如下声明了名为 file 的通用许可集,这里的 file 并不是客体类别中的 file,它们在策略中属于不同的组件,仅仅是名字相同而已。
- 客体类别与客体许可中声明的关键字都是存在于自身独立的命名空间中的。
common file
{
ioctl
read
write
create
getattr
setattr
lock
relabelfrom
relabelto
append
unlink
link
rename
execute
swapon
quotaon
mounton
}
2.2.2 联合许可
class dir { search }
class dir { search add_name remove_name }
- 在访问向量语句中,也可以使用inherits来联合通用许可。
class dir inherits file {add_name remove_name reparent search rmdir}
2.2.3 文件客体类别许可
file 许可 |
描述 |
分类 |
ioctl |
ioctl(2)系统调用请求 |
|
read |
读取文件内容,对应标准 Linux 下的 r 访问权 |
标准 Linux 许可 |
write |
写入文件内容,对应标准 Linux 下的 w 访问权 |
标准 Linux 许可 |
create |
创建一个新文件 |
|
getattr |
获取文件的属性,如访问模式(例如:stat,部分 ioctl) |
|
setattr |
改变文件的属性,如访问模式(例如:chmod,部分 ioctl) |
|
lock |
设置和清除文件锁 |
|
relabelfrom |
从现有类型改变安全上下文 |
SELinux 特定许可 |
relabelto |
改变新类型的安全上下文 |
SELinux 特定许可 |
append |
附加到文件内容(即用 o_append 标记打开) |
文件扩展许可 |
unlink |
移除硬链接(删除) |
|
link |
创建一个硬链接 |
|
rename |
重命名一个硬链接 |
|
execute |
执行,与标准 Linux 下的 x 访问权一致 |
标准 Linux 许可 |
swapon |
不赞成使用。它用于将文件当做换页/交换空间 |
文件扩展许可 |
quotaon |
允许文件用作一个限额数据库 |
文件扩展许可 |
mounton |
用作挂载点 |
文件扩展许可 |
audit_access |
|
|
open |
打开文件 |
|
execmod |
使被修改过的文件可执行(含有写时复制的意思) |
SELinux 特定许可 |
execute_no_trans |
在访问者域转换的执行文件(即没有域转换) |
SELinux 特定许可 |
entrypoint |
通过域转换,可以用作新域的入口点的文件 |
SELinux 特定许可 |
- 大多数与文件有关的客体类别的许可都是公用的,只有 execute_no_trans,entrypoint 和 execmod 是特定给 file 客体类别的。
2.2.3.1 标准 Linux 许可
- read、write 和 execute 基本上与 Linux 中对应的权限类似,但并不完全相同。
- 访问权限通常在文件打开时进行检查。
- 而 SELinux 中访问权限每次使用时都会检查,当一个文件被映射到内存中时,也会检查
read 和 write 许可。
- read 许可包括了读取整个文件的能力,它包括以一种随机方式访问文件的许可。
- write 许可包括写入文件的许可,包括附加。
- execute 许可在成功使用一个文件作为共享库时也是必需的。
2.2.3.2 SELinux 特定许可
- 对于文件而言有五种 SELinux 特定许可,relabelfrom,relabelto,execute_no_trans,enTRypoint 和 execmod。
- relabelfrom 和 relabelto 许可控制域类型将文件从一个类型改为另一个类型的能力,为了使重新标记文件成功,域类型必须要有该文件客体当前类型的 relabelfrom 许可,并且还要有新类型的 relabelto 许可,注意这些许可不允许控制确切的许可对,域可以将它有 relabelfrom 许可的任何类型改为它有 relabelto 许可的任何类型,在重新标记时可以增加约束。
- execute_no_trans 许可允许域执行一个无域转换的文件,这个许可还不够执行一个文件,还需要 execute 许可。
- 没有 execute_no_trans 许可,进程可能只能在一个域内执行。
- 想要确保一个执行过程总是会引发一个域转换(或失败)时,此时就会排除
execute_no_trans 许可。
- entrypoint 许可提供控制使用可执行文件允许域转换的能力。
- execmod 许可提供控制执行在进程内存中已经被修改了的内存映像文件的能力,这在防止共享库被另一个进程修改时非常有用,没有这个许可时,如果一个内存映像文件在内存中已经被修改了,进程就不能再执行这个文件了。
2.2.4 进程客体类别许可
process 许可 |
描述 |
分类 |
fork |
派生两个进程 |
创建进程 |
transition |
通过 execve(2) 系统调用转换到一个新的上下文(域类型) |
进程域类型转换 |
sigchld |
发送 sigchld 信号 |
进程信号 |
sigkill |
发送 sigkill 信号 |
进程信号 |
sigstop |
发送 sigstop 信号 |
进程信号 |
signull |
不发送信号测试另一个进程的存在性 |
进程信号 |
signal |
发送一个非 sigkill、sigstop 或 sigchld 的信号 |
进程信号 |
ptrace |
跟踪程序执行的父进程或子进程 |
|
getsched |
获取进程的优先级 |
进程属性 |
setsched |
设置进程的优先级 |
进程属性 |
getsession |
获取进程的会话 ID |
进程属性 |
getpgid |
获取进程的组进程 ID |
进程属性 |
setpgid |
设置进程的组进程 ID |
进程属性 |
getcap |
获取这个进程允许的 Linux 能力 |
进程属性 |
setcap |
为进程设置允许的 Linux 能力 |
进程属性 |
share |
允许与克隆的或派生的进程共享状态 |
创建进程 |
getattr |
通过 /proc/[pid]/attr/ 目录获取进程的属性 |
|
setexec |
下一次调用 execve(2) 时覆盖默认的上下文 |
|
setfscreate |
允许进程设置由其创建的客体的上下文 |
|
noatsecure |
禁用清除安全模式环境,允许进程在 execve(2) 上禁用 glibc 的安全模式特性 |
进程域类型转换 |
siginh |
在 execve(2) 上继承信号状态 |
创建进程 |
setrlimit |
改变进程硬性资源限制 |
|
rlimitinh |
在 execve(2) 上继承进程资源限制 |
创建进程 |
dyntransition |
允许进程动态地转移到新的上下文中 |
进程域类型转换 |
setcurrent |
设置当前的进程上下文,当进程试图执行一个动态域转换时,这是第一个检查的能力 |
|
execmem |
产生一个匿名的映像或可写的私有文件映像可执行体 |
执行可写入内存 |
execstack |
产生进程堆栈可执行体 |
执行可写入内存 |
execheap |
产生一个堆栈可执行体 |
执行可写入内存 |
setkeycreate |
|
|
setsockcreate |
|
|
2.3 类型增强
- SELinux 策略大部分是一套声明和规则一起定义的类型增强(TE)策略。
- 每个进程对每个资源的访问,都必须要有一条允许的 TE 访问规则。
- 所有规则都属于两类范畴:访问向量(AV,即权限)和类型规则。
- SELinux 主要使用类型来确定什么访问是被允许的,而别名是为类型定义的另外一个名字。
2.3.1 属性、类型和别名
2.3.1.1 类型声明
- 这里所说的类型指的是域类型和客体类型。
- 别名集 如果有多个别名,可在一对大括号中用空格将各个别名区别开来,如:alias {aliasa_t aliasb_t}。
- 属性集 如果同时指定多个属性标识符,属性之间使用逗号进行分隔,如:type
bin_t,file_type,exec_type。
type 类型名称 [alias 别名集] [,属性集];
type httpd_t;
type http_user_content_t;
2.3.1.2 属性声明
- 规则默认情况下是拒绝所有访问的,每一个访问都需要明确声明,那么一个系统上的策略将会非常的复杂和冗长,那么此时属性的存在将会是这种情况得到很大的缓解。
- 类型和属性共享相同的命名空间,即类型和属性命名不能重复。
- 域类型和属性共享命名空间,在对类型进行声明的时候,通常在最后已 " _t "结尾,这是通俗的约定写法。
attribute 属性名称;
2.3.1.3 关联类型和属性
type 类型名,属性名;
type http_user_content_t,file_type;
typeattribute 类型名 属性名;
type httpd_user_content_t;
typeattribute httpd_user_content_t file_type,httpdcontent;
2.3.1.4 别名
- 别名的设计通常是为了策略更新时新旧类型的兼容性。
- 声明语句中使用 alias 为类型定义一个别名。
type mozilla_t alias netscape_t, domain
typealias 类型名称 alias 别名名称
type mozilla_t, domain;
typealias mozilla_t alias netscape_t;
2.3.2 访问向量规则( Access Vector Rules,即 AV 规则)
- AV 规则是按照对客体类别的访问许可指定具体含义的规则。
-
allow 表示主体对客体执行允许的操作。
-
dontaudit 表示不记录违反规则的决策信息,且违反规则不影响运行。
-
auditallow 表示允许操作并记录访问决策信息。
-
neverallow 表示不允许主体对客体执行指定的操作。
2.3.2.1 AV 规则语法
2.3.2.1.1 通用 AV 规则语法
allow(规则类型) user_t(域类型) bin_t(客体类型) : file(客体类别) execute(访问向量);
- 规则名称:allow、dontaudit、auditallow 和 neverallow。
- 源类型:授予访问的类型,通常指域类型-进程。
- 目标类型:客体的类型。
- 客体类别:客体的类别,如 file。
- 许可:表示主体访问客体时所指定操作类型,即许可。
2.3.2.1.2 AV 规则的键
- 域类型、客体类型和客体类别共同组成了键。
- 多个规则使用同一个键,编译后的策略会将具有相同键的规则通过 checkpolicy 进行整合为一条规则。
2.3.2.1.3 AV 规则中使用属性
allow domain exec_type:file execute;
2.3.2.1.4 AV 规则中的多类型和属性
allow user_t { bin_t sbin_t }:file execute;
allow {user_t domain} {bin_t file_type sbin_t}:file execute;
2.3.2.1.5 特殊类型 self
- self 是策略语言中的一个关键字,通常用于 AV 规则中的客体类型中。
- self 通常用于主体类型与客体类型相同的场景。
- 区别在于第一条语句属性为 user_t 的进程可以向属性为 user_t 的所有进程发送信号。
- 第二条语句属性为 user_t 的进程可以向属性为 user_t 的进程发送信号,但仅限于进程自身。
allow user_t user_t:process signal;
allow user_t self:process signal;
allow user_t user_t:process signal;
allow staff_t staff_t:process signal;
allow {user_t staff_t} self:process signal;
2.3.2.1.6 特殊操作符 " 非 "
- 某个属性来指代一组域域类型,而该组域类型中我们不希望某个域类型针对客体类型具有相关访问许可。
- AV 规则中对 " 非 " 操作符的顺序并没有要求。
- 属性为 domain 的域类型可以对属性为 exec_type 的客体类型具有可执行权限,但客体类型中并不包括 sbin_t。
allow domain { exec_type -sbin_t }:file execute;
2.3.2.1.7 在 AV 规则中指定多个客体类别和类型
allow user_t bin_t:{ file dir } { read getattr };
- read 和 getattr 权限对 file 和 dir 客体类别来说属于通用许可的范畴,但 search 只对 dir 客体类别有效。
- 为 file 类别提供了一个无效的许可(search)。当 checkpolicy 时不能为其创建键,编译的时候会报错。
// 无效的规则,因为 search 对于客体类别 file 是无效的
allow user_t bin_t:{ file dir } { read getattr search };
// 当许可对两个客体类别不是都有效时,需要两条规则
allow user_t bin_t:file { read getattr };
allow user_t bin_t:dir { read getattr search };
2.3.2.1.8 AV 规则中的特殊许可操作符
- AV 规则语法定义了两个特殊的许可操作符,分别是通配符(*)和补集(~)。
- 通配符的使用。
- 通配符所指代的许可只针对那些有效的客体类别有效。
- 下列例子中 dir 客体类别的 search 对客体类别 file 并无任何影响。
// 域类型 user_t 具有对客体类型 bint_t 的客体类别 file 和 dir 具有所有许可。
allow user_t bin_t:{ file dir } *;
// 允许域类型 user_t 对客体类型 bin_t 具有除 write、setattr、ioctl 之外的任何访问许可。
allow user_t bin_t:file ~{ write setattr ioctl };
2.3.2.2 allow 规则
- 是 SELinux 策略中允许许可的唯一方法。
- AV 规则具有累加性。
// 允许域类型为 user_t 的进程对客体类型为 bin_t 的文件具有读和可执行权限。
allow user_t bin_t:file { read execute };
2.3.2.3 audit 规则
- SELinxu 有大量的工具用于记录日志信息、审核信息和那些被策略允许或禁止的访问尝试信息。
- 其中审核信息被称之为 " AVC 信息 ",在 AVC 信息中我们可以看到非常详细的信息,包括访问被允许还是被禁止,安全上下文的域类型、客体类型等。
- 这些信息被保存在 /var/log下的日志文件中。
// 域类型为 httpd_t 的进程对客体类型为 etc_t 的目录进行 search 访问被拒绝时,这个拒绝不会被审核。简单来理解就是对权限检查失败的操作不做记录。
dontaudit httpd_t etc_t:dir search;
// 域类型为 domain 的进程对客体类型为 shadow_t 的文件进行 write 访问得到允许时进行审核。
auditallow domain shadow_t:file write;
2.3.2.4 neverallow 规则
- neverallow 的设计主要是为了避免非法的授权。
- 意义在于策略中误添加了一条允许域类型为 user_t 的进程对客体类型为 shadow_t 的文件具有写权限时,在编译策略时就会报错。
// 禁止域类型为 user_t 的进程执行对客体类型为 shadow_t 的文件写权限。
neverallow user_t shadow_t:file write;
2.4 类型规则
- 类型规则是在创建客体或者运行过程重新标记时指定的默认类型。
-
type_transition:域转换过程重新标记时或创建客体时,指定的默认类型。
-
type_change:使用 SELinux 的应用程序执行标记时指定的默认类型。
2.4.1 通用类型规则语法
规则名称 |
type_transition 或 type_change |
源类型(域类型,如进程) |
The type(s) of the creating or owning process(创建或拥有进程的类型) |
目标类型(客体类型,如某个具体的文件或目录等) |
新的或重新标记的客体的客体类型 |
客体类别(如文件file、目录dir等) |
新的或重新标记的客体的类别 |
默认类型 |
新创建或重新标记的单一默认类型 |
- 进程类型若没有其他请求将会默认转换为 passwd_t 。
// 规则名称 域类型 客体类型:客体类别 默认类型。
type_transition user_t passwd_exec_t:process passwd_t;
// type_transition 规则在域列表中包括两个类型:user_t 和 sysadm_t 。
type_transition { user_t sysadm_t } passwd_exec_t:process passwd_t;
- 在类型规则中同样可以使用属性的概念,但由于默认类型只能指定一个,属性和上面的多个类型不能用于默认类型。
- 同样不能指定两条独立的规则同时拥有相同的规则名称、域类型、客体类型、客体类别。
- 如果把类型规则中的规则名称、域类型、客体类型、客体类别作为类型规则的键,而默认类型作为类型规则的值,一个键不能存在多个不同的值。
// 这两条规则将会冲突,编译时会报错
type_transition user_t passwd_exec_t:process passwd_t;
type_transition user_t passwd_exec_t:process user_passwd_t;
2.4.2 类型转换规则
- type_transition 规则没有 allow 访问权,仅是提供一个默认类型标记,要成功进行类型转换,还需要一套相关联的 allow 规则,才能允许进程创建客体或标记客体。
2.4.2.1 默认域转换
//类型为 init_t 的进程执行一个类型为 apache_exec_t 的文件时,进程类型将会转换到 apache_t。
type_transition init_t apache_exec_t:process apache_t;
- 域转换只是改变进程现有的类型,而不是创建一个新的进程。
- type_transition 规则没有 allow 访问权,仅是提供一个默认类型标记,要成功进行类型转换,还需要一套相关联的 allow 规则。
allow init_t apache_exec_t:file execute;
allow init_t apache_t:process transition;
allow apache_t apache_exec_t:file entrypoint;
2.4.2.2 默认客体转换
- 客体转换规则为新创建的客体指定一个默认的类型,通常在与文件系统有关的客体(如 file,dir,lnk_file 等)上使用此规则。
//域类型为 passwd_t 的进程在一个客体类型为 tmp_t 的目录下创建一个普通文件(file 客体类别)时,默认情况下,如果策略允许的话,新创建的文件类型默认为 passwd_tmp_t,而不是客体类型 tmp_t。
type_transition passwd_t tmp_t:file passwd_tmp_t;
2.5 角色和用户
- SELinux 中的访问权不是直接授予用户或角色的,而是通过 TE allow 规则授权给类型的。
- 角色是类型强制的中的一个特性。
- 一般不会将域类型和用户关联,而是将域类型与角色进行关联,然后再将角色与用户关联起来。
- 角色可以理解为一套域类型的集合,可以方便地与用户建立联系。
2.5.1 角色
- SELinux 中只有 object_r 为内置的角色,是直接硬编码进 SELinux 的,不需要进行声明。如果需要定义其他角色就需要在策略中进行声明。
- 角色声明
// 为 user_t 类型声明 user_r 角色
role user_r types user_t;
// 为 passwd_t 类型声明 user_r 角色
role user_r types passwd_t;
allow staff_r sysadm_r;
- 角色转换规则
- 可以使用角色转换规则 role_transition。
// 角色为 sysadm_r 的进程执行 http_exec_t 的文件时,SELinux 会尝试转换为角色 system_r。
role_transition sysadm_r http_exec_t system_r;
// 声明一个角色 super_r,sysadm_r,secadm_r 并使其同时具有 sysadm_r 和 secadm_r 角色的内容。
dominance { role super_r {role sysadm_r; role secadm_r;}
2.5.2 用户
- 使用用户声明语句(user)声明用户以及与之关联的角色。
//声明用户 keepalived 并与角色 user_r 进行关联。
user keepalived roles {user_r};
- 登录程序(如 login、sshd 等)负责映射 Linux 用户到 SELinux 用户。
- 在登录时如果 SELinux 中用户恰好与 Linux 用户完全相同,则对应的 SELinxu 用户就成为初始 shell 进程安全上下文的用户。
- 策略中有一个特殊的用户标识符 user_u,即普通用户,所有 Linux 用户在策略中如果没有匹配就会被映射到 user_u 上。
- 如果普通用户 user_u 没有定义在策略中,任何没有明确在 SELinux 策略中的 Linux 将无法正常登录。
// 定义普通用户 user_u 并授予角色user_r。
// 如果 SELinux 策略中没有定义用户 keepalived,那么当 Linux 用户 keepalived 登录时,在初始 shell 进程安全上下文的用户表示符将是 user_u。
user user_u roles {user_r};
2.6 约束
2.6.1 约束语句
constrain 类别集 许可集 表达式;
关键字 |
说明 |
t1 |
源类型 |
r1 |
源角色 |
u1 |
源用户 |
t2 |
目标类型 |
r2 |
目标角色 |
u2 |
目标用户 |
操作符 |
说明 |
== |
相等 |
!= |
不相等 |
eq |
(角色关键字)等于 |
dom |
(角色关键字)优先于 |
A domby B |
(角色关键字)B优先A |
incomp |
(角色关键字)无可比性 |
// 域转换过程中需要 transition 许可,此约束作了进一步限制,且被应用到 process 客体类别当中。
// 所有的域转换,主客体用户标识符要保持一致。
constrain process transition (u1==u2);
// 要求所有的域转换,主客体角色标识符需保持一致。
constrain process transition (r1==r2);
2.6.2 标记转换约束
关键字 |
说明 |
t1 |
旧安全上下文的类型 |
r1 |
旧安全上下文的角色 |
u1 |
旧安全上下文的用户 |
t2 |
新安全上下文的类型 |
r2 |
新安全上下文的角色 |
u2 |
新安全上下文的用户 |
t3 |
进程安全上下文的类型 |
r3 |
进程安全上下文的角色 |
u3 |
进程安全上下文的用户 |
//首先使用了一个普通文件和一个符号链接文件(lnk_file),因为不想某些人使用链接代替文件。然后表达式中禁止某个域类型被授权可以重新标记一个用户临时文件的类型为 shadow 密码文件的类型。
validatetrans {file lnk_file} ( t2 != shadow_t or t1 !=user_tmp_t );
3. SELinux 相关指令工具
命令 |
说明 |
sestatus |
查询系统的 selinux 目前的狀态。 |
selinuxenabled |
查询系统的 selinux 支持是否有启用。 |
setenforce |
设定 selinux 运行狀态。 |
getsebool |
列出所有 selinux 开关数值清单列表与内容。 |
setsebool |
设定 selinux 开关数值内容。 |
chcon |
变更档案目录的安全上下文。 |
restorecon |
重载档案目录的安全上下文。 |
fixfiles |
修正档案目录的安全上下文。 |
semanage |
SELiux 策略维护管理程序。 |
secon |
分析项目的 SELinux 安全上下文。 |
audit2why |
分析 SELinux audit 日志的内容。 |
sealert |
SELinux 信息诊断用户端程序。 |
3.1 sestatus
Usage: sestatus [OPTION]
-v Verbose check of process and file contexts.
-b Display current state of booleans.
[root@nodeA engine]# sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 28
3.2 selinuxenabled
- 查询系统的 selinux 支持是否有启用。
- 可以通过返回值判断 SELinux 是否已经启动。
[root@engineA engine]# selinuxenabled ; echo $?
0
3.3 setenforce
- setenforce 工具,可以设定 SELinux 的运行狀态。
usage: setenforce [ Enforcing | Permissive | 1 | 0 ]
[root@nodeA ~]# getenforce
Enforcing
[root@nodeA ~]# setenforce Permissive
[root@nodeA ~]# getenforce
Permissive
3.4 getsebool
- 规范了许多 boolean 数值清单档案,提供开启或关闭功能存取项目,而这些值都存放在 /selinux/booleans/ 目录内相关档案。
usage: getsebool -a or getsebool boolean...
[root@engine22 engine-HA.V2.0]# getsebool -a
abrt_anon_write --> off
abrt_handle_event --> off
abrt_upload_watch_anon_write --> on
antivirus_can_scan_system --> off
antivirus_use_jit --> off
auditadm_exec_content --> on
authlogin_nsswitch_use_ldap --> off
authlogin_radius --> off
authlogin_yubikey --> off
awstats_purge_apache_log_files --> off
boinc_execmem --> on
cdrecord_read_content --> off
cluster_can_network_connect --> off
cluster_manage_all_files --> off
cluster_use_execmem --> off
cobbler_anon_write --> off
cobbler_can_network_connect --> off
cobbler_use_cifs --> off
cobbler_use_nfs --> off
collectd_tcp_network_connect --> off
condor_tcp_network_connect --> off
conman_can_network --> off
container_connect_any --> off
......
3.5 setsebool
Usage: setsebool [ -NPV ] boolean value | bool1=val1 bool2=val2...
setsebool ftpd_disable_trans=on
参数 |
说明 |
-N |
磁盘上的策略不会重新加载到内核中。 |
-P |
所有挂起的值都被写入磁盘上的策略文件。将在重新启动时保持持久性。 |
-V |
将从语义库中打印详细的错误消息。 |
3.6 chcon
用法: chcon [选项]... CONTEXT FILES...
或: chcon [选项]... [-u USER] [-r ROLE] [-l RANGE] [-t TYPE] 文件...
或: chcon [选项]... --reference=PEF_FILES FILES...
参数 |
说明 |
CONTEXT |
需要设置的安全上下文。 |
FILES |
对象(文件)。 |
--reference |
参照的对象。 |
PEF_FILES |
参照文件上下文。 |
FILES |
应用参照文件上下文为我的上下文。 |
选择 |
说明 |
-f |
强迫执行。 |
-R |
递归地修改对象的安全上下文。 |
-r ROLE |
修改安全上下文角色的配置。 |
-t TYPE |
修改安全上下文类型的配置。 |
-u USER |
修改安全上下文用户的配置。 |
-v |
显示详细的信息。 |
-l, --range=RANGE |
修改安全上下文中的安全级别。 |
chcon -t var_t /etc/vsftpd/vsftpd.conf
chcon --reference=/var/www/html index.html
若是变更于目录上,后续于该目录内建立的档案目录会套用目录本身 type 设定。
3.7 restorecon
- 重载档案目录的安全上下文。
- 来源于 /etc/selinux/<POLICY>/contexts/files/ 目录中的 file_contexts 与 file_contexts.local。
restorecon [FRrv] [-e excludedir ] pathname... ]
参数 |
说明 |
-r | -R |
包含子目录与其下档案目录 |
-F |
恢复使用预设 |
-v |
显示执行过程 |
restorecon /etc/ntp.conf
restorecon -v /etc/ntp.conf
restorecon -v -F /etc/ntp.conf
- 手动配置新增恢复规则。
- 档案名称:/etc/selinux/<POLICYTYPE>/contexts/files/file_contexts.local。
[root@nodeA files]# pwd
/etc/selinux/targeted/contexts/files
[root@nodeA files]# cat file_contexts.local
# This file is auto-generated by libsemanage
# Do not edit directly.
'sedZPQ2b3' system_u:object_r:snmpd_var_lib_t:s0
'50-rhev-1.brand' system_u:object_r:var_run_t:s0
'rsync' system_u:object_r:var_run_t:s0
'sed0taHOK' system_u:object_r:var_run_t:s0
'branding' system_u:object_r:snmpd_var_lib_t:s0
'engine-backup.log' system_u:object_r:zoneminder_log_t:s0
'20180523095032-setup.conf' system_u:object_r:zarafa_var_lib_t:s0
'/var/lib/ovirt-engine/engine.up' system_u:object_r:zoneminder_log_t:s0
'jhrw.deploy.temp' system_u:object_r:var_run_t:s0
'ovirt-engine' system_u:object_r:snmpd_var_lib_t:s0
'engine-ha.log' system_u:object_r:zoneminder_log_t:s0
'/var/lib/ovirt-engine/setup/answers/20180523095032-setup.conf' system_u:object_r:zoneminder_log_t:s0
sedZPQ2b3 system_u:object_r:snmpd_var_lib_t:s0
engine-ha.log system_u:object_r:keepalived_var_run_t:s0
3.8 fixfiles
- 纠正档案目录的预设的安全上下文,依据 /etc/selinux/<POLICY>/contexts/files/ 内相关档案进行。
/usr/sbin/fixfiles [-v] [-F] [-N time ] [-l logfile ] { check | restore| [-f] relabel | verify } [[dir/file] ... ]
/usr/sbin/fixfiles [-v] [-F] -R rpmpackage[,rpmpackage...] [-l logfile ] { check | restore | verify }
/usr/sbin/fixfiles [-v] [-F] -C PREVIOUS_FILECONTEXT { check | restore | verify }
/usr/sbin/fixfiles [-F] [-B] onboot
参数 |
说明 |
-l logfile |
将输出保存到指定的日志文件。 |
-F |
强制重置上下文以匹配可定制文件的文件上下文。 |
-f |
清除 /tmp 目录,带清除提示。 |
-R rpmpackagename[,rpmpackagename...] |
使用 rpm 数据库发现指定包中的所有文件并还原文件上下文。 |
-N time |
只对指定日期后创建的文件进行操作。日期必须是 " YYYY-MD DD HH:MM " 格式。 |
-v |
显示详细的信息。 |
操作 |
说明 |
check |
打印所有不正确的文件上下文标签,显示旧的和新的上下文,但不要更改它们。 |
restore |
更改任何不正确的文件上下文标签。 |
relable |
提示删除 /tmp 目录的内容,更改所有不正确的文件上下文标签以匹配安装的 file_contexts 文件。 |
verify |
用不正确的文件上下文标签来验证列表文件,但不要更改它们。 |
[[dir/file] ... ] |
希望检查的文件上下文文件或目录树列表。 |
[root@nodeA files]# fixfiles check /etc
Warning: Skipping the following R/O filesystems:
/sys/fs/cgroup
/sbin/restorecon reset /etc/selinux/targeted/semanage.read.LOCK context unconfined_u:object_r:semanage_trans_lock_t:s0->unconfined_u:object_r:selinux_config_t:s0
/sbin/restorecon reset /etc/selinux/targeted/semanage.trans.LOCK context unconfined_u:object_r:semanage_trans_lock_t:s0->unconfined_u:object_r:selinux_config_t:s0
/sbin/restorecon reset /etc/sysconfig/iptables context unconfined_u:object_r:etc_t:s0->unconfined_u:object_r:system_conf_t:s0
/sbin/restorecon reset /etc/sysconfig/anaconda context system_u:object_r:etc_runtime_t:s0->system_u:object_r:etc_t:s0
/sbin/restorecon reset /etc/sysconfig/iptables.20180523094935 context unconfined_u:object_r:etc_t:s0->unconfined_u:object_r:system_conf_t:s0
/sbin/restorecon reset /etc/ovirt-engine/sdcos-schedule/logging.properties context system_u:object_r:etc_runtime_t:s0->system_u:object_r:etc_t:s0
/sbin/restorecon reset /etc/ovirt-engine/sdcos-schedule/sdcos-schedule_history/sdcos-schedule.initial.xml context system_u:object_r:etc_runtime_t:s0->system_u:object_r:etc_t:s0
/sbin/restorecon reset /etc/ovirt-engine/sdcos-schedule/sdcos-schedule_history/sdcos-schedule.last.xml context system_u:object_r:etc_runtime_t:s0->system_u:object_r:etc_t:s0
/sbin/restorecon reset /etc/ovirt-engine/sdcos-schedule/sdcos-schedule_history/sdcos-schedule.boot.xml context system_u:object_r:etc_runtime_t:s0->system_u:object_r:etc_t:s0
3.9 semanage
- SELiux 策略维护管理程序。
- 用于配置 SELiux 策略的某些元素,需要修改或重新编译策略源。
usage: semanage [-h]
{import,export,login,user,port,interface,module,node,fcontext,boolean,permissive,dontaudit}
...
参数 |
说明 |
import |
导入本地定制。 |
export |
导出本地定制。 |
login |
Linux 用户与 SELinux 登录管理登录映射。 |
user |
管理 SELinux 受限用户(角色和级别)。 |
port |
管理网络端口类型定义。 |
interface |
管理网络接口类型定义。 |
module |
管理 SELinux 策略模块。 |
node |
管理网络节点类型定义。 |
fcontext |
上下文文件映射定义。 |
boolean |
管理布尔选择选择性启用功能。 |
permissive |
管理过程类型实施模式。 |
dontaudit |
禁用/启用策略中的 dontaudit 规则。 |
[root@nodeA files]# semanage login -l
登录名 SELinux 用户 MLS/MCS 范围 服务
__default__ unconfined_u s0-s0:c0.c1023 *
root unconfined_u s0-s0:c0.c1023 *
system_u system_u s0-s0:c0.c1023 *
3.10 secon
Usage: secon [-hVurtscmPRCfLp] [ context | - ]
--help -h Show this message.
--version -V Show the version.
--prompt -P Output in a format good for a prompt.
--user -u Show the user of the context.
--role -r Show the role of the context.
--type -t Show the type of the context.
--sensitivity -s Show the sensitivity level of the context.
--clearance -c Show the clearance level of the context.
--mls-range -m Show the sensitivity to clearance range of
the context.
--raw -R Show the context in "raw" format.
--color -C Output using ANSI color codes (requires -P).
--current, --self Get the context for the current process.
--current-exec, --self-exec Get the exec context for the current process.
--current-fs, --self-fs Get the fs context for the current process.
--current-key, --self-key Get the key context for the current process.
--parent Get the context for the parent process.
--parent-exec Get the exec context for the parent process.
--parent-fs Get the fs context for the parent process.
--parent-key Get the key context for the parent process.
--pid -p <arg> Use the context from the specified pid.
--pid-exec <arg> Use the exec context from the specified pid.
--pid-fs <arg> Use the fs context from the specified pid.
--pid-key <arg> Use the key context from the specified pid.
--file -f <arg> Use the context from the specified file.
--link -L <arg> Use the context from the specified link.
[root@nodeA files]# secon -u
unconfined_u
3.11 audit2why
- 分析 SELinux audit 日志内容,提供分析 /var/log/audit/audit.log 内的记录信息。
audit2why < /var/log/audit/audit.log
[root@nodeA files]# audit2why < /var/log/audit/audit.log
......
#Constraint rule:
# constrain lnk_file { create relabelfrom relabelto } ((u1 == u2 -Fail-) or (t1 == { abrt_dump_oops_t abrt_handle_event_t anaconda_t install_t preupgrade_t httpd_t httpd_unconfined_script_t auditadm_su_t auditadm_sudo_t authconfig_t updpwd_t bacula_unconfined_script_t kernel_t boinc_project_t bootloader_t cachefiles_kernel_t certmonger_unconfined_t cinder_api_t cinder_backup_t cinder_scheduler_t cinder_volume_t cloud_init_t cmirrord_t cockpit_session_t condor_startd_t conman_unconfined_script_t container_runtime_t spc_t crond_t system_cronjob_t unconfined_cronjob_t cupsd_t dbadm_sudo_t devicekit_t devicekit_power_t devicekit_disk_t dirsrv_t dirsrvadmin_unconfined_script_t dovecot_t firstboot_t fsadm_t ftpd_t glusterd_t gssproxy_t inetd_t inetd_child_t init_t initrc_t ipa_helper_t ipsec_t racoon_t kdumpctl_t keepalived_unconfined_script_t kadmind_t kpropd_t krb5kdc_t keystone_t slapd_t lsassd_t livecd_t local_login_t sulogin_t syslogd_t logrotate_t clvmd_t lvm_t depmod_t insmod_t mount_t unconfined_mount_t unconfined_munin_plugin_t mysqld_t nagios_unconfined_plugin_t nagios_eventhandler_plugin_t namespace_init_t ncftool_t yppasswdd_t oddjob_t oddjob_mkhomedir_t openshift_initrc_t openshift_t openshift_app_t openvpn_t openvpn_unconfined_script_t openwsman_t pegasus_openlmi_account_t pegasus_openlmi_logicalfile_t pegasus_openlmi_unconfined_t pki_tomcat_t pki_tomcat_script_t policykit_t policykit_auth_t postgresql_t prelink_t prelink_cron_system_t puppetagent_t puppetmaster_t rabbitmq_t radiusd_t realmd_t realmd_consolehelper_t remote_login_t cluster_t rhev_agentd_consolehelper_t rlogind_t gssd_t rpm_t rpm_script_t rshd_t rtas_errd_t samba_unconfined_script_t samba_unconfined_net_t saslauthd_t secadm_t secadm_su_t secadm_sudo_t newrole_t restorecond_t semanage_t setfiles_t setfiles_mac_t unconfined_sendmail_t sge_shepherd_t sge_job_t snapperd_t sosreport_t squid_t sshd_t sssd_t staff_t staff_sudo_t staff_consolehelper_t sysadm_t sysadm_su_t sysadm_sudo_t dhcpc_t systemd_tmpfiles_t telnetd_t tuned_t udev_t unconfined_service_t unconfined_t unconfined_dbusd_t chfn_t groupadd_t passwd_t sysadm_passwd_t useradd_t virtd_t virtd_lxc_t virt_qemu_ga_unconfined_t vlock_t vmtools_t vmtools_helper_t vmware_host_t watchdog_unconfined_t wine_t xdm_t xserver_t xdm_unconfined_t zabbix_script_t } -Fail-) ); Constraint DENIED
# Possible cause is the source user (system_u) and target user (unconfined_u) are different.
3.12 audit2allow
- 从操作日志中的拒绝信息中生成可通过 setlinux 安全策略的允许规则。
[root@localhost ovirt-engine]# audit2allow --help
Usage: audit2allow [options]
Options:
--version show program's version number and exit
-h, --help show this help message and exit
-b, --boot audit messages since last boot conflicts with -i
-a, --all read input from audit log - conflicts with -i
-p POLICY, --policy=POLICY
Policy file to use for analysis
-d, --dmesg read input from dmesg - conflicts with --all and
--input
-i INPUT, --input=INPUT
read input from <input> - conflicts with -a
-l, --lastreload read input only after the last reload
-r, --requires generate require statements for rules
-m MODULE, --module=MODULE
set the module name - implies --requires
-M MODULE_PACKAGE, --module-package=MODULE_PACKAGE
generate a module package - conflicts with -o and -m
-o OUTPUT, --output=OUTPUT
append output to <filename>, conflicts with -M
-D, --dontaudit generate policy with dontaudit rules
-R, --reference generate refpolicy style output
-N, --noreference do not generate refpolicy style output
-v, --verbose explain generated output
-e, --explain fully explain generated output
-t TYPE, --type=TYPE only process messages with a type that matches this
regex
--perm-map=PERM_MAP file name of perm map
--interface-info=INTERFACE_INFO
file name of interface information
--debug leave generated modules for -M
-w, --why Translates SELinux audit messages into a description
of why the access was denied
3.13 sealert
Usage: sealert [options]
Options:
-h, --help show this help message and exit
-b, --browser Launch the browser
-s, --service Start sealert as a dbus service
-S, --noservice Start sealert without dbus service as stand alone app
-l LOOKUPID, --lookupid=LOOKUPID
Lookup alert by id, id may be wildcard * to lookup all
alerts
-a FILE, --analyze=FILE
Scan a log file, analyze it's AVC's
-u USER, --user=USER logon user name
-p PASSWORD, --password=PASSWORD
logon user password
-P PLUGIN, --plugin=PLUGIN
Plugin Name Required for -f
-f FIX, --fix=FIX fix avc with the given uuid, requires plugin
[root@nodeA files]# sealert -a /var/log/audit/audit.log
......
***** 插件 catchall (17.1 置信度) 建议 ********************************************
If you believe that mandb should be allowed read access on the cat1 directory by default.
Then 应该将这个情况作为 bug 报告。
可以生成本地策略模块以允许此访问。
Do
allow this access for now by executing:
# ausearch -c 'mandb' --raw | audit2allow -M my-mandb
# semodule -i my-mandb.pp
更多信息:
源环境 (Context) system_u:system_r:mandb_t:s0-s0:c0.c1023
目标环境 system_u:object_r:unlabeled_t:s0
目标对象 cat1 [ dir ]
源 mandb
源路径 /usr/bin/mandb
端口 <Unknown>
主机 <Unknown>
源 RPM 软件包 man-db-2.6.3-9.el7.x86_64
目标 RPM 软件包
策略 RPM selinux-policy-3.13.1-166.el7.noarch
Selinux 已启用 True
策略类型 targeted
强制模式 Enforcing
主机名 engine22
平台 Linux engine22 3.10.0-693.1.1.el7.x86_64 #1 SMP
Thu Aug 3 08:15:31 EDT 2017 x86_64 x86_64
警报计数 1
第一个 2018-09-01 03:47:02 CST
最后一个 2018-09-01 03:47:02 CST
本地 ID fcd41d4e-8f18-45cb-87ff-e1b7c59dc28a
原始核查信息
type=AVC msg=audit(1535744822.131:22044): avc: denied { read } for pid=1972 comm="mandb" name="cat1" dev="dm-0" ino=51432678 scontext=system_u:system_r:mandb_t:s0-s0:c0.c1023 tcontext=system_u:object_r:unlabeled_t:s0 tclass=dir
yum install setroubleshoot setools
- sealert 分析会给出建议的解决方案,直接执行就可以解决安全策略相关的权限问题。
ausearch -c 'mandb' --raw | audit2allow -M my-mandb
semodule -i my-mandb.pp
3.14 seinfo
[root@localhost answers]# seinfo --help
Usage: seinfo [OPTIONS] [EXPRESSION] [POLICY ...]
Print information about the components of a SELinux policy.
EXPRESSIONS:
-c[NAME], --class[=NAME] print object classes
--sensitivity[=NAME] print sensitivities
--category[=NAME] print categories
-t[NAME], --type[=NAME] print types (no aliases or attributes)
-a[NAME], --attribute[=NAME] print type attributes
-r[NAME], --role[=NAME] print roles
-u[NAME], --user[=NAME] print users
-b[NAME], --bool[=NAME] print conditional booleans
--constrain print constrain statements
--initialsid[=NAME] print initial SIDs
--fs_use[=TYPE] print fs_use statements
--genfscon[=TYPE] print genfscon statements
--netifcon[=NAME] print netif contexts
--nodecon[=ADDR] print node contexts
--permissive print permissive types
--polcap print policy capabilities
--portcon[=PORT] print port contexts
--protocol=PROTO specify a protocol for portcons
--all print all of the above
OPTIONS:
-x, --expand show more info for specified components
--stats print useful policy statistics
-l, --line-breaks print line breaks in constrain statements
-h, --help print this help text and exit
-V, --version print version information and exit
[root@localhost answers]# seinfo
Statistics for policy file: /sys/fs/selinux/policy
Policy Version & Type: v.28 (binary, mls)
Classes: 94 Permissions: 262
Sensitivities: 1 Categories: 1024
Types: 4747 Attributes: 251
Users: 8 Roles: 14
Booleans: 307 Cond. Expr.: 356
Allow: 101724 Neverallow: 0
Auditallow: 155 Dontaudit: 8846
Type_trans: 17759 Type_change: 74
Type_member: 35 Role allow: 39
Role_trans: 416 Range_trans: 5697
Constraints: 109 Validatetrans: 0
Initial SIDs: 27 Fs_use: 29
Genfscon: 105 Portcon: 602
Netifcon: 0 Nodecon: 0
Permissives: 6 Polcap: 2
yum install setools
3.15 sesearch
Usage: sesearch [OPTIONS] RULE_TYPE [RULE_TYPE ...] [EXPESSION] [POLICY ...]
Try sesearch --help for more help.
One of --all, --allow, --neverallow, --auditallow, --dontaudit,
--range_trans, --type, --role_allow, or --role_trans must be specified.
[root@localhost answers]# sesearch --allow
......
allow nscd_t nscd_t : fifo_file { ioctl read write create getattr setattr lock append unlink link rename open } ;
allow chfn_t chfn_t : capability net_bind_service ;
allow chfn_t chfn_t : capability net_bind_service ;
allow httpd_suexec_t w3c_validator_script_exec_t : file { read getattr execute open } ;
allow nscd_t init_var_run_t : dir { getattr search open } ;
allow lpr_t printer_t : sock_file { write getattr append open } ;
allow lpr_t printer_t : sock_file { read getattr open } ;
allow portmap_t portmap_t : fifo_file { ioctl read write create getattr setattr lock append unlink link rename open } ;
allow lsassd_t var_t : dir { getattr search open } ;
allow nscd_t cyphesis_t : lnk_file { read getattr } ;
allow cvs_script_t httpd_suexec_t : process sigchld ;
......
yum install setools