Linux ❀ RHCE自研教学笔记 - Redhat 8.2 SeLinux服务教研笔记

Posted 国家级干饭型选手°

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux ❀ RHCE自研教学笔记 - Redhat 8.2 SeLinux服务教研笔记相关的知识,希望对你有一定的参考价值。


SeLinux是Security-Enhanced Linux的缩写,意思是安全强化的Linux;SeLinux由美国国家安全局开发,是为了避免资源误用;资源访问是通过程序进行的,如果将/var/www/html权限设置为777,那么代表所有程序都可以访问该目录,此时启动www服务软件,那么该软件触发的进程将写入该目录,而该进程是对整个物联网提供服务的,NSA为了控制这方面权限与进程的问题,就使用Linux作为目标来研究,最终将研究结果整合到内核中就形成了SeLinux;
SeLinux是对程序、文件等权限设置依据的一个内核模块,由于启动网络服务也是程序,因此也是能够控制网络服务能否访问系统资源的一道关卡;

  • 传统的文件权限与账户关系:DAC 自主访问控制 Discretionary Access Control
    当某个进程要对文件进行访问时,系统就会根据该进程的所有者/用户组,并比较文件的权限,若通过权限检查,就可以访问到该目录文件,对root账户无效;

  • 以策略规则制定特定的程序读取文件:MAC 强制访问控制 Mandatory Access Control
    MAC可以针对特定的进程与特定的文件资源来进行权限控制,登录账户即使为root,在使用不同的进程时,获取到的权限也不一定是root权限,而需要查看此进程的权限设定,此时就可以针对不同用户对资源的访问控制,每个文件资源有针对进程可获取的权限,单个系统的进程非常多,此时SeLinux提供了一些默认的策略,并在该策略内提供了多个规则;

1、运行模式


SeLinux是通过MAC的方式来控制管理进程,它控制的主体是进程,而目标是该进程是否能够读取的文件资源;

  • 主体 subject:即进程;
  • 目标 object:被主体访问的资源,可以是文件、目录、端口等;
  • 策略 policy:由于进程与文件数量庞大,因此SeLinux会依据某些服务来制定基本的访问安全策略,这些策略还会有详细的规则来指定不同的服务开放某些资源的访问与否,目前主要的策略有如下几点:
    • targeted - 针对网络服务限制较多,针对本机限制较少,是默认的策略;
    • strict:完整的SeLinux限制,限制方面比较严格;
  • 安全上下文 security context:主体能不能访问目标除了策略指定外,主体与目标的安全上下文必须一致才能够访问;

最终文件的成功访问还是与文件系统的rwx权限设置有关;

2、查看安全上下文


[root@localhost ~]# ls -Z
unconfined_u:object_r:admin_home_t:s0 111.txt
身份标识 : 角色 : 类型 : 灵敏度
unconfined_u:object_r:named_zone_t:s0 1D
unconfined_u:object_r:admin_home_t:s0 66c221be-6ab2-ef53-1589-fe16877914f4.pl
unconfined_u:object_r:admin_home_t:s0 66c221be-6ab2-ef53-1589-fe16877914f4.sh
    system_u:object_r:admin_home_t:s0 anaconda-ks.cfg
unconfined_u:object_r:admin_home_t:s0 Desktop
unconfined_u:object_r:admin_home_t:s0 Documents
unconfined_u:object_r:admin_home_t:s0 Downloads
    system_u:object_r:admin_home_t:s0 initial-setup-ks.cfg
unconfined_u:object_r:admin_home_t:s0 Music
unconfined_u:object_r:admin_home_t:s0 Pictures
unconfined_u:object_r:admin_home_t:s0 Public
unconfined_u:object_r:admin_home_t:s0 Templates
unconfined_u:object_r:admin_home_t:s0 test
unconfined_u:object_r:admin_home_t:s0 Videos
  • 身份标识 identify:相当于账号方面的身份标识,主要有三种常见类型:
    • root:表示root的账号身份;
    • system_u:表示程序方面的标识,即进程;
    • unconfined_u:代表一般用户相关的身份;
  • 角色 role:通过角色字段,可知道这个数据是属于程序、文件资源还是代表用户,一般角色有:
    • object_r:代表文件或目录等文件资源;
    • system_r:代表进程;
  • 类型 type:在默认把的targeted策略中,identity与role字段基本上是不重要的,重要的是类型字段,而类型字段在文件和进程中的定义是不同的,如下:
    • type:文件资源称为类型;
    • domain:进程称为域;
    • domain需要与type搭配,则该程序才能够顺利读取到文件资源;
  • 灵敏度:与MLS和MCS相关,一般用s0、s1、s2来命名,数字代表灵敏度分级,数字越大,令敏度越高;
