Linux(RadHat)基础学习—了解SELinux

基本SELinux安全概念

SELINUX ( 安全增强型 Linux ) 是可保护你系统安全性的额外机制。
SELinux(Security-Enhanced Linux) 是美国国家安全局(NSA)对于强制访问控制的实现,是 Linux历史上最杰出的新安全子系统。NSA是在Linux社区的帮助下开发了一种访问控制体系,在这种访问控制体系的限制下,进程只能访问那些在他的任务中所需要文件。SELinux 默认安装在 Fedora 和 Red Hat Enterprise Linux 上,也可以作为其他发行版上容易安装的包得到。

(1).在某种程度上 , 它可以被看作是与标准权限系统并行的权限系统。在常规模式中 , 以用户身份运行进程 , 并且系统上的文件
(2).和其他资源都设置了权限标签 ( 控制哪些用户对哪些文件具有哪些访问权 SELINUX 的另一个不同之处在于 , 若要访问文件 ,你必须具有普通访问权限和 SELINUX 访问权限。因此 , 即使以超级用户身份root运行进程 , 根据进程以及文件或资源的SELinux安全性上下文可能拒绝访问文件或资源限 )

1.SELinux模式


SELinux共有3个状态enforcing (执行中)、permissive (不执行但产生警告)、disabled(关闭)

getenforce  ##显示当前selinux安全模式

在shell中直接更改状态:

setenforce 0|1  ##强制性、警告性之间的模式更改
0 表示 permissive # 警告
1 表示 enforcing  # 强制

disaled模式与上面这两种模式的更改,在文件/etc/sysconfig/selinux中更改,并且重启才会生效。
当然这三种模式都可以再这个文件中更改。

Linux(RadHat)基础学习—了解SELinux

SELINUX=enforcing | permissive | disabled
enfirocing  ##强制模式
permissive  ##警告模式
disabled    ##关闭

2.SELinux安全上下文访问规则

-------->参考文章: SELinux安全上下文的认识

在SELinux中,访问控制属性叫做安全上下文。所有操作系统访问控制都是以关联的客体和主体的某种类型的访问控制属性为基础的。所有客体(文件、进程间通讯通道、套接字、网络主机等)和主体(进程)都有与其关联的安全上下文,一个安全上下文由三部分组成:用户、角色和类型标识符。常常用下面的格式指定或显示安全上下文:

 USER : ROLE :  TYPE [ LEVEL [: CATEGORY] ]


① USER

1) useridentity:类似Linux系统中的uid,提供身份识别,用来记录身份;安全上下文的一部分;
2) 三种常见的 user:

     • user_u :普通用户登录系统后的预设
     • system_u :开机过程中系统进程的预设
     • root :root 登录后的预设

3) 在 targeted policy 中 users 不是很重要;
4) 在strict policy 中比较重要,所有预设的 SELinux Users 都是以 “_u” 结尾的,root 除外。


② ROLE

1) 文件、目录和设备的role:通常是 object_r;
2) 程序的role:通常是 system_r;
3) 用户的role:targeted policy为system_r; strict policy为sysadm_r、staff_r、user_r;用户的role,类似系统中的gid,不同角色具备不同的的权限;用户可以具备多个role;但是同一时间内只能使用一个role;


③ TYPE

1) type:用来将主体(subject)和客体(object)划分为不同的组,给每个主体和系统中的客体定义了一个类型;为进程运行提供最低的权限环境;
2) 当一个类型与执行中的进程相关联时,其type也称为domain;
3) type是SElinux security context 中最重要的部位,是 SELinux Type Enforcement 的心脏
4)在SELinux中,类型标识符是安全上下文的主要组成部分,由于历史原因,一个进程的类型通常被称为一个域(domain),"域"和"域类型"意思都一样,即都是安全上下文中的“TYPE”。

•WEB 服务器的 HTTPD 进程设置了 SELinux 上下文system_u:system_r:httpd_t 标签。该上下文的重要部分是第三个用冒号分隔的字段 SELinux类型 :。
•系统上的文件和资源也设置了 SELinux上下文标签 , 并且重要的部分是 SELINUX 类型。例如 , /var/www/html 中的文件具有类型 httpd_sys_content_t 。/tmp 和/var/tmp 中的文件通常具有类型 tmp_t。
•SEliux 策略具有允许以 httpd_t 身份运行的进程访问标记为 httpd_sys_content_t 的文件的规则。没有规则允许这些进程访问标记有 tmp_t 的文件 , 因此将拒绝这些访问 , 即使常规文件权限指出应该允许这些访问。

还有一个比较特殊的访问控制属性:unconfined_u:unconfined_r:unconfined_t

3.显示SELinux文件上下文

•什么确定文件的初始 SELinux 上下文 ? 通常是父目录。将父目录的上下文指定给新创建的文件。这对 vimcp 和 touch等命令其作用 , 但是 , 如果文件是在其他位置创建的并且保留了权限 ( 与 mv 或 cp -a 一样 ) 则还将保留 SELinux上下文

•许多处理文件的命令具有一个用于显示或设置 SELinux 上下文的选项 ( 通常是 -Z ) 。例如 , ps 、 ls 、 cp 和mkdir 都使用 -Z 选项显示或设置 SELinux 上下文

查看目录及文件:
1.
Linux(RadHat)基础学习—了解SELinux
2.
Linux(RadHat)基础学习—了解SELinux

3.
Linux(RadHat)基础学习—了解SELinux
查看进程:
Linux(RadHat)基础学习—了解SELinux

