SELinux简介:
SELinux:Secure Enahanced Linux 安全增强的Linux
SELinux是2.6版本的Linux内核中提供的强制访问控制(MAC)系统。对于目前可用的Linux安全模块来说,SELinux是功能最全面,而且测试最充分的,它是在20年的MAC研究基础上建立的。SELinux在类型强制服务器中合并了多级安全性或一种可选的多类策略,并采用了基于角色的访问控制概念。
大部分使用SELinux的人使用的都是SELinux就绪的发行版,例如Fedora、RedHatEnterpriseLinux(RHEL)、Debian或Centos。它们都是在内核中启用SELinux的,并且提供一个可定制的安全策略,还提供很多用户层的库和工具,它们都可以使用SELinux的功能。
SELinux是一种基于域–类型模型(domain-type)的强制访问控制(MAC)安全系统,它由NSA编写并设计成内核模块包含到内核中,相应的某些安全相关的应用也被打了SELinux的补丁,最后还有一个相应的安全策略。
众所周知,标准的UNⅨ安全模型是“任意的访问控制“DAC。就是说,任何程序对其资源享有完全的控制权。假设某个程序打算把含有潜在重要信息的文件扔到/tmp目录下,那么在DAC情况下没人能阻止他!
而MAC情况下的安全策略完全控制着对所有资源的访问。这是MAC和DAC本质的区别。
SELinux提供了比传统的UNⅨ权限更好的访问控制。
工作于Linux内核中
DAC:自主访问控制
基本要素:
主体:主动的实体,用户、服务、进程等
客体: 被动的实体,包括数据、文件等
规则:主体对客体访问的策略集合
基本类型:
DAC访问控制:自主访问控制
通过权限列表(访问控制列表)来限定特定主体对特定客体可以执行什么操作。
特点:
1、每个主体都拥有一个用户名或组来获取操作权限
2、每个客体都拥有一个限定主体对其访问的访问控制列表
3、访问时,基于访问控制列表检查主体用户标示以实现授权或拒绝。
进程的访问权限
进程拥有超过其本该拥有的权限
管理员的访问权限
管理员拥有超过其本该有用的权限
普通用户的访问权限
MAC:强制访问控制
特点:
1、主体被分配一个安全等级 机密
2、客体被分配一个安全等级 绝密
3、访问时,对主体和客体的安全级别进行对比,最终获得授权或拒绝。
sandbox 沙箱 虚拟化技术
模式切换:
得到当前的SELinux值
[root@localhost ~]#getenforce Enforcing
更改当前SELinux值,后面可跟1|0
[root@localhost ~]#setenforce usage: setenforce [ Enforcing | Permissive | 1 | 0 ]
显示当前的SELinux信息
[root@localhost ~]#sestatus SELinux status: enabled SELinuxfs mount: /selinux Current mode: enforcing Mode from config file: enforcing Policy version: 24 Policy from config file: targeted [root@localhost ~]#sestatus -v SELinux status: enabled SELinuxfs mount: /selinux Current mode: enforcing Mode from config file: enforcing Policy version: 24 Policy from config file: targeted Process contexts: Current context: unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 Init context: system_u:system_r:init_t:s0 /sbin/mingetty system_u:system_r:getty_t:s0 /usr/sbin/sshd system_u:system_r:sshd_t:s0-s0:c0.c1023 File contexts: Controlling term: unconfined_u:object_r:user_devpts_t:s0 /etc/passwd system_u:object_r:etc_t:s0 /etc/shadow system_u:object_r:shadow_t:s0 /bin/bash system_u:object_r:shell_exec_t:s0 /bin/login system_u:object_r:login_exec_t:s0 /bin/sh system_u:object_r:bin_t:s0 -> system_u:object_r:shell_exec_t:s0 /sbin/agetty system_u:object_r:getty_exec_t:s0 /sbin/init system_u:object_r:init_exec_t:s0 /sbin/mingetty system_u:object_r:getty_exec_t:s0 /usr/sbin/sshd system_u:object_r:sshd_exec_t:s0
配置文件:/etc/sysconfig/selinux
[root@localhost ~]# cat /etc/sysconfig/selinux # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=enforcing # SELINUXTYPE= can take one of these two values: # targeted - Targeted processes are protected, # mls - Multi Level Security protection. SELINUXTYPE=targeted /etc/selinux/config
SELinux两种级别
strict:严格模式,每个进程都会受到SELinux的控制
targeted:宽松模式,仅有限的进程受到SELinux的控制
只监控容易被入侵的进程
查看文件安全标签(安全上下文)
[root@localhost ~]# ls -Z -rw-------. root root system_u:object_r:admin_home_t:s0 anaconda-ks.cfg drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 Desktop drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 Documents drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 Downloads -rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 file -rw-r--r--. root root system_u:object_r:admin_home_t:s0 install.log -rw-r--r--. root root system_u:object_r:admin_home_t:s0 install.log.syslog drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 Music drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 Pictures drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 Public drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 Templates drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 Videos
查看进程安全标签
[root@localhost ~]# ps -aux Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.1 19344 1548 ? Ss 13:36 0:01 /sbin/init root 2 0.0 0.0 0 0 ? S 13:36 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? S 13:36 0:00 [migration/0] root 4 0.0 0.0 0 0 ? S 13:36 0:00 [ksoftirqd/0] root 5 0.0 0.0 0 0 ? S 13:36 0:00 [stopper/0] root 6 0.0 0.0 0 0 ? S 13:36 0:00 [watchdog/0] root 7 0.0 0.0 0 0 ? S 13:36 0:00 [migration/1] root 8 0.0 0.0 0 0 ? S 13:36 0:00 [stopper/1] root 9 0.0 0.0 0 0 ? S 13:36 0:00 [ksoftirqd/1] root 10 0.0 0.0 0 0 ? S 13:36 0:00 [watchdog/1] root 11 0.0 0.0 0 0 ? S 13:36 0:00 [migration/2] root 12 0.0 0.0 0 0 ? S 13:36 0:00 [stopper/2] root 13 0.0 0.0 0 0 ? S 13:36 0:00 [ksoftirqd/2] root 14 0.0 0.0 0 0 ? S 13:36 0:00 [watchdog/2] root 15 0.0 0.0 0 0 ? S 13:36 0:00 [migration/3] root 16 0.0 0.0 0 0 ? S 13:36 0:00 [stopper/3]
SELinux为每个文件提供了安全标签,也为进程提供了安全标签
SELinux规则库
规则:哪种域能访问哪种或哪些种类型的文件
配置SELinux:
SELinux是否启用
给文件重新打标签
设定某些布尔型特性
SELinux的状态
enforcing 强制开启 每个受限的进程都必然受限
permissive 启用 不会阻止访问,但会记录日志
disabled 关闭
getenforce 获取SELinux当前状态
setenforce 0|1
0:设置为:permissive
1:设置为:enforcing
此设定临时生效,重启后无效
给文件重新打标签
chcon -R 递归打标签
还原文件的默认标签
restorecon -R 递归还原标签
布尔型规则:
添加/删除进程或服务本身开启的功能模块
getsebool -a 查看所有布尔值
[root@localhost ~]# getsebool -a abrt_anon_write --> off abrt_handle_event --> off allow_console_login --> on allow_cvs_read_shadow --> off allow_daemons_dump_core --> on allow_daemons_use_tcp_wrapper --> off allow_daemons_use_tty --> on allow_domain_fd_use --> on allow_execheap --> off allow_execmem --> on allow_execmod --> on allow_execstack --> on
getsebool -p ftp_home_dir on/off
将修改结果保存至本地磁盘
日志文件:/var/log/audit/audit.log
SELinux优点:
SELinux系统比起通常的Linux系统来,安全性能要高的多,它通过对于用户,进程权限的最小化,即使受到攻击,进程或者用户权限被夺去,也不会对整个系统造成重大影响。
对访问的控制彻底化
特点1:MAC(MandatoryAccessControl)―――对访问的控制彻底化 对于所有的文件,目录,端口这类的资源的访问,都可以是基于策略设定的,这些策略是由管理员定制的、一般用户是没有权限更改的。
对于进程只赋予最小的权限
特点2:TE(TypeEnforcement)―――对于进程只赋予最小的权限 Te概念在SELinux里非常的重要。它的特点是对所有的文件都赋予一个叫type的文件类型标签,对于所有的进程也赋予各自的一个叫domain的标签。Domain标签能够执行的操作也是由accessvector在策略里定好的。
我们熟悉的apache服务器,httpd进程只能在httpd_t里运行,这个httpd_t的domain能执行的操作,比如能读网页内容文件赋予httpd_sys_content_t,密码文件赋予shadow_t,TCP的80端口赋予http_port_t等等。如果在accessvector里我们不允许http_t来对http_port_t进行操作的话,Apache启动都启动不了。反过来说,我们只允许80端口,只允许读取被标为httpd_sys_content_t的文件,httpd_t就不能用别的端口,也不能更改那些被标为httpd_sys_content_t的文件(readonly)。
防止权限升级
特点3:domain迁移――防止权限升级
在用户环境里运行点对点下载软件azureus,你当前的domain是fu_t,但是,你考虑到安全问题,你打算让他在azureus_t里运行,你要是在terminal里用命令启动azureus的话,它的进程的domain就会默认继承你实行的shell的fu_t。
有了domain迁移的话,我们就可以让azureus在我们指定的azureus_t里运行,在安全上面,这种做法更可取,它不会影响到你的fu_t。
对于用户只赋予最小的权限
特点4:RBAC(rolebaseaccesscontrol)―――――对于用户只赋予最小的权限 对于用户来说,被划分成一些ROLE,即使是ROOT用户,你要是不在sysadm_r里,也还是不能实行sysadm_t管理操作的。因为,那些ROLE可以执行那些domain也是在策略里设定的。ROLE也是可以迁移的,但是也只能按策略规定的迁移。
SELinux缺点:
虽然Linux比起Windows来说,它的可靠性,稳定定要好得多,但是他也是和其他的UNIX一样,有以下这些不足之处。
存在特权用户root
任何人只要得到root的权限,对于整个系统都可以为所欲为。这一点Windows也一样。
对于文件的访问权的划分不够细
在linux系统里,对于文件的操作,只有「所有者」,「所有组」,「其他」这3类的划分。
对于「其他」这一类里的用户再细细的划分的话就没有办法了。
SUID程序的权限升级
如果设置了SUID权限的程序有了漏洞的话,很容易被攻击者所利用。 DAC(DiscretionaryAccessControl)问题
文件目录的所有者可以对文件进行所有的操作,这给系统整体的管理带来不便。
对于以上这些的不足,防火墙,入侵检测系统都是无能为力的。
在这种背景下,对于访问权限大幅强化的OSSELinux来说,它的魅力的无穷的。
由于本人对于SELinux理解有限,也是参考了大量文档后所写的此文章,若果有对SELinux有深入了解的朋友可以一起交流,或者本文有理解有误的地方,欢迎留言指出
原创文章,作者:Linux.rookie,如若转载,请注明出处:http://www.178linux.com/76648