[Linux] SELinux基础学习

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/FightFightFight/article/details/81639312

1.什么是SELinxu?

SELinux(Security-Enhanced Linux),安全增强型Linux,最初是由犹他大学Flux团队和美国国防部开发的Flux高级安全内核(FLASK)开发的是由NSA开发的一种访问控制体系。NSA对该开发进行了改进,并作为开源软件发布,目前SELinux已集成到Linux2.6内核系列和几个Linux发行版中,作为Linux内核中主要的强制访问控制(MAC)机制。

2.设计目的

要说到设计目的,就需要了解DAC和MAC.

1.自主访问控制(Discretionary Access Control)

自主访问控制简称DAC,是访问控制的一种类型,它根据主体的身份和他所属的组限制对客体的访问。所谓的自主,是因为拥有访问权限的主体,可以直接(或间接)地将访问权限赋予其他主体。DAC的主体一般是用户。

说的更直白一点,就是根据用户是否具有rwx权限来决定对客体的操作。

因此,DAC的缺点是显而易见的:

  • 1.所有权限都是对于root用户来说都是无效的

一旦root用户密码泄露,则系统所有文件、数据都处于危险之中。

  • 2.使用者可以变更文件权限

比如用户将某一文件权限通过chmod -R 777或者chmod -R uoa=rwx修改权限后,所有用户都具有rxw权限,该文件就会被任何用户操作。

2.强制访问控制(Mandatory Access Controll)

强制访问控制,简称MAC,所谓强制访问控制是指由系统对用户所创建的对象进行统一的强制性控制,按照确定的规则决定哪些用户可以对哪些对象进行哪些操作类型的访问,即使是创建者用户,创建一个对象后.也可能无权访问该对象。

在MAC中,不存在”root用户”的概念,即使是root用户,对于不同的文件、程序,可能会有不同的权限,因此,在MAC中,主体由“用户”变成了“进程”。MAC一般与DAC配合使用,图示如下:
这里写图片描述

正是由于DAC对root用户的限制太宽松,因此SELinux采用了MAC进行程序的控制。

SELinux支持三种类型的MAC:

  • Type Enforcement:类型强制模式,进程运行在实体中,且主体对客体的动作由policy控制。
  • Multi-Level Secure(MLS):多级安全模式,用于访问不同级别的组织,以便将受限制的信息与机密信息分开以保持机密性。它允许允许通过扩展安全上下文以包括安全级别来在策略中实现如“no write down”和“no read up”的强制规则。
  • Multi-Category Security(MCS):多类型安全模式。

3.SELinux基本概念

主体(Subject)

在SELinux中,主体是一个进程,有安全上下文和它关联。

目标(Object)

在SELinux中,Object是通过进程访问的文件,套接字,管道或网络接口等资源。 这些目标根据它们提供的资源和与其目的相关的访问权限(例如,读取,接收和写入)进行分类,并分配安全上下文。

SELinux用户(Users)

SELinux用户不等于Linux用户,最大的区别就是SELinux用户在登录期间不会改变,而Linux用户则可以通过su、sudo变为root用户。通常多个Linux用户会使用一个SELinux用户,但可以对他们进行1:1的映射,例如Linux的root用户和SELinux root用户(SELinux root并不像Linux root一样对所有权限都无效),一般而言,SELinux用户一般以_u结尾。

角色(Roles)

一个SELinux用户可以接受多个角色,角色的含义由策略定义。目标一般具有object_r角色,一般而言,角色以_r结尾。

类型/域(Types)

Types是决定是否可以访问的主要因素。Type在主体上(进程)一般称为domain(域),在目标上一般称为types(类型)。Type以_t结尾。

安全上下文(Security Context)

系统中每个进程(主体)和对象(目标)上都有一个上下文(或称为标签),这是一个属性,用于决定是否允许进程和目标之间的访问,安全上下文由三个必需字段和一个可选字段组成:

user:role:type[:range]

user:表示SELinux用户;
role:表示SELinux角色;
type:表示类型/域;
range:该字段表示安全级别,并且仅当策略支持MLS或MCS时才存在.

如:

system_u:system_r:xserver_t:s0

通过ls -Z来查看相关文件或进程的安全上下文,如:

jyq@ubuntu:~$ ls -Z
system_u:object_r:file_t:s0 PythonWorkSpace
system_u:object_r:file_t:s0 shellstudy
system_u:object_r:file_t:s0 test.log

目标类型(Object Classes)

SELinux有许多目标类,或者说是目标类别,用于策略和访问决策,以更精细地指定允许的访问。 每个对象类都有一组权限,这些权限是访问这些对象的可能的方式。如file目标类具有create, read, write, and unlink (delete)的权限,而unix_stream_socket类则具有 create, connect, and sendto的权限。

规则(Rules)

SELinux支持三种MAC:MCS、MLS、Type Enhancement,最主要的安全机制就是Type Enhancement,它将使用进程和目标的Type指定规则:

allow Rule | source_domain | target_type   : class    | permission
-----------▼---------------▼--------------------------▼------------
allow        unconfined_t    ext_gateway_t : process    transition;
allow:表示allow规则
source_domain:主体Type标识,即domain
target_type:目标Type标识,即type
class:目标类型
permission:授予主体对目标的权限

以上语句也称为TE语法,如:

