一:SELinux简介

在SELinux访问控制体系的限制下,进程只能访问那些在他的任务中所需要的文件,从而实现系统的安全性。

1:常见的读取控制机制

(1) DAC

(Discretionary Access Control,任意式读取控制),每个对象都会记录一个拥有者的信息。只要是对象的拥有,就可以获得该对象的完全控制权限。DAC允许拥有者完全权限。其他需要读取该对象的时候,必须授予适当的权限。但是每个对象仅有一组拥有者的信息,如果需要更复杂的读取控制能力,必须使用ACL。ACL是DAC的延伸,在ACL环境下,可以为不同的用户设置一组权限,对不同的用户设置不同的权限。

(2) MAC

(Mandatory Access Control,强制性读取控制),为每一个对象添加一个安全的上下文。进程和用户除了具备传统的权限之外,还必须获得SELinux的授权,才能读取对象。

(3) RBAC

(Role-based Access Control,角色基础读取控制),以用户所属的角色进行读取权限判定的动作。

(4) MLS

(Mulit-Live Security,多层次安全),以对象的机密等级来决定进程对该对象的读取权限。

2:什么是SELinux

SELinux(Security-Enhanced Linux,安全增强型Linux)是美国国家安全局(NAS)对于强制访问控制的实现,在这种访问控制体系的限制下,进程只能访问哪些在他的任务中所需的文件。SELinux在类型强制服务器中合并了多级安全性或一种可选的多类策略,并采用了基于角色的控制概念。

在SELinux中定义了许多类型(TYPE),每一个进程、文件、设备等都必须标识他所属的类型进程只能读取相同类型的文件,如果没有相关类型,并且SELinux不允许读取的时候,则无法读取文件。SELinux除了约束进程读取文件的能力之外,还限制进程对设备、网络联机、通信端口、跨进程通信的读取能力,并提供更细致的读取控制。

SELinux的特点:

Ø MAC:对访问的控制彻底化,对所有的文件、目录、端口的访问都是基于策略设定的,可以由管理员自行设定的。

Ø RBAC:对于用户只是赋予最小权限。用户被划分成了一些角色,即使是root用户,如果不具备sysadm_r的角色的话,也不能执行相关的管理。哪一个角色可以执行哪些域是可以修改的。

Ø 安全上下文:当启动SELinux的时候,所有文件与对象都有安全上下文。

二:SELinux状态和应用模式

1:/etc/selinux/config文件详解

[root@localhost ~]# cat /etc/selinux/config

# This file controls the state of SELinux on the system.

# SELINUX= can take one of these three values:

#     enforcing - SELinux security policy is enforced.

#     permissive - SELinux prints warnings instead of enforcing.

#     disabled - No SELinux policy is loaded.

SELINUX=enforcing

# SELINUXTYPE= can take one of these two values:

#     targeted - Targeted processes are protected,

#     mls - Multi Level Security protection.

SELINUXTYPE=targeted

(1)应用模式设置

enforcing:强制模式,只要SELinux不允许,就无法执行

permissive:允许模式,将该时间记录下来,依然允许执行

disabled:禁用SELinux

(2)策略类型设置

在使用策略类型时必须先安装策略类型的软件包

targeted:保护常见的网络服务,是SELinux的默认值

      minimum:SELinux最低基本策略

      mls:提供符合MLS机制的安全性

2:查看SELinux状态

使用sestatus命令查看系统运行SELinux的状态、应用模式、布尔值以及sestatus.cong文件内列出的文件和进程的安全上下文。

-v:详细检查进程和文件的安全上下文

-b:显示当前布尔值状态

[root@localhost ~]# sestatus

SELinux status:                 enabled       \\SELinux状态,enabled启用,disabled禁用

SELinuxfs mount:                /selinux      \\SELiuux fs文件系统挂在目录

Current mode:                   enforcing    \\SELinux目前的应用模式

Mode from config file:          enforcing       \\在配置文件中设置的SELinux应用模式

Policy version:                 24            \\使用中的SELinux策略类型版本

Policy from config file:        targeted          \\在配置文件中设置的SELinux策略类型

3:启用或禁用SELinux

修改/etc/selinux/config文件,以禁用SELInux(若要启用,SELinux字段应设置为enforcing或permissive)

SELINUX=disabled

SELINUXTYPE=targeted

4:查看和更改SELinux应用模式

(1) 查看SELinux应用模式

[root@localhost ~]# getenforce

Enforcing

(2) 更改SELinux应用模式

使用setenforce命令可以切换SELinux应用模式

enforcing或1:强制模式

