SELinux相关内容

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

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

SELinux就是MAC访问控制机制在Linux系统中的实现;

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

SELinux依赖于安全策略结果进行相应的访问控制管理,策略结果已知的有三种:
    strict:对于每个文件都有严格的规定其类型,对于每个进程都要设定特定的域,进程的域和文件的类型必须严格匹配,才能允许进程访问此文件;

    mls:multi-level security,多级安全策略结果集;

    targeted:仅对有限个进程进行SELinux的强制访问控制管控;只要进程的域和文件的类型属于某同一大类,就可以匹配,就可以允许进程访问文件;在RHEL系操作系统中为此策略结果;
        所有有限个进程,指的是那些容易被***并且会对系统造成安全隐患的进程;

Sandbox:
    在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:敏感度;

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

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

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

    SELinux的工作模式:
        enforcing - SELinux security policy is enforced.
        permissive - SELinux prints warnings instead of enforcing.
        disabled - No SELinux policy is loaded.

        注意:
            1.凡是从enforcing或permissive模式切换至disabled模式,或者从disabled模式切换至enforcing或permissive模式,都必须经过操作系统的重新引导才能生效;
            2.从enforcing模式到permissive模式的切换,可以直接使用命令行工具完成且立即生效;
                setenforce命令:
                    setenforce - modify the mode SELinux is running in.

                    setenforce [ Enforcing | Permissive | 1 | 0 ]
                        1:Enforcing
                        0:Permissive

                getenforce命令:
                    getenforce - get the current mode of SELinux

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

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

    进程安全上下文查看:
        ps auxZ
        ps -efZ

修改文件的安全上下文:
    chcon命令:
        chcon - change file SELinux security context

        -t, --type=TYPE:直接设置目标文件的类型;
        -R, --recursive:递归地修改目录中所有文件,包括子目录中的文件;
        --reference=RFILE:参考RFILE所代表的文件的安全上下文,为目标文件设置完全相同的安全上下文;

        使用场景:
            通常在进程的安全上下文与文件的安全上下文类型不相符合或不能匹配的时候使用;

            如:设置httpd虚拟主机对应的文档根目录的安全上下文;

    restorcon命令:
        restorecon - restore file(s) default SELinux security contexts.

        -R, -r:递归修改指定目录及其子目录的安全上下文为默认值;

查看或修改策略中的内容:
    getsebool命令:
        getsebool - get SELinux boolean value(s)

        -a:Show all SELinux booleans.

    setsebool命令:
        setsebool - set SELinux boolean value

        -P:If the -P option is given, all pending values are written to the policy file  on disk. So they will be persistent across reboots.

    使用场景:支持二进制策略修改的系统服务;
        vsftpd的匿名用户的上传功能被SELinux限制的场景:
            ~]# setsebool -P ftpd_anon_write on
            ~]# setsebool -P ftpd_full_access=1
        samba服务中samba用户访问自己的家目录的共享结果被SELinux限制的场景:
            ~]# setsebool -P samba_enable_home_dirs on

        samba服务中共享的目录是由管理员自行创建并指定的:
            chcon -t samba_share_t /path/to/directory

    semanage命令:
        semanage - SELinux Policy Management tool
            注意:如果没有此命令,需要安装policycoreutils-python程序包即可;

            semanage port命令:
                -a, --add
                    Add a record of the specified object type

                -d, --delete
                    Delete a record of the specified object type

                -m, --modify
                    Modify a record of the specified object type

                -l, --list
                    List records of the specified object type

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

tcp_wrappers:tcp封装器;
仅仅就是一个库:libwrap.so

功能:对能够访问到调用了libwrap.so库的应用程序服务的客户端主机进行基于IP地址的访问控制;

库调用的方法:
    静态编译:
    动态链接:

