zoukankan      html  css  js  c++  java
  • 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!
  • 相关阅读:
    windows中dos命令指南
    HDU 2084 数塔 (dp)
    HDU 1176 免费馅饼 (dp)
    HDU 1004 Let the Balloon Rise (map)
    变态杀人狂 (数学)
    HDU 2717 Catch That Cow (深搜)
    HDU 1234 开门人和关门人 (模拟)
    HDU 1070 Milk (模拟)
    HDU 1175 连连看 (深搜+剪枝)
    HDU 1159 Common Subsequence (dp)
  • 原文地址:https://www.cnblogs.com/Shadowplay/p/9530798.html
Copyright © 2011-2022 走看看