• SELinux


    SELinux

    一、什么是SELinux?

    SELinux(Security Enhanced Linux):在进行程序、文件等细部权限设置依据的一个核心模块。

    1.传统的文件权限与账号关系:自主式存取控制,DAC:依据程序的拥有者与文件资源的rwx权限来决定有无存取能力。缺点:

    1)root权限有被窃取的风险。

    2)使用者可以取得程序来变更文件资源的权限。

    2.以政策规则订定特定程序读取特定文件:委托式存取控制,MAC

    MAC可以针对特定的程序与特定的文件资源进行权限控制。因此,即使你是root,在使用不同的程序时,你不一定能取得全部权限,

    你的权限与该程序的设定相关。如此一来,权限控制的主体变成了程序而不是使用者。此外,程序也不能随意使用系统资源文件,因为

    文件也可对程序设置可取用权限。例如,默认情况下,httpd仅能在/var/www目录下存取文件。如果httpd程序想要到其他目录去存取数据,

    首先规则设置要开放,其次目标目录也要设置为httpd可读模式。

    二、SELinux的运行模式

    SELinux是通过MAC方式来管控程序的,它控制的主体是程序,目标是该程序能否读取的"文件资源"。

    1.主体:程序

    2.目标:文件资源

    3.政策:由于程序与文件数量庞大,因此SELinux会依据某些服务来制定基本的存取安全政策。这些政策内还有详细的规则

    来指定不同的服务开放某些资源的存取与否。CentOS7中主要的3种政策:

    1)targeted:针对网络服务的限制较多,针对本机服务的限制较少。默认政策

    2)minimun:由targeted修订而来,仅针对选择的程序来保护。

    3)mls:完整的SELinux限制,较为严格,建议使用targeted。

    4.安全性文本:主体与目标的安全性文本必须一致才能够顺利存取。

    上图的重点在主体如何取得目标的资源存取权限! 由上图我们可以发现,(1) 主体程序必须要通过 SELinux 政策内的规则放行后,就可以与目标资源进行安全性本文的比对
    2) 若比对失败则无法存取目标,若比对成功则可以开始存取目标。问题是,最终能否存取目标还是与文件系统的 rwx 权限设置有关喔!如此一来,加入了 SELinux 之后,出现权限不
    符的情况时,你就得要一步一步的分析可能的问题了!

     查看安全性文本:

    [root@VM_167_181_centos /]# ls -Z
    lrwxrwxrwx. root root system_u:object_r:bin_t:s0       bin -> usr/bin
    dr-xr-xr-x. root root system_u:object_r:boot_t:s0      boot
    drwxr-xr-x  root root ?                                data
    drwxr-xr-x  root root ?                                dev
    drwxr-xr-x. root root system_u:object_r:etc_t:s0       etc
    drwxr-xr-x. root root system_u:object_r:home_root_t:s0 home

    安全性文本用冒号分为三个字段

    Identify:role:type

    1.identify:

    主要有以下几种常见类型:

    1)unconfined_u:

    不受限的用户,也就是说,该文件来自于不受限的程序所产生的!一般来说,我们使用可登陆帐号来取得 bash 之后,
    默认的 bash 环境是不受 SELinux 管制的因为 bash 并不是什么特别的网络服务!因此,在这个不受 SELinux 所限制的 bash
    程序所产生的文件, 其身份识别大多就是 unconfined_u 这个不受限用户。

    2)system_u:

    系统用户,大部分是系统自己产生的文件。

    2.role:

    通过该字段,我们可以知道这个数据是属于程序,文件资源还是使用者。

    1)object_r:文件资源

    2)system_r:程序或者使用者

    3.type

    默认的targeted政策中,最重要的字段。程序能否读取文件资源与type相关。而类型字段在文件与程序中的定义不同,分别是:

    1)type:在文件资源上的称谓

    2)domain:在主体程序上的称谓

    程序与文件type字段的相关性:

    身份识别 角色 该对应在 targeted 的意义
    unconfined_u unconfined_r 一般可登陆使用者的程序!相对没有受限的程序
    !大多数都是用户已经顺利登陆系统 (不论是网络
    还是本机登陆来取得可用的 shell) 后, 所用来操作系
    统的程序!如 bash, X window 相关软件等。
    system_u system_r 由于为系统帐号,因此是非交谈式的系统运行程序,大
    多数的系统程序均是这种类型!


    在默认的 target 政策下,其实最重要的字段是类型字段 (type) , 主体与目标之间是否具有可以读写的权限,
    与程序的 domain 及文件的 type 有关!这两者的关系我们可以使用 crond 以及他的配置文件来说明!
    亦即是 /usr/sbin/crond, /etc/crontab, /etc/cron.d 等文件来说明。 

    # 1. 先看看 crond 这个“程序”的安全本文内容:
    [root@study ~]# ps -eZ | grep cron
    system_u:system_r:crond_t:s0-s0:c0.c1023 1338 ? 00:00:01 crond
    system_u:system_r:crond_t:s0-s0:c0.c1023 1340 ? 00:00:00 atd
    # 这个安全本文的类型名称为 crond_t 格式!
    # 2. 再来瞧瞧可执行文件、配置文件等等的安全本文内容为何!
    [root@study ~]# ll -Zd /usr/sbin/crond /etc/crontab /etc/cron.d
    drwxr-xr-x. root root system_u:object_r:system_cron_spool_t:s0 /etc/cron.d
    -rw-r--r--. root root system_u:object_r:system_cron_spool_t:s0 /etc/crontab
    -rwxr-xr-x. root root system_u:object_r:crond_exec_t:s0 /usr/sbin/crond

    当我们执行 /usr/sbin/crond 之后,程序的 domain 类型是 crond_t 而 crond_t 能够读取的配置文件则为 system_cron_spool_t 类型。
    因此不论/etc/crontab, /etc/cron.d 以及 /var/spool/cron 都会是相关的 SELinux 类型 (/var/spool/cron为 user_cron_spool_t) 。 
    1. 首先,我们触发一个可执行的目标文件,那就是具有 crond_exec_t 这个类型的
    /usr/sbin/crond 文件;
    2. 该文件的类型会让这个文件所造成的主体程序 (Subject) 具有 crond 这个领域
    domain) , 我们的政策针对这个领域已经制定了许多规则,其中包括这个领域可以读
    取的目标资源类型;
    3. 由于 crond domain 被设置为可以读取 system_cron_spool_t 这个类型的目标文件
    Object) , 因此你的配置文件放到 /etc/cron.d/ 目录下,就能够被 crond 那支程序所读
    取了;
    4. 但最终能不能读到正确的数据,还得要看 rwx 是否符合 Linux 权限的规范!

    三、SELinux三种模式的启动、关闭与观察

    SELinux依据启动与否共有三种模式:

    1.enfocing:强制模式,代表SELinux运行中,且已经正确地开始限制domain/type了

    2.permissive:宽容模式,代表SELinux运行中,不过仅会警告信息不会实际限制

    3.disable:关闭SELinux

    查看模式:

    [tang@VM_167_181_centos etc]$ getenforce

    查看政策

    [tang@VM_167_181_centos etc]$ sestatus

    SELinux配置文件:/etc/selinux/config

    SELinux的启动与关闭:

    改变SELinux的政策与运行模式都需要重启系统,且从disable转到启动模式时要重启两次。

    SELinux模式在 enforcing 与 permissive 之间切换的方法为

    [root@study ~]# setenforce 1
    选项与参数:
    0 :转成 permissive 宽容模式;
    1 :转成 Enforcing 强制模式
    范例一:将 SELinux 在 Enforcing 与 permissive 之间切换与观察
    [root@study ~]# setenforce 0
    [root@study ~]# getenforce
    Permissive
    [root@study ~]# setenforce 1
    [root@study ~]# getenforce
    Enforcing

    注意, setenforce 无法在 Disabled 的模式下面进行模式的切换。 

    四、政策的规则管理

    查看规则是否启动:

    getsebool [-a] [规则名称]

    -a:查看所有规则

    [root@study ~]# sesearch [-A] [-s 主体类别] [-t 目标类别] [-b 布林值]
    选项与参数:
    -A :列出后面数据中,允许“读取或放行”的相关数据
    -t :后面还要接类别,例如 -t httpd_t
    -b :后面还要接SELinux的规则,例如 -b httpd_enable_ftp_server
    范例一:找出 crond_t 这个主体程序能够读取的文件 SELinux type
    [root@study ~]# sesearch -A -s crond_t | grep spool
    allow crond_t system_cron_spool_t : file { ioctl read write create getattr ..
    allow crond_t system_cron_spool_t : dir { ioctl read getattr lock search op..
    allow crond_t user_cron_spool_t : file { ioctl read write create getattr se..
    allow crond_t user_cron_spool_t : dir { ioctl read write getattr lock add_n..
    allow crond_t user_cron_spool_t : lnk_file { read getattr } ;
    # allow 后面接主体程序以及文件的 SELinux type,上面的数据是撷取出来的,
    # 意思是说,crond_t 可以读取 system_cron_spool_t 的文件/目录类型~等等!
    范例二:找出 crond_t 是否能够读取 /etc/cron.d/checktime 这个我们自订的配置文件?
    [root@study ~]# ll -Z /etc/cron.d/checktime
    -rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 /etc/cron.d/checktime
    # 两个重点,一个是 SELinux type 为 admin_home_t,一个是文件 (file)
    [root@study ~]# sesearch -A -s crond_t | grep admin_home_t
    allow domain admin_home_t : dir { getattr search open } ;
    allow domain admin_home_t : lnk_file { read getattr } ;
    allow crond_t admin_home_t : dir { ioctl read getattr lock search open } ;
    allow crond_t admin_home_t : lnk_file { read getattr } ;
    # 仔细看!看仔细~虽然有 crond_t admin_home_t 存在,但是这是总体的信息,
    # 并没有针对某些规则的寻找~所以还是不确定 checktime 能否被读取。但是,基本上就是 SELinux
    # type 出问题~因此才会无法读取的!
    [root@study ~]# semanage boolean -l | grep httpd_enable_homedirs
    SELinux boolean State Default Description
    httpd_enable_homedirs (off , off) Allow httpd to enable homedirs
    # httpd_enable_homedirs 的功能是允许 httpd 程序去读取使用者主文件夹的意思~
    [root@study ~]# sesearch -A -b httpd_enable_homedirs
    范例三:列出 httpd_enable_homedirs 这个规则当中,主体程序能够读取的文件 SELinux type
    Found 43 semantic av rules:
    allow httpd_t home_root_t : dir { ioctl read getattr lock search open } ;
    allow httpd_t home_root_t : lnk_file { read getattr } ;
    allow httpd_t user_home_type : dir { getattr search open } ;
    allow httpd_t user_home_type : lnk_file { read getattr } ;
    ....(后面省略) ....
    # 从上面的数据才可以理解,在这个规则中,主要是放行 httpd_t 能否读取使用者主文件夹的文件!
    # 所以,如果这个规则没有启动,基本上, httpd_t 这种程序就无法读取使用者主文件夹下的文件!
    [root@study ~]# setsebool [-P] “规则名称” [1]
    选项与参数:
    -P :直接将设置值写入配置文件,该设置数据未来会生效的!
    范例一:查询 httpd_enable_homedirs 这个规则的状态,并且修改这个规则成为不同的布林值
    [root@study ~]# getsebool httpd_enable_homedirs
    httpd_enable_homedirs --> off <==结果是 off ,依题意给他启动看看!
    [root@study ~]# setsebool -P httpd_enable_homedirs 1 # 会跑很久很久!请耐心等待!
    [root@study ~]# getsebool httpd_enable_homedirs
    httpd_enable_homedirs --> on

    五、SELinux安全文本的修改

    一)使用 chcon 手动修改文件的 SELinux type

    [root@study ~]# chcon [-R] [-t type] [-u user] [-r role] 文件
    [root@study ~]# chcon [-R] --reference=范例档 文件
    选项与参数:
    -R :连同该目录下的次目录也同时修改;
    -t :后面接安全性本文的类型字段!例如 httpd_sys_content_t ;
    -u :后面接身份识别,例如 system_u; (不重要)
    -r :后面街角色,例如 system_r; (不重要)
    -v :若有变化成功,请将变动的结果列出来
    --reference=范例档:拿某个文件当范例来修改后续接的文件的类型!
    范例一:查询一下 /etc/hosts 的 SELinux type,并将该类型套用到 /etc/cron.d/checktime 上
    [root@study ~]# ll -Z /etc/hosts
    -rw-r--r--. root root system_u:object_r:net_conf_t:s0 /etc/hosts
    [root@study ~]# chcon -v -t net_conf_t /etc/cron.d/checktime
    changing security context of ‘/etc/cron.d/checktime’
    [root@study ~]# ll -Z /etc/cron.d/checktime
    -rw-r--r--. root root unconfined_u:object_r:net_conf_t:s0 /etc/cron.d/checktime
    范例二:直接以 /etc/shadow SELinux type 套用到 /etc/cron.d/checktime 上!
    [root@study ~]# chcon -v --reference=/etc/shadow /etc/cron.d/checktime
    [root@study ~]# ll -Z /etc/shadow /etc/cron.d/checktime
    -rw-r--r--. root root system_u:object_r:shadow_t:s0 /etc/cron.d/checktime
    ----------. root root system_u:object_r:shadow_t:s0 /etc/shadow

    二)使用 restorecon 让文件恢复正确的 SELinux type 

    [root@study ~]# restorecon [-Rv] 文件或目录
    选项与参数:
    -R :连同次目录一起修改;
    -v :将过程显示到屏幕上
    范例三:将 /etc/cron.d/ 下面的文件通通恢复成默认的 SELinux type!
    [root@study ~]# restorecon -Rv /etc/cron.d
    restorecon reset /etc/cron.d/checktime context system_u:object_r:shadow_t:s0->
    system_u:object_r:system_cron_spool_t:s0
    # 上面这两行其实是同一行喔!表示将 checktime 由 shadow_t 改为 system_cron_spool_t
    范例四:重新启动 crond 看看有没有正确启动 checktime 啰!?
    [root@study ~]# systemctl restart crond
    [root@study ~]# tail /var/log/cron
    # 再去瞧瞧这个 /var/log/cron 的内容,应该就没有错误讯息了

    三)semanage 默认目录的安全性本文查询与修改

    Simple is important!
  • 相关阅读:
    调度器30—调度相关结构体—struct rq Hello
    Linux内核机制—wait唤醒机制 Hello
    Java File I/O 操作 Hello
    【Linux】查端口 查进程
    【ElasticSearch】去掉重复数据
    【MySQL】优化
    【Java SE】时区,LocalDate,LocalDateTime
    【Redis】配置
    【VUE】neditor
    【VUE】json查看vuejsonviewer查件
  • 原文地址:https://www.cnblogs.com/Shadowplay/p/9530798.html
Copyright © 2020-2023  润新知