SELinux——概述及基本操作命令

SELinux

基本概述:
SELinux(Security-Enhanced Linux) 是美国国家安全局(NSA)对于强制访问控制的实现,是 Linux历史上最杰出的新安全子系统。NSA是在Linux社区的帮助下开发了一种访问控制体系,在这种访问控制体系的限制下,进程只能访问那些在他的任务中所需要文件。SELinux 默认安装在 Fedora 和 Red Hat Enterprise Linux 上,也可以作为其他发行版上容易安装的包得到。
SELinux 是 2.6 版本的 Linux 内核中提供的强制访问控制(MAC)系统。对于目前可用的 Linux安全模块来说,SELinux 是功能最全面,而且测试最充分的,它是在 20 年的 MAC 研究基础上建立的。SELinux 在类型强制服务器中合并了多级安全性或一种可选的多类策略,并采用了基于角色的访问控制概念。 [1]
大部分使用 SELinux 的人使用的都是 SELinux 就绪的发行版,例如 Fedora、Red Hat Enterprise Linux (RHEL)、Debian或 Centos。它们都是在内核中启用 SELinux 的,并且提供一个可定制的安全策略,还提供很多用户层的库和工具,它们都可以使用 SELinux 的功能。
SELinux是一种基于 域-类型 模型(domain-type)的强制访问控制(MAC)安全系统,它由NSA编写并设计成内核模块包含到内核中,相应的某些安全相关的应用也被打了SELinux的补丁,最后还有一个相应的安全策略。任何程序对其资源享有完全的控制权。假设某个程序打算把含有潜在重要信息的文件扔到/tmp目录下,那么在DAC情况下没人能阻止他。SELinux提供了比传统的UNIX权限更好的访问控制。

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:
概述:
在计算机安全领域,沙盒(英语:sandbox,又译为沙箱)是一种安全机制,为执行中的程式提供的隔离环境。通常是作为一些来源不可信、具破坏力或无法判定程序意图的程序提供实验之用。
沙盒通常严格控制其中的程序所能访问的资源,比如,沙盒可以提供用后即回收的磁盘及内存空间。在沙盒中,网络访问、对真实系统的访问、对输入设备的读取通常被禁止或是严格限制。从这个角度来说,沙盒属于虚拟化的一种。
沙盒中的所有改动对操作系统不会造成任何损失。通常,这种技术被计算机技术人员广泛用于测试可能带毒的程序或是其他的恶意代码。
具体实现
沙盒将软件运行于一个受限的系统环境中,控制程序可使用的资源(如文件描述符、内存、磁盘空间等)。
以下是一些沙盒的具体实现:
软件监狱(Jail):限制网络访问、受限的文件系统命名空间。软件监狱最常用于虚拟主机上[4]。基于规则的执行:通过系统安全机制,按照一系列预设规则给用户及程序分配一定的访问权限,完全控制程序的启动、代码注入及网络访问[5]。也可控制程序对于文件、注册表的访问。在这样的环境中,病毒木马感染系统的几率将会减小。Linux中,安全增强式Linux和AppArmor正使用了这种策略。虚拟机:模拟一个完整的宿主系统,可以如运行于真实硬件一般运行虚拟的操作系统(客户系统)。客户系统只能通过模拟器访问宿主的资源,因此可算作一种沙盒。主机本地沙盒:安全研究人员十分依赖沙盒技术来分析恶意软件的行为。通过创建一个模拟真实桌面的环境,研究人员就能够观察恶意软件是如何感染一台主机的。若干恶意软件分析服务使用了沙盒技术[6]。在线判题系统:用于编程竞赛中的程序测试。安全计算模式(seccomp)(英语:seccomp):Linux内核内置的一个沙盒。启用后,seccomp仅允许write()、read()、exit()和sigreturn()这几个系统调用。

在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

SELinux的优缺点:

缺点:
虽然Linux比起 Windows来说,它的可靠性,稳定性要好得多,但是他也是和其他的UNIX 一样,有以下这些不足之处。
存在特权用户root
任何人只要得到root的权限,对于整个系统都可以为所欲为。这一点Windows也一样。
对于文件的访问权的划分不够细
在linux系统里,对于文件的操作,只有「所有者」,「所有组」,「其他」这3类的划分。
对于「其他」这一类里的用户再细细的划分的话就没有办法了。
SUID程序的权限升级
如果设置了SUID权限的程序有了漏洞的话,很容易被攻击者所利用。
DAC(Discretionary Access Control)问题
文件目录的所有者可以对文件进行所有的操作,这给系统整体的管理带来不便。
对于以上这些的不足,防火墙,入侵检测系统都是无能为力的。
在这种背景下,对于访问权限大幅度强化的SELinux来说,它的魅力
SELinux系统比起通常的Linux系统来,安全性能要高的多,它通过对于用户,进程权限的最小化,即使受到攻击,进程或者用户权限被夺去,也不会对整个系统造成重大影响。
SELinux的一些优点。
对访问的控制彻底化
特点1:MAC(Mandatory Access Control)―――对访问的控制彻底化
对于所有的文件,目录,端口这类的资源的访问,都可以是基于策略设定的,这些策略是由管理员定制的、一般用户是没有权限更改的。
对于进程只赋予最小的权限
特点2:TE (Type Enforcement)――― 对于进程只赋予最小的权限
Te概念在 SELinux里非常的重要。它的特点是对所有的文件都赋予一个叫type的文件类型标签,对于所有的进程也赋予各自的一个叫 domain的 标签。Domain标签能够执行的操作也是由access vector在策略里定好的。
我们熟悉的apache服务器,httpd进程只能在httpd_t 里运行,这个httpd_t 的domain能执行的操作,比如能读网页内容文件赋予httpd_sys_content_t,密码文件赋予shadow_t,TCP的80端口赋予 http_port_t等等。如果在access vector里我们不允许 http_t来对http_port_t进行操作的话,Apache启动都启动不了。反过来说,我们只允许80端口,只允许读取被标为 httpd_sys_content_t的文件,httpd_t就不能用别的端口,也不能更改那些被标为httpd_sys_content_t的文件(read only)。
防止权限升级
特点3:domain迁移 ―― 防止权限升级
在用户环境里运行点对点下载软件azureus,你当前的domain是fu_t,但是,你考虑到安全问题,你打算让他在azureus_t里运行,你要是在terminal里用命令启动azureus的话,它的进程的domain就会默认继承你实行的shell的fu_t。
有了domain迁移的话,我们就可以让azureus在我们指定的azureus_t里运行,在安全上面,这种做法更可取,它不会影响到你的fu_t。
下面是domain迁移指示的例子:
domain_auto_trans(fu_t,azureus_exec_t,azureus_t)
意思就是,当在 fu_t domain里,实行了 被标为 azureus_exec_t的文件时,domain 从fu_t迁移到 azureus_t。下面是Apache启动的迁移图。注意了,因为从哪一个domain能迁移到httpd_t是在策略里定好了,所以要是我们手动 (/etc/init.d/httpd start)启动apache的话,可能仍然留在sysadm_t里,这样就不能完成正确的迁移。要用run_init命令来手动启动。
对于用户只赋予最小的权限
特点4:RBAC(role base access control) ――――― 对于用户只赋予最小的权限
对于用户来说,被划分成一些ROLE,即使是ROOT用户,你要是不在sysadm_r里,也还是不能实行sysadm_t管理操作的。因为,那些ROLE可以执行那些domain也是在策略里设定的。ROLE也是可以迁移的,但是也只能按策略规定的迁移。

猜你喜欢

转载自blog.51cto.com/fuboyuan/2120180