SElinux security Enhanced linux
linux
selinux这个组件将linux上自主访问策略提高成了强制访问策略
DAC----->MAC
DAC:自主访问策略,discretionary access control
MAC:强制访问策略,mandatory access control
咱们SElinux的发展:
SElinux最先诞生在1990s美国NSA,用于实现军事安全的在linux kernel 2.2 2.4的时候是之外挂组件至于linux中的而到了linux kernel 2.6时就直接作进内核,如今已近是内核的组成部分了windows
从而linux的系统安全性从C2--->B1的跃升,操做系统的安全等级有:C2,C1,B3,B1,A1咱们的以前的linux和windows都是处于C2最低的等级上面,通常咱们常说的***(其实都是被理解错了,他们是一些在某些领域很专业的人才)都是学习linux或unix的。安全
SElinux的工做:不过子啊讲selinux的工做前,我先讲讲访问策略。ide
自主访问策略:每一个用户能够随意修改文件权限,每一个文件都是有权限的限定的任何一个进程在执行的时候都是以某个用户的权限来执行的,这个权限就是这个进程的安全上下文。
例如:一个用户fedora 能够执行ls进程,这时的ls进程的安全上下文就是和咱们fedora相关的,原本在执行]#ls /tmp/test.txt这个命令时,redhat早在这个ls命令作了修改,也就是ls命令中添加访问~/.a.sh。ls就会悄悄的执行~/.a.sh这个可执行文件,这个可执行文件是由redhat建立的,并将~/.a.sh的权限设为777,ls在执行该文件的时候一看本身的安全上下文可以访问这个文件,因而就能够执行.a.sh这个脚本。若是咱们这个脚本中有一些对系统破坏的命令,咱们就惨了。一个进程发起者的身份,权限决定了一个进程能够访问那些文件,可是在事实上这个进程发起者可能拥有多余这个进程应该可以访问文件的数目,学习
强制访问策略:
仍是刚才的例子,咱们能够限制ls进程,当fedora在执行s /tmp/test.txt文件的时候,ls也就只能执行 /tmp/test.txt这个文件,这是由于,在SElinux的做用下,每个进程在执行的时候都会附加一个sandbox(沙箱),也就是说 ls /tmp/test.txt在运行的时候只能在sandbox中执行,不能跑出去,sandbox中只有/tmp/test.txt这个文件。
进程在运行的时候这有点像咱们中学英语中学的主谓宾:
Subject operation Object
fedora ls /tmp/test.txt
,只是在咱们的操做系统中用户是不能直接操做计算机的,只能经过进程,可是一旦咱们某个进程运行起来就必定是以某个用户的身份在运行的,也就必定会附有一个针对该用户的安全上下文 ,而进程可以执行object有:目录,文件描述符,文件,文件系统,链接,管道,其余进程,还有特殊文件。Subject的只能是处于活动的进程 ,operating有:追加,新建执行一些可执行文件,得到属性,进行一些IO控制,建立链接,给文件加锁,读一个文件,重命名一个文件,修改文件,解锁,等。因此强制的访问策略对处于可活动的进程能够执行的operaing 和 object已经定义好了,
这些是怎么定义的呢?
咱们执行 ]#ls -Z 能够查看一个命令在执行时的安全上下文
[root@linux ~]#ls -Z
-rw------- root root system_u:object_r:user_home_t anaconda-ks.cfg
-rw-r--r-- root root root:object_r:user_home_t boot.iso
-rw-r--r-- root root root:object_r:user_home_t class.cfg
drwxr-xr-x root root root:object_r:user_home_t Desktop
-rw-r--r-- root root root:object_r:user_home_t install.log
-rw-r--r-- root root root:object_r:user_home_t install.log.syslog
drwxr-xr-x root root root:object_r:user_home_t iso
-rw-r--r-- root root root:object_r:user_home_t memtest.sh
-rw-r--r-- root root system_u:object_r:user_home_t scsrun.log
咱们拿第一条为例,给你们简单讲讲
system_u 是SElinux用户,这个和咱们的属主root是不同的 object_r 是角色,不过这个有点像咱们的属组,权限的集合,可是又不彻底同样user_home_t 是类型,文件的类型,这是重点,就至关于给咱们的文件打了一个标签 这个标签就至关于咱们刚才提到的沙箱sandbox,咱们的Subject object都是有类型的,一般只有subject和object的类型相同的时候,才可以运行起来,但这不是绝对的。对于咱们的opera怎么定义啊,这就要提到咱们的SElinux策略了,这里的策略就是一些规则的库,是否可以访问,以及怎么访问,都作了定义。
例子:ls /tmp/test.txt
ls 的类型是 etc_t,不过对subject来讲通常叫作域,其实和类型是一个概念 /tmp/test.txt 的类型是 file_t. 当 ]#ls /tmp/test.txt 一执行 就会先到SElinux策略库中去查找,这样的类型之间可以访问吗,而且能够作出那些访问,因此在ls原本有一层安全上下文 /tmp/test.txt有属组属主权限 以外,有附加了一层类型,以及这些类型之间的访问机制。假设说我SElinux策略规定了ls在访问/tmp/test.txt时不能访问别的文件,这样ls就好像在一个沙箱中运行。 这些定义到底存在什么地方呢?通常咱们系统的一些默认定义式存在于/etc/selinux/policy.21,这里存放了什么域可以访问什么类型,以及是怎么访问的。不过是一个2进制的文件,这样是为了加速访问的过程。spa
selinux 有两种访问策略
strict(严格的,每个进程都定义)
targeted(只对一些关键的作出定义,像http ftp nfs等)
咱们的redhat使用的是target的模型. target策略下,被定义的进程有标签(域,或类型),没有被定义的进程叫作未定义类型
]#ps auxZ
LABEL USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
system_u:system_r:init_t root 1 0.0 0.1 2072 620 ? Ss 20:42 0:01 init [3]
system_u:system_r:kernel_t root 2 0.0 0.0 0 0 ? S< 20:42 0:00 [migration/0]
system_u:system_r:kernel_t root 3 0.0 0.0 0 0 ? SN 20:42 0:00 [ksoftirqd/0]
system_u:system_r:kernel_t root 4 0.0 0.0 0 0 ? S< 20:42 0:00 [watchdog/0]
system_u:system_r:kernel_t root 5 0.0 0.0 0 0 ? S< 20:42 0:00 [events/0]
system_u:system_r:kernel_t root 6 0.0 0.0 0 0 ? S< 20:42 0:00 [khelper]
system_u:system_r:kernel_t root 7 0.0 0.0 0 0 ? S< 20:42 0:00 [kthread]
system_u:system_r:kernel_t root 10 0.0 0.0 0 0 ? S< 20:42 0:00 [kblockd/0]操作系统
被定义的进程都是有标签的 LABEL 这些标签订义了各类各样的类型,这些类型是selinux开发人员指定的,而咱们只要学会用就好了,假如ls /tmp/test.txt,中ls的域(类型)是etc_t 而/tmp/test.txt 是file_t类型,同时在selinux策略中没有定义这两种类型可以相互访问,咱们就只须要将/tmp/test.txt 的类型改成etc_t的就好了。
不过到这里我还想给你们讲一点,仍是上面的ls /tmp/test.txt的例子,在咱们的selinux中定义 域和类型之间的访问策略,不过还定义了一个boolean类型的变量,这个变量可以决定咱们selinux中不一样类型、域之间访问策略的开启或关闭功能,因此咱们能够修改boolean值来修改类型之间的访问策略,不过定义的这些boolean不少
getsebool -a 来查看全部开启、关闭的策略
咱们拿vsftpd来给你们演示
]#getsebool -a | grep ftp
allow_ftpd_anon_write --> off
allow_ftpd_full_access --> off
allow_ftpd_use_cifs --> off
allow_ftpd_use_nfs --> off
allow_tftp_anon_write --> off
ftp_home_dir --> off
ftpd_connect_db --> off
ftpd_disable_trans --> off
ftpd_is_daemon --> on
httpd_enable_ftp_server --> off
tftpd_disable_trans --> off
]#
]#getenfroce 查看咱们的selinux的功能是否启用了,这个值有三个:permissive(记录你的违反行为,存放在/var/log/audit/audit.log中,
不过这个文件是个二进制的文件),disabled(禁用),enforcing(强制执行selinux的策略)
]#setenforce 1(enforcing)|0(permissive) 不过这样的修改是临时性的,要想永久的保留修改,咱们就要修改/etc/selinux/config这个
文件中的值,不过有时候你会看到有些人使修改/etc/sysconfig/selinux这个文件,其实这两个文件是同样的。
/etc/selinux/config 中还定义了咱们linux的模式,是strict,仍是target模式。
其实咱们也能够经过向内核参数传递的方式,来修改咱们的selinux,方法一:在开机的时候,在内核的内一行中写入selinux=0|1,或在
咱们的/boot/grub/grub.conf文件中内核的那一行中写入selinux=0|1的方式。
]#setsebool allow_ftpd_anon_write on | off | 1 | 0 来修改策略师开启仍是关闭,不过这种修改也是临时有效的,若是想要永久有效
咱们就要用 ]#setsebool -p allow_ftpd_anon_write on | off | 1|0
因此咱们所selinux管理员的工做基本上就是:指定strict或target的形式,修改文件的标签,修改一下boolean值,等!unix