代码改变世界

《鸟哥的Linux私房菜 基础学习篇(第四版)》 第16章第5节 SELinux初探 笔记

2019-06-27 21:09  受匕图灵  阅读(431)  评论(0编辑  收藏  举报

目录

1什么是SELinux

  自主式存取控制

  强势访问控制

2SELinux的运行模式

  主体 (Subject)

  目标 (Object)

  政策 (Policy)

    targeted

    minimum

    mls

  安全上下文 (security context)

    身份识别 ( Identify )

    角色 ( Role )

    类型 (Type) (最重要!)

3SELinux三种模式

  enforcing

  permissive

  disabled

4SElinux策略内的规则管理

  getenforce

  sestatus

  vim /etc/selinux/config

  setenforce

  getsebool

  seinfo

  sesearch

  setsebool

5SElinux安全上下文的修改

  chcon  (chcon被restorecon取代)

  restorecon

  semanage

  范例一

  范例二

6、一个网络服务案例及登录文件协助

  范例

  范例

  范例

 

正文

1什么是SELinux

自主式存取控制

自传统的文件权限与帐号关系:自主式存取控制 , DACDiscretionary Access Control

强势访问控制

以政策规则制定特定进程读取特定文件:强势访问控制 , MACMandatory Access Control

 

2SELinux的运行模式

Security Enhanced Linux

SELinux是通过MAC的方式来管理进程的,他控制的主体是进程,而目标则是该进程能否读取的【文件资源】!

 

主体 (Subject)

SELinux 主要想要管理的就是进程,因此你可以将『主体』跟本章谈到的 process 划上等号;

 

目标 (Object)

主体进程能否存取的『目标资源』一般就是文件系统。因此这个目标项目可以等文件系统划上等号;

 

政策 (Policy)

由于进程与文件数量庞大,因此 SELinux 会依据某些服务来制订基本的存取安全性政策。这些政策内还会有详细的规则 (rule) 来指定不同的服务开放某些资源的存取与否。在目前的 CentOS 7.x 里面仅有提供三个主要的政策(建议使用预设的targeted政策即可),分别是:

targeted

  针对网络服务限制较多,针对本机限制较少,是预设的政策;

minimum

  由 target 修订而来,仅针对选择的进程来保护!

mls

  完整的 SELinux 限制,限制方面较为严格。

 

安全上下文 (security context)

我们刚刚谈到了主体、目标与政策面,但是主体能不能存取目标除了政策指定之外,主体与目标的安全上下文必须一致才能够顺利存取。 这个安全上下文 (security context) 有点类似文件系统的 rwx !安全上下文的内容与设定是非常重要的如果设定错误,你的某些服务(主体进程)就无法存取文件系统(目标资源),当然就会一直出现『权限不符』的错误讯息了!

安全上下文你就将他想成 SELinux 内必备的 rwx 就是了!安全上下文是放置到文件的 inode 内的。

 

观察安全上下文可使用 “ ls -Z” 去观察如下:(注意:你必须已经启动了 SELinux 才行!

安全上下文主要用冒号分为三个字段,这三个字段的意义为:

Identify:role:type

身份识别:角色:类型

 

身份识别 ( Identify )

相当于帐号方面的身份识别!主要的身份识别常见有下面几种常见的类型:

unconfined_u :不受限的用户,也就是说,该文件来自于不受限的程序所产生的!一般来说,我们使用可登陆帐号来取

得 bash 之后默认的 bash 环境是不受 SELinux 管制的~因为 bash 并不是什么特别的网络服务!因此,在这个不受

SELinux 所限制的 bash 程序所产生的文件其身份识别大多就是 unconfined_u 这个 “ 不受限 ” 用户啰!

system_u :系统用户,大部分就是系统自己产生的文件啰!

 

角色 ( Role )

通过角色字段,我们可以知道这个数据是属于程序、文件资源还是代表使用者。一般的角色有:

object_r :代表的是文件或目录等文件资源,这应该是最常见的啰;

system_r :代表的就是程序啦!不过,一般使用者也会被指定成为 system_r !

你也会发现角色的字段最后面使用 “ _r ” 来结尾!因为是 role 的意思嘛!

 

类型 (Type) (最重要!)

在预设的 targeted 政策中, Identify 与 Role 字段基本上是不重要的!重要的在于这个类型(type) 字段基本上,一个主体进程能不能读取到这个文件资源,与类型字段有关!而类型字段在文件与进程的定义不太相同,分别是:

type:在文件资源 (Object) 上面称为类型 (Type);

domain:在主体进程 (Subject) 则称为领域 (domain) !

domain 需要与 type 搭配,则该进程才能够顺利的读取文件资源啦!

 

3SELinux三种模式

SELinux 依据启动与否,共有三种模式,分别如下:

enforcing

强制模式,代表 SELinux 运作中,且已经正确的开始限制 domain/type ;

permissive

宽容模式:代表 SELinux 运作中,不过仅会有警告讯息并不会实际限制 domain/type 的存取。这种模式可以运来作为 SELinux 的 debug 之用;

disabled

关闭,SELinux 并没有实际运作。

 

4SElinux策略内的规则管理

getenforce

知道目前的 SELinux 模式

语法:

getenforce

 

sestatus

知道 SELinux 的政策 (Policy)

语法:

sestatus [-vb]

选项与参数:

-v :检查列于 /etc/sestatus.conf 内的文件与进程的安全上下文内容;

-b :将目前政策的规则布尔值列出,亦即某些规则 (rule) 是否要启动 (0/1) 之意;

 

vim /etc/selinux/config

选项与参数:

ELINUX=enforcing <==调整 enforcing|disabled|permissive

SELINUXTYPE=targeted <==目前仅有 targeted, mls, minimum 三种政策

 

如果由 enforcing 或 permissive 改成disabled ,或由 disabled 改成其他两个,那也必须要重新开机。这是因为 SELinux 是整合到核心里面去的你只可以在 SELinux运行下切换成为强制 ( enforcing ) 或宽容 ( permissive ) 模式,不能够直接关闭 SELinux 如果刚刚你发现 getenforce 出现disabled ,请到上述文件修改成为 enforcing 然后重新开机吧!

不过你要注意的是,如果从 disable 转到启动 SELinux 的模式时由于系统必须要针对文件写入安全上下文的信息,因此开机过程会花费不少时间在等待重新写入 SELinux 安全上下文 (有时也称为 SELinux Label ) ,而且在写完之后还得要再次的重新开机一次喔!你必须要等待粉长一段时间!

 

setenforce

让 SELinux 模式在 enforcing permissive 之间切换

语法:

setenforce [0|1]

选项与参数:

0 :转成 permissive 宽容模式;

1 :转成 Enforcing 强制模式

 

getsebool

SELinux各个规则的布尔值查询

语法:

getsebool [-a] [规则的名称]

选项与参数:

-a:列出目前系统上面的所有 SELinux 规则的布尔值为开启或关闭值

 

seinfo

SELinux各个规则规范的主体进程能够读取的文件SELinux类型查询

打印有关SELinux策略组件的权限信息

yum install -y setools-console.x86_64

语法:

seinfo [-Atrub]

选项与参数:

-A :列出 SELinux 的状态、规则布尔值、身份识别、角色、类别等所有信息

-u :列出 SELinux 的所有身份识别 (user) 种类

-r :列出 SELinux 的所有角色 (role) 种类

-t :列出 SELinux 的所有类别 (type) 种类

-b :列出所有规则的种类 (布尔值)

无:列出SELinux在此政策下的统计状态

例:

seinfo -t |egrep 'samba|smb|nmb'

 

sesearch

SELinux策略中搜索规则
yum install -y setools-console.x86_64

语法:

sesearch [-A] [-s 主体类别] [-t 目标类别] [-b 布尔值]

选项与参数:

-A :列出后面数据中,允许『读取或放行』的相关描述

-t :后面还要接类别,例如 -t httpd_t

-b :后面还要接 SELinux 的规则,例如 -b httpd_enable_ftp_server

   

setsebool

修改 SELinux 规则的布尔值

语法:

setsebool [-P] 『规则名称』 [0|1]

选项与参数:

1on

0off

-P:直接将设定值写入配置文件,该设定数据未来会生效的!

 

SELinux 对受限的主体程序有没有影响,第一关考虑 SELinux 的三种类型,第二关考虑 SELinux 的政策规则是否放行,第三关则是开始比对 SELinux类型。

 

5SElinux安全上下文的修改

chcon (chcon被restorecon取代)

手动修改文件的 SELinux 类型Change context的缩写

chcon [-R] [-t type] [-u user] [-r role] 文件

chcon [-R] --reference=范例文件 文件

选项与参数:

-R :连同该目录下的次目录也同时修改;

-t :后面接安全上下文的类型字段!例如 httpd_sys_content_t ;

-u :后面接身份识别,例如 system_u; (不重要)

-r :后面街角色,例如 system_r; (不重要)

-v :若有变化成功,请将变动的结果列出来

--reference=范例文件:拿某个文件当范例来修改后续接的文件的类型!

 

restorecon

让文件恢复正确的 SELinux 类型

语法:

restorecon [-Rv] 文件或目录

选项与参数:

-R :连同次目录一起修改;

-v :将过程显示到屏幕上

 

semanage

默认目录的安全上下文查询与修改 (用于配置selinux策略的某些元素,而不需要修改或从策略源重新编译)

semanage {login|user|port|interface|fcontext|translation} -l

semanage fcontext -{a|d|m} [-frst] file_spec

选项与参数:

fcontext :主要用在安全上下文方面的用途, -l 为查询的意思;

-a :增加的意思,你可以增加一些目录的默认安全上下文类型设定;

-m :修改的意思;

-d :删除的意思。

范例一

查询一下/etc /etc/cron.d 的默认 SELinux type 为何?

[root@study ~]# semanage fcontext -l | grep -E '^/etc |^/etc/cron'

范例二

查看类型httpd_enable_homedirs的相关说明

semanage boolean -l | grep httpd_enable_homedirs

结果:

SELinux 布尔值                    状态  默认 描述

httpd_enable_homedirs          (关    ,    )  Allow httpd to enable homedirs

 

6、一个网络服务案例及登录文件协助

范例

将 mycron 默认值改为 system_cron_spool_t !

[root@study ~]# semanage fcontext -a -t system_cron_spool_t "/srv/mycron ( /.* ) ?"

 

范例

[root@study ~]# setenforce 0

[root@study ~]# curl ftp://ftptest:myftp123@localhost/~/test.txt

testing

[root@study ~]# setenforce 1 # 确定问题后,一定要转成 Enforcing !

确定有数据内容!所以,确定就是 SELinux 造成无法读取的问题~那怎办?要改规则?还是改 type?

因为都不知道,所以,就检查一下登录文件看看有没有相关的信息可以提供给我们处理!

[root@study ~]# vim /var/log/messages

Aug 9 02:55:58 station3-39 setroubleshoot: SELinux is preventing /usr/sbin/vsftpd

from lock access on the file /home/ftptest/test.txt. For complete SELinux messages.

run sealert -l 3a57aad3-a128-461b-966a-5bb2b0ffa0f9

[root@study ~]# sealert -l 3a57aad3-a128-461b-966a-5bb2b0ffa0f9

[root@study ~]# setsebool -P ftp_home_dir 1

 

范例

[root@study ~]# grep sealert /var/log/messages | tail

[root@study ~]# sealert -l 08d3c0a2-5160-49ab-b199-47a51a5fc8dd

root@study ~]# ll -Zd /var/ftp

drwxr-xr-x. root root system_u:object_r: public_content_t :s0 /var/ftp

[root@study ~]# semanage fcontext -a -t public_content_t "/srv/gogogo ( /.* ) ?"

[root@study ~]# restorecon -Rv /srv/gogogo