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: user@host, user@address, a host name,  or  just an address, depending on how much information is available.

        %s     Server information: daemon@host, daemon@address, 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:打开的文件锁的最大数量值;

猜你喜欢

转载自blog.51cto.com/huliheeyu/2150636