判断一个应用程序服务是否能够接受tcp_wrappers的访问控制:
    1.对于动态链接至libwrap.so的应用程序:
        ldd /PATH/TO/APP_BINARY_FILE | grep libwrap.so

    2.对于静态编译libwrap库至应用程序中的:
        strings /PATH/TO/APP_BINARY_FILE

        利用strings命令查看指定的应用程序的二进制文件中,是否包含有/etc/hosts.allow, /etc/hosts.deny;如果有此类信息,则说明其将libwrap库以静态的方式编译进应用程序,即可以支tcp_wrappers的访问控制;

常用的基于tcp_wrappers进行访问控制的服务:sshd, vsftpd;

tcp_wrappers的配置文件:
    /etc/hosts.allow
    /etc/hosts.deny

    配置文件的匹配顺序:
        /etc/hosts.allow --> /etc/hosts.deny --> 默认规则:允许所有主机数据放行;

        获取配置文件的帮助的方法:
            ~]# man hosts.allow
            ~]# man hosts.deny
            ~]# man hosts_access(推荐)
            ~]# man hosts_options

    配置文件的格式:
        daemon_list : client_list [ : shell_command ]
        daemon_list : client_list : option : option ...

        daemon_list:
            1.单个应用程序服务文件的名称;
                如:vsftpd;
            2.多个应用程序服务文件的名称列表,用","分隔;
                如:vsftpd, sshd;
            3.通配符:ALL
                不加区分的表示所有受到tcp_wrappers控制的应用程序服务文件;

        client_list:
            1.单个主机的IP地址或主机名称,如果使用主机名称,必须保证在本机能够实现名称解析;
            2.网络地址:
                1) 如果写掩码,必须是以完整的子网掩码表示的网络地址,如果使用前缀长度来表示则无效;
                    如:172.16.0.0/255.255.0.0是有效的;
                            172.16.0.0/16是无效的;
                2) 如果不写掩码,可以使用简短格式:
                    如:172.16.
            3.通配符:
                ALL:所有的客户端主机;
                LOCAL:所有的主机名称中不包含"."字符的客户端主机;
                KNOWN:所有的能够被当前主机正确完成名称解析的客户端主机;
                UNKNOWN:所有的不能被当前主机正确完成名称解析的客户端主机;
                PANANOID:所有的正向解析结果和反向解析结果不一致的客户端主机;
                    如:www.qhdlink.com --> 192.168.100.1
                            192.168.100.1 --> www.qhdink.org

        : option
            allow:允许,主要用于hosts.deny文件中,定义允许放行的访问控制规则;

            deny:阻止,拒绝,主要用于hosts.allow文件中,定义阻止访问的访问控制规则;

            spawn shell_command:当规则能够匹配主机时,执行后面的shell命令;

    示例1:
        拒绝172.16.72.1主机利用ssh协议访问172.16.69.2主机;
            可以在/etc/hosts.allow中拒绝:
                sshd : 172.16.72.1 : deny

            可以在/etc/hosts.deny中拒绝:
                sshd : 172.16.72.1

    示例2:
        拒绝172.16.0.0/16中的所有主机,但允许172.16.0.1主机利用ssh协议访问172.16.69.2主机;
            /etc/hosts.deny:
            sshd : 172.16.0.0/255.255.0.0 EXCEPT 172.16.0.1

    示例3:
        仅允许172.16.0.0/16中的所有主机,但拒绝172.16.72.1主机利用ssh协议访问到172.16.69.2主机;

        方案1:
            /etc/hosts.deny
                sshd : ALL EXCEPT 172.16. EXCEPT 172.16.72.1

        方案2:
            /etc/hosts.deny
                sshd : ALL
            /etc/hosts.allow
                sshd : 172.16. EXCEPT 172.16.72.1

    spawn使用示例:
        /etc/hosts.deny
            sshd : ALL EXCEPT 172.16.0.0/255.255.0.0 EXCEPT 172.16.72.1 : spawn /bin/echo $(date) %c attempt to login %s >> /var/log/tcp_wrap_sshd.log

    常用的内建宏:
        %c     Client information: [email protected], [email protected], a host name,  or  just an address, depending on how much information is available.

        %s     Server information: [email protected], [email protected], or just  a  daemon name, depending on how much information is available.

