SElinux:Security Enhanced Linux
selinux的设计初衷是为了防止资源误用;
什么是资源误用那?对于一般的用户,通常来说都会设定其被允许访问的资源范围,如果因为某个失误,导致其可以访问其权限之外的资源,这样就会存在安全隐患,万一他把资源删除或者做一些不好的事情那,这都会对管理者造成损失;
传统的访问资源的方式:
自主式访问控制,DAC
通过对比进程的拥有者的权限与文件的wrx权限,如果匹配则允许做相应操作;
selinux访问资源的方式:
委任式访问控制,MAC
可以针对特定的进程与特定的资源来进行权限的管理
selinux控制的主体是进程,而目标或者成为客体是资源(文件,套接字等),中间通过策略设置主体能否访问目标;
主体(Subject):selinux中的主体一般都是指进程
目标(Objetic):selinux中的目标(客体)一般是指文件资源
策略(Policy):selinux通过策略来定义了很多详细的规则,从而控制哪些资源对哪些进程是开放的,由于系统中有太多的进程和文件了,所以selinux提供了三个主要策略;
targeted:主要是针对网络服务,对主机本身限制的较少,默认为此;
minimum:由targeted修订而来,仅针对指定的进程做控制;
mls:完整的selinux,限制严格;
其实主体能不能取用目标除了跟策略的设置有关,还跟主体与目标的安全上下文有关,只有都对应上时才可以访问目标资源;
进程首先需要通过策略中的定义的规则然后再与目标资源对比安全上下文,当都通过后就算通过selinux了,但是最后能不能访问目标资源还要对比文件的rwx权限,然后才能决定是否允许访问;
可以通过ls -Z来查看安全上下文:
-rw-------. root root system_u:object_r:admin_home_t:s0 anaconda-ks.cfg
一共由五段组成,我们只讲前三个:
第一个是user(用户):类似Linux 里的用户,用作身份识别;
常用的用户类型:
unconfined_u:表示不受限的用户,一般是用户通过shell手动建立的;
system_u:表示系统用户,大部分是由系统自动产生的;
sysadm_u:表示通过服务产生的;
第二个是role(角色):用作标识资源的类型;
常用的角色类型:
object_r:表示此资源是文件或者目录;
system_r:表示此资源是进程;
第三个是type(类型):在策略这一步用作决定主体进程能不能存取目标资源;
type:表示文件资源的类型;
domain:表示进程资源的类型;
这第三段最为重要,只有domain与type搭配使用才能顺利的取用资源;
domain类型可以对应多个type类型;
可以通过ps auxZ 查看进程的domain:
[root@localhost ~]# ps auxZ
LABEL USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
system_u:system_r:rngd_t:s0 root 943 0.0 0.0 6472 648 ? Ss 10:26 0:02 /sbin/rngd -f
system_u:system_r:crond_t:s0-s0:c0.c1023 root 4993 0.0 0.0 126260 1716 ? Ss 13:29 0:01 /usr/sbin/crond -n
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 root 3777 0.0 0.2 116944 3892 pts/1 Ss 12:22 0:02 -bash
一般进程分为两种:
一种是系统受限的(system_u:system_r),一种是用户比较不受限的(unconfined_u:unconfined_r);
selinux模式:
enforcing:强制模式,表示selinux已经在运行,并且开始显示domain和type了;
permissive:宽松模式,表示selinux已经在运行,但是不会显示domain和type,仅记录警告信息,用于以后审计;
disable:关闭模式,表示selinux没有运行,无任何限制;
相关命令:
getenforce: get the current mode of SELinux
用于查看当前的selinux模式;
setenforce:modify the mode SELinux is running in
用于修改当前的selinux模式,立即生效,重启还原;
setenforce 0:表示permissive;
setenforce 1:表示enforcing;
也可以通过编辑配置文件:/etc/selinux/confing来永久设置selinux模式;
sestatus:SELinux status tool
显示selinux的相关信息
-b:列出当前策略包含的规则的布尔值;
selinux的策略:
selinux的三种模式会决定主体进程能否通过初步考验,接下来第二关就是targeted里面的各项规则;
相关命令:
getsebool: get SELinux boolean value(s)
查询当前策略里面规则的启动与否;
-a:显示当前系统上所有selinux规则的启动或关闭状态;
seinfo:SELinux policy query tool
显示规则统计信息;
-u:显示所有user的种类;
-r:显示所有role的种类;
-t:显示所有type的种类;
-b:显示所有规则种类;
sesearch:SELinux policy query tool
显示各项规则里详细的信息;
-A:列出所有允许读取或放行的相关数据;
-t:后面接目标类别,配合-A使用;
-s:后面接主体类别,配合-A使用;
-b:后面接selinux规则,配合-A使用;
例子:sesearch -A -b 规则名 :显示主体进程更够读取的资源类型;
[root@localhost ~]# sesearch -A -s crond_t
Found 1356 semantic av rules:
allow syslog_client_type device_t : dir { ioctl read getattr lock search open } ;
allow crond_t ftpd_exec_t : file { read getattr execute open } ;
allow crond_t admin_home_t : dir { ioctl read getattr lock search open } ;
allow crond_t admin_home_t : lnk_file { read getattr } ;
allow xserver_unconfined_type x_domain : x_resource { read write } ;
semanage:SELinux Policy Management tool
规则的解释信息。也可以添加/修改/删除selinux类型;
boolean:Manage booleans to selectively enable functionality
-l:List records of the specified object type
例子:semanage boolean -l
[root@localhost ~]# semanage boolean -l | head
SELinux boolean State Default Description
privoxy_connect_any (on , on) Allow privoxy to connect any
fcontext:SELinux Policy Management file context tool
-l:查看默认类型;
-a:添加默认类型;
-m:修改默认类型;
-d;删除默认类型;
setsebool:set SELinux boolean value
修改规则的布尔值;
setsebool [-P] [规则名称] [0|1]
-P:将设定值写入配置文件,以便永久生效;
chcon:change file SELinux security context
修改文件的selinux安全上下文;
-R:递归修改目录及其子目录;
-t:修改类型字段;
-u:修改用户字段;
-r:修改角色字段;
--reference=参考文件:使用某个文件作为参考来修改其他文件;
restorecon:restore file(s) default SELinux security contexts
恢复文件的默认安全上下文;
-R:递归恢复;
-v:显示恢复过程;
注:根据马哥视频做的学习笔记,如有错误,欢迎指正;侵删