Linux学习25-SELinux

SELinux介绍

需要掌握

启用禁用SELinux
更改标签
更改布尔值

1. 简介

SELinux: Secure Enhanced Linux, 是美国国家安全局(NSA=The National Security Agency)和SCC(Secure Computing Corporation)开发的 Linux的一个强制访问控制的安全模块。2000年以GNU GPL发布,Linux内核2.6版本后集成在内核中

  • DAC与MAC

    • 早期没有SELinux时叫
      DAC:Discretionary Access Control自由访问控制
      • DAC环境下进程是无束缚的
    • 加入SELinux后叫
      MAC:Mandatory Access Control 强制访问控制,即使是root账号也会受到一定的限制
      • MAC环境下策略的规则决定控制的严格程度
      • MAC环境下进程可以被限制的
      • 策略被用来定义被限制的进程能够使用那些资源(文件和端口)
      • 默认情况下,没有被明确允许的行为将被拒绝,例如SELinux不允许上传文件
      • 优点:配置复杂,让系统处于比较安全的状态
      • 缺点:配置复杂,与很多应用不兼容,在国内用的比较少
  • 工作流程
    Subject(比如进程)发起请求,例如读写某文件 ,需要通过中间的SELinux安全服务器,上面记录了 SELinux策略的各种数据设置(相当于规则库),根据库的规则来决定是否允许Subject的请求:

    • 如果允许,就可以根据访问权限取执行请求
    • 不允许,就会以AVC的消息发布出来,记录在日志中
  • SELinux工作类型
    targeted为默认类型,minimum和mls稳定性不足,未加以应用,strict已不再使用

    • strict: centos5以后的版本没有,每个进程都受到selinux的控制,包括未知的进程
    • targeted: 用来保护常见的网络服务,仅有限进程受到selinux控制,只监控容易被入侵的进程,centos4只保护13个服务,centos5保护88个服务。只监控系统已知的服务,会不断完善。
    • minimum:centos7,修改的targeted,只对选择的网络服务
    • mls:提供MLS(多级安全)机制的安全性
  • SELinux安全上下文(security context)

    • 概述
      1. 在传统Linux中,一切皆文件,由用户,组,权限控制访问,而在SELinux中,一切皆对象(object),由存放在inode的扩展属性域的安全元素所控制其访问
      2. 每个文件都定义了SELinux的扩展属性,这个扩展属性叫做安全上下文。所有文件和端口资源和进程都具备安全标签:安全上下文
    • 查看安全上下文

      1. 实际上下文:存放在文件系统中
        查看命令ls –Z;ps –Z
      2. 期望(默认)上下文:存放在二进制的SELinux策略库(映射目录和期望安全上下文)中,策略库严格规定了什么目录,拥有什么标签类型
        查看命令semanage fcontext –l
      3. 数据库配置文件在/etc/selinux/targeted/contexts
    • 格式
      安全上下文有五个元素组成:
      user:role:type:sensitivity:category

      1. User:指示登录系统的用户类型,进程:如system_u为系统服务进程,是受到管制的,unconfined_u为不管制的进程,用户自己开启的,如 bash
      2. Role:定义文件,进程和用户的用途:进程:system_r为系统服务进程,受到管制。unconfined_r 为不管制进程,通常都是用户自己开启的,如 bash,文件:object_r
      3. Type:指定数据类型,规则中定义何种进程类型访问何种文件Target策略基于type实现,多服务共用:public_content_t
      4. Sensitivity:限制访问的需要,由组织定义的分层安全级别,如unclassified,secret,top,secret, 一个对象有且只有一个sensitivity,分0-15级,s0最低,Target策略默认使用s0
      5. Category:对于特定组织划分不分层的分类,如FBI Secret,NSA secret, 一个对象可以有多个categroy, c0-c1023共1024个分类, Target 策略不使用category
  • SELinux策略
    定义主体读取对象的规则数据库,规则中记录了哪个类型的主体使用哪个方法读取哪一个对象是允许还是拒绝的,并且定义了哪种行为是充许或拒绝

    • 涉及的名词
      • 对象(object)
        所有可以读取的对象,包括文件、目录和进程,端口等
      • 主体(subject)
        进程称为主体
    • 安全策略实现
      • 打标签
        SELinux中对所有的文件都赋予一个type的文件类型标签,对于所有的进程也赋予各自的一个domain的标签。domain标签能够执行的操作由安全策略里定义
      • 按规则执行
        当一个subject试图访问一个object,Kernel中的策略执行服务器将检查AVC (访问矢量缓存Access Vector Cache), 在AVC中,subject和object的权限被缓存(cached),查找“应用+文件”的安全环境。然后根据查询结果允许或拒绝访问