allow user_t user_home_t:file { create read write unlink };

该语法含义为:允许具有user_t类型的进程(主体)对具有user_home_t类型的、目标类是file的目标有create read write unlink的权限,或者为:允许domain为user_t的进程(主体)对type为user_home_t的、目标类为file的目标有create read write unlink的权限。

4.SELinux核心组件

主体(Subject)

即进程。

Object Manager

目标管理器,知道特定资源(例如文件)所需的操作,并且可以强制执行这些操作。

Security Server

安全管理服务器,根据安全策略规则,对主体权限执行对对象请求的动作做出决策。

Security Policy

安全策略,使用SELinux Policy 语言描述的规则(Roles)。

Access Vector Cache (AVC)

访问向量缓存,通过缓存来提高性能。

图示如下:
这里写图片描述

了解了SELinux的基本概念和原理后,接下来我们看看SELinux的启动及其相关的一些命令。

5.SELinux的启动、关闭、查看

虽然SELinux已经作为Linux内核一个组件了,然而并非所有的Linux发行版本都支持SELinux,目前CentOS、Fedora 和Red Hat已将SELinux内置并且默认启动,在Ubuntu等其他版本上则没有内置,需要自行安装。

SELinux的三种模式

目前SELinux支持三种模式:

  • Enforcing:强制模式,代表SELinux正在运行中,且已经开始执行策略,限制domain/type了;
  • Permissive:宽容模式,代表SELinux正在运行中,不过没有执行策略,同时在log中会有AVC denied 信息,因此该模式可以用于调试。
  • Disabled:表示SELinux没有实际运行。

getenforce、setenforce命令

可以通过getenforcesetenforce命令来查看和切换当前的模式,如:

# 查看当前系统SELinux模式
jyq@ubuntu:~$ getenforce
Permissive
# 将SELinux模式设置为Enforcing模式,1表示Enforing模式,0表示Permissive模式
jyq@ubuntu:~$ sudo setenforce 1
jyq@ubuntu:~$ getenforce
Enforcing

但是需要注意的是,setenforce命令无法在Disabled的模式下进行模式的切换,如果要切换Diabled模式,则需要通过修改SELinux配置文件来实现,打开/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=permissive
# SELINUXTYPE= can take one of these two values:
# default - equivalent to the old strict and targeted policies
# mls     - Multi-Level Security (for military and educational use)
# src     - Custom policy built from source
SELINUXTYPE=ubuntu

# SETLOCALDEFS= Check local definition changes
SETLOCALDEFS=0

以上文件中SELINUX=permissive代表当前SELinux的模式,SELINUXTYPE代表目前的策略。

修改SELinux配置文件后,需要重启才能生效。

sestatus命令检查完整的SELinux状态

除了getenforce命令之外,还可以使用sestatus命令来查看SELinux的状态:

sestatus [-v|b]
-v:详细列出/etc/sestatus.conf下的文件和进程的安全上下文
-b:将目前策略的规则的布尔值列出

如:

jyq@ubuntu:~$ sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             ubuntu
Current mode:                   enforcing
Mode from config file:          permissive
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      31

6.SELinux的策略和规则

seinfo命令

可以通过seinfo命令来查看SELinux的策略:

seinfo [-urtb]

不带任何选项时统计当前策略下的状态
u:列出所有的SELinux用户标识
r:列出所有的SELinux角色标识
t:列出所有的SELinux类型/域
b:列出所有的布尔值列表

如:

# 查看当前系统中所有的SELinux用户
jyq@ubuntu:~$ seinfo -u

Users: 6
   sysadm_u
   system_u
   root
   staff_u
   user_u
   unconfined_u
jyq@ubuntu:~$ 

sesearch命令

通过setinfo命令查看到当前系统的主体、目标、目标类型等后,就可用通过该命令来查看规则了:

sesearch -A [-stcb] [expression]

-A:查看`allow`规则;
-s:查看指定主体type的规则
-t:查看指定目标type的规则
-c:查看指定目标类型的规则
-b:查看给定名称的条件规则

如:

# 先通过seinfo -t查看目标type
jyq@ubuntu:~$ seinfo -t

Types: 1041
   bluetooth_conf_t
   etc_runtime_t
   audisp_var_run_t
   auditd_var_run_t
   ......
# 再通过sesearch 查看对应目标type的规则
jyq@ubuntu:~$ sesearch -A -t bluetooth_conf_t
Found 99 semantic av rules:
   allow mount_t bluetooth_conf_t : file { ioctl read getattr lock open } ; 
   allow mount_t bluetooth_conf_t : dir { ioctl read getattr lock search open } ; 

或:

# 查看目标类型为file的规则,打印前5行
jyq@ubuntu:~$ sesearch -A -c file | sed -n 1,5p
Found 4342 semantic av rules:
   allow restorecond_t ntpdate_exec_t : file { ioctl read getattr lock relabelfrom relabelto open } ; 
   allow cupsd_t etc_runtime_t : file { ioctl read getattr lock open } ; 
   allow dpkg_script_t hald_acl_exec_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ; 
   allow kernel_t proc_mdstat_t : file { ioctl read getattr lock open } ;

参考资料

http://selinuxproject.org/page/Main_Page

猜你喜欢

转载自blog.csdn.net/FightFightFight/article/details/81639312