SELinux简介

来源:互联网 发布:苹果内存清理软件 编辑:程序博客网 时间:2024/05/01 14:13

 1. 简介

      SELinux(Security-Enhanced Linux) 是美国国家安全局「NSA=The National Security Agency」 和SCC(Secure Computing Corporation)开发的 Linux的一个扩张强制访问控制(MAC)安全模块,是 Linux® 上最杰出的新安全子系统。NSA是在Linux社区的帮助下开发了一种访问控制体系,在这种访问控制体系的限制下,进程只能访问那些在他的任务中所需要文件

      SELinux是一种基于 域-类型 模型(domain-type)的强制访问控制(MAC)安全系统,它由NSA编写并设计成内核模块包含到内核中,相应的某些安全相关的应用也被打了SELinux的补丁,最后还有一个相应的安全策略。

     众所周知,标准的UNIX安全模型是"任意的访问控制"DAC。就是说,任何程序对其资源享有完全的控制权。假设某个程序打算把含有潜在重要信息的文件扔到/tmp目录下,那么在DAC情况下没人能阻止他!

     而MAC情况下的安全策略完全控制着对所有资源的访问。这是MAC和DAC本质的区别。

     SELinux提供了比传统的UNIX权限更好的访问控制。

2. 基本概念

2.1 主体

      通常指用户,或代表用户意图运行进程或设备。主体是访问操作的主动发起者,它是系统中信息流的启动者,可以使信息流在实体之间流动。

2.2 客体

      通常是指信息的载体或从其他主体或客体接收信息的实体。
      主体有时也会成为访问或受控的对象,如一个主体可以向另一个主体授权,一个进程可能控制几个子进程等情况,这时受控的主体或子进程也是一种客体。

2.3 访问控制分类

      客体不受它们所依存的系统的限制,可以包括记录、数据块、存储页、存储段、文件、目录、目录树、库表、邮箱、消息、程序等,还可以包括比特位、字节、字、字段、变量、处理器、通信信道、时钟、网络结点等。

2.3.1 自主访问控制DAC

      管理的方式不同就形成不同的访问控制方式。一种方式是由客体的属主对自己的客体进行管理,由属主自己决定是否将自己客体的访问权或部分访问权授予其他主体,这种控制方式是自主的,我们把它称为自主访问控制(Discretionary Access Control——DAC)。在自主访问控制下,一个用户可以自主选择哪些用户可以共享他的文件。Linux系统中有两种自主访问控制策略,一种是9位权限码(User-Group-Other),另一种是访问控制列表ACL(Access Control List)。

2.3.2  强制访问控制MAC

      强制访问控制(Mandatory Access Control——MAC),用于将系统中的信息分密级和类进行管理,以保证每个用户只能访问到那些被标明可以由他访问的信息的一种访问约束机制。通俗的来说,在强制访问控制下,用户(或其他主体)与文件(或其他客体)都被标记了固定的安全属性(如安全级、访问权限等),在每次访问发生时,系统检测安全属性以便确定一个用户是否有权访问该文件。其中多级安全(MultiLevel Secure, MLS)就是一种强制访问控制策略。

3. 控制切换

    Fedora core 5 里的/etc/sysconfig/selinux标准设置如下:

[cpp] view plain copy
  1. # This file controls the state of SELinux on the system.  
  2. # SELINUX= can take one of these three values:  
  3. # enforcing - SELinux security policy is enforced.  
  4. # permissive - SELinux prints warnings instead of enforcing.  
  5. # disabled - SELinux is fully disabled.  
  6. SELINUX=enforcing  
  7.   
  8. # SELINUX=disabled  
  9. # SELINUXTYPE= type of policy in use. Possible values are:  
  10. # targeted - Only targeted network daemons are protected.  
  11. # strict - Full SELinux protection.  
  12. SELINUXTYPE=targeted  


3.1 SELINUX

      SELINUX 有【disabled】、【permissive】、【enforcing】3种选择。

      • disabled:不启用SELINUX功能

      • permissive:SELINUX有效,但是即使你违反了策略,它让你继续操作,但是把你的违反的内容记录下来。在我们开发策略的时候非常的有用。相当于Debug模式。

      • enforcing:当你违反了策略,你就无法继续操作下去。

3.2 SELINUXTYPE

      目前主要有2大类,【targeted】和【strict】。

      • targeted:它是红帽子开发的targeted,它只是对于主要的网络服务进行保护,比如apache, sendmail, bind, postgresql等,不属于那些domain的就都让他们在unconfined_t里,可导入性高,可用性好但是不能对整个系统进行保护。

      • strict:是由NAS开发的,能对整个系统进行保护,但是设定复杂,但是只要掌握一些基本的知识,还是可以玩得动的。

     我们除了在/etc/sysconfig/selinux设它有效无效外,在启动的时候,也可以通过传递参数selinux给内核来控制它。(Fedora 5默认是有效)

3.3 对文件系统赋予标签

