SElinux security Enhanced 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时就直接做进内核,现在已近是内核的组成部分了
从而linux的系统安全性从C2--->B1的跃升,操作系统的安全等级有:C2,C1,B3,B1,A1我们的之前的linux和windows都是处于C2最低的等级上面,一般我们常说的黑客(其实都是被理解错了,他们是一些在某些领域很专业的人才)都是学习linux或unix的。
SElinux的工作:不过子啊讲selinux的工作前,我先讲讲访问策略。
自主访问策略:每个用户可以随意修改文件权限,每个文件都是有权限的限定的任何一个进程在执行的时候都是以某个用户的权限来执行的,这个权限就是这个进程的安全上下文。
例如:一个用户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进制的文件,这样是为了加速访问的过程。
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值,等!