Security Enhenced linux

如果某个用户需要以root权限执行某条命令怎么办?
如果某个用户a想要与用户b共同享有某个文件的全部权限怎么办?
进程安全上下文 context
进程是用户获取资源的代理
一个进程在运行过程中对哪些文件具有访问权限 是由进程的发起者的权限决定的

试想 如果你的web服务器是以webman这个用户的身份运行的 他对系统中所有o上置r的文件都具有读权限 如果某个人劫持了web服务器 那么他就获得了webman的所有权限 他可以利用缓冲区溢出漏洞set uid等多种方式获得权限提升 进而劫持整个系统 此时 传统的DAC模式就无法防范这种***

DAC 自主访问控制 用户自主决定属于自己的文件权限
MAC 强制访问控制 内核定义了所有用户包括root 的权限由selinux决定 由内核实现

当进程不运行时 只是文件
Subject 是 正在内存中执行的进程
object 动作承受者 进程 文件 套接字
是否一个subject能够操作一个object 取决于selinux的定义
在一个进程需要运行以完成某种任务时 selinux为此进程规定了一个运行环境sandbox 此环境限制了此进程可以进行的操作和可以访问的文件 此时 这个进程可以活动的范围就由selinux限定 如果是传统的DAC 此进程的行为权限则由运行它的用户的权限决定,此时 它的活动范围是整个系统

selinux将进程分类 将资源分类 定义了那个进程在哪个范围内运行 只能访问哪些资源 此时不管它对其它的资源有读写权限 此时只要selinux不允许 它就不能访问

--------selinux怎样实现这种机制呢--------|
----<1>-----首先设置开启selinux的全局设置:

查看和设置selinux状态--&gt;配置文件--&gt;配置选项:

临时查看和设置:
#getenforce 查看selinux状态
#setenforce 1/0  把selinux临时设为enforcing/permissive
内核可以直接接受selinux参数 所以也可以在grub.conf 中 kernel行 最后添加:
selinux=0 向内核传递参数禁用selinux
如果selinux已经启用想让它在开机立即进入某种状态
enforce=1/0 状态为enforcing/premissive

永久设置:
配置文件位置: /etc/selinux/config 它还有个链接在 /etc/sysconfig/selinux
-+&gt;    # SELINUX= can take one of these three values:
    #       enforcing - SELinux security policy is enforced.
    #       permissive - SELinux prints warnings instead of enforcing.
    #       disabled - SELinux is fully disabled.
-+<    SELINUX=enforcing

-#->permissive (warn-mode,只警告并记录操作并不真正阻止)
-#-&gt;enforcing (强制限制状态)
-#-&gt;disabled (selinux禁用状态)

-+&gt;    # SELINUXTYPE= type of policy in use. Possible values are:
    #       targeted - Only targeted network daemons are protected.
    #       strict - Full SELinux protection. (高精细度控制模式)
-+<    SELINUXTYPE=targeted

-#->redhat 将那些通常容易受***被利用的文件/进程 默认置于selinux标签 此种规定范围是一种selinux类型
-#-&gt;redhat支持前两种类型:    SELINUXTYPE=targeted/strict/mls 普通控制级别/严格控制级别/军事级别

----<2>----selinux对文件/用户/进程的限制机制:

处于执行状态的进程/程序--&gt;subject (动作的发出者)
资源(file process socket ...)--&gt;object (动作的承受者)
各种subject之间的权限不同 优先级不同 所需要的资源不同
把具有相同权限的进程 标识 把具有相同权限的文件 标识

selinux给每个进程按类划分role角色 角色定义了谁可以访问哪些资源
给每个资源置上标签 标签标明了哪些角色可以访问

selinux利用ext3的扩展属性来标识这些资源
# lsattr 查看文件扩展属性的标识位
------------- ./wawa.xxx
------------- ./install.log
------------- ./anaconda-ks.cfg
------------- ./install.log.syslog
------------- ./dead.letter

进程所属的类--domain
资源所属的类--type
到底哪些domain中的subject可以访问哪些type中的object 取决于selinux的策略机制
策略(Policy) 由Administrator 定义
(kernel2.6以后 selinux已经不再区分进程和资源)

标签 label 安全上下文context
标签(label) system_u:object_r:user_home_t
安全上下文(context) 一个进程运行的时候所属的域 以及通过规则定义的它能够获取的所有资源 (由标签来表现)

---------------文件的selinux标签----------------

#ls -Z 查看文件标签 --context(等同于-Z) 或者--scontext (只显示安全上下文) 或者--lcontext (意为ll+context)
-rw-------  root root system_u:object_r:user_home_t    anaconda-ks.cfg
            user  :    role   : type

label 通常由3段组成 其实有5段user_u:object_r:user_home_t
se.属主域(user):角色域(object role):类型域(user type):敏感度:类别
类型域很重要 比如说 tmp目录下的文件type字段通常都是tmp_t
type字段决定了哪些subject可以访问它
还有user_home_dir_t等等
事实上 在subject运行过程中 还可以进行域切换进而完成自身对资源访问权限的切换
# ls -Z a.txt
-rw-r--r--  root root root:object_r:user_home_t        a.txt

#chcon 意思是change context
    -t type 类型
    -R recursive 递归(特别适用于改变某个目录下所有文件的context)
    -u user
    -r role
#chcon --reference=a.txt b.txt 将b以a为准设置selinux标签 (以引用方式改变文件标签)
#restorecon a.txt 将a.txt 恢复默认标签

-------------selinux 默认标签的定义文件----------
/etc/selinux/targeted/
此目录下定义了targeted 类型的selinux所有策略和文件默认标签类型
/etc/selinux/targeted/policy/
此目录显示了所有的policy(策略)
/etc/selinux/targeted/contexts/files
此目录中的几个文件定义了在不同目录下创建文件的默认标签是什么
大多数文件都是user_home_t 目录为user_dir_t
恢复默认标签的命令 则是以此为准

--------------用户/进程的selinux标签---------------
#id student 可以查看用户的selinux标签
uid=500(student) gid=500(student) groups=500(student) context=root:system_r:unconfined_t:SystemLow-SystemHigh

#ps auxZ 查看进程的selinux标签
system_u:system_r:getty_t       root      2451  0.0  0.0   1664   444 tty3     Ss+  Jul29   0:00 /sbin/mingetty tty3
    其中有一种tpye叫做 unconfined 未定义的类型 表示不受selinux控制 它的权限模型仍是DAC的

-------------查看和设置selinux策略--------------
roles(规则)组合起来就是策略 策略就是规则的库

#getsebool -a 查看所有可以通过bool型变量控制selinux状态的 功能
    qemu_use_usb --&gt; on 是否开启usb功能
    allow_httpd_anon_write --&gt; off 是否开启httpd匿名写入功能
设置某个功能的selinux状态:
#setsebool pppd_for_user 1/0 或者on/off 临时设置开启/关闭
#setsebool -P pppd_for_user 1/0 或者on/off 永久设置开启/关闭

#system-config-selinux 图形化界面设置selinux配置 (不建议)
通过这种方式改变selinux或者防火墙规则 可能会被系统默认规则限制 导致设置无效
#semanage {login/user/port/interface/fcontext/translation} -l [-options] 强大的selinux管理命令
例如 #semanage login -l 列出login功能中可用的子命令

-----------------------------------------
如果要深入了解selinux ----&gt;
rh429(rhcss 的官方教材)
O'Reilly - SELinux (2004).chm
http://book.opensourceproject.org.cn/security/selinux/
http://www.ebookee.net/