nss & pam
nss --> nsswitch:Name Service Switch,名称服务开关;

名称解析:将人类能够识别和使用的自然语言的符号转换成计算机能够识别和使用的数字符号的过程;包括:
    主机名 --> IP地址;
    用户名 --> UID;
    组名 --> GID;
    服务名 --> PORT;
    网络接口名称 --> MAC地址;
    ...

解析:根据已知的信息(关键字,key)查找某个特定的存储库,从而能够获取到与该已知信息有关的或者相匹配的其他信息的过程;

    存储库:
        文件;
        RDBMS;
        No-SQL;
        LDAP;
        ...

    login:

nsswitch:通用服务框架:为应用程序提供简洁且高效的接口;名称解析服务的代理程序;
    作用:承上启下:
        承上:提供统一的配置和调用接口;
        启下:向各种形式的存储库的使用接口发出调用;

    在Linux系统中实现名称解析服务的通用框架:nss相关的库;
        /lib64/libnss*
        /usr/lib64/libnss*
            /usr/lib64/libnss3.so:nss服务框架接口,用于承上;
            其他的libnss*.so库文件,都是用于访问各种存储库的接口(驱动);

    为了能够正确的访问存储库,为每种用到解析库的应用程序,通过一个特定配置文件定义存储库的访问方式:
        /etc/nsswitch.conf

    配置文件的格式:
        db: store_format1 store_format2 ...

        每种存储中都可以根据查找键进行查找,且每次查找都会有返回状态:
            STATUS => SUCCESS | NOTFOUND | UNAVAIL | TRYAGAIN

        对应每一种状态返回值,都有相应的行为:
            ACTION => return | continue

        注意:除了SUCCESS状态的默认行为是return之外,其余的状态的默认行为都是continue;

        自定义状态和行为的关系组合:
            [STATUS=ACTION]
            [!STATUS=ACTION]

        示例:
            hosts:      files [NOTFOUND=return] dns

        获取解析结果的命令:
            getent命令:
                getent - get entries from Name Service Switch libraries

                getent database [key ...]

        示例:
            getent passwd root
            getent hosts www.qhdlink.com

