文章目录
- SELinux说明
- SELinux 的运行模式
- SElinux命令
SELinux 是 Security-Enhanced Linux 缩写,安全强化的linux
系统资源都是通过程序进行访问的,如果将/var/www/html权限设置为777,代表所有程序均可以对该目录访问,如果已启动www服务软件,那么该软件触发的进程将可以写入该目录,而该进程是对整个internet提供服务的。
为了控制这方面的权限与进程问题,出现SELinux
SELinux说明
对程序、文件灯权限设置依据的一个内核模块。由于启动网络服务的也是程序,因此刚好也是能够控制网络服务能否访问系统资源的一道关卡。
1、传统的文件权限与账号的关系:
自主访问控制,DAC(Discretionary Access Control)----针对用户权限
当某个进程想要对文件进行访问时,系统就会根据该进程的所有者/用户组,并比较文件的权限,若通过权限检查,就可以访问该文件了。各种权限设置对root用户无效
2、以策略规则指定特定程序读取特定文件
强制访问控制,MAC(Mandatory Access Control)----针对程序进程的权限
MAC可以针对特定的进程与特定的文件资源来进行权限的控制
即使用root权限,使用不同进程,取得的权限并不一定是root,而要看当时该进程的设置
这个进程也不能任意使用系统资源,因为每个文件资源也有针对进程设置可取用的权限
SELinux 的运行模式
通过MAC的方式控制管理进程,控制的主体是进程,而目标则是该进程能否读取的文件资源
主体subject : 进程
==目标 object : == 被主体访问的资源,可以是文件、目录、端口
==策略 policy : ==由于进程与文件数量庞大,SELinux会依据某些服务 来指定基本的访问安全策略。
这些策略还有详细规则(rule)来指定不同服务开放某些资源的访问与否
- targeted : 针对网络服务限制多,针对本机限制少,是默认的策略
- strict : 完整的SELinux限制, 限制方面严格
安全上下文(security context)
主体能否访问目标除了策略指定外,主体与目标的安全上下文必须相互匹配才能顺利访问
最终文件的成功访问还是与文件系统的rwx权限设置有关
查看安全上下文
安全上下文用冒号分为四个字段
- 身份标识 (Identify):相当于账号方面的身份标识,主要有以下三种常见的类型
root 表示root的账号身份;
system_u 表示程序方面的标识,通常就是进程;
unconfined_u 代表的是一般用户账号相关的身份
- 角色(role):通过角色字段,可知道这个数据是属于程序、文件资源还是代表用户。一般角色有:
object_r:代表的是文件或目录等文件资源
system_r: 代表的进程
- 类型(type):在默认的targeted 策略中, Identify 与 role字段基本上是不重要的,重要的在于这个类型字段。
type: 在文本资源上称为类型
domain:在主体程序中则成为域
domain 需要与type搭配,则该程序才能够顺利读取文件资源
- MLS和MCS相关,代表灵敏度,一般用s0 s1 s2命名,数字代表灵敏度的分级。数值越大、灵敏度越高
例如:http服务已经给程序和文件设置了安全上下文
/usr/sbin/httpd:type ——> httpd_exec_t
/var/www/html ——> httpd_sys_content_t
以上两个文件的角色字段都是object_r ,代表都是文件
/usr/sbin/httpd属于httpd_exec_t类型,代表它是一个可执行的文件
/var/www/html则属于httpd_sys_content_t类型
访问过程
(1)首先,触发具有httpd_exec_t这个类型的/usr/sbin/httpd这个可执行文件
(2)该文件的类型会让这个文件所造成的主体进程具有httpd这个域,我们的策略已经针对这个域指定了许多规则,其中包括这个域可以读取的目标资源类型
(3)由于httpd_domain被设置为可读取httpd_syscontent_t这个类型的目标文件,因此httpd进程就能够读取在/var/www/html目录下面的文件了
(4)最终能否读到/var/www/html目录下面的数据,还要看rwx是否符合linux权限的规范
进程安全上下文
http进程——>system_u:system_r:httpd_t
system_r 代表进程
文件的type字段为httpd_exec_t ----- 执行之后type字段变成httpd_t
判断httpd进程是否可以访问/var/www/html-----通过httpd进程的type字段和/var/www/html的type字段 是否匹配
httpd_t 和 httpd_sys_content_t是否匹配
目前使用的模式是targeted , 忽略id和role字段,主要看type字段
SElinux命令
1、SELinux状态
2、查看selinux策略
改变策略之后需要重新启动
如果由enforce或permissive改成disabled , 或由disabled 改为其他两个,也必须要重新启动
将selinux模式在enforce和permissive之间切换的方法为:
setenforce 0 转换成permissive 宽容模式
setenforce 1 转换成enforcing 强制模式
修改完后重启
3、查询安全上下文
getsebool -a 列出目前系统上面的所有布尔值条款
4、SELinux的启动、关闭与查看
三种模式:
- enforcing: 强制模式,代表SELinux正在运行中,开始限制domain/type
- permissive: 宽容模式,代表SELinux正在运行中,不过仅会有告警信息并不会实际限制domain / type的访问
- disabled : 关闭,SELinux并没有实际运行
查看目前的模式
getenforce
查看目前的selinux使用策略
sestatus
配置目前Selinux策略
vim /etc/selinux/config
5、还原默认的安全上下文
系统默认的目录都有特殊的selinux安全上下文,/var/www/html原本就是httpd可以读取的目录。所以如果修改错误可以使用restorecon还原默认的安全上下文
restorecon -Rv 文件或目录
-R 连通子目录一起修改
-v 将过程显示到屏幕上
restorecon 怎么知道每个目录记载的默认selinux type类型呢?
因为系统将每个目录的默认selinux type类型记录在/etc/selinux/target/contexts/目录内
但是该目录内有很多不同的数据,所以可以用semanage这个命令的而功能来查询与修改
6、查询和修改安全上下文
semanage
man semanage-port
semanage port -a -t http_port_t -p tcp 81
允许apache服务可以通过tcp port 81访问
-t SELinux type for the object (目标的类型)
例:如果现在是通过安全上下文实现8089端口去访问httpd这个服务
最开始的配置
关闭SElinux , 看到是自定义的页面
开启SElinux , 只能看到测试页面
修改vhost文件
启动时存在问题
执行journalctl -xe查看报错信息
SELinux is preventing httpd from name_bind access on the tcp_socket port 8089.
SELinux阻止了通过tcp的8089端口访问httpd
但是这里报错信息也告诉了应该怎么做
If you want to allow httpd to bind to network port 8089
Then you need to modify the port type.
semanage port -a -t PORT_TYPE -p tcp 8089
这里的PORT_TYPE也给出了相关可选类型
所以可以这样修改
[root@localhost www]# semanage port -a -t http_port_t -p tcp 8089
没有报错,且SElinux状态是开启的