SElinux的前身是NSA(美国国家安全局)发起的一个项目。它的目的是将系统加固到可以达到军方级别。secutity enhanced linux
为什么NSA选择Linux呢?
在目前市面上大多数操作系统都是商用闭源的,只有Linux是开源的,这样修改并加入这项功能就方便许多,而且没有版权纠纷。所以,现在selinux就成为了Linux内核的一部分。
在了解selinux之间,我们需要知道DAC和CS的概念,它们是linux系统本身的安全机制。
DAC:Discretionary Access Control 自主(任意)访问控制
每一个用户为了能够实现和其他用户共享文件,在使用ACL之前,只能通过改变这个文件其他用户的权限,但是这中方法给系统安全带来了无穷的隐患。
CS(安全上下文):取决于发起用户的权限和文本本身的权限
CS+DAC给系统的安全机制带来了漏洞,事想apache用户可以查看/etc/passwd,如果它有写权限,就可能被利用进而就修改passwd文件,危害系统安全。
所有才又了MAC强制访问控制的概念
MAC: Mandatory Access Control 强制访问控制
,它是selinux实现访问控制的基础
还通过httpd服务来说明它的原理:
SELINUX通过type enforce (TE)强制类型策略将httpd的工作目录定义在一个特定的目录/var/www用户如果在定义其他目录,将不允许访问,从而实现mac的强制访问控制。
selinux是怎么工作的
它通过operation (操作)的主和宾打一个“标签”,在一个“类型”里只能由特定的目录或用户执行。这样可以限定一个进程的执行范围只能在一个“沙箱”(sandbox)内了(最小权限法则)
###operation: 读,写,执行,等。其实是一个主谓宾的结构 Subject Operation Object
###最小权限法则:例如定义Sbjiect httpd 的目录/var/www 为public_content_t类型,这样,httpd只能访问有这个特定类型的文件或目录,这些文件就叫沙箱“sendbox”
使用selinx,必须精心设计一套访问法则
给不同的进程打上不同的“域”,给不同的目录打上不同的”类型“通过定义“类型”和“域”的对应规则,来实现。selinx需要域和标签的对应关系,一对一对应 。但是系统上有上千个进程,实现起来很麻烦,所以一般情况下,并不是用selinx作为安全防范
。
selinux的实现机制有两种
strict: 任何进程都受selinux的控制,一般不用,太难设定
targeted: 红帽开发,指定选定的进程来受SELINUX,这种机制使得selinx更加容易受到控制
以上规则组合起来就叫策略policy
规则通常是以二进制文件存在的(编辑完转换成二进制),这样可以降低系统资源占用
#ll /etc/selinxu/policy
MLS muiti level scurity
selinxu把一些规则里面可以方便控制的功能设定为on或者off,这些都成为布尔类型
#getsebool -a 可以显示这些布尔型的内容
fcontext 规定目录属于哪个进程的范围
《《《《《《《《《《《《
进程的执行本来是取决于用户所拥有的权限rwx,我们只想让gentoo对a.txt具有写权限,进行修改。对其他任何文件都不能修改。
那么我们就需要对他进行一些限制,将他能执行的操作仅限于a.txt这个文件。
我们就借助sandbox:沙盒 将他的权限限定在某个特定目标
我们定义一个进程类型为t1,在定义一个目标为t2
我们制定一个策略表,t1只能对t2执行什么操作,把活动范围限制在沙盒。
就是提供了一个域,将活动范围限定在这个域之内。
subject:domain(type)
例如:一个web网站,linux系统上需要用户发起httpd进程来访问。这个用户拥有rx权限。我们只需要用户查看网页就行了,不能让他访问我们的系统,那么只要将他限定在一个域内就行了。比如我们建一个目录
/var/www,我们把用户的httpd进程活动范围限制在这个目录。他就算搞破坏,也只是针对这个目录,无法搞坏我们整个系统。
MAC做进了内核,-->SELinux
selinux的模型:
strict模型:安全级别太高,每一个进程都需要严格设定,五角大楼才用 - -!!
target模型:只对可能有风险的进行限定,web,ftp,http等
在/etc/selinux/config定义了类型
SELINUXTYPE=target在最后一行
可以关闭,只要修改SELINUX=enforcing
enforcing-状态为生效
permissive-状态为生效,但不强制,只警告不阻止。发送邮件至日志
disabled-不开启
下次开机生效
#getenforce 查看当前生效的模型
#setenforce 0 或1改变状态,在enforcing与permissive之间切换
/etc/sysconfig/selinux链接/etc/selinux/config
类型强制:selinux为每一个进程分配了一个标签
label:标签
user:用户
role:组
type:类型
#ls -Z 字段user:role:type 查看文件标签
#ps -axZ 查看进程标签
定义规则,策略在/etc/selinux/targeted/policy/policy.21
它是二进制格式,不可直接制定,需要文本文件,在进行转换
改变文件的类型# chcon -t 类型 文件名
我们可以通过修改文件标签来限制进程访问文件
#restorecon -vvF 恢复文件类型
如果是目录,只改目录本身。要想对其子目录及其文件生效,使用-R
如果ftp被selinux限制,就不能上传了。
使用getsebool -a | less 查看进程功能的开启与关闭
修改方法:setsebool 功能名 no或off
当前生效,永久有效要加-P选项
》》》》》》》》》》》》》》》》
启动使用selinux
1.启用selinux
- vim /etc/sysconfig/selinux
- SELINUX=enforcing #任何进程都受selinux控制
- permissive #仍然受控制,但是进程进入了别的目录会记录到日志
- disable #干净彻底的关闭
- setenforce
- genenforce
2.显示标签
- ls -Z 显示文件的标签
- 一共五段 角色:selinux里另外定义的用户
- object_r: 有点类似于组
- user_home_t: 域或者类型(最重要)通过改变它可以控制访问。类型强制的机制就是通过它实现的
- ps -Z 显示进程的标签
- 所有显示unconfined_t都表示不受selinux控制
- ps auxZ | grep httpd
- ls -dZ
在不同的目录建立的文件类型是不一样的,归不同的进程管理。
3.改变一个类型的标签
- chcon chage contex 改变上下文
- chcon -t 改类型,指定为特定类型
- -u
- -R 递归修改,可以改变目录下所有目录
- --reference= 以某个文件的标签为参照改变成一样的标签
- chcon -R --reference=/var/www/html /www
- chcon -t default_t /www/index.html
4.恢复默认安全上下文及修改
- restorecon
- -R 递归
- -F 强制
- -v 显示详细信息
- restorecon -R -v -F /www # 显示/www目录的详细CS信息
- semange
- -d 删除
- -m 修改
- -r
- -a 附加
- -t 类型
6.开启布尔类型
- getsebool -a | grep httpd #查看某个对应的布尔类型的值
- setsebool httpd_enable_cgi=on # 加上-p选项永久有效
下面通过添加一个samba目录来测试selinux控制
1.添加tools文件夹
- vim /etc/samba/smb.conf
- [tools]
- path = /share #没有的话事前创建一个
- public = yes
- write list = @mygrp #只允许mygrp组具有创建文件的权限
- browseable = yes
- service smb start
2.添加用户gentoo,并设置samba密码,允许器登陆samba服务器在tools下创建文件
class="cpp" name="code">groupadd mygrp
- useradd gentoo -g mygrp
- [root@station32 var]# smbpasswd -a gentoo
- New SMB password:
- Retype new SMB password:
- Added user gentoo.
- smbclient -L 192.168.0.32 -U gentoo # 查看samba服务器的内容
3.我们查看下/shared目录的CS,并且开启selinux
- ls -dZ /share/
- drwxrwxr-x root mygrp root:object_r:default_t /share/
- setenforce 1
4.开启selinux后,再使用smbclient命令就会报错,我们看下配置文件里面有这样一行 # To set a label use the following: chcon-t samba_share_t /path ,所以我们必须把/shared文件夹的CS修改后才能正常使用samba
- chcon -t samba_share_t /share
5.我们关闭samba里关于访问家目录的布尔类型
- setsebool samba_enable_home_dirs off
这个时候使用win网络邻居,以用户gentoo登陆后,就不能进入gentoo家目录了
6.我们将它开启就又能访问了,命令如下:
- setsebool samba_enable_home_dirs on