一、SELinux简介
SELinux(Secure Enhanced Linux)安全增强的Linux是由美国国家安全局NSA针对计算机基础结构安全开发的一个全新的Linux安全策略机制。SELinux可以允许系统管理员更加灵活的来定义安全策略。SELinux是一个安全体系结构,它通过LSM(LinuxSecurity Modules)框架被集成到Linux Kernel 2.6.x中。因为SELinux是内核级别的,所以我们对于其配置文件的修改都是需要重新启动操作系统才能生效的。
二、SELinux基本概念
我们知道,操作系统的安全机制其实就是对两样东西做出限制:进程和系统资源(文件、网络套接字、系统调用等)。 在之前学过的知识当中,Linux操作系统是通过用户和组的概念来对我们的系统资源进行限制,我们知道每个进程都需要一个用户才能执行。在SELinux当中针对这两样东西定义了两个基本概念:域(domin)和上下文(context)。SELinux提供了一种灵活的强制访问制(MAC)系统,且内嵌于Linux Kernel中。SELinux定义了系统中每个用户、进程、应用和文件的访问和转变的权限,然后它使用一个安全策略来控制这些实体(用户、进程、应用和文件)之间的交互,安全策略指定如何严格或宽松地进行检查。ll 文件/目录后出现 ”.”,说明该文件/目录与SELinux有关。只通过权限访问的叫DAC,限+SELinux,叫MAC强制访问方式。SELinux 会给每个文件分配一个标签,当标签不匹配时,即使有权限,也不能访问。标签学名叫做SELinux上下文.selinux可以让应用程序运行在其所需的最低权限上。未经修改过的Linux系统是使用自主访问控制的,用户可以自己请求更高的权限,由此恶意软件几乎可以访问任何它想访问的文件,而如果你授予其root权限,那它就无所不能了。 在SELinux中没有root这个概念,安全策略是由管理员来定义的,任何软件都无法取代它。这意味着那些潜在的恶意软件所能造成的损害可以被控制在最小。一般情况下只有非常注重数据安全的企业级用户才会使用SELinux。
操作系统有两类访问控制:自主访问控制(DAC)和强制访问控制(MAC)。标准Linux安全是一种DAC,SELinux为Linux增加了一个灵活的和可配置的的MAC。
所有DAC机制都有一个共同的弱点,就是它们不能识别自然人与计算机程序之间最基本的区别。简单点说就是,如果一个用户被授权允许访问,意味着程序也被授权访问,如果程序被授权访问,那么恶意程序也将有同样的访问权。 DAC最根本的弱点是主体容易受到多种多样的恶意软件的攻击,MAC就是避免这些攻击的出路,大多数MAC特性组成了多层安全模型。
[[email protected] ~]# ll /root total 56 -rw-r--r--. 1 root root 238 Apr 29 11:31 ] -rw-------. 1 root root 1442 Apr 5 21:56 anaconda-ks.cfg -rw-r--r--. 1 root root 34353 Apr 5 21:55 install.log #在权限得最后面有一个点 [[email protected] ~]# ls -Z -rw-r--r--. root rootsystem_u:object_r:admin_home_t:s0 ] -rw-------. root rootsystem_u:object_r:admin_home_t:s0 anaconda-ks.cfg -rw-r--r--. root rootsystem_u:object_r:admin_home_t:s0 install.log -rw-r--r--. root root system_u:object_r:admin_home_t:s0install.log.syslog -rw-r--r--. root rootsystem_u:object_r:admin_home_t:s0 oldboy [[email protected] ~]# ps -Z LABEL PID TTY TIME CMD unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c10232003 pts/0 00:00:00 su unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c10232009 pts/0 00:00:00 bash unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c10232030 pts/0 00:00:00 ps [[email protected] ~]# id –Z #显示shell的安全上下文 unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
三、selinux简单的策略
1、selinux 的配置文件
在/etc/sysconfig/selinux 和文件/etc/selinux/conf中都可以修改,是/etc/sysconfig/selinux是一个符号链接,真正的配置文件为:/etc/selinux/config
它包含3个选项:
1》打开或者关闭selinux
2》设置系统执行哪一个策略(policy)
3》设置如何执行策略
disabled:关闭SELinux
permissive:警告,不满足上下文的要求,依然可以访问
enforcing:强制,不满足上下文,拒绝setenforce 0|1
2、一些简单的命令
getsebool -a #查看所有服务的开关 setsebool -P #需要修改的SELiux服务布尔开关 on|off chcon -R --reference=/var/blog/ /var/blog/index.html #将index.html的context修改为与/var/blog一致 chcon -R -t SELinux上下文 文件/目录 #-R 递归到子目录 #-t 上下文的类型 restorecon -R 文件/目录 #继承当前目录的上下文
3、selinux 安全策略
SELINUXTYPE=targeted|strict — 指定SELinux执行哪一个策略
3.1 targeted
只有目标网络daemons保护。每个daemon是否执行策略,可通过system-config-selinux进行配置。保护常见的网络服务,为SELinux默认值。可使用如下工具设置每个daemon的布尔值:
1》getsebool -a:列出SELinux的所有布尔值
2》setsebool:置SELinux布尔值,如:setsebool-P dhcpd_disable_trans=0,-P表示即使用reboot之后,仍然有效。
3.2strict
对SELinux执行完全的保护。为所有的subjects和objects定义安全环境,且每一个Action由策略执行服务器处理。提供符合Role-based-Access Control(RBAC)之policy,具备完整的保护功能,保护网络服务、一般指令及应用程序。
[[email protected] ~]# /usr/sbin/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
4、selinux上下文
Selinux 的上下文格式 :USER:ROLE:TYPE[LEVEL[:CATEGORY]]
4.1 USER
1》user identity:类似Linux系统中的UID,提供身份识别,用来记录身份;安全上下文的一部分
2》三种常见的 user:
user_u :普通用户登录系统后的预设;
system_u :开机过程中系统进程的预设;
root :root 登录后的预设;
3》在 targeted policy 中 users 不是很重要;
4》在strict policy 中比较重要,所有预设的 SELinux Users 都是以 “_u” 结尾的,root 除外。
4.2 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;
4》使用基于RBAC(Roles Based Access Control) 的strict和mls策略中,用来存储角色信息
4.3 TYPE
1》type:用来将主体(subject)和客体(object)划分为不同的组,给每个主体和系统中的客体定义了一个类型;为进程运行提供最低的权限环境;
2》当一个类型与执行中的进程相关联时,其type也称为domain;
3》type是SElinux security context 中最重要的部位,是 SELinux Type Enforcement 的心脏,预设值以_t结尾;
LEVEL和CATEGORY:定义层次和分类,只用于mls策略中
LEVEL:代表安全等级,目前已经定义的安全等级为s0-s15,等级越来越高
CATEGORY:代表分类,目前已经定义的分类为c0-c1023
举个例子:system_u:object_r:admin_home_t:s0
这条语句通过:划分成了四段,第一段 system_u 代表的是用户,第二段 object_r 表示的是角色,第三段是SELinux中最重要的信息,admin_home 表示的是类型,最后一段 s0 是跟MLS、MCS相关的东西,暂时不需要管。
5、Apache实例
当我们在Apache的站点目录建立一个index文件.在本地的host文件中添加本地解析,输入你的网址就可以得到下面的图片内容。虚拟主机配置在:http://13132323.blog.51cto.com/13122323/1953402
[[email protected] ~]# getenforce Enforcing [[email protected] ~]#/application/apache/bin/apachectl start [[email protected] ~]# netstat -lnt |grep 80 tcp 0 0 0.0.0.0:38051 0.0.0.0:* LISTEN tcp 0 0 :::80 :::* LISTEN
这时如果我们删除站点目录的index文件,在/home/目录下建立一个index文件,将其移动到Apache的站点目录下时,按F5刷新浏览器页面,则会发现出现了Apache的默认界面并没有显示index文件的内容而是默认的Apache测试页面。这时我们修改让index的类型和他的目录保持一致,这时我们会看到又会出现上边的图片。
[[email protected] ~]# cd /var/blog [[email protected] blog]# ls index.html [[email protected] blog]# rm -rf index.html [[email protected] blog]# cp /home/index.html . [[email protected] blog]# ls -Z -rw-r--r--. root rootunconfined_u:object_r:home_root_t:s0 index.html [[email protected] blog]# ls -dZ /var/blog drwxr-xr-x. ett ettsystem_u:object_r:var_t:s0 /var/blog [[email protected] blog]# chcon -R --reference=/var/blog /var/blog/index.html [[email protected] blog]# ls -Z -rw-r--r--. root root system_u:object_r:var_t:s0 index.html ##或者这个命令:restorecon -R -v /var/blog/index.html
出现的原因:我们发现我们的 /var/blog 这个目录的上下文类型是var_t, 而我们刚才移动过来的 index.html 的类型却是 home_root_t,因为我们此时的SELinux的工作模式是 enforcing,所以对于违反策略的行动是被禁止的,所以我们刷新页面并不会出现我们的index.html里面的信息。