pam:
    pam:Pluggable Authentication Modules;可插入式认证模块;
        通用的认证服务框架;

    实现:提供了与各类型的存储库进行交互的通用实现解决方案,主要依靠相应的认证功能模块;

    模块存放的路径:/lib64/security/pam_*.so

    配置文件:每个基于pam做认证的应用程序都需要有相应的配置文件,其中定义了应用程序如何利用pam实现各种所需的认证功能;
        1.全局认证配置文件:/etc/pam.conf
            格式:
                service type control module-path module-arguments

        2.各个应用程序的专用配置文件:/etc/pam.d/*APP_NAME*
            格式:
                type control module-path module-arguments

            type:
                account:
                    与账号管理相关的非认证类功能;通常是账号审计,包括:过期时间,资源可用性等;

                auth:
                    与账号的认证和授权有关的功能;

                password:
                    与用户账户修改密码时的复杂度的规定有关的功能;

                session:
                    通过认证和账户审计之后,用户获取到服务之前或使用服务完成之后,需要进行的附加审计操作;如:日志记录等;

            control:同一种type的多个检查之间如何进行关联和组合;
                有两种实现方式:
                    1.简单实现:使用一个关键词来定义;
                        required:在认证时,如果本条目没有被满足,那么最终本次的认证一定失败;但是本次认证过程并不会因此而中断,而是在整个栈所有的规则运行完毕之后,最终给出"认证失败"的信号;
                            隐性的一票否决权;

                        requisite:在认证时,如果本条目没有被满足,那么本地认证一定失败;而且整个栈立即终止并返回"认证失败"的信号;
                            显式的一票否决权;
                        如果本条目被满足,则需要继续参考其他条目;

                        sufficient:在认证时,如果本条目被满足,且本条目之前没有任何required条目被判断为失败,则整个栈立即终止并返回"认证成功"的信号;
                            条件式一票通过;
                        如果本条目没有被满足,则还需要继续参考其他的条目规则;

                        optional:该条目仅在整个栈中只此一条时才有决定作用,否则无论该条目被满足或没有被满足都与最终的认证结果无关;

                        include:将其他的配置文件中的所有规则包含至当前条目,此条目是否被满足,取决于被指定文件的最终认证结果;
                            有可能影响当前栈的最终认证结果;

                        substack:将其他的配置文件中的所有规则包含至当前条目,与include不同,其认证结果不影响当前栈;

                    2.详细实现:使用一个或多个"statsu=action"标记进行组合定义;
                        [value1=action1 value2=action2 ...]
                        value的值包括:
                            success, open_err, symbol_err, service_err, system_err, buf_err, perm_denied, auth_err, cred_insufficient, authinfo_unavail, user_unknown, maxtries, new_authtok_reqd, acct_expired, session_err, cred_unavail, cred_expired, cred_err, no_module_data, conv_err, authtok_err, authtok_recover_err, authtok_lock_busy, authtok_disable_aging, try_again, ignore, abort, authtok_expired, module_unknown, bad_item, conv_again, incomplete, and default.

                        action的值:
                            ok, done, die, bad, ignore, N, reset, ...

            module-path:被调用的模块所在的路径;
                相对路径:相对于/lib64/security目录而言的模块路径;
                绝对路径:/lib64/security/*.so

            module-arguments:各个被调用的模块的专有模块参数;
                通常来讲,同一个模块如果需要多个参数时,只需要将各个参数以空白字符分隔即可;如果需要在单个参数中使用空格等空白字符,可以用中括号([])将整个参数包裹起来;

认证模块:
    pam_shells.so
        用户账户默认登录shell是否为安全shell;凡是在/etc/shells文件中以单行被列举出的shell,都属于安全shell,反之则为非安装shell;

        如:在/etc/pam.d/sshd第一行添加如下认证信息:
            auth        required        pam_shells.so

    pam_limits.so
        系统资源分配管控模块;

        在用户级别实现对指定用户限制其可以使用的资源总量;

        ulimit命令:可以查看或临时的调整系统资源的使用限制,仅root用户能进行调整;
            -n #:设置打开的文件数;

        修改配置文件可以是资源使用的限制永久生效:
            /etc/security/limits.conf
            /etc/security/limits.d/*

            格式:
                <domain> <type> <item> <value>

                    <domain>
                        1.单个用户;
                        2.组,组内所有用户账户成员;
                        3.*,表示所有用户,通常用于设置默认值;

                    <type>
                        soft:
                        hard:
                        -:既是soft也是hard;

                    <item>
                        nofile:同时打开的文件的最大数量值;
                        nproc:并发启动的进程的最大数量值;
                        locks:打开的文件锁的最大数量值;

原文地址:http://blog.51cto.com/huliheeyu/2150636

时间: 2024-10-31 06:22:17

SELinux相关内容的相关文章

Linux -- SELinux相关问题解决办法

一.如何解决SELinux问题? 说起SELinux,多数Linux发行版缺省都激活了它,可见它对系统安全的重要性,可惜由于它本身有一定的复杂性,如果不熟悉的话往往会产生一些看似莫名其妙的问题,导致人们常常放弃使用它,为了不因噎废食,学学如何解决SELinux问题是很有必要的. 我们以CentOS环境为例重现一个非常常见的SELinux问题: 首先需要确认SELinux处于激活状态,可以使用getenforce或sestatus命令: shell> getenforce  Enforcing  

移动端 h5开发相关内容总结——CSS篇

移动端 h5开发相关内容总结——CSS篇 标签: css移动 2016-01-06 15:59 5536人阅读 评论(3) 收藏 举报  分类: HTML+CSS(17)  版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 1.移动端开发视窗口的添加 h5端开发下面这段话是必须配置的 <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=n

EF Code First 配置的相关内容

I.实体间一对一的关系 添加一个PersonPhoto类,表示用户照片类 1 /// <summary> 2 /// 用户照片类 3 /// </summary> 4 public class PersonPhoto 5 { 6 [Key] 7 public int PersonId { get ; set ; } 8 public byte [] Photo { get ; set ; } 9 public string Caption { get ; set ; } // 标题

【转帖】MATLAB 与 音频处理 相关内容摘记

MATLAB 与 音频处理 相关内容摘记 MATLAB 与 音频处理 相关内容摘记 MATLAB 与 音频处理 相关内容摘记 1 MATLAB 音频相关函数 1 MATLAB 处理音频信号的流程 2 音量标准化 2 声道分离合并与组合 3 数字滤波 3 数据转换 5 基于MATLAB 的数字滤波实验6 MATLAB 音频相关函数 声音数据输入输出函数: 可以方便地读写au和way文件,并可控制其中的位及频率. wavread()和wavwriteO. 声音播放: wavplay():播放wav声

python爬虫主要就是五个模块:爬虫启动入口模块,URL管理器存放已经爬虫的URL和待爬虫URL列表,html下载器,html解析器,html输出器 同时可以掌握到urllib2的使用、bs4(BeautifulSoup)页面解析器、re正则表达式、urlparse、python基础知识回顾(set集合操作)等相关内容。

本次python爬虫百步百科,里面详细分析了爬虫的步骤,对每一步代码都有详细的注释说明,可通过本案例掌握python爬虫的特点: 1.爬虫调度入口(crawler_main.py) # coding:utf-8from com.wenhy.crawler_baidu_baike import url_manager, html_downloader, html_parser, html_outputer print "爬虫百度百科调度入口" # 创建爬虫类class SpiderMai

学习笔记之html5相关内容

写一下昨天学习的html5的相关内容,首先谈下初次接触html5的感受.以前总是听说html5是如何的强大,如何的将要改变世界.总是充满了神秘感.首先来谈一下我接触的第一个属性是  input的里面的一个属性是 type="email".以前用html的时候,type是有很多类型的,有text,password,summit.就是没听说过email.当得知这个email是验证输入的内容是否为email格式的时候.我顿时兴奋了.以前接触到html的时候,如果要验证输入内容时,是需要写js

在生成一系列相关内容后,签名文件生成

然后上传刚刚生成的CSR文件 按下Generate后,稍等一会,证书就生成了,你可以下载然后安装到本机. 3. AppID 需要强调一下的是,这里的AppID和常说的AppleID不是一个概念.AppleID是用户在苹果的账号,在AppStore上下载应用时,需要使用的就是这个账号.而AppID则是应用的身份证,用来表明应用的ID. 在证书生成后,下一步就是生成AppID,相当于帮你想开发的应用生成一张身份证. AppID需要你起一个名字以方便描述.这里不能输入特殊字符. AppID还分成带通配

App Store审核指南中文版(2014.9.10更新):新增Apple Pay相关内容

苹果在9月3日对App Store审核指南进行了重大更新,新添加了扩展.HealthKit.HomeKit以及TestFlight相关内容.另外,在9月10日新品发布会之后,苹果再次更新了App Store审核指南,添加Apple Pay相关内容.文中红色部分是相对于此前版本的新增内容,蓝色部分表示苹果相关官方文档的链接. App Store Review Guidelines(英文版). 前言 感谢您付出宝贵的才华与时间来开发iOS应用程程序.从职业与报酬的角度而言,这对于成千上万的开发员来说

linux中Makefile文件相关内容

第一章.概述什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional(专业)的程序员,makefile还是要懂.这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义.特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力.因为,makefile关系到了整个