4.修改 selinux 安全上下文

(1)chcon 参数 目录/文件
    -u   修改user
        -r    修改role
        -t    修改type

Linux(RadHat)基础学习—了解SELinux

chcon命令是一次性定制安全上下文 , 系统重启会还原,执行 restorecon 刷新目录后也还原

restorecon -Rv 文件/目录
//-R 表示递归,如果是目录,则该目录下的所有子目录、文件都会得到修复
restorecon -FvvR   目录  ##刷新列表,使目录下所有内容恢复

(2)semanage命令
semanage命令是用来查询与修改SELinux默认目录的安全上下文。

 semanage fcontext -{a|d|m} [-frst] file_spec
 选项:
         -l:查询。 fcontext:主要用在安全上下文方面。 
         -a:增加。你可以增加一些目录的默认安全上下文类型设置。 
         -m:修改。 
         -d:删除。

示例:
查询/var/ftp/test目录的安全上下文:

semanage fcontext -l | grep /var/ftp/test

semanage fcontext 使用扩展正则表达式来指定路径和文件名。
fcontext 规则中最常用的扩展正则表达式是 (/.*)?, 表示随意地匹配 / 后跟任何数量的字符
semanage fcontext 将递归地与在表达式前面列出的目录以及该目录中的所有内容相匹配

5. SELinux 布尔值

SELinux 布尔值是更改 SELinux 策略行为的开关。 SELinux 布尔值是可以启用或禁用的规则。安全管理员可以使 SELinux 布尔值来调整策略 。

1.使用getsebool工具显示布尔值列表和当前值。

查询命令:getsebool -a

Linux(RadHat)基础学习—了解SELinux
以上输出我使用了管道符过滤了大部分,因为系统中把整个SELinux策略加载以后,不同的布尔值轻松达到200+。


2.获得布尔值信息

并不是所有布尔值都命名都能让人轻易读懂。使用semanage boolean –l可以知道布尔值的相关描述。
Linux(RadHat)基础学习—了解SELinux


3.改变布尔值状态

(1).改变SELinux布尔值可以通过setsebool命令实现(需要设置的布尔值,on或者off)。

setsebool xxxxx on | off   ##设置xxxxx策略开启或关闭

Linux(RadHat)基础学习—了解SELinux

当你完成这些命令,改变的值将会立刻生效,但是只在当前加载策略的活动期间。也就是说,如果系统重启,之前修改的将失效。或者当你直接地重新加载SELinux策略,之前的设置也会失效。换句话说,就是切换booleans这个方法快捷,它是帮助调试问题用的。
(2).使用-P选项可以使,SELinux布尔值的修改将永久生效。

setsebool -P xxxxx on | off   ##设置xxxxx策略永久开启或关闭

-----> 需要注意的是,参数P必须是大写的字母P,否则是无效参数,如下图所示。
Linux(RadHat)基础学习—了解SELinux

另外,这个命令要一会儿时间才能完成,因为SELinux策略本身需要重建、保存和布尔值也会被注册。一旦完成,布尔值将会一直为活动状态。

6.监控 SELinux 冲突

(1).必须安装 setroubleshoot-server 软件包 , 才能将 SELinux消息发送至 /var/log/messages
(2).setroubleshoot-server 侦听 /var/log/audit/audit.log 中的审核信息并将简短摘要发送至 /var/log/messages。摘要包括 SELinux 冲突的唯一标识符 ( UUIDs ), 可用于收集更多信息。
(3).Sealert -l UUID 用于生成特定事件的报告。
(4).Sealert -a /var/log/audit/audit.log 用于在该文件中生成所有事件的报告

示例:

1.在/var/ftp/目录下我们首先存在一些内容
Linux(RadHat)基础学习—了解SELinux
我们远程ftp登陆可以看到这些文件
Linux(RadHat)基础学习—了解SELinux

2.在/mnt目录下新建文件,然后把文件移动到/var/ftp目录下,

Linux(RadHat)基础学习—了解SELinux

3.再在ftp登陆用户中看,却并没有我这些新文件。
Linux(RadHat)基础学习—了解SELinux

这个就跟我们的SELinux的安全策略有关系了,我们在ftp目录下查看:
Linux(RadHat)基础学习—了解SELinux

*可以看到原来在ftp目录中建的文件目录都是public_content_t,而我们在/mnt目录下建的文件上下文类型是mnt_t。因为我们此时的SELinux的工作模式是 enforcing,所以对于违反策略的行动是被禁止的,所以我们刷新页面并不会出现我们从/mnt目录移动到ftp的几个文件。

*那为什么我们建的文件上下文类型不一致呢?因为我们刚才是在 /mnt 目录下创建的文件,所以其默认会继承上一层目录的SELinux的类型信息。在/var/ftp目录下建的文件目录也会默认继承上一层目录的SELinux的类型信息。而这两个目录mnt和ftp的SELinux的类型信息本就不一样,所以在其下创建的文件目录也就不一样了。

*通常解决办法由两种:

①直接将SELinux的工作模式设置成 disabled,这样就不会出现策略拦截问题了,但是这样的话我们的系统就没有SELinux安全防护了

②通过 restorecon 或者 chcon 命令来修复我们的文件上下文信息

restorecon -Rv /var/ftp/*

Linux(RadHat)基础学习—了解SELinux

再看远程ftp登陆的用户也能看到所有的文件了。

Linux(RadHat)基础学习—了解SELinux

猜你喜欢

转载自blog.51cto.com/13885935/2155037