permissive或0:允许模式

[root@localhost ~]# setenforce 0

三:安全上下文

安全上下文是一组和进程或对象有关的安全属性,每一个进程或对象都会记录一条安全上下文,将其作为SELinux判断进程是否能读取对象的依据。

1:安全上下文格式

(1) USER字段

USER字段用来记录登录系统后所属的SELinux身份。USER字段通常以_u为后缀。

常用的USER:

Ø user_u:真实用户类型的使用者

Ø system_u:系统账户类型的使用者

Ø root:超级用户的使用者

(2) ROLE字段

ROLE字段用来存储进程、领域或对象所扮演的角色信息,使用ROLE代表多个TYPE的组合,ROLE字段通常以_r为后缀。

常用的ROLE

Ø staff_r:内部的用户角色

Ø user_r:其他或不分类的用户角色

Ø object_r:文件、设备或其他无法分类的对象

Ø secadm_r:允许做安全管理的用户角色

(3) TYPE字段

TYPE字段用来定义该对象的类别。TYPE字段通常以_t为后缀

通常的TYPE字段

unconfiged_:未设置类型

default_t:默认类别

mn_t:代表挂载点的类型,/mnt中的文件类型属于这个类别

boot_t:作为开机文件的类型,/boot中的文件多数属于这个类别

bin_t:作为二进制执行文件,/bin中的文件多数属于这个类别

sbin_t:作为系统管理类型的文件,/sbin中的文件属于这个类别

device_t:代表设备文件,/dev中的文件属于这个类别

lib_t:链接库类别,/lib中的文件属于这个类别

var_t:代表存储于/var中的文件类别

usr_t:代表存储于/usr中的文件类别

etc_t:存储于/etc中的文件类别

tty_device_t:代表终端或控制台设备

su_exec_t:具备su功能的执行文件

java_exec_t:JAVA相关的执行文件

public_content_t:公共内容类型文件,比如FTP、NFS等服务器中的文件

shadow_t:代表存储密码数据的文件类别

http_t:作为HTTP服务器文件的类别

(4) LEVEL和CATEGORY字段

用来定义其隶属的安全等级和分类。LEVEL字段定义为s0~S15,共16个,s0机密等级最低,s15机密等级最高。CATEGORY字段定义为c0~c1023,共1024个。

2:查看安全上下文

(1) 查看用户账户安全上下文

[root@localhost ~]# id -Z

unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

(2) 查看进程安全上下文

[root@localhost ~]# ps -ax -Z

Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ

LABEL                              PID TTY      STAT   TIME COMMAND

system_u:system_r:init_t:s0          1 ?        Ss     0:01 /sbin/init

system_u:system_r:kernel_t:s0        2 ?        S      0:00 [kthreadd]

system_u:system_r:kernel_t:s0        3 ?        S      0:00 [migration/0]

system_u:system_r:kernel_t:s0        4 ?        S      0:00 [ksoftirqd/0]

system_u:system_r:kernel_t:s0        5 ?        S      0:00 [migration/0]

system_u:system_r:kernel_t:s0        6 ?        S      0:00 [watchdog/0]

(3) 查看文件和目录安全上下文

[root@localhost ~]# ls -Z /root/anaconda-ks.cfg

-rw-------. root root system_u:object_r:admin_home_t:s0 /root/anaconda-ks.cfg

[root@localhost ~]# ls -dZ /root

dr-xr-x---. root root system_u:object_r:admin_home_t:s0 /root

3:修改文件的安全上下文

(1) 查看文件系统对象扩展属性

getfattr命令查看文件系统对象的扩展属性。

-m . 匹配所有格式的扩展属性,默认的是user.xxx,即"^user\."。

-d 获得所有扩展属性值

-d -e hex 使用16进制编码dump出对应扩展属性的值

--absolute-names 不过滤路径分隔符('/')

-n 指定扩展属性的名称

-R递归到子目录

[root@localhost ~]# getfattr -m . -d /root/anaconda-ks.cfg

getfattr: Removing leading '/' from absolute path names

# file: root/anaconda-ks.cfg

security.selinux="system_u:object_r:admin_home_t:s0"

(2) 修改文件安全上下文

使用chcon命令修改文件的SELinux安全上下文

-h, --no-dereference:影响符号连接而非引用的文件。

--reference=参考文件:使用指定参考文件的安全环境,而非指定值。

-R, --recursive:递归处理所有的文件及子目录。

-v, --verbose:为处理的所有文件显示诊断信息。

-u, --user=用户:设置指定用户的目标安全环境。