[cpp] view plain copy
  1. [root@python sysconfig]# /usr/sbin/getenforce  
  2. Enforcing  
  3. #确认有效后重新对文件系统赋予标签:  
  4. [root@python sysconfig]# /sbin/fixfiles relabel  
  5. #或者  
  6. [root@python /]# touch /.autorelabel  
  7. #然后 reboot,你就在secure的Linux环境下工作了。  

4. 基本操作

    SELinux是个经过安全强化的Linux操作系统,实际上,基本上原来的运用软件没有必要修改就能在它上面运行。真正做了特别修改的RPM包只有50 多个。像文件系统EXT3都经过了扩展。对于一些原有的命令也进行了扩展,另外还增加了一些新的命令,接下来我们就来看看这些命令。

4.1 文件操作

4.1.1  ls命令

         在命令后加个 -Z 或者加 -context

[cpp] view plain copy
  1. [root@python azureus]# ls -Z  
  2. -rwxr-xr-x fu fu user_u:object_r:user_home_t azureus  
  3. -rw-r--r-- fu fu user_u:object_r:user_home_t Azureus2.jar  
  4. -rw-r--r-- fu fu user_u:object_r:user_home_t Azureus.png  

4.1.2 chcon

        更改文件的标签

[cpp] view plain copy
  1. [root@python tmp]# ls --context test.txt  
  2. -rw-r--r-- root root root:object_r:staff_tmp_t test.txt  
  3.   
  4. [root@python tmp]# chcon -t etc_t test.txt  
  5.   
  6. [root@python tmp]# ls -lZ test.txt  
  7. -rw-r--r-- root root root:object_r:etc_t test.txt  

4.1.3 restorecon

        当这个文件在策略里有定义时,可以恢复原来的 文件标签。

4.1.4 setfiles

        跟chcon一样可以更改一部分文件的标签,不需要对整个文件系统重新设定标签。

4.1.5 fixfiles

         一般是对整个文件系统的, 后面一般跟 relabel,对整个系统 relabel后,一般我们都重新启动。如果,在根目录下有.autorelabel空文件的话,每次重新启动时都调用 fixfiles relabel

4.1.6 star

        就是tar在SELinux下的互换命令,能把文件的标签也一起备份起来。

4.1.7 cp

        可以跟 -Z,--context=CONTEXT 在拷贝的时候指定目的地文件的security context

4.1.8 find

        可以跟 –context 查特定的type的文件。例子如下:

[cpp] view plain copy
  1. find /home/fu/ --context fu:fu_r:amule_t -exec ls -Z {} \:  

4.1.9 run_init

         在sysadm_t里手动启动一些如Apache之类的程序,也可以让它正常进行,domain迁移。

4.2 进程domain的确认

      程序现在在那个domain里运行,我们可以在ps 命令后加 -Z进行查看:

[cpp] view plain copy
  1. [root@python /]# ps -eZ  
  2.     LABEL                 PID TTY TIME CMD  
  3. system_u:system_r:init_t   1  00:00:00 init  
  4. system_u:system_r:kernel_t 2  00:00:00 ksoftirqd/0  
  5. system_u:system_r:kernel_t 3  00:00:00 watchdog/0  

4.3 ROLE的确认和变更

     命令id能用来确认自己的 security context。

[cpp] view plain copy
  1. [root@python ~]# id  
  2. uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) context=root:staff_r:staff_t  
         这里,虽然是root用户,但也只是在一般的ROLE在staff_t里运行,如果在enforcing模式下,这时的root对于系统管理工作来说,是什么也干不了。
[cpp] view plain copy
  1. [root@python ~]# newrole -r sysadm_r  
  2. Authenticating root.  
  3. 口令:  
  4. [root@python ~]# id  
  5. uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) context=root:sysadm_r:sysadm_t  

4.4 模式切换

4.4.1 getenforce

       得到当前的SELINUX值。

[cpp] view plain copy
  1. [root@python bin]# getenforce  
  2. Permissive  

4.4.2 setenforce

        更改当前的SELINUX值 ,后面可以跟 enforcing,permissive 或者 1,0。

[cpp] view plain copy
  1. [root@python bin]# setenforce permissive  

4.4.3 sestatus

        显示当前的 SELinux的信息。
[cpp] view plain copy
  1. [root@python bin]# sestatus -v  
  2. SELinux status: enabled  
  3. SELinuxfs mount: /selinux  
  4. Current mode: permissive  
  5. Mode from config file: permissive  
  6. Policy version: 20  
  7. Policy from config file: refpolicy  
  8. Process contexts:  
  9. Current context: user_u:user_r:user_t  
  10. Init context: system_u:system_r:init_t  
  11. /sbin/mingetty system_u:system_r:getty_t  
  12. /usr/sbin/sshd system_u:system_r:sshd_t  
  13. File contexts:  
  14. Controlling term: user_u:object_r:user_devpts_t  
  15. /etc/passwd system_u:object_r:etc_t  
  16. /etc/shadow system_u:object_r:shadow_t  
  17. /bin/bash system_u:object_r:shell_exec_t  
  18. /bin/login system_u:object_r:login_exec_t  
  19. /bin/sh system_u:object_r:bin_t -> system_u:object_r:shell_exec_t  
  20. /sbin/agetty system_u:object_r:getty_exec_t  
  21. /sbin/init system_u:object_r:init_exec_t  
  22. /sbin/mingetty system_u:object_r:getty_exec_t  

