一.什么是SELinux
1.访问控制分类
DAC(Discretionary Access Control,自主访问控制)
依据进程的所有者与文件资源的rwx权限来决定有无访问权限。
缺点:
1.如果某个进程以root身份运行,可能被恶意目的
2.用户可以取得进程来获得文件的访问权限
DAC针对控制的主体是用户
MAC(Mandatory Access Control),强制访问控制
依据策略规则决定进程可以访问哪些文件。
优点:
即使是root用户,在使用不同进程时,所能取得的权限并不一定是root,需要看当时进程的设置而定。
MAC针对控制的主体是进程
2.SELinux介绍
SELinux(安全增强型Linux)是美国国家安全局开发,是实现系统安全性的额外机制,其目标之一是保护用户的数据免受已泄露的系统服务的威胁。
SELinux提供一些默认的策略(Policy), 并在该策略内提供多个规则(rule),让用户可以选择是否启用该控制规则。
二.SELinux管理
1.SELinux三种模式
SELinux 有三个模式(可以由用户设置)。这些模式将规定 SELinux 在主体请求时如何应对。这些模式是:
- Enforcing 强制— SELinux 策略强制执行,基于 SELinux 策略规则授予或拒绝主体对目标的访问
- Permissive 宽容— SELinux 策略不强制执行,不实际拒绝访问,但会有拒绝信息写入日志
- Disabled 禁用— 完全禁用SELinux
#SELinux的模式可以直接在/etc/selinux/config文件中修改(重启生效)
#也可以按如下方式临时设定:
getenforce #SELinux状态查看
setenforce 0 #设置为permissive模式
setenforce 1 #设置为enforcing模式
sestatus #可以查看完整的状态信息
2.问题引入
当我们搭建FTP服务端时,我们分以下两种情况进行讨论:
SELinux未开启时:
1.在/mnt下新建一个测试文件test1,并将其移动到FTP默认发布目录/var/ftp下,是可以被访问的。
2.匿名用户通过设置可以上传(put)文件。
3.使用"ls -Z /var/ftp"查看test1文件的type时显示"?"
4.使用"ps axZ | grep vsftpd"时有一处显示"?"
SELinux开启时:
1.在/mnt下新建一个测试文件test2,并将其移动到FTP默认发布目录/var/ftp下,不可以被访问。
2.匿名用户通过设置后仍然不能上传(put)文件。
3.使用"ls -Z /var/ftp"查看test2文件时有安全上下文信息。
4.使用"ps axZ | grep vsftpd"时也可以查看到进程的安全上下文。
- SELinux对文件的影响:
当Selinux开启时,内核会对每个文件及每个开启的程序进行标签加载,标签内记录程序和文件的安全上下文(context)。 - SELinux对程序功能的影响:
当SELinux开启会对程序的功能加载开关,并设定此开关的状态为关闭,当需要此功能时需要手动开启功能开关(sebool)。
3.SELinux的安全上下文
进程和文件都有属于自己的Context信息,Context分为几个部分,分别是 user:role:type:sensitivity:category。SELinux在运行过程中将使用这些信息查询安全策略进行决策。
- User:指示登录系统的用户类型,如root,user_u,system_u,多数本地进程都属于自由(unconfined)进程。
- Role:定义文件,进程和用户的用途:文件:object_r,进程和用户:system_r。
- Type:指定数据类型,规则中定义何种进程类型访问何种文件Target策略基于type实现,多服务公用:public_conten_t。
- Sensitivity:限制访问的需要,由组织定义的分层安全级别,如unclassified,secret,top,secret,一个对象有且只要一个sensitivity,分0-15级,s0最低,Target策略默认使用s0。
- Category:对于特定组织划分不分层的分类,如FBI Secret,NSA secret,一个对象可以有多个catagroy,c0-c1-23共1024个分类,Target策略不适用category。
☆查看安全上下文
ls -Z [文件] #查看文件的安全上下文
ls -Zd [目录] #查看目录的安全上下文
ps auxZ #查看进程的安全上下文
☆临时修改安全上下文
在我们的实际生产环境中跟文件权限最相关的是位于第三字段的数据类型。
#临时修改(selinux重启后还原):
chcon -t [标签] [文件|目录]
chcon -Rt [标签] [目录] #递归修改目录和目录下的文件
#-r ROLE:修改安全上下文角色的配置
#-t TYPE:修改安全上下文类型的配置
#-u USER:修改安全上下文用户的配置
举例:
chcon -t public_content_t /var/ftp/test2
# 将test2文件的安全上下文修改成/var/ftp相同的就可以被访问了。
☆永久修改安全上下文
semanage fcontext -l #查看内核安全上下文列表
semanage fcontext -a -t public_content_t '/testdir(/.*)?'
# (/.*)?这个后缀表示修改目录本身和里面的所有内容
restorecon -RvF /testdir/ #刷新安全上下文
touch /.autorelabel #重启系统时selinux初始化文件标签开关文件
4.SEBOOL
getsebool -a #显示服务的bool值
setsebool -P ftpd_anon_write on #-P直接将设置值写入配置文件
案例:解决“匿名用户通过设置后仍然不能上传(put)文件”的问题。
问题背景:
1.SELinux开启
2.在FTP主配置文件中允许了匿名用户上传
3.设置/var/ftp/pub这个目录所有组是ftp,权限是775
4.更改安全上下文为可写
此时还是不能上传文件。
解决方式:
getsebool -a|grep ftp
#ftpd_anon_write --> off
#发现匿名用户可写的功能是关闭的
setsebool -P ftpd_anon_write on
#再次测试 上传成功
5.SEPORT
semanage port -l #查看端口标签
semanage port -a -t http_port_t -p tcp 8888 #添加端口标签
案例:把http的服务端口由80改为8888发现重启服务失败。
semanage port -l|grep http
#查看http的端口,发现只能使用查询到的几个端口,不能用8888端口
semanage port -a -t http_port_t -p tcp 8888
#添加端口标签后重启成功。
6.SELinux解决方案
- selinux警告信息会存放在/var/log/audit/audit.log下。
- 系统的日志信息:/var/log/messages。
setroubleshoot软件可以采集SELinux警告信息并得到解决方案,并把解决方案存放到/var/log/messages中。