SELinux
- SELinux(Security-Enhanced Linux) 是美国国家安全局(NSA)对于强制访问控制的实现,是Linux历史上最杰出的新安全子系统。NSA是在Linux社区的帮助下开发了一种访问控制体系,在这种访问控制体系的限制下,进程只能访问那些在他的任务中所需要文件。SELinux默认安装在 Fedora 和 Red Hat Enterprise Linux 上,也可以作为其他发行版上容易安装的包得到。
- SELinux是一种基于 域-类型 模型(domain-type)的强制访问控制(MAC)安全系统,它由NSA编写并设计成内核模块包含到内核中,相应的某些安全相关的应用也被打了SELinux的补丁,最后还有一个相应的安全策略。任何程序对其资源享有完全的控制权。假设某个程序打算把含有潜在重要信息的文件扔到/tmp目录下,那么在DAC情况下没人能阻止他。SELinux提供了比传统的UNIX权限更好的访问控制。
一、SELinux 的作用及权限管理机制
1、 SELinux 的作用
SELinux 主要作用就是最大限度地减小系统中服务进程可访问的资源(最小权限原则)。
设想一下,如果一个以 root 身份运行的网络服务存在的漏洞,黑客就可以利用这个漏洞,以 root 的身份在您的服务器上为所欲为了。是不是很可怕?
SELinux 就是来解决这个问题的。
2、 DAC
在没有使用 SELinux 的操作系统中,决定一个资源是否能被访问的因素是:某个资源是否拥有对应用户的权限(读、写、执行)。
只要访问这个资源的进程符合以上的条件就可以被访问。
而最致命问题是,root 用户不受任何管制,系统上任何资源都可以无限制地访问。
这种权限管理机制的主体是用户,也称为自主访问控制(DAC)。
3.MAC
在使用了 SELinux 的操作系统中,决定一个资源是否能被访问的因素除了上述因素之外,还需要判断每一类进程是否拥有对某一类资源的访问权限。
这样一来,即使进程是以 root 身份运行的,也需要判断这个进程的类型以及允许访问的资源类型才能决定是否允许访问某个资源。进程的活动空间也可以被压缩到最小。
即使是以 root 身份运行的服务进程,一般也只能访问到它所需要的资源。即使程序出了漏洞,影响范围也只有在其允许访问的资源范围内。安全性大大增加。
这种权限管理机制的主体是进程,也称为强制访问控制(MAC)。
二、selinux简介
作用: 给每一个文件加载标签(context:安全上下文)
对文件的影响:安全上下文
对服务的影响:对服务的特定功能加开关(sebool)
selinux的三种状态:
enforcing 强制模式
permissive 警告模式
disabled 关闭
显示selinux的状态: getenforce
更改selinux的开机状态:
更改完状态要重启才能生效(因为是改变了内核数据,所以要重启)
这里看到已经改为enforcing
selinux的两个级别: 强制和警告
setenforce 0 -----> permissive
setenforce 1 -----> enforcing
selinux报错日志: /var/log/audit/audit.log
三、selinux:安全上下文访问规则
安全上下文简介:
所有操作系统访问控制都是以关联的客体和主体的某种类型的访问控制属性为基础的
在SELinux中,访问控制属性叫做安全上下文。所有客体(文件、进程间通讯通道、套接字、网络主机等)和主体(进程)都有与其关联的安全上下文
比如:我们从别的地方移动一个文件到/var/ftp,而当我们登陆lftp之后,发现看不到该文件,是因为这个文件的安全上下文和/var/ftp的安全上下文不匹配,这就是selinux的保护机制,所以我们需要将这个文件的安全上下文修改和/var/ftp的达到一致。
测试 :
selinux状态为强制模式
- 在/mnt下新建一个文件hui,并将它移动到 /var/ftp
注意:
mv是重命名的过程,文件的属性和权限不会改变(文件上下文类型不会改变)
cp新建的过程,文件的属性和权限会改变(会重新生成安全上下文) - 查看/var/ftp的安全上下文的类型
(1)ls -Z 查看文件的安全上下文
(2)ls -Zd 查看目录的安全上下文
/var/ftp是lftp的默认发布目录,它默认的安全上下文是public_content_t
此处可以看到hui和pub安全上下文类型不一致
lftp登录服务端,看不到移动过去的文件
当把selinux的状态由强制模式改为警告模式后
再次登录客户端,就可以看到移动过去的文件hui
1、修改上下文的方法:
(1)临时修改:
- 查看/ftphome的上下文类型 ,显示default
- chcon -t public_content_t /ftphome/ -R
-t 表示修改上下文类型为public_content_t
-R 表示递归设置
- 测试临时属性
修改selinux的配置文件,将selinux的状态进行如下改变:enforcing–>disabled–>enforcing
发现上下文类型又变成默认,说明这种方式的修改是临时的
(2)永久修改:
查看/var/ftp和/ftphome的上下文列表
因为/ftphome是自己建立的目录,没有列表信息
- 修改/ftphome和底下的所有文件的安全上下文 ,递归刷新并显示刷新过程
-a 表示增加
-t 表示设置安全上下文的类型为public_content_t
/ftphome(/.*)? 表示对文件本身和里面的所有文件,包括隐藏文件
- 再次查看 /ftphome的上下文列表
- 上下文类型永久设定成功
四、管理selinux 布尔(sebool)值
SELinux 布尔值是更改 SELinux 策略行为的开关
SELinux 布尔值是可以启用或禁用的规则
(1)本地用户上传
在selinux开启的状态下,默认本地用户是没有上传权限的
查看开关(本地用户上传开关是关闭的)
开启本地用户上传开关
测试:此时本地用户可以上传文件
(2)匿名用户上传
- 在selinux开启的状态下,匿名用户是没有上传权限
- 编辑ftp服务配置文件,将匿名用户上传权限打开
- 修改匿名用户目录的所有组并给组添加权限
- 打开匿名用户上传开关
- 给匿名用户默认家目录的安全上下文类型添加读写权限
- 测试:此时匿名用户可以成功上传文件
五、selinux的排错工具: setroubleshoot-server
- 查看selinux排错工具软件包
- 在/mnt下新建一个文件hui,并将它移动到 /var/ftp
- 清空日志信息,方便测试报错信息
- lftp登录服务端,看不到自己建立的文件,这是由于安全上下文的关系
- 查看selinux的报错日志/var/log/audit/audit.log,会有报错信息产生
查看/var/log/messages 日志,里面会有报错的解决方案(排错指令)
- 如果删除setroubleshoot-server软件
此处再次清空日志信息方便测试
再次登录服务端并退出
- selinux报错日志/var/log/audit/audit.log中仍有报错,但是/var/log/messages就不会有排错指令了