MAC访问控制机制在Linux系统中的实现:SELinux

SELinux
全称:Security-Enhanced Linux,安全加强的Linux;
SELinux系统的本来名称为MAC:强制访问控制;SELinux就是MAC访问控制机制在Linux系统中的实现;

操作系统安全等级标准(橙皮书):
    D级别(最低安全级别)
    C级别:C1, C2  (DAC自主访问控制,例如windows等系统的安全级别为C1级别)
    B级别:B1, B2, B3 (强制访问控制级别MAC)
    A级别(最高安全级别)

访问控制机制:
    DAC:Discretionary Access Control,自主访问控制:
        基于文件或数据被文件系统赋予的访问权限(r,w,x)的方式实现的访问控制机制;

    MAC:Mandatory Access Control,强制访问控制:
        对于文件或数据的访问权限不是针对用户身份来设定,当某个用户发起某个进程之后,该进程是否能够操纵或处理此文件或数据,取决于进程和文件是否具备可以匹配的domain(进程的域)和type(文件的类型);

SELinux工作于Linux内核中:
    RHEL 4.0:测试性的加入了SELinux安全组件;
    RHEL 5.0:在安全操作系统时强制安装此组件,但可以在安装时选择关闭相应功能;
    RHEL 6.0+:在安装操作系统时强制安装此组件,且在系统启动之后自动启动其功能;

SELinux依赖于安全策略结果进行相应的访问控制管理,策略结果已知的有三种:
    1、strict(严格策略):对于每个文件都要严格的规定其类型,对于每个进程都要设定特定的域,进程的域和文件的类型必须严格匹配,才能允许进程访问此文件;
    2、mls:multi-level security,多级安全策略结果集;  //发行版内被去除
    3、targeted:仅对有限个进程进行SELinux的强制访问控制管控;只要进程的域和文件的类型属于某同一大类,就可以匹配,就可以允许进程访问文件;在RHEL系操作系统中为此策略结果;     //所有有限个进程:指的是那些容易被入侵并且会对系统造成安全隐患的进程

    注意:在targeted策略结果集中,仅关心进程的domain和文件的type能否匹配,与其他的安全上下文标识没有关系;

Sandbox(SELinux需要在沙箱中完成):
    在Linux系统中,能够完成真实操作的实体,是进程;
        subject, action(operation), object
            subject:进程
            action(operation)动作:open, close, read, write, modify, delete, chmod, chown, ...
            object:文件,进程,套接字,链接,...

    SELinux为每个文件和进程提供了一套安全标签,这些安全标签可以称为SELinux的安全上下文(security context);
        user-identify:role:domain|type:sencitivity
            user-identify:SELinux的用户身份标识,通常指用户的类型;
            role:角色
            domain|type:进程的域或文件的类型;
            sencitivity:敏感度;

    SELinux的策略库(规则库):用来存放规则
        规则:进程的哪个域可以以哪种方式访问或操纵哪些类型的文件;存放于/etc/selinux/targeted/policy目录中;

        /etc/sysconfig/selinux文件中定义了SELinux的工作模式和使用的策略结果集;
            SELINUX=enforcing
            SELINUXTYPE=targeted

    SELinux的工作模式(/etc/sysconfig/selinux文件中定义SELinux工作模式):
        enforcing - 强制开启SELinux机制
        permissive - 警告模式,所有动作被记录下来,但并不会阻止操作
        disabled - 关闭SELinux机制

        注意:
            1.凡是从enforcing或permissive模式切换至disabled模式,或者从disabled模式切换至enforcing或permissive模式,都必须经过操作系统的重新引导才能生效;
            2.从enforcing模式到permissive模式的切换,可以直接使用命令行工具完成且立即生效; 
                setenforce命令:切换SELinux的工作模式
                    setenforce [ Enforcing | Permissive | 1 | 0 ]
                        1:Enforcing
                        0:Permissive
                getenforce命令:显示SELinux的工作模式

                注意:使用setenforce命令修改的SELinux的工作模式会立即生效,但并非永久有效;如果想要使被修改的SELinux的工作模式永久有效,则需要修改/etc/sysconfig/selinux文件中的SELINUX参数的值,并重新引导操作系统;

查看进程或文件的SELinux的安全上下文:
    文件安全上下文查看:
        ls -Z|--context [file]
    进程安全上下文查看:
        ps auxZ|-efZ

修改文件的安全上下文:
    chcon命令:
        常用选项:
            -t, --type=TYPE:直接设置目标文件的类型;
            -R, --recursive:递归地修改目录中所有文件,包括子目录中的文件;
            --reference=RFILE:参考RFILE所代表的文件的安全上下文,为目标文件设置完全相同的安全上下文;
        使用场景:
            通常在进程的安全上下文与文件的安全上下文类型不相符合或不能匹配的时候使用;

        示例:
            设置httpd虚拟主机对应的文档根目录的安全上下文:
                ~]# chcon -t httpd_sys_content_t -R /myweb
                ~]# chcon --reference=/var/www -R /myweb

    restorcon命令:
        常用选项:
            -R, -r:递归修改指定目录及其子目录的安全上下文为默认值;
        示例:
            撤销httpd虚拟主机对应的文档根目录的安全上下文:
                ~]# restorcon -R /myweb

查看或修改策略中的内容:
    getsebool命令:查看SELinux的布尔值
        常用选项:-a:查看所有SELinux的布尔值
    setsebool命令:修改SELinux的布尔值
        常用选项:
            -P:如果添加-P选项,则将附加的值直接写入磁盘中的策略文件中,永久生效;如果不添加-P选项,则重启后恢复默认布尔值
        使用场景:支持二进制策略修改的系统服务;
            1.vsftpd的匿名用户的上传功能被SELinux限制的场景:
                ~]# setsebool -P ftpd_anon_write on
                ~]# setsebool -P ftpd_full_access=1
            2.samba服务中samba用户访问自己的家目录的共享结果被SELinux限制的场景:
                ~]# setsebool -P samba_enable_home_dirs on
            3.samba服务中共享的目录是由管理员自行创建并指定的:
                chcon -t samba_share_t /path/to/directory

    semanage命令:SELinux的策略管理工具  //如果没有此命令,安装policycoreutils-python程序包
            semanage port命令:
                -a, --add:添加一个端口号
                -d, --delete:删除一个端口号
                -m, --modify:修改一个端口号
                -l, --list:列出已被定义的端口号
            示例:

                ~]# semanage port -a -t http_port_t -p tcp 8088 

猜你喜欢

转载自blog.51cto.com/chenliangdeeper/2119357