一:Selinux介绍:

SELinux: 是美国国家安全局和SCC开发的 Linux的一个强制访问控制的安全模块。 2000年以GNU GPL发布, Linux内核2.6版本后集成在内核中。
SElinux提供DAC:自由访问控制和MAC:强制访问控制两种访问控制。所有DAC机制都有一个共同的弱点,就是它们不能识别自然人与计算机程序之间最基本的区别。简单点说就是,如果一个用户被授权允许访问,意味着程序也被授权访问,如果程序被授权访问,那么恶意程序也将有同样的访问权。 DAC最根本的弱点是主体容易受到多种多样的恶意软件的***,而且DAC环境下进程是无束缚的,MAC就是避免这些***的出路,大多数MAC特性组成了多层安全模型。MAC环境下策略的规则决定控制的严格程度,MAC环境下进程可以被限制的,策略被用来定义被限制的进程能够使用那些资源(文件和端口)。 默认情况下,没有被明确允许的行为将被拒绝

二:SElinux的四种工作类型。

(1)strict:centos5,每个进程都受到selinux的控制
(2)targrtd:用来保护常见 的网络服务,仅有限进程受到selinux控制,只监控容易被***的进程。
(4)minimum :centos7,修改targeted,只对选择的网络服务
注:targeted为默认类型,minimum和mls稳定性不足,未加以应用,strict已不再使用。

三SElinux的安全上下文

Linux所有文件和端口资源和进程都具备安全标签: 安全上下文(security context)
安全上下文有五个元素组成:
user:role:type:sensitivity:category
user_u:object_r:tmp_t:s0:c0


User:指示登录系统的用户类型,如root,user_u,system_u,多数本地进程都属于自由(unconfined)进程
Role:定义文件,进程和用户的用途:文件:object_r,进程和用户: system_r
Type:指定数据类型,规则中定义何种进程类型访问何种文件,Target策略基于type实现。
Sensitivity:限制访问的需要,由组织定义的分层安全级别,
Category:对于特定组织划分不分层的分类, 一个对象可以有多个categroy, Target 策略不使用category。


实际上下文:存放在文件系统中。
selinux
期望(默认)上下文:存放在二进制的SELinux策略库(映射目录和期望安全上下文)中
selinux

四:selinux的状态

1.三种状态:

enforcing:强制,每个受限的进程都必须受限
permissive:允许,每个受限的进程违规操作不会被禁止,但是会被记录于审计日志。
disabled:禁用

2.selinux状态设置的相关命令:

getenforce : 获取selinux当前状态
sestatus :查看selinux状态
setenforce 0|1
0:设置为permissive
1:设置为enforcing
注:仅限制在selinux开启状态下切换,如果设置为disable改为其他两个选项则需要重启后生效。(修改/etc/selinux/config文件)
selinux
selinux

3.修改SELinux安全标签

semanage fcontext -a -t httpd_sys_content_t '/app/website(/.*)?' :增加期望值

semanage fcontext -m -t var_log_t '/app/website(/.*)?':修改期望值

semanage fcontext -d '/app/website(/.*)?' 删除期望值
selinux

selinux

4.Selinux端口标签

semanage port -a -t http_port_t -p tcp 9527:增加端口号

semanage port -d -t http_port_t -p tcp 9527:删除端口号
selinux

selinux

5.SELinux布尔值

getsebool -a :查看布尔值
selinux
总结:SELinux中对所有的文件都赋予一个type的文件类型标签,对于所有的进程也赋予各自的一个domain的标签。 domain标签能够执行的操作由安全策略里定义。当一个进程试图访问一个文件或端口, Kernel中的策略执行服务器将检查AVC (访问矢量缓存Access Vector Cache), 在AVC中, 进程和文件的权限被缓存(cached),查找“应用+文件”的安全环境。然后根据查询结果允许或拒绝访问。而安全策略则定义主体读取对象的规则数据库,规则中记录了哪个类型的主体使用哪个方法读取哪一个对象是允许还是拒绝的,并且定义了哪种行为是充许或拒绝。