• 【Linux集群教程】13 集群安全防御 - SELinux 功能


    3 SELinux

    3.1 SELinux 前世今生

    系统安全评级:D(安全性最低) < C1 < C2 < B1 < B2 < B3 < A1(安全性最高)。

    Linux 安全性与 Windows 在不开启防御措施时一致,系统安全评级为 C2 级别。创造者:美国国家安全局(National Security Agency,简写为 NSA)。

    安全增强型 Linux(Security-Enhanced Linux)简称 SELinux,它是一个 Linux 内核模块,也是 Linux 的一个安全子系统。

    SELinux 主要由美国国家安全局开发。2.6 及以上版本的 Linux 内核都已经集成了 SELinux 模块。

    SELinux 的结构及配置非常复杂,而且有大量概念性的东西,要学精难度较大。很多 Linux 系统管理员嫌麻烦都把 SELinux 关闭了。

    如果可以熟练掌握 SELinux 并正确运用,我觉得整个系统基本上可以到达"坚不可摧"的地步了(请永远记住没有绝对的安全)。掌握 SELinux 的基本概念以及简单的配置方法是每个 Linux 系统管理员的必修课。

    SELinux 是 2.6 版本的 Linux 内核中提供的强制访问控制 (MAC)系统。对于目前可用的 Linux 安全模块来说,SELinux 是功能最全面,而且测试最充分的,它是在 20 年的 MAC 研究基础上建立的。SELinux 在类型强制服务器中合并了多级安全性或一种可选的多类策略,并采用了基于角色的访问控制概念。

    大部分使用 SELinux 的人使用的都是 SELinux 就绪的发行版,例如 Fedora、Red Hat Enterprise Linux (RHEL)、Debian 或 Gentoo。它们都是在内核中启用 SELinux 的,并且提供一个可定制的安全策略,还提供很多用户层的库和工具,它们都可以使用 SELinux 的功能。

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

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

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

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

    Linux 的安全性

    《关于UNIX的安全》“首先要面对的事实是,UNIX的开发者并没有考虑安全问题,单单这一点就会引发大量的漏洞。”——Dennis Ritchie。

    Linux 的护城河

    iptables;SELinux;ACL;Tcp Wrappers(简单防火墙)。

    SELinux 评价:现今为止人类能够找到的最安全的软件之一,当然配置也较为复杂。

    3.1.1 SELinux 实现模型(强制访问控制)

    img

    有这么一套规则体系,当主体访问客体的时候必须要经过规则库,并且是实现防篡改,无旁路,可验证的特性。

    在传统的操作系统下,使用的任意访问控制,只要满足 rwx 权限对应的关系就可以做对应的事情,即满足 r 可读,w 可写,x 可执行。当开启了强制访问控制,当权限即使是 777 也不行,需要经过规则库的判断,判断主体和客体之间是否有关系。

    • 防篡改:即当访问不了的时候,管理员就修改规则库的配置,是不允许的;
    • 无旁路:即经过这个规则库不允许访问,管理员就跳过规则库的匹配,直接访问,同样也是不允许的;
    • 可验证:即留下对应的日志数据记录。

    3.1.2 SELinux 在Linux中的地位变化(经历过程)

    • 2.2 需要手动加载的一个外部模块
    • 2.4 直接写到内核的一个模块
    • 2.6 成为了一部分 Linux 发行版的内核的一部分

    特性: 提高了 Linux 系统内部的安全等级,对于进程和用户只赋予最小权限,并且防止了权限升级, 即使受到攻击,进程或者用户权限被夺去,也不会对整个系统造成重大影响

    3.1.3 SELinux 原理

    SELinux 原理

    img

    PROCESS TYPES 进程类型;OBJECT TYPES 对象类型;

    SELinux 原理 - 类型强制

    img

    顾名思义,当DOG要吃 CAT_CHOW 这个时候 KERNEL 内核就会将其拒绝。反之,CAT 要吃 DOG_CHOW 的时候KERNEL 内核就会将其拒绝。也就是主体 和 客体之间是存在一定的联系的。

    SELinux 原理 - MCS 多类型强制

    img

    小总结:

    Linux 的安全性不比 Windows 高,Linux 的提高安全性工具:IPtables,TCP wrappers,ACL,SElinux。SElinux 则是通过主体,客体,规则库进行匹配。

    3.2 安全上下文

    3.2.1 安全上下文的定义

    SELinux 是一套基于令牌的访问控制。SELinux 中的主体要想访问客体,必须要使用令牌,令牌匹配成功时候才能允许访问,而令牌匹配不成功那么就不允许访问。在 SELinux 中令牌,是叫做安全上下文。

    所有操作系统访问控制都是以关联的客体和主体的某种类型的访问控制属性为基础的。在SELinux中, 访问控制属性叫做安全上下文。所有客体(文件、进程间通讯通道、套接字、网络主机等,资源)和主体(进程,要求资源)都有与其关联的安全上下文,一个安全上下文由三部分组成:用户、角色和类型标识符。常常用下面的格式指定或显示安全上下文:

    用户:角色:类型
    # 只要在传统Linux里只要类型一致即可,用户和角色是可以不考虑的
    
    • 1
    • 2

    3.2.2 相关配置命令

    开启SELinux 功能

    $ vim /etc/selinux/config
    
    # This file controls the state of SELinux on the system.
    # SELINUX= can take one of these three values:
    #     enforcing - SELinux security policy is enforced.
    # enforce - SELinux安全策略强制执行。
    #     permissive - SELinux prints warnings instead of enforcing.
    # permissive - SELinux打印警告而不是强制。
    #     disabled - No SELinux policy is loaded.
    # disabled — 没有加载SELinux策略。
    #开启SELinux功能
    SELINUX=enforcing
    # SELINUXTYPE= can take one of three values:
    #     targeted - Targeted processes are protected, 
    # 有针对性的进程受到保护。
    #     minimum - Modification of targeted policy. Only selected processes are protected. 
    # 修改有针对性的策略。只有选定的进程受到保护。
    #     mls - Multi Level Security protection.       
    # 多级安全保护。
    #SELinux的类型
    SELINUXTYPE=targeted
    
    $ getenforce 
    Enforcing
    
    #临时的关闭和开启SELinux功能
    $ setenforce 0 #关闭
    $ setenforce 1 #开启
    
    #开启Httpd服务
    $ yum install -y httpd && systemctl enable --now httpd
    #编写一个网站并进行访问
    $ echo "This is the apache server" > /var/www/html/index.html
    $ curl 127.0.0.1
    This is the apache server
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    主机通过浏览器访问

    img

    $ mkdir -pv /www
    $ vim /etc/httpd/conf/httpd.conf
    #修改为新的目录
    DocumentRoot "/www"
    #修改为新的目录
    <Directory "/www">
        Options Indexes FollowSymLinks
    
        AllowOverride None
    
        Require all granted
    </Directory>
    
    #重启服务
    $ systemctl restart httpd
    $ echo "This is Server 123" > /www/index.html
    $ chmod -R 777 /www/
    $ ls -l /www/
    total 4
    -rwxrwxrwx. 1 root root 19 Sep  4 14:34 index.html
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    主机通过浏览器访问

    img

    将Apache Server 的SELinux 功能关闭

    setenforce 0
    
    • 1

    img

    将Apache Server 的SELinux 功能开启并查看SELinux

    #原ApacheServer的网页目录
    $ ls -lZ /var/www/html/
    -rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 index.html
    #用户:角色:类型:系统分配的等级(不需要管理员管理)
    
    $ ls -lZ /www/
    -rwxrwxrwx. root root unconfined_u:object_r:default_t:s0 index.html
    #发现类型是不一致的
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    3.2.2.1 更改 SELinux 的用户角色类型
    #修改类型
    chcon [-R] [-t type] [-u user] [-r role] 文件 
    	-R :连同该目录下的次目录也同时修改; 
    	-t :后面接安全性本文的类型字段! 
    	-u :后面接身份识别,例如 system_u;
    	-r :后面接角色,例如 system_r;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    范例:

    # -R:递归
    $ chcon -t httpd_sys_content_t -R /www/
    $ ls -lZ /www/
    -rwxrwxrwx. root root unconfined_u:object_r:httpd_sys_content_t:s0 index.html
    $ setenforce 1
    $ getenforce
    Enforcing
    
    ## 在SELinux 用户,角色,类型中管理员需要在应用程序的官方说明文档中有展现
    ## 或者在 SELinux 官方文档中查找。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    客户端可以正常访问

    img

    在大部分环境(生产环境)中都不会开启 SELinux 的强制访问控制功能。

    当开启 SELinux 功能的环境中,当网站需要上传文件,那么就会出现上传文件的SELinux类型和系统的SELinux类型不匹配,从而造成不能使用的情况。或许有管理员会想写一个定时任务跑脚本递归该目录下的文件,修改其SELinux的类型,但这样会严重损耗机器的资源性能。所以在环境中一般不会开启该功能。

    3.2.2.2 还原 SELinux 用户角色类型
    restorecon 还原成原有的 SELinux type 
    格式:restorecon [-Rv] 档案或目录 
    		-R :连同次目录一起修改; 
    		-v :将过程显示到屏幕上
    
    • 1
    • 2
    • 3
    • 4

    范例:

    $ restorecon -Rv /www/
    restorecon reset /www context unconfined_u:object_r:httpd_sys_content_t:s0->unconfined_u:object_r:default_t:s0
    restorecon reset /www/index.html context unconfined_u:object_r:httpd_sys_content_t:s0->unconfined_u:object_r:default_t:s0
    
    • 1
    • 2
    • 3

    客户端再次通过浏览器访问

    img

    3.3 SELinux 布尔值

    3.3.1 解释说明

    Managing Boole(管理 SElinux 布尔值):SELinux 给管理员提供SELinux 布尔值 特殊权限的开关,精确控制 SElinux 对某个服务的某个选项的保护,就可以达到某种权限的控制,比如 samba 服务。

    3.3.2 布尔值配置命令

    getsebool -a 
    # 命令列出系统中可用的 SELinux 布尔值。
    
    setsebool 
    # 命令用来改变 SELinux 布尔值
    
    • 1
    • 2
    • 3
    • 4
    • 5

    范例:

    $ getsebool -a | head
    abrt_anon_write --> off
    abrt_handle_event --> off
    abrt_upload_watch_anon_write --> on
    antivirus_can_scan_system --> off
    antivirus_use_jit --> off
    auditadm_exec_content --> on
    authlogin_nsswitch_use_ldap --> off
    authlogin_radius --> off
    authlogin_yubikey --> off
    awstats_purge_apache_log_files --> off
    $ getsebool -a | wc -l
    316
    
    ## 查看Samba 的布尔值
    $ getsebool -a | grep samba
    bacula_use_samba --> off
    samba_create_home_dirs --> off
    samba_domain_controller --> off
    samba_enable_home_dirs --> off
    samba_export_all_ro --> off
    samba_export_all_rw --> off
    samba_load_libgfapi --> off
    samba_portmapper --> off
    samba_run_unconfined --> off
    samba_share_fusefs --> off
    samba_share_nfs --> off
    sanlock_use_samba --> off
    tmpreaper_use_samba --> off
    use_samba_home_dirs --> off
    virt_use_samba --> off
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    3.3.2.1 实验案例
    #10.0.0.101作为Samba服务器
    #安装 samba 软件
    yum install -y samba
    #创建系统用户
    useradd zhangsan && useradd lisi
    echo "123456" | passwd --stdin zhangsan &> /dev/null
    echo "123456" | passwd --stdin lisi &> /dev/null
    #将系统用户转变为Samba用户
    #echo -e "123456\n123456" | pdbedit -a zhangsan
    #echo -e "123456\n123456" | pdbedit -a lisi
    pdbedit -a zhangsan
    pdbedit -a lisi
    #创建目录
    mkdir -pv /samba ; chmod -R 777 /samba
    #修改配置文件
    $ vim /etc/samba/smb.conf
    [pulic]
    comment = Share Stuff
    path = /samba
    public = yes
    writable = yes
    #开启服务,并拷贝一些文件
    systemctl enable --now smb
    # service smb start && chkconfig smb on
    cp -a /var/log/*.log /samba/
    #10.0.0.102作为Samba客户端
    #安装 samba 软件
    $ yum install -y samba samba-client
    $ smbclient -U zhangsan -L 10.0.0.101
    Enter SAMBA\zhangsan's' password:
    
            Sharename       Type      Comment
            ---------       ----      -------
            print$          Disk      Printer Drivers
            pulic           Disk      Share Stuff
            IPC$            IPC       IPC Service (Samba 4.10.16)
            zhangsan        Disk      Home Directories
    Reconnecting with SMB1 for workgroup listing.
    
            Server               Comment
            ---------            -------
    
            Workgroup            Master
            ---------            -------
    #登录查看,发现没有文件(可能是SELinux功能在工作)
    $ smbclient -U zhangsan //10.0.0.101/pulic
    Enter SAMBA\zhangsan's' password:
    Try "help" to get a list of possible commands.
    smb: \> ls
    NT_STATUS_ACCESS_DENIED listing \*
    
    #关闭10.0.0.101机器的SELinux后,再次登录查看
    $ smbclient -U zhangsan //10.0.0.101/pulic
    Enter SAMBA\zhangsan's' password:
    Try "help" to get a list of possible commands.
    smb: \> ls
      .                                   D        0  Sun Sep  4 15:02:06 2022
      ..                                  D        0  Sun Sep  4 14:57:50 2022
      boot.log                            N    24559  Sun Sep  4 14:25:26 2022
      vmware-network.1.log                N      715  Thu Sep  1 00:36:32 2022
      vmware-network.2.log                N      719  Thu Aug 11 20:23:56 2022
      vmware-network.3.log                N      719  Wed Dec 15 19:56:58 2021
      vmware-network.4.log                N      715  Fri Dec  3 22:20:38 2021
      vmware-network.5.log                N      715  Thu Dec  2 21:19:42 2021
      vmware-network.6.log                N      715  Thu Dec  2 20:29:51 2021
      vmware-network.7.log                N      719  Sun Jul 11 22:50:02 2021
      vmware-network.log                  N      715  Thu Sep  1 20:34:51 2022
      vmware-vmsvc-root.log               N  1719806  Sun Sep  4 15:01:48 2022
      vmware-vmtoolsd-root.log            N     1740  Sun Sep  4 14:25:18 2022
      wpa_supplicant.log                  N      360  Sun Sep  4 14:25:33 2022
      Xorg.0.log                          N    30346  Sun Sep  4 14:25:33 2022
      Xorg.9.log                          N    22030  Sun Jul 11 22:50:18 2021
      yum.log                             N     1763  Sun Sep  4 14:53:14 2022
    
                    104806400 blocks of size 1024. 100481984 blocks available
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75

    将10.0.0.101机器的SELinux开启,然后在修改其类型

    $ ls -lZ /samba/ | head -n 1
    -rw-------. root root system_u:object_r:plymouthd_var_log_t:s0 boot.log
    $ chcon -R -t samba_share_t /samba/
    $ setenforce 1 
    
    #10.0.0.102机器就可以正常的访问下载文件了
    $ smbclient -U zhangsan //10.0.0.101/pulic
    Enter SAMBA\zhangsan's' password:
    Try "help" to get a list of possible commands.
    smb: \> get yum.log
    getting file \yum.log of size 1763 as yum.log (573.9 KiloBytes/sec) (average 573.9 KiloBytes/sec)
    smb: \> exit
    $ ls -l yum.log
    -rw-r--r--. 1 root root 1763 Sep  4 15:10 yum.log
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    3.3.2.2 SELinux布尔值实验案例

    需求:两个用户到自己的家里只能读(下载)不能上传

    #传统方式就是将家目录的权限进行更改,这样就带来另一个问题,需求是只想 Samba 中这样实现,在真正的系统中,依旧是可以进行基本的读写操作的。

    #SELinux 布尔值

    #查看SELinux布尔值
    $ getsebool -a | grep samba
    samba_create_home_dirs --> off
    samba_domain_controller --> off
    samba_enable_home_dirs --> off
    samba_export_all_ro --> off
    samba_export_all_rw --> off
    samba_load_libgfapi --> off
    samba_portmapper --> off
    samba_run_unconfined --> off
    samba_share_fusefs --> off
    samba_share_nfs --> off
    sanlock_use_samba --> off
    tmpreaper_use_samba --> off
    use_samba_home_dirs --> off
    virt_use_samba --> off
    
    #在该需求则执行
    $ setsebool -P samba_export_all_ro on
    $ getsebool -a | grep samba_export_all_ro
    samba_export_all_ro --> on
    
    #开启家目录是否能访问的控制
    # setsebool –p samba_enable_home_dirs=1 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    测试

    # 10.0.0.101执行
    $ echo "Hello SELinux" > /home/zhangsan/smb.txt
    
    # 10.0.0.102执行下载
    $ smbclient -U zhangsan //10.0.0.101/zhangsan
    Enter SAMBA\zhangsan's' password:
    Try "help" to get a list of possible commands.
    smb: \> ls
      .                                   D        0  Sun Sep  4 15:20:22 2022
      ..                                  D        0  Sun Sep  4 14:54:56 2022
      .mozilla                           DH        0  Sun Jul 11 22:38:51 2021
      .bash_logout                        H       18  Wed Apr  1 10:17:30 2020
      .bash_profile                       H      193  Wed Apr  1 10:17:30 2020
      .bashrc                             H      231  Wed Apr  1 10:17:30 2020
      smb.txt                             N       14  Sun Sep  4 15:20:22 2022
    
                    104806400 blocks of size 1024. 100480468 blocks available
    smb: \> get smb.txt
    getting file \smb.txt of size 14 as smb.txt (2.7 KiloBytes/sec) (average 2.7 KiloBytes/sec)
    smb: \> exit
    
    $ ls -l smb.txt
    -rw-r--r--. 1 root root 14 Sep  4 15:21 smb.txt
    
    # 10.0.0.102进行上传
    $ smbclient -U zhangsan //10.0.0.101/zhangsan
    Enter SAMBA\zhangsan's' password:
    Try "help" to get a list of possible commands.
    smb: \> put yum.log
    NT_STATUS_ACCESS_DENIED opening remote file \yum.log
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
  • 相关阅读:
    c语言系统编程十四:Linux进程间的同步与互斥
    react-demo项目:支持使用scss(不使用create-react-app脚手架)
    AndroidT(13) -- logger_write 库实现解析(四)
    腾讯、阿里面试Redis真题精选36道,配合项目实战,助你大厂无忧
    复习 --- 消息队列
    ubuntu20.04安装anaconda3搭建python环境
    (六)Vue之MVVC
    三废的日常——什么是负载均衡
    对日开发 项目工程名词解析(整理中,待完善...)
    服务器硬件基础知识
  • 原文地址:https://blog.csdn.net/weixin_40274679/article/details/127449965