2. 设置SELinux

  • 配置SELinux:
    1. SELinux是否启用
    2. 给文件重新打安全标签
    3. 给端口设置安全标签
    4. 设定某些操作的布尔型开关

  • 配置SELinux命令

    • 查看当前SELinux状态
      getenforce: 获取selinux当前状态
      sestatus :查看selinux状态

    • SELinux的状态:

      • enforcing: 强制,每个受限的进程都必然受限
      • permissive: 允许,每个受限的进程违规操作不会被禁止,只会警告,记录于审计日志
      • disabled: 禁用
    • 状态切换
      • permissive与enforcing切换可以使用命令setenforce 0|1
        0: 设置为permissive
        1: 设置为enforcing
      • enforcing与disable切换要修改配置文件,并重启
  • 配置文件:

    • /boot/grub/grub.conf优先级更高

      • CentOS6中/boot/grub/grub.conf
        CentOS7中/boot/grub2/grub.cfg
        CentOS6中找到,在kernel行尾添加selinux=0,禁用SELinux

        root (hd0,0)
        kernel /vmlinuz-2.6.32-754.el6.x86_64 ro root=UUID=bc5e1202-11ed-42d4-bbec-16c1d408f809 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
        

        CentOS7中找到如下行,在后面添加selinux=0禁用SELinux

         linux16 /vmlinuz-0-rescue-e2c96d58ccbf4eb796063f25db8f0029 root=UUID=f5362972-e8db-456e-b3e3-88436aa6b865 ro crashkernel=auto rhgb quiet net.ifnames=0
        
    • /etc/selinux/config
      如图中所示行,修改对应状态
      这里写图片描述

3. 修改SELinux安全标签

  • 修改全部标签
    touch /.autorelabel为所有文件重新打标签,在系统启动因为标签不对时使用
  • 文件重新打安全标签
    注意,打标签之前要知道这个文件的标签类型,不然会破坏文件,一般文档主

    • 破坏文件的标签
      方法:将文件复制出来,再复制回去

      1:#ll  -Z /var/log/messages   
      -rw-r--r--. root root  system_u:object_r_r:var_log_t:s0      /var/log/messages
      查看messages文件标签类型
      2:#cp  /var/log/messages  /root/
      将文件复制到root下
      3:ll -Z /root/messages  
      -rw-r--r--. root root unconfined_u:unconfined_r:admin_home_t:s0      /root/messages
      文件类型已经改变
      4:mv  /root/messages    /var/log/ 覆盖原文件夹文件
      -rw-r--r--. root root unconfined_u:unconfined_r:admin_home_t:s0      /root/messages
      移动回去,覆盖原有文件
      5:logger  "this ia a log" 
      触发一条日志,日志文件不做记录,说明文件已经不起作用
      6:chcon  -t  var_log_t  /var/log/messages
      重新打安全标签
      7:systenctl restart rsyslog 
      重启日志服务
      
    • 重新打安全标签:

      • 指定类型为文件修改安全标签
        • 格式
          chcon [OPTION]… [-u USER] [-r ROLE] [-t TYPE] FILE…
        • 选项
          -R:递归打标
        • 示例
          chcon -t var_log_t /var/log/messages
      • 参考其他文件来修改安全标签
        • 格式
          chcon [OPTION]… –reference=RFILE FILE…
        • 选项
          -R:递归打标
        • 示例
          参考messages文件为f1.txt文件重新打安全标签
          chcon --reference /var/log/messages /data/f1.txt
      • 恢复目录或文件默认的安全上下文:
        restorecon [-R] /path/to/somewhere

4. 默认安全上下文查询与修改