-r, --role=角色:设置指定角色的目标安全环境。

-t, --type=类型:设置指定类型的目标安全环境。

-l, --range=范围:设置指定范围的目标安全环境。

[root@localhost ~]# chcon -tetc_t /root/anaconda-ks.cfg

[root@localhost ~]# ls -Z /root/anaconda-ks.cfg

-rw-------. root root system_u:object_r:etc_t:s0       /root/anaconda-ks.cfg

4:修复安全上下文

(1) 查看默认安全上下文

使用matchpathcon命令可以得到制定文件的默认SELinux安全上下文。

-p:使用前缀的速度解答

-N:不使用解答

-n:不显示路径

-V:在磁盘匹配默认上验证文件上下文

-f <file_context_file文件>:使用备用file_context文件

[root@localhost ~]# matchpathcon /root/anaconda-ks.cfg

/root/anaconda-ks.cfg system_u:object_r:admin_home_t:s0

(2) 使用fixfiles命令修复安全上下文

使用fixfiles命令可以修复RPM软件包里的文件的安全上下文。

-l <日志文件>:将输出保存到制定的日志文件

-F:强制重置上下文为匹配file_context的自定义文件

-f:清楚/tmp目录

-R <RPM软件包名称>:使用rpm数据库,以发现指定数据包中的所有文件和恢复文件的上下文

例:修复crontabs软件包中的文件的安全上下文

[root@localhost ~]# ls -Z /etc/crontab

-rw-r--r--. root root system_u:object_r:system_cron_spool_t:s0 /etc/crontab

[root@localhost ~]# chcon -t user_home_t /etc/crontab

[root@localhost ~]# ls -Z /etc/crontab

-rw-r--r--. root root system_u:object_r:user_home_t:s0 /etc/crontab

[root@localhost ~]# rpm -qf /etc/crontab

crontabs-1.10-33.el6.noarch

[root@localhost ~]# fixfiles -R crontabs check

/sbin/restorecon reset /etc/crontab context system_u:object_r:user_home_t:s0->system_u:object_r:system_cron_spool_t:s0

[root@localhost ~]# fixfiles -R crontabs restore

[root@localhost ~]# ls -Z /etc/crontab

-rw-r--r--. root root system_u:object_r:system_cron_spool_t:s0 /etc/crontab

(3) 使用restorecon命令修复安全上下文

使用该命令可以恢复SELinux文件属性,即恢复文件的安全上下文。

-i:忽略不存在的文件

-f <文件名>:包含由应用程序处理的文件列表

-e <目录>:制定要排除的目录

-R:递归处理目录

-n:不改变任何文件标签

-o <文件名>:保存不正确的上下文列表到输出文件中

-v:显示文件标签

-F:强制恢复文件安全上下文

-p:没1000个文件显示速度

例:恢复/root/anaconda-ks.cfg文件的安全上下文

[root@localhost ~]# restorecon /root/anaconda-ks.cfg

[root@localhost ~]# ls -Z /root/anaconda-ks.cfg

-rw-------. root root system_u:object_r:admin_home_t:s0 /root/anaconda-ks.cfg

(4) 重新产生安全上下文

如果需要修复非常多的文件的安全上下文,则建议重新产生安全上下文,为Linux整个系统中的每一个文件重新产生正确的安全上下文。Linux在开机的时候,会检查是否需要启动SELinux子系统,以及是否有/.autorelabel文件,Linux系统使用fixfiles重新生成Linux系统文件的安全上下文。

[root@localhost ~]# touch /.autorelable

重启系统(需要较长时间)

四:策略类型

1:策略类型简介

SELinux策略是用来定义SELinux的读取规则,比如哪一个安全上下文的进程允许或禁止读取哪一个对象。Linux会把每一个Linux策略类型的资料存储在/etc/selinux策略类型名目录中。

例:targeted策略类型的内容(targeted目录中的文件或子目录都是用来存储SELinux策略类型的数据)

[root@localhost ~]# ls -l /etc/selinux/targeted/

总用量 24

drwxr-xr-x. 4 root root 4096 7月   1 2016 contexts     \\存储策略类型的安全上下文

drwxr-xr-x. 2 root root 4096 11月 24 2013 logins       \\

drwxr-xr-x. 3 root root 4096 7月   1 2016 modules     \\存储策略类型的模版数据

drwxr-xr-x. 2 root root 4096 7月   1 2016 policy       \\存储策略类型的二进制类型数据库

-rw-r--r--. 1 root root  607 11月 24 2013 setrans.conf   \\定义某一个安全等级和类别的转译名称

