SELinux详解(1)

来源:互联网 发布:酱紫是什么网络用语 编辑:程序博客网 时间:2024/06/09 14:47

#一.常见的读取控制机制

1.DAC(Discretionary Access Control ):任意读取控制

    在此机制下,每一个对像都会记录一个拥有者的信息,只要是对象的拥有者,就可以获得对该对象的完全控制。

传统的UNIX系统提供的安全机制就是DAC思维。


2.MAC(Mandatory Access Control):强制读取控制

  在MAC机制下,会为每一个对象增添一个‘安全脉络’的信息,进程或用户除了具备传统权限外,还必须得到授权,方能

读取指定的对象。在MAC机制下包括:RBAC,MLS

  RBAC(Role-based Access Control):基于角色的读取控制,这有点像数据库的角色。

  MLS(Multi-level Security):多层次的安全,以数据内容的精密性和敏感性定义不同级别。比如在国家机密中,有普通,机密,绝对机密等。


#二.SELinux与chroot的对比

    SELinux提供了类似chroot的效果:都只能读取指定空间的对象,非该空间的对象不可读取。

但SELinux明显优于chroot。因为chroot只能用来修改进程的根目录,无法限制进程的其它能力,而SELinux除了可以控制读取文件外,

还可以限制对其它设备的读取能力,提供更加细微的读取控制。而且SELinux是在传统的DAC之后执行的,也就是说要想读取必须过两道关。


#三.SELinux初始化

 当BootLoader加载内核后,启动init,init会执行下列操作

(1)init会先挂载procfs,然后寻找Linux内核是否提供selinuxfs文件系统,如果是,则表示目前Linux内核支持SELinux的功能。如果不支持,进行其它初始化计划
(2)init根据/etc/sysconfig/selinux 中的SELINUX参数或selinux内核启动参数,来决定是否启用SELinux。如果SELinux参数是disabled,则init服务会跳过初始化SELinux
(3)如果需要启动,则init会将SELinux状态设置为permissive。接着会根据/etc/sysconfig/selinux 的SELINUX的参数或enforcing这个内核启动参数来决定是否要切换为强制模式。如果enforcing的值不为0或SELINUX参数定义为enforcing,则切换为强制模式
(4)完成上述后,init会把selinuxfs文件系统挂载到/selinux/目录
     这里可以验证:如果将SELinux禁止后,则/selinux目录中什么也没有,如果启用,则有内容
(5)接着,init加载SELinux安全原则文件  init会根据/etc/sysconfig/selinux 中的SELINUXTYPE=TYPE参数决定要加载哪一个SELinux安全原则,并查询/selinux/policyvers的内容(即版本号),载入某一个版本的selinux安全原则文件->>>即 /etc/selinux/TYPE/policy.VERSION如我的SELINUXTYPE为targeted,/selinux/policyvers中内容为21,则SELINUX加载的安全文件为:/etc/selinux/targeted/policy/policy.21 
(6)加载完安全原则文件后,则根据/etc/selinux/TYPE/contexts的相关文件设置安全脉络。这样Linux内核就可以从内核内部的安全服务器取得所有主体,对象的安全脉络。
如果有需要,init会重新修改自己的安全脉络。

到此,已成功建立SELinux环境。


#四.切换SELinux状态

     SELinux有两种模式:强制模式(Enforcement Mode)->>只要违反规则就强制读取     允许模式(Permissive Mode)->>即使违反还是允许读取

需要注意的是,切换启用与停用状态,必须要重新开机;启用之后修改强制和允许模式时,不需要重新开机就可切换模式。

1.查看SELinux状态

    sestatus  [-v]      #-v显示详细信息

2.启用与停用SELinux

  (1)通过内核启动参数

boot: linux  selinux=N   #N为0代表停用,非0代表启用
还可以修改grub.conf永久保存,如下:

kernel /vmlinuz-2.6.18-164.el5 ro root=LABEL=/  selinux=N

 (2)修改配置文件/etc/sysconfig/selinux

SELINUX=enforcing  #disabled->>停用  enforcing->> 强制  permissive->> 允许SELINUXTYPE=targeted  #targeted->> 基于目标策略   strict->>提供符合RBAC机制的策略   mls->>提供符合MLS机制的策略

(3)getenforce,setenforce获取和设置当前模式

root@localhost ~]# getenforce    #获取执行模式Enforcing[root@localhost ~]# setenforce 0    #0或permissive->>允许   1或enforcing->>强制[root@localhost ~]# getenforce Permissive[root@localhost ~]# setenforce enforcing[root@localhost ~]# getenforce Enforcing

