一 SELinux 简介

1 SELinux(security enhanced Linux)安全强化的Linux

SELinux 是由美国国家安全局(NSA)开发,我们知道所有的系统资源都是透过进程来进行存取的,那么/var/www/html/如果设定为777,代表所有进程均可对该目录进行存取,为了控制权限与进程之间的问题,SELinux是在进行进程、文件等细部权限设定依据一个核心模块,由于启动网络服务也是进程,因此也刚好也能控制网路服务能否存存取系统资源的一道关卡。

2 传统的文件权限与账号关系:自主式访问控制,DAC

系统账号分为系统管理员(root)与一般用户,各种权限对root是无效的,因此,当某个进程要对文件进行存取时,系统就会根据该进程的拥有者/群组,并比对文件的权限,若权限通过检查,就可以存取该文件了这种存取方式是**(DAC discretionary access control),基本上,就是依据进程拥有者与文件资源的rwx权限来决定有无存取能力** DAC的困扰: root 具有最高的权限:如果有一个进程属于root的权限,则系统上的任何资源都可以进行存取 使用者可以取得进程来变更文件资源的访问权限:如果你不小心将某个目录的权限设定为777,由于对任何人的权限会变成rwx,因此该目录就会被任何人所任意存取!

3 以政策规则定制特定进程读取特定文件:委任式访问控制,MAC

为了避免DAC容易发生的问题,因此SELinux导入了委任式访问控制(mandatory access control)的方法,**委任式访问控制控制可以针对特定的进程与特定的文件资源来进行权限的控管, 即使你是root,那么在使用不同的进程时,你所取得的权限并不一定时root,而得要看当时该进程的设定而定。**这样,我们对控制的主体变成了进程而不是使用者,此外,这个主体进程也不能任意使用系统文件资源,因为每个文件资源也有针对该主体进程设定可取用的权限. SELinux 也提供一些预设的政策(policy),并在该政策内提供多个(rule), ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

二 SELinux 的内部解析

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

主体(subject)

SELinux主要想要管理的就是进程,因此主体跟process相同

目标(object)

主体进程能否存取的目标资源一般都是文件系统,因此目标和文件系统相同

政策(policy)

由于进程与文件数量大,因此SELinux会依据某些服务来定制基本的存取安全性政策,这些政策内还会有详细的规则(rule)来制定不同的服务开发某些资源的存取与否。 三个主要政策 1 targeted:针对网络服务限制较多,针对本机限制较少是,是预设的政策 2* minmum:由target修订而来,仅针对选择的进程来保护* 3* mls:完整的SELinux限制,限制方面比较严格* 建议使用预设的target政策

安全性本文(security context)

主体能不能存取目标除了政策指定外,主体与目标的安全性本文必须一致才能顺利存取, SELinux重点在保护进程读取文件系统的权限,

主体进程必须要通过SELinux政策内的规则放行后,就可以与目标资源进行安全性本文的对比,若对比失败,则无法存取文件,若对比成功则可以开始存取目标

**安全性本文存在于主体进程与目标文件资源中,进程内存内,所以安全性本文可以存入是没问题的,文件的安全性本文是放置在文件的iNode内,因此主体进程想要读取目标文件资源,同时需要读取iNode。

查看SELinux相关信息 解释 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

身份识别(identify)

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

unconfined_u:不受限的用户,也就是说,该文件来自于不受限的进程所产生的,一般来说,我们使用可登入账号取得bash之后预设的bash环境是不受SELinux管制的,因为bash并不是特别的网络服务,因此,在这个不受SELinux所限制的bash进程所产生的文件,其身份识别大多数就是unconfined_u这个用户

system_u: 系统用户,大部分就是系统自己产生的文件 基本上,如果是系统或软件本身所提供的文件,大多数就是system_u这个身份名称,而如果是我们用户透过bash自己建立的文件,则大多数是不受限制的,**如果是网络服务所产生的的文件,或者系统服务运行过程中的文件,则大部分的识别就会是system_u ** 自己创建的文件是unconined_u,而vsftp的文件则是system_u

角色(role)

透过角色字段,我们可以知道这个资料是属于进程,文件资源还是使用者。 object_r:代表的是文件或目录等文件资源 system_r:代表的就是进程

类型(type)最重要

基本上,一个主体进程能不能读取到这个文件资源,与类型字段有关,而类型字段在文件与进程的定义不太相同。 type:在文件资源(object)上面称为类型type domain :在主体进程(subject)则成为领域(domain)

domain 需要与type搭配,则该进程才能顺利读取文件资源啦 进程与文件SELinux type字段的相关性

进程与文件SELinux type字段的相关性

基本上进程主要分为两大类,一种是系统有受限的system_u:system_r,另一种则可能是用户自己的

比较不受限的进程(通常是本机用户自己执行的程序),亦是unconfined_u:unconfined_r这两种 此安全本文的类型名称为crond_t格式

[root@localhost ~]# 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,/tec/cron.d 以及/var/spool/cron 都会是相关的SELINUX类型, ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

三 SELinux 运行模式

enforcing:强制模式,代表SELinux运行中,且已经正确的开始限制domain/type了 permissive:宽容模式,代表SELinux运行中,不仅会有警告信息并不会实际限制domain/type的存取,这种模式可以运来作为SELinux的debug之用。

disabled:关闭,SELinux并没有实际运作 由上述可知,并非所有的进程都会被SELinux管制,可以透过ps -eZ 去撰取 [root@localhost ~]# ps -eZ | grep -E 'cron|bash' system_u:system_r:crond_t:s0-s0:c0.c1023 1031 ? 00:00:00 crond system_u:system_r:crond_t:s0-s0:c0.c1023 1034 ? 00:00:00 atd unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 1739 pts/0 00:00:00 bash 其中bash不经过SELinux的过滤,直接进入rwx的判断的 查看SELinux的模式: [root@localhost ~]# getenforce Permissive

SELinux的政策(policy)

sestatus [-vb]

选项与参数 -v :检查列于/etc/sestatus.conf 内的文件与进程的安全性文本内容 -b: 将目前政策的规则布尔值列出。

[root@www ~]# sestatus SELinux status: disabled 没有启动的状态

[root@localhost ~]# sestatus SELinux status: enabled 是否启动SELinux SELinuxfs mount: /sys/fs/selinux SELinux 的相关文件数据挂载点 SELinux root directory: /etc/selinux SELinux的根目录 Loaded policy name: targeted 目前的政策 Current mode: permissive 目前的模式 Mode from config file: error (Success) 目前配置文件内规范的SELinux 模式 Policy MLS status: enabled 是否含有NLS的模式机制 Policy deny_unknown status: allowed 是否预设抵挡未知的主体进程 Max kernel policy version: 28

目前的政策:targeted,mls,minmum三种

SELinux的启动与关闭 当由enforcing或permissive改成disabled,或由disabled改成其他模式,需要重新启动, 因为系统必须要针对文件写入安全性本文的信息,所以开机过程会花费不少时间在等待重新写入 SELinux 安全性本文 (有时也称为SELinux Label)

让SELinux在enforcing和permissive 之间的切换方式:

setenforce [0|1]

参数与选项: 0:转化成permissive 宽容模式 1: 转成 enforcing 强制模式

[root@localhost ~]# setenforce 1 [root@localhost ~]# getenforce Enforcing [root@localhost ~]# setenforce 0 [root@localhost ~]# getenforce Permissive +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

四 SELinux 政策内的规则管理

SELinux各个规则的布尔查询 getsebool

[root@localhost ~]# getsebool -a [规则名称]

选项与参数: -a :列出目前系统上面的所有SELinux规则的布尔值为开启或关闭值 [root@localhost ~]# 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

**SELinux 各个规格的主体进程能够读取的文件 SELinux type 查询 seinfo,sesearch

安装完成后就可以查询规则中限制的东西了** [root@localhost ~]# mount /dev/cdrom /mnt/ mount: /dev/sr0 写保护,将以只读方式挂载 [root@localhost ~]# yum install /mnt/Packages/setools-console-* 已加载插件:langpacks, product-id, subscription-manager This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.

seinfo 的选项与参数

-A:列出SELinux的状态,规则布尔值、身份识别、角色、类别等信息 -u:列出SELinux的所有身份识别(user)种类 -r:列出SELinux 的所有角色role(种类) -t:列出SELinux的所有类别(type)种类 -b:列出所有规则的种类(布尔值)

[root@localhost ~]# seinfo

Statistics for policy file: /sys/fs/selinux/policy Policy Version & Type: v.28 (binary, mls)

Classes: 83 Permissions: 255 Sensitivities: 1 Categories: 1024 ** Types: 4446 ** Attributes: 353 Users: 8 Roles: 14 ** Booleans: 280** (各种selinux规则共280条) Cond. Expr.: 331 Allow: 90724 Neverallow: 0 Auditallow: 151 Dontaudit: 8054 Type_trans: 15683 Type_change: 74 Type_member: 28 Role allow: 29 Role_trans: 777 Range_trans: 5249 Constraints: 98 Validatetrans: 0 Initial SIDs: 27 Fs_use: 26 Genfscon: 91 Portcon: 549 Netifcon: 0 Nodecon: 0 Permissives: 30 Polcap: 2

sesearch [-A] [-g] [-t] [-b]

-A :列出后面数据中,允许[读取或放行]的相关数据 -t:后面还要接类别,如-t httpd_t -b:后面还要接SELinux的规则, httpd_enable_ftp_server

[root@localhost ~]# sesearch -A -s crond_t | grep spool allow crond_t cron_spool_t : file { ioctl read getattr lock open } ; allow crond_t var_spool_t : dir { ioctl read getattr lock search open } ; allow daemon user_cron_spool_t : file { ioctl read write getattr lock append } ; allow crond_t system_cron_spool_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ; allow crond_t system_cron_spool_t : dir { ioctl read getattr lock search open } ; allow crond_t cron_spool_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ; allow 后面接着主机进程以及文件的SELinux type 意思是说,crond_t 可以读取system_cron_spool_t、 cron_spool_t 、 cron_spool_t 的文件/目录类型等。

有 crond_t admin_home_t 存在,但是这是总体的信息,并没有针对某些规则的寻找~所以还是不确定 aaa.py 能否被读取。但是,基本上就是 SELinux type 出问题~因此才会无法读取的!

httpd_enable_homedirs 的功能是允许 httpd 进程去读取用户家目录的意思 [root@www ~]# sesearch -A -b httpd_enable_homedirs 其含义是列出此功能开启后httpd进程能够读取的文件的数量的列表。 从上面的数据才可以理解,在这个规则中,主要是放行 httpd_t 能否读取用户家目录的文件! 所以,如果这个规则没有启动,基本上, httpd_t 这种进程就无法读取用户家目录下的文件!

修改SELinux 规则的布尔值

setsebool [-P] (大写) [规则名称] [0|1] 选项与参数: -P :直接将设定值写入配置文件,该设定数据会生效。 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

五 SELinux 安全本文修改

我们知道 SELinux 对受限的主体进程有没有影响,第一关考虑SELinux 的三种类型,第二关考虑 SELinux 的政策规则是否放行,第三关则是开始比对 SELinuxtype 啦!

使用chcon 手动修改文件的SELINUX type

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

选项与参数: -R :连同给目录下的此目录也同时修改 -t: 后面接安全性本文的类型字段, -u 后面接身份识别,如system_u -r : 后面接角色,如system_r -v: 若有变化,请将变动的结果列出来 --reference=范例文件,那某个文件当范例来修改后续的文件的类型。

修改aaa.py的文件SELinux type 通过--reference 进行修改:

通过restorecon 来让SELinux自己解决默认目录下的SELinux type 。

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

restorecon [-Rv ] 文件或目录

-R 连同次目录一起修改 -v:将过程显示到屏幕上

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

restorecon 可以恢复到原来的SELinux TYPE的原因是有个地方在记录文件/目录的selinux 默认类型, 查询和增加修改预设的selinux type可以通过 semanage来实现 semanage {login| user|port|interface|fcontext|translation} -l

semanage fcontext -{a|d|m} {-frst} file_spec 选项与参数: fcontext:主要用在安全性本文方面的用途,-l 为查询的意思。 -a: 增加的意思,你可以增加一些目录的默认安全性本文类型设定 -m :修改的意思 -d:删除的意思

这便是restorecon和在其目录下建立的文件默认是此SELinux 类型的原因。

查看其目录的上一层SELinux的类型