[root@localhost ~]# ps -Zaux | grep httpd
system_u:system_r:httpd_t:s0    root        3903  0.3  0.1 280348 13732 ?        Ss   10:31   0:00 /usr/sbin/httpd -DFOREGROUND
身份标识 : 角色 : 域 : 灵敏度
[root@localhost ~]# ll -Zd /var/www/html			/文件目录
drwxr-xr-x. 2 root root system_u:object_r:httpd_sys_content_t:s0 6 Dec  2  2019 /var/www/html
[root@localhost ~]# ll -Zd /usr/sbin/httpd 		/服务进程
-rwxr-xr-x. 1 root root system_u:object_r:httpd_exec_t:s0 580008 Dec  2  2019 /usr/sbin/httpd

上面两个文件的角色都是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_sys_content_t这个类型的目标文件,因此httpd进程就能够读取在/var/www/html目录下面的文件了;
  4. 最终能否读取到/var/www/html目录下的数据,还需要取决于是否满足rwx权限;

3、启动、关闭、查看SeLinux


SeLinux拥有三种模式:

  • enforcing 强制模式:SeLinux正在运行,限制domain/type;
  • permissive 宽容模式:SeLinux正在运行,只产生告警,不会限制domain/type;
  • disabled 关闭:关闭SeLinux;

查看目前SeLinux的运行状态

[root@localhost ~]# getenforce 
Permissive

查看SeLinux目前使用的策略

[root@localhost ~]# sestatus 
SELinux status:                 enabled				/是否启用SeLinux;
SELinuxfs mount:                /sys/fs/selinux		/文件数据挂载点;
SELinux root directory:         /etc/selinux		
Loaded policy name:             targeted			/目前策略为targeted;
Current mode:                   permissive			
Mode from config file:          permissive
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Memory protection checking:     actual (secure)
Max kernel policy version:      31

查看SeLinux的策略

[root@localhost ~]# vim /etc/selinux/config 
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=permissive
# SELINUXTYPE= can take one of these three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

4、修改SeLinux的模式

(1)通过命令修改

[root@localhost ~]# setenforce 0
[root@localhost ~]# getenforce 
Permissive
[root@localhost ~]# setenforce 1
[root@localhost ~]# getenforce 
Enforcing

(2)配置文件修改

[root@localhost ~]# vim /etc/selinux/config 
SELINUX=permissive
:wq

修改策略之后需要重新启动,由enforcing/permissive改为disabled,或由disabled改为permissive/enforcing必须要重新启动;

附:一次性关闭SElinux命令:

[root@localhost ~]# setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
#sed为shell脚本命令,具体细节后续发布,此处不做赘述

5、修改安全上下文案例,以HTTP服务为例


配置规范
chcon [-R ] [-t type] [-u user] [-r role] 文件路径

  • -R 连同该目录下的子目录同时修改
  • -t 类型
  • -u 身份识别
  • -r 角色
[root@localhost ~]# cat /etc/httpd/conf.d/vhost.conf
listen 8888
<directory /www>
	allowoverride none
	require all granted
</directory>
<virtualhost 192.168.39.139:8888>
	servername 192.168.39.139
	documentroot /www/139
</virtualhost>
[root@localhost ~]# mkdir -pv /www/139/
[root@localhost ~]# echo this is 8888 > /www/139/index.html
[root@localhost ~]# firewall-cmd --add-service=http
success
[root@localhost ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens160
  sources: 
  services: cockpit dhcpv6-client http ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
[root@localhost ~]# semanage port -l | grep -w 80
http_port_t                    tcp      80, 81, 443, 488, 8008, 8009, 8443, 9000
[root@localhost ~]# semanage port -a -t http_port_t -p tcp 8888
[root@localhost ~]# semanage port -l | grep -w 8888
http_port_t                    tcp      8888, 80, 81, 443, 488, 8008, 8009, 8443, 9000
[root@localhost ~]# systemctl restart httpd

[root@localhost ~]# ls -Zd /www/139/
unconfined_u:object_r:default_t:s0 /www/139/    httpd_t
[root@localhost ~]# ls -Zd /www/139/index.html 
unconfined_u:object_r:default_t:s0 /www/139/index.html

[root@localhost ~]# chcon -t httpd_exec_t /www/139/index.html 
[root@localhost ~]# ls -Zd /www/139/
unconfined_u:object_r:default_t:s0 /www/139/
[root@localhost ~]# ls -Zd /www/139/index.html 
unconfined_u:object_r:httpd_exec_t:s0 /www/139/index.html

[root@localhost ~]# curl http://192.168.39.129:8888
this is 8888

以上是关于Linux ❀ RHCE自研教学笔记 - Redhat 8.2 SeLinux服务教研笔记的主要内容,如果未能解决你的问题,请参考以下文章

Linux ❀ RHCE自研教学笔记 - Redhat 8.2 SFTP服务教研笔记

Linux ❀ RHCE自研教学笔记 - Redhat 8.2 SFTP服务教研笔记

Linux ❀ RHCE自研教学笔记 - Redhat 8.2 Nmcli服务教研笔记

Linux ❀ RHCE自研教学笔记 - Redhat 8.2 Nmcli服务教研笔记

Linux ❀ RHCE自研教学笔记 - Redhat 8.2 HTTP服务教研笔记

Linux ❀ RHCE自研教学笔记 - Redhat 8.2 FTP服务教研笔记