4.5 其他重要命令

4.5.1 audit2allow

        很重要的一个以python写的命令,主要用来处理日志,把日志中的违反策略的动作的记录,转换成 access vector,对开发安全策略非常有用。在refpolicy里,它的功能比以前有了很大的扩展。

[cpp] view plain copy
  1. [root@python log]# cat dmesg | audit2allow -m local > local.te  

4.5.2 checkmodule

         编译模块。

[cpp] view plain copy
  1. [root@python log]# checkmodule -m -o local.mod local.te  
  2. checkmodule: loading policy configuration from local.te  
  3. checkmodule: policy configuration loaded  
  4. checkmodule: writing binary representation (version 5) to local.mod  

4.5.3 semodule_package

         创建新的模块。
[cpp] view plain copy
  1. [root@python log]# semodule_package -o local.pp -m local.mod  

4.5.4 semodule

可以显示、加载、删除模块,加载的例子:
[cpp] view plain copy
  1. [root@python log]# semodule -i local.pp  

4.5.5 semanage

        这是一个功能强大的策略管理工具,有了它即使没有策略的源代码,也是可以管理安全策略的。因为本文主要是介绍用源代码来修改策略的,详细用法大家可以参考它的man页。

5. 定制策略

    FC4,RHEL4等都是采用策略1.X版本的,并且是提供策略源代码的RPM包。从FC5开始策略的版本从1.X 升级到2.X。2.X版本的refpolicy(reference policy)最大的一个变化就是引进模块(module)这个概念,同一套策略源代码就可以支持Multi-LevelSecurity(MLS)和non-MLS。

    标准的FC5里不提供源代码的RPM包。FC5提供的audit2allow,semanage,semodule也是可以开发一些简单的策略模块的。但是,要是做策略模块的开发,增加一个ROLE之类的,最好还是下载refpolicy的源代码。

5.1 策略源文件的安装

      从CVS服务器下载的源代码是最新的,如果make时出错,最好把你系统里和SELinux有关的那些包更新到最新的状态。
      每一个模块有3个文件构成,比如上图的sudo.fc 就是和 命令sudo相关的文件的定义标签,(file context rabel),sudo.te是Type Enforcement定义,包括TE访问规则等,sudo.if是一个外部模块调用这个模块的接口定义。

5.2 给程序定制domain

     开发程序策略的一般步骤
     1) 给文件,端口之类的object赋予type 标签
     2) 设置 Type Enforcement (Domain 迁移,访问许可)
     3) 策略加载
     4) permissive模式下运行程序
     5) 确认日志,用audit2allow生成访问许可
     6) 重复1-5动作,直到没有违反的日志出现
     7) 切换到enforcing模式,正式运用

     因为我们所常用的那些服务的策略模块都已经有了,修改的时候也比较简单。在这里我就举个一般的例子。用点对点下载的朋友估计都跟我一样,在Linux上用 azureus,Amule来下载东西吧。

    接下来以azureus为例,介召如何在FC5里追加一个azureus.pp模块。我们在追加azureus.pp模块之前,azureus是在系统给用户设好的user_t domain里运行。

[cpp] view plain copy
  1. [fu@python azureus]$ ps -efZ|grep azureus  
  2. user_u:user_r:user_t fu 1751 1732 0 22:28 pts/3 00:00:00 /bin/bash ./azureus  
     接下来我们在追加3个文件。
1) azureus.fc
     在这里我只定义一个文件,实际要是真的用的,还要定义azureus_t能写的目录等。

[cpp] view plain copy
  1. [root@python apps]# more azureus.fc  
  2. /home/fu/azureus -- gen_context(user_u:object_r:azureus_exec_t,s0)  
2) azureus.te
[cpp] view plain copy
  1. [root@python apps]# more azureus.te  
  2. policy_module(azureus,1.0.0)  
  3. type azureus_t;  
  4. type azureus_exec_t;  
  5. role user_r types azureus_t;  
  6. require {  
  7. type user_t;  
  8. };  
  9. domain_type(azureus_t)  
  10. domain_entry_file(azureus_t,azureus_exec_t)  
  11. domain_auto_trans(user_t,azureus_exec_t,azureus_t)  
3) azureus.if
实际上没有别的模块要调用azureus,所以这个文件就是空文件也不要紧。

[cpp] view plain copy
  1. [root@python apps]# more azureus.if  
  2. # policy/modules/apps/azureus.if  
  3. ## Myapp example policy  
  4. ##  
  5. ## Execute a domain transition to run azureus.  
  6. ##  
  7. ##  
0 0
原创粉丝点击