SELinux
Security-Enhanced Linux 安全强化Linux
工作原理:
通过MAC(Mandatory Access Control 强制访问控制 )的方式控制管理进程
**控制主体:**进程
目标: 被主体访问的资源,可以是文件、目录、端口等等
策略: 依靠某些服务制订基本的访问安全策略
策略类型 | 特点 |
---|---|
targeted | 针对网络服务的限制较多,针对本机的限制较少,是默认策略 |
strict | 完整的SELinux 限制,较严格 |
安全上下文 | 主体访问目标需要策略指定,主体与目标的安全上下文必须一致,以及文件系统的rwx权限设置 |
安全上下文:
查看:
[root@server ~]# ll -Z
[root@server ~]# ll -Z-rw-------. 1 root root system_u:object_r:admin_home_t:s0 1014 9月 24 10:43 anaconda-ks.cfg
-rw-r--r--. 1 root root unconfined_u:object_r:admin_home_t:s0 1081 11月 11 13:24 fa
-rw-r--r--. 1 root root unconfined_u:object_r:admin_home_t:s0 807 11月 2 10:43 ystemc
通过冒号分为四个部分:
identify :role : type : level
-
identify(身份标识):SELinux用户身份,主要有以下三种类型:
身份 说明 root 表示root账号身份 system_u 表示程序方面的标识,通常是进程 unconfined_u 一般是用户账号相关的身份 -
role(角色): 表明该数据是属于程序、文件资源还是用户,一般有以下类型:
角色 说明 object_r 文件或目录等文件资源 system_r 进程 -
type(类型):标识文件类型或进程域;进程只能访问相同类型的文件
例子:一个Web服务器进程可能被标记为
httpd_t
类型,这意味着它只能访问同样标记为httpd_t
类型的文件 -
level:表明信息的敏感程度,一般用s0、s1、s2来命名(越大越敏感)
例子:S1的进程不能访问S2的文件,只能访问S1和S0的文件
SELinux的设置:
修改模式:
SELinx的三种模式:
-
enforcing:强制模式
代表SELinux正在运行中,开始限制domain/type
-
permissive : 宽容模式
代表SELinux正在运行,但只有警告信息,不会实际限制domain/type的访问
-
disabled:关闭
SELinux被关闭,未运行
#查看当前的模式
[root@server ~]# getenforce
Enforcing
#查看当前SELinux的情况
[root@server ~]# sestatus
SELinux status: enabled #是否启用了SELinux
SELinuxfs mount: /sys/fs/selinux #SELinux的相关文件数据的挂载点
SELinux root directory: /etc/selinux
Loaded policy name: targeted #目前在使用的策略
Current mode: enforcing #现在的模式
Mode from config file: enforcing #配置中默认的模式
Policy MLS status: enabled
Policy deny_unknown status: allowed
Memory protection checking: actual (secure)
Max kernel policy version: 33
#查看/修改SELinux的策略
[root@server ~]# vim /etc/selinux/config
修改安全上下文:
chcon:
#命令
chcon [-R] [-t type] [-u user] [-r role] 文件
# -R: 连同子目录一起递归修改
# -t: 指定安全上下文的类型
# -u: 指定身份
# -r: 指定角色
chcon [-R] --reference=范例文件 文件 #将文件的安全上下文按照范例文件修改
restorecon:
#将文件修改回默认的上下文
restorecon [-Rv] 文件或目录
# -R:连同子目录一起修改;
# -v:将过程显示到屏幕上
默认selinux type类型记录在/etc/selinux/targeted/contexts/
目录内。
semanage:
contexts
目录内有很多不同的数据,所以用semanage
的功能来查询与修改。
semanage {login|user|port|interface|fcontext|translation} -l
semanage fcontext -{a|d|m} [-frst] file_spec
# -l : 查询;
# -a:增加一些目录的默认安全上下文的设置;
# -m:修改;
# -d:删除
# -f:指定文件类型,file、dir等。
# -r:指定 SELinux 用户角色。
# -s:指定 SELinux 用户类型。
# -t:指定 SELinux 安全上下文类型。
实验:
实验1:
使用web服务演示安全上下文值的设定
服务器(192.168.111.128):
使用enforcing模式访问自定义网站
[root@server ~]# systemctl stop firewalld.service
[root@server ~]# getenforce
Enforcing
[root@server ~]# cat /etc/nginx/conf.d/ip.conf
server{listen 192.168.111.128:80;root /www/ip/128;location /{}
}
[root@server ~]# cat /www/ip/128/index.html
this is 128# nginx配置没有问题,但访问出现403
[root@server ~]# curl 192.168.111.128
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.26.1</center>
</body>
</html>
修改自定义目录的安全上下文的值:
[root@server ~]# chcon -t httpd_sys_content_t /www /www/ip
[root@server html]# curl 192.168.111.128
this is 128
#能在selinux开启Enforcing 的前提下正常访问自定义网站
实验2:
使用web服务端口的改变来演示端口的设定
使用enforcing模式访问自定义端口的网站
[root@server ~]# cat /etc/nginx/conf.d/port.conf
server{listen 192.168.111.128:10000;root /www/port/10000;location /{}
}
[root@server ~]# cat /www/port/10000/index.html
this is 10000
#nginx配置无问题,但重启nginx失败
修改安全上下文:
#添加一条新的上下文
[root@server conf.d]# semanage port -a -t http_port_t -p tcp 10000
#即可成功启动nginx并访问自定义端口的网站