SELinux带给Linux的主要价值是提供了一个灵活、可配置的MAC系统,SELinux(Security-Enhanced Linux)主要由Kernel SELinux模块和用户态工具组成。
SELinux是一个安全体系结构,它提供了一种灵活的强制访问控制(MAC)系统。SELinux定义了系统中,每个用户、进程、应用和文件的访问和转变的权限,然后它使用一个安全策略来控制这些实体之间的交互,安全策略指定如何严格或宽松的进行检查。
SELinux用于明确指明某个进程可以访问哪些资源。
只有同时满足标准Linux访问控制和SELinux访问控制时,主体才能访问客体。SELinux是加入到Linux系统中的一套核心组件及用户工具,可以让应用程序运行在其所需的最低权限上。
未经修改过的Linux系统是使用的自主访问控制(DAC)的,用户可以自己请求更高的权限,所以恶意软件几乎可以任意访问它想访问的软件,并且如果该软件被授予root权限,那么它就无所不能了。
在SELinux中,没有root用户的概念,安全策略是由管理员来定义的,任何软件都无法取代,这样就可以将那些潜在的恶意软件所能造成的损害可以被控制在最小。
DAC最大的弱点是不能识别人和计算机程序之间最基本的区别。如果一个用户被授权访问,那么他的程序也就被授权访问,那么其中的恶意程序也就被授权访问。所以DAC最主要的缺陷就是主体容易受到多种的恶意软件的攻击,而MAC就是避免这些攻击的方法。
SELinux实现了一个更加灵活的MAC 形式,叫做类型强制(Type Enforcement)和一个非强制的多层安全形式(Multi-Level Security)
SELinux的配置文件是/etc/selinux/config,他还有一个符号链接文件是/etc/sysconfig/selinux。
任意进入这两个文件的一个就可以对SELinux进行配置修改。配置文件中配置内容有:是否打开SELinux,执行哪一种策略和系统如何执行策略。所有的策略文件和主要配置文件都在/etc/selinux目录下。
enforcing:安全策略强制执行
permissive:不强制执行安全策略但是会发出警告
disabled:SELinux完全失效,SELinux和内核失去联系
SELIINUXTYPE=targeted|strict两个选项用来确定哪一种策略
targeted:只有目标网络的守护进程保护,每个守护进程是否执行策略是可以进行修改的,保护常见的网络服务,为SELinux默认值。bool值0=off bool值1=on。如果进程的布尔值为0,也就是off,那就说明SELinux不允许执行此功能,反之,则表示可以执行此功能。
命令getsebool -a可列出所有SELinux的布尔值。只查询和某个进程相关的布尔值就使用grep命令过滤即可,如getsebool -a|grep ftp.就能看到所有和ftp有关的bool布尔值了。
命令setsebool -P+守护进程名=0/1,即可修改该进程的布尔值,比如setsebool -P dhcpd_disable_trans=0即将该进程的布尔值修改为o,也就是off。(-P表示永久修改,重启有效)
strict:对SELinux执行完全的保护,为所有的object和subject定义安全环境,而且每个action由策略服务器来处理。具备完整的保护功能,保护网络、一般指令及应用程序。
Centos7以后的版本在/etc/selinux目录下已经找不到strict目录了,所以可以理解为已经默认该选项就默认使用targeted的策略方式。
SETLOCALDEFS=0/1,用于控制如何设置本地定义
设置为1,表示这些定义是由load_policy控制,load_policy来自于文件/etc/selinux/
设置为0,由semanage控制
不过centos7以及以后的版本已经没有第三个参数了。默认是由semanage来决定。所以一般不需要去管这个参数。
所以对于该文件的配置仅仅需要修改SELINUX这一个参数即可。
安全上下文是一个简单的、一致的访问控制属性,在SELinux中,类型标识符是安全上下文的主要部分。一个进程的类型通常被称为一个域(domain)。域即安全上下文中的TYPE.
SELinux对系统中部分命令做了修改。部分命令后面再跟一个选项,大写的Z,即可显示客体和主体的安全上下文。
系统根据PAM子系统中的pam_selinux.so模块设置登陆者运行程序的安全上下文。
文件的Security Contex规则如下:
rpm包安装的文件,会根据rpm包内记录来生成安全上下文;
手动创建的文件,会根据policy中规定的来设置安全上下文;
cp命令会重新生成安全上下文,而mv命令则保持原有的不变。
id -Z显示shell的安全上下文;ps -Z检查进程的安全上下文; ls -Z检查文件、目录的安全上下文。
所有的操作系统访问控制都是以关联的主体(进程)和客体(文件、进程间通信通道、套接字、网络主机等)的某种类型的访问控制属性为基础,在SELinux中,访问控制属性就叫安全上下文。
所有主、客体都有与其相关联的安全上下文,一个安全上下文由三部分组成:用户、角色和类型标识符,
USER:ROLE:TYPE[LEVEL[:CATEGORY]]
命令ls -Z:unconfined_u:object_r:home_root_t:s0 a.txt
USER:安全上下文的一部分,类似于UID用于提供身份识别,记录身份,最常见的是system_u是开机过程中系统进程的预设,其他的没有主动更改的情况下都是unconfined_u,在targeted策略中,user并不重要。
role:类似于GID,不同角色具备不同的权限,用户可以具备多个role,但是同一时间内只能使用一个role。
文件、目录和设备的role通常是object_r
程序的role通常是system_r;
其他的一般是unconfind_r.
type:用于将主体和客体划分为不同的组,给每个主体和系统中的客体定义了一个类型,为进程运行提供最低的权限环境。
type是安全上下文中最重要的部分,预设值以_t结尾。type的类型就很多,有kernel_t,还有各种服务的类型,如httpd_t,vsftpd_t等。
LEVEL:代表安全等级,目前已经定义的安全等级为s0-s15
CATEGORY:代表分类,目前已经定义的分类为c0-c10233.
标准Linux中,访问控制属性是基于读写执行这三个控制位以及所有者、所属组和其他人各一套。
SELinux则是根据安全上下文(用户,角色,类型)来表明访问控制属性。也由于SELinux的主要访问控制特性是类型强制,所以安全上下文中的类型标识符决定了访问权。
又因为SELinux是在标准Linux基础上增加了类型强制,所以如果主体想要访问客体那么就要同时满足标准的访问控制属性和安全上下文。
总之,系统中每个文件、目录、网络端口等都被指定一个安全上下文,policy则给出各安全上下文呢之间的作用规则,SELinux根据policy已经安全上下文规则来决定存取行为是否可执行。
在SELinux中,所有访问必须明确授权,SELinux默认不允许任何访问,即没有root的概念。SELinux通过制定主体类型(即域)和客体类型使用allow规则授予访问权限,allow规则为:
源类型:通常是尝试访问的进程的域类型
目标类型:被进程访问的客体的类型
客体类别:指定允许访问的客体的类型
许可:象征目标类型允许源类型访问客体类型的访问种类。
allow user_t bin_t : file {read execute getattr};
allow表示这是在使用allow规则,user_t是源类型,bin_t是目标类型,file是定义在策略中的客体类别名称,这里表示一个普通文件,括号中包括的许可是文件客体类别有效许可的一个子集:
即拥有user_t的进程可以读/执行或获取具有bin_t类型的文件客体的属性。
即语法为:allow 源类型 目标类型:客体类别{许可子集}。这样既可保证主体访问客体时候只给予必须的权限,实现尽可能的安全。
当某些文件拥有了SetUID的属性之后,在运行的过程中就会拥有属主的权利,如passwd命令,但是实际上root只是希望普通用户使用passwd命令仅仅是去修改shadow和passwd文件,而不是去做别的事,但是文件拥有SUID权限后却是拥有了访问任何系统资源的权利,这就给系统带来了安全问题,就需要类型强制访问控制来解决。
1.sestatus查看SELinx系统的基本信息,加参数-v查看SELinux系统的详细信息,加参数-b查看SELinux所有的布尔值,和命令getsebool -a得到的结果一样。
2.命令getenforce可查看当前SELinux的状态。
3.命令setenforce 1/0可临时设置,1表示enforcing,0表示permissive。
4. 命令getsebool -a可列出所有SELinux的布尔值。
5. 命令setsebool -P+进程名=0/1,即可修改该进程的布尔值。
对于普通用户来说,selinux这东西就属于很复杂但又不重要的东西,我也不知道为什么要去了解这么清除,反正没啥用。只需要记住如果你在配置服务器的时候,排除网络、防火墙和服务器设置之外的事情的情况仍然有故障,那么可以考虑是否是由于selinux的限制导致的。你完全可以选择直接使用命令临时关闭或者在/etc/selinux/config文件中直接禁用即可。