有些时候用户可能会自建服务目录,这些目录没有在默认上下策略库中,这时候就可以使用默认安全上下文修改
使用命令semanage,来自policycoreutils-python包

  • 查看默认的安全上下文
    semanage fcontext –l
  • 添加安全上下文

    1. 查看默认安全上下文相关写法作为参考

      $semanage fcontext -l|grep data
      /var/lib/stickshift/.*/data(/.*)? 
      
    2. 将目录/data改为httpd进程可访问目录
      semanage fcontext -a –t httpd_sys_content_t "/data(/.*)?"
    3. 定义了目录标签后,更改其下的文件标签,直接恢复目录的默认上下文
      restorecon –R /data
  • 删除安全上下文
    semanage fcontext -d ‘/testdir(/.*)?’

5. SElinux端口标签

定义了在SElinux策略里,各种服务可以使用的端口

  • 查看端口标签
    semanage port –l

  • 添加端口
    semanage port -a -t port_label -p tcp|udp PORT
    semanage port -a -t http_port_t -p tcp 9527

  • 删除端口
    semanage port -d -t port_label -p tcp|udp PORT
    semanage port -d -t http_port_t -p tcp 9527
  • 修改现有端口为新标签,将现在管理中的端口,更改到别的服务身上
    semanage port -m -t port_label -p tcp|udp PORT
    semanage port -m -t http_port_t -p tcp 9527
  • 示例:
例如:在http_port_t这样的标签里面再增加一个9527端口
$semanage port -l |grep http
http_port_t                    tcp      80, 81, 443, 488, 8008, 8009, 8443, 9000
$semanage port -a   -t http_port_t  -p  tcp 9527
-t  表示给服务用的标签
-p  指定使用的协议
-m  表示修改
-d  表示删除

6. SELinux布尔值

严格的限定了用户的某些行为是否被允许,值为on|off或者0|1

  • 查看bool命令:
    • 格式
      getsebool [-a] [boolean]
      getsebool -a 显示所有布尔值
      semanage boolean –l 显示所有布尔值,可以看到描述
$semanage boolean -l 
SELinux boolean         State   Default   Description 
    State 表示当前状态值 
    Default表示数据库中的策略期望值
    Description表示描述信息
  • 查看修改过的布尔值
    semanage boolean -l –C
  • 设置bool值命令
    • 格式:
      setsebool [-P] boolean value(on,off)
      setsebool [-P] Boolean=value(0,1)
    • 选项
      -P表示连同数据库一起更改,不加只修改当前
    • 示例
      setsebool -P samba_enable_home_dirs=1

7. SELinux日志管理

安装工具setroubleshoot,可以只搜索setroubleshoot来查找出错日志
yum install setroubleshoot(重启生效)

  • 筛选错误信息
    默认情况下,错误信息会写入到/var/log/message
    详细日志放在/var/log/audit/audit.log
    grep setroubleshoot /var/log/messages

    • 示例:
      在配置文件中修改端口 为9527时,错误信息
      grep 9527 /var/log/messages
  • 查看安全事件日志说明
    筛选出来的错误讯息,会有一个编号就是UUID
    sealert -l UUID

  • 扫描并分析日志
    直接查看/var/log/audit/audit.log的话,不直观,没有格式
    加上-a选项可以编排
    sealert -a /var/log/audit/audit.log

8. SELinux帮助

  1. 安装一下两个文档
    yum –y install selinux-policy-devel ( centos7.2) 开发文档
    yum –y install selinux-policy-doc man 帮助文档
  2. 安装好后,更新数据库
    mandb
  3. 将开发文档和帮助文档结合起来看
    man -k _selinux
  4. 示例:
    例如想要查看ftp的帮助文档
1:$man -k _selinux|grep ftp
    anon_sftpd_selinux (8) - Security Enhanced Linux Policy for the anon_sftpd processes
    ftpd_selinux (8)     - Security Enhanced Linux Policy for the ftpd processes
    ftpdctl_selinux (8)  - Security Enhanced Linux Policy for the ftpdctl processes
    sftpd_selinux (8)    - Security Enhanced Linux Policy for the sftpd processes
    tftpd_selinux (8)    - Security Enhanced Linux Policy for the tftpd processes
2:$man 8 ftpd_selinux

猜你喜欢

转载自blog.csdn.net/free050463/article/details/82692725