-rw-r--r--. 1 root root  106 7月   1 2016 seusers       \\自动生成libsemanage

[root@localhost ~]# ls -l /etc/selinux/targeted/policy/      \\policy是targeted中最重要的目录,

总用量 7124

-rw-r--r--. 1 root root 7292701 7月   1 2016 policy.24

[root@localhost ~]# ls /etc/selinux/targeted/policy/

policy.24      \\ policy.24是该策略类型数据库文件,文件名后的数子是该策略类型数据库的版本

2:安装和使用策略类型

(1) 查看/etc/selinux目录(此时只有一个targeted目录,每一个策略类型都会有一个目录的)

[root@localhost ~]# ls -l /etc/selinux/

总用量 20

-rw-r--r--. 1 root root  458 7月   1 2016 config

-rw-r--r--. 1 root root  113 11月 23 2013 restorecond.conf

-rw-r--r--. 1 root root   76 11月 23 2013 restorecond_user.conf

-rw-r--r--. 1 root root 2271 2月  22 2013 semanage.conf

drwxr-xr-x. 6 root root 4096 7月   1 2016 targeted

(2) 安装selinux-policy-minimum软件包

[root@localhost ~]# rpm -qa selinux-policy-minimum

[root@localhost ~]# yum -y install selinux-policy-minimum

(3) 查看是否已经存在策略类型

[root@localhost ~]# ls -l /etc/selinux/总用量 24

-rw-r--r--. 1 root root  458 7月   1 2016 config

drwxr-xr-x. 6 root root 4096 3月  15 14:10 minimum

-rw-r--r--. 1 root root  113 11月 23 2013 restorecond.conf

-rw-r--r--. 1 root root   76 11月 23 2013 restorecond_user.conf

-rw-r--r--. 1 root root 2271 2月  22 2013 semanage.conf

drwxr-xr-x. 6 root root 4096 7月   1 2016 targeted

(4) 使用新的策略类型

[root@localhost ~]# vi /etc/selinux/config

SELINUX=enforcing

SELINUXTYPE=minimum

(5) 重新启动Linux系统

3:查看策略类型信息

查看策略类型需要安装setools-console和setools-libs软件包,然后才能使用seinfo命令查看。

(1) 安装装setools-console和setools-libs软件包

[root@localhost ~]# yum -y install setools-console

[root@localhost ~]# yum -y install setools-libs

(2) 查看策略类型信息

使用seinfo命令查看SELinux策略的组建有关的信息

seinfo命令选项

-x:为每个组件匹配表达式显示更多详细信息

--stats:显示策略的统计信息

-l:显示约束语句时显示换行符

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

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

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

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

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

例:查看SELinux策略类型targeted的信息

[root@localhost ~]# seinfo /etc/selinux/targeted/policy/policy.24

Statistics for policy file: /etc/selinux/targeted/policy/policy.24

Policy Version & Type: v.24 (binary, mls)

   Classes:            81    Permissions:       235

   Sensitivities:       1    Categories:       1024

   Types:            3637    Attributes:        280

   Users:               9    Roles:              12

   Booleans:          217    Cond. Expr.:       257

   Allow:          291034    Neverallow:          0

   Auditallow:        123    Dontaudit:      226650

   Type_trans:      33142    Type_change:        38

   Type_member:        48    Role allow:         19

   Role_trans:        308    Range_trans:      4521

   Constraints:        90    Validatetrans:       0

   Initial SIDs:       27    Fs_use:             23

   Genfscon:           83    Portcon:           446

   Netifcon:            0    Nodecon:             0

   Permissives:        75    Polcap:              2

(3) 搜索策略类型

使用seinfo命令可以查询SELinux的策略提供多少相关规则,如果查到的相关类型或者布尔值,想要知道详细规则时,使用sesearch命令查询。

sesearch命令选项:

-a:列出该类型或布尔值的所有相关信息

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

-b:后面还要接布尔值的规则,例如 -b httpd_enable_ftp_server

-d:不搜索类型的属性

-R:使用正则表达式匹配

-n:问每个规则显示行号(如果有)

-S:搜索规则的语义而不是语法

-C:为条件规则显示条件表达式

规则类型:

-A:搜索允许规则

--neverallow:搜索neverallow规则

--auditallow:搜索auditallow规则

--dontaudit:搜索dontaudit规则

-T:搜索type_transition、type_member和type_change规则

--role_allow:搜索角色允许规则

--role_trans:搜索role_transition规则

--range_trans:搜索range_transition规则

--all:搜索所有规则类型

例:搜索targeted策略类型中httpd_t读取etc_t类型时所有的规则