#五.管理安全脉络

SELinux定义的安全脉络:USER:ROLE:TYPE[LEVEL[:CATEGORY]]

USER:用来记录身份,如system_u->>系统用户 user_u->>普通用户 root->>超级用户

            不过在targeted策略中还不支持user字段,即user字段对targeted策略没意义

ROLE:使用基于RBAC的strict和mls策略中,用来存储角色信息,如user_r->>用户角色   object_r->>文件或设备等对象

TYOPE:定义对象的类别

LEVEL和CATEGORY:定义层次和分类,只用于mls策略中

           LEVEL:代表安全等级,目前已经定义的安全等级为s0-s15,等级越来越高

           CATEGORY:代表分类,目前已经定义的分类为c0-c1023

又是会看到查看SELinux安全脉络时,会看到SystemLow-SystemHigh,这什么意思?

[root@localhost ~]# semanage translation -lLevel                     Translations0                        s0-s0:c0.c1023            SystemLow-SystemHighs0:c0.c1023               SystemHigh
即s0 ->>显示为空字符串

    s0-s0:c0.c1023->>显示为SystemLow-SystemHigh 
    s0:c0.c1023->>显示为SystemHigh

#六.SELinux安全脉络默认值

有没有想过当我又开了一个VI,那么Vi这个进程的安全脉络是什么呢?当我用RPM包新安装软件时,安全脉络又是什么呢??

1.进程默认安全脉络

在REEL中,通过PAM子系统的pam_selinux.so模块设置进程的安全脉络,子进程会继承父进程的安全脉络,除非子进程需要修改安全脉络

2.文件默认安全脉络

如果是安装RPM包所产生的文件->>每一个RPM包都会记录提供的每一个文件的安全脉络

手动新建的文件->>RHEL会将安全原则中定义的安全脉络作为新建文件的安全脉络

      如在targeted策略中,每个目录都有默认的安全脉络,如/etc目录下为etc_t,  /mnt目录下为mnt_t等

      这里特别注意:cp过来的文件为使用目录下的默认安全脉络,而mv则会保留自己原来的安全脉络。

[root@localhost ~]# cd /mnt[root@localhost mnt]# ls -Zdrwxr-xr-x  root root system_u:object_r:mnt_t          mysdb1                       #/mnt目录下为mnt_t[root@localhost mnt]# ls -Z /etc/passwd-rw-r--r--  root root system_u:object_r:etc_t          /etc/passw                   #/etc/passwd为etc_t[root@localhost mnt]# cp /etc/passwd .                                              #将/etc/passwd复制到/mnt目录下[root@localhost mnt]# ls -Z /root/write_image.c                                     #/root/write_image.c为user_home_t  -rw-r--r--  root root root:object_r:user_home_t        /root/write_image.c   [root@localhost mnt]# mv /root/write_image.c .                                      #将/root/write_image.c移动到/mnt目录下[root@localhost mnt]# ls -Z                                                         #体会cp和mv的区别drwxr-xr-x  root root system_u:object_r:mnt_t          mysdb1                          -rw-r--r--  root root root:object_r:mnt_t              passwd-rw-r--r--  root root root:object_r:user_home_t        write_image.c

3.如何查看对象安全脉络

id -Z   #查看用户

ls -Z   #查看文件

ps -Z  #查看进程

  

#七:修改安全脉络

[root@localhost ~]# ls -Z cs-rw-r--r--  root root root:object_r:user_home_t        cs[root@localhost ~]# chcon -u system_u cs[root@localhost ~]# ls -Z cs-rw-r--r--  root root system_u:object_r:user_home_t    cs

参数:  

-R  递归   -r  角色配置    -t  类型配置     -u  用户配置

chcon test --reference=cs   #让test的安全脉络设置和cs一样


八:修复安全脉络

##1.查看默认的安全脉络

[root@localhost ~]# matchpathcon /etc/passwd      #查看默认安全脉络/etc/passwd     system_u:object_r:etc_t[root@localhost ~]# matchpathcon /etc/passwd -V   #验证是否符合/etc/passwd verified.
##2.修复安全脉络

fixfiles  ->依据RPM包中的设置来修复文件的安全脉络

restorecon ->修复自建的安全脉络

restorecon 文件名  


九:重新产生安全脉络

RedHat在开机时会检查是否有/.autorelabel,如果有则会利用fixfiles重新产生系统重要文件的安全脉络(前提示启用SElinux)

所以要重新产生安全脉络需要

(1)产生空的/.autorelabel

(2)重启

开机时会出现: