美文网首页程序员
SELinux 相关整理

SELinux 相关整理

作者: 58bc06151329 | 来源:发表于2018-09-03 13:29 被阅读509次

    文前说明

    作为码农中的一员,需要不断的学习,我工作之余将一些分析总结和学习笔记写成博客与大家一起交流,也希望采用这种方式记录自己的学习之旅。

    本文仅供学习交流使用,侵权必删。
    不用于商业目的,转载请注明出处。

    1. 简介

    • 大多数操作系统中主要的访问控制类型为 DAC(任意访问控制)。
    • SELinux 是一个灵活的、可配置的 MAC(强制访问控制) 机制。
      • 将程序访问资源限制在访问规则当中,由规则决定访问主体是否有对客体的访问权限。
      • Linux 系统中,主体通常指程序进程,而客体通常表示系统资源(如文件、目录、套接字、共享内存等)。

    1.1 DAC(任意访问控制)

    • 将资源访问者分成三类, 分别是 User(owner)GroupOther 资源针对这三类访问者设置不同的访问权限. 而访问权限又分成 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 类型强制访问控制

    • SELinux 当中,所有访问都必须明确授权,SELinx 默认不允许任何访问。

    • SELinux 当中,通常使用 allow 规则来指定主体类型(即域)对客体类型授予访问权限,也就是 allow 规则规定了哪些类型的进程可以访问哪些客体。

    • allow 规则的组成部分

      • 原类型(Source type(s)) 主体类型,即域。
      • 目标类型(Target type(s)) 客体类型。
      • 客体类别(Object class(es))客体的类别,如文件、目录等。
      • 许可(Permission(s)) 主体可以对客体执行的操作,称之为访问向量。
    • allow 规则的基础语法

    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 是否已经启动。
        • 0 启动
        • 1 关闭
    [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流套接字)
    • 与 PIC 相关的客体类别。
    客体类别 描述
    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 提供对许可(relabelfromrelabelto)来限制这个能力。

    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_transentrypointexecmod 是特定给 file 客体类别的。

    2.2.3.1 标准 Linux 许可

    • read、write 和 execute 基本上与 Linux 中对应的权限类似,但并不完全相同。
      • 访问权限通常在文件打开时进行检查。
      • 而 SELinux 中访问权限每次使用时都会检查,当一个文件被映射到内存中时,也会检查
        read 和 write 许可。
        • read 许可包括了读取整个文件的能力,它包括以一种随机方式访问文件的许可。
        • write 许可包括写入文件的许可,包括附加。
        • execute 许可在成功使用一个文件作为共享库时也是必需的。

    2.2.3.2 SELinux 特定许可

    • 对于文件而言有五种 SELinux 特定许可,relabelfromrelabeltoexecute_no_transenTRypointexecmod
      • 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 语句独立声明。
    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 规则
      • 使用 allow 规则对角色的改变进行授权。
    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 标记转换约束

    • 唯一支持 validatetrans 约束的客体是文件系统客体,如文件、目录、设备文件等。

      • validatetrans 语句允许你将某个客体的新安全上下文和旧安全上下文联系起来。
    • 在 validatetrans 语句中关键字

    关键字 说明
    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

    • 查询系统的 selinux 目前的状态。
    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 是否已经启动。
        • 0 启动
        • 1 关闭
    [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/ 目录内相关档案。
      • 这些档案里的值
        • 1(启用)
        • 0(关闭)
    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

    • 设定selinux 开关数值清单列表与内容。
    Usage:  setsebool [ -NPV ] boolean value | bool1=val1 bool2=val2...
    
    setsebool ftpd_disable_trans=on
    
    参数 说明
    -N 磁盘上的策略不会重新加载到内核中。
    -P 所有挂起的值都被写入磁盘上的策略文件。将在重新启动时保持持久性。
    -V 将从语义库中打印详细的错误消息。
    • 如果没有命令,则需要安装 rpm 包。

    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_contextsfile_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

    • 分析项目的 SELinux 安全上下文。
    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 内的记录信息。
      • 需要搭配启动 auditd 服务程序一起使用。
    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

    • SELinux 信息诊断用户端程序。
    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
    
    • 如果没有命令,则需要安装 rpm 包。
    yum install setroubleshoot setools
    
    • sealert 分析会给出建议的解决方案,直接执行就可以解决安全策略相关的权限问题。
      • 例如执行上述例子中的建议,就可以解决该问题。
    ausearch -c 'mandb' --raw | audit2allow -M my-mandb
    semodule -i my-mandb.pp
    

    3.14 seinfo

    • 显示有关 SELinux 策略的组件信息。
    [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
    
    • 如果没有命令,则需要安装 rpm 包。
    yum install setools
    

    3.15 sesearch

    • SELinux 策略查询工具。
    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 ; 
    ......
    
    • 如果没有命令,则需要安装 rpm 包。
    yum install setools
    

    相关文章

      网友评论

        本文标题:SELinux 相关整理

        本文链接:https://www.haomeiwen.com/subject/ornjwftx.html