[root@localhost ~]# sesearch -A -s httpd_t -t etc_t /etc/selinux/targeted/policy/policy.24

Found 14 semantic av rules:

   allow httpd_t file_type : filesystem getattr ;

   allow domain etc_t : file { ioctl read getattr lock open } ;

   allow domain etc_t : dir { ioctl read getattr lock search open } ;

   allow domain etc_t : lnk_file { read getattr } ;

   allow httpd_t etc_t : file { ioctl read getattr lock open } ;

   allow httpd_t etc_t : dir { ioctl read getattr lock search open } ;

   allow httpd_t etc_t : lnk_file { read getattr } ;

   allow domain configfile : file { ioctl read getattr lock open } ;

   allow domain configfile : dir { ioctl read getattr lock search open } ;

   allow domain configfile : lnk_file { read getattr } ;

   allow httpd_t configfile : file { ioctl read getattr lock open } ;

   allow httpd_t configfile : dir { ioctl read getattr lock search open } ;

   allow httpd_t configfile : lnk_file { read getattr } ;

   allow httpd_t etc_t : dir { getattr search open } ;

五:布尔值

1:查看布尔值

使用gesebool命令查看SELinux布尔值

-a:列出目前系统上面的所有布尔值条款设置为开启或关闭值。

例:查看所有SELinux布尔值

[root@localhost ~]# getsebool -a

abrt_anon_write --> off

abrt_handle_event --> off

allow_console_login --> on

allow_cvs_read_shadow --> off

allow_daemons_dump_core --> on

allow_daemons_use_tcp_wrapper --> off

allow_daemons_use_tty --> on

allow_domain_fd_use --> on

例:查看httpd_can_network_connect布尔值

[root@localhost ~]# getsebool httpd_can_network_connect

httpd_can_network_connect --> off

2:修改布尔值

setsebool命令是用来修改SElinux策略内各项规则的布尔值。setsebool命令和getsebool命令是SELinux修改和查询布尔值的一套工具组。

当值设置为1、on、true是标识启用布尔值,当值为0、false、off时为禁用布尔值。使用setsebool修改SELinux的布尔值时只能改变当前运行的布尔值,Linux系统重启后,将继续加载默认配置,如果需要永久改变,需要使用-P选项。

例:启用httpd_can_network_connect的布尔值

[root@localhost ~]# getsebool httpd_can_network_connect

httpd_can_network_connect --> off

[root@localhost ~]# setsebool httpd_can_network_connect on

[root@localhost ~]# getsebool httpd_can_network_connect

httpd_can_network_connect --> on

例子:禁用httpd_can_network_connect的布尔值

[root@localhost ~]# setsebool httpd_can_network_connect off

[root@localhost ~]# getsebool httpd_can_network_connect

httpd_can_network_connect --> off

六:管理策略模

使用semodule命令可以管理SELinux策略模块,比如显示、安装、升级、删除、激活以及禁用策略模块。

semodule命令选项

-l:显示安装的模块

-R重装策略模块

-B建立和承诺改装策略模块

-I <策略模块>:安装一个新的模块

-u <策略模块>:升级策略模块

-e <策略模块>:激活策略模块

-d <策略模块>:禁用策略模块

-b <策略模块>:安装新的基础模块

-r <策略模块>:删除策略模块

例:查看SELinux加载的策略模块

[root@localhost ~]# semodule -l

abrt 1.2.0

accountsd 1.0.0

ada 1.4.0

afs 1.5.3

aiccu 1.0.0

aide 1.5.0

amanda 1.12.0

amtu 1.2.0

例:查看apache策略模块

[root@localhost ~]#  semodule -l | grep apache

apache 2.1.2

例:禁用zebra策略模块

[root@localhost ~]# semodule -d zebra

 [root@localhost ~]#  semodule -l | grep zebra

zebra 1.10.1 Disabled

例:激活zebra模块

[root@localhost ~]# semodule -e zebra

[root@localhost ~]#  semodule -l | grep zebra

zebra 1.10.1

例:删除zebra模块

[root@localhost ~]# semodule -r zebra

[root@localhost ~]#  semodule -l | grep zebra

七:图形界面管理SELinux

需要先安装policycoreutils-gui软件包

[root@localhost ~]# yum -y install policycoreutils-gui

【系统】à【管理】à【SELinux管理】,打开SELinux维护界面,

1:状态

image.png

2:布尔值

3:文本标记

4:用户映射

5:SELinux用户

6:网络端口

7:策略模块

8:进程域

 

Logo

更多推荐