目录

SELlinux

SELlinux(基于Red_Hat_Enterprise_Linux_8) #

概述 #

image-20210124205447982

May do to ?

SUbject:主体 ,是个进程

Object:对象,是文件、设备、套接字或者任何可被主体访问的资源

Action: 动作,就是主体对象执行的操作,读、写等

简介:

SELinux:Secure Enhanced Linux,是美国国家安全局(NSA=The National Security Agency)和SCC(Secure Computing Courporation)开发的LInux的一个强制控制的安全模块。2000年以GNU GPL发布,Linux内核2.6版本后继承在内核中。

访问控制类别:

DAC:Discretionary Access Control 自由访问控制

MAC:Mandatory Access Control 强制访问控制

DAC和MAC的特点:

DAC环境下进程是无束缚的

MAC环境下策略的规则决定控制的严格程度

MAC环境下进程可以被限定的

策略被用来定义被限定的进程能够使用那些资源(文件和端口)

默认情况下,没有被明确允许的行为将被拒绝

SELinux状态管理 #

信息获取

# getenforce
  Enforcing
注:enforcing 	强制模式,阻止违反规则的行为并记录到日志中
   permissive    宽容模式,不阻止违反规则的行为,仅记录到日志中
   disabled		 关闭SELinux
   
# cat /sys/fs/selinux/enforce		---->查看SELinux的伪文件,返回布尔值
  1
# cat /etc/selinux/config			---->在centos7或红帽系统7之后selinux的配置文件
  # 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=enforcing
  # 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

修改工作模式

​ 临时修改

​ 支持:enforcing <------> permissive

​ 不支持:更改到disabled或者从disabled更改为其他模式

# setenforce  
  usage:  setenforce [ Enforcing | Permissive | 1 | 0 ]
永久修改

​ 修改配置文件/etc/selinux/config中的SELINUX,并且重启系统

​ 从原有disabled修改enforcing,需要在重启时重打文件标签

# touch /.autorelabel -------->在disabled改为其他模式时,为了加快系统重启速度,可以在根目录下创建隐藏文件autorelabel
# reboot

​ 注意:在重启时,重新打标签的时间可能会比较长

SELinux中“一切都得有一个标签” label=context #

所有用户、文件、进程、网络端口等资源都具有与其有关联的SELinux标签/上下文

SELinux策略是基于资源的标签/上下文进行的

普通文件俺对象的SELinux标签/上下文存储在文件系统的扩展属性 -------->inode

image-20210124214739975

# id -Z			----->用户
  unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
  SELinux user SELinux relo SELinux type Sensitivity level		MCS,MLS
# ps -eZ|grep httpd|head -n 1		------->进程
  system_u:system_r:httpd_t:s0       6164 ?        00:00:00 httpd
# ls -Z anaconda-ks.cfg				------->普通文件
system_u:object_r:admin_home_t:s0 anaconda-ks.cfg

用户管理 #

image-20210124220441520

安装semanage命令 ------>不会的相关参数,可以查看man帮助

# Radhat系列安装
# 查找semanage的rpm包
# yum provides semanage
# yum provides semanage
  Updating Subscription Management repositories.
  Last metadata expiration check: 1:10:26 ago on Sun 24 Jan 2021 07:58:34 AM EST.
  policycoreutils-python-utils-2.8-16.1.el8.noarch : SELinux policy core python utilities
  Repo        : rhel-8-for-x86_64-baseos-rpms
  Matched from:
  Filename    : /usr/sbin/semanage

  policycoreutils-python-utils-2.9-3.el8.noarch : SELinux policy core python utilities
  Repo        : rhel-8-for-x86_64-baseos-rpms
  Matched from:
  Filename    : /usr/sbin/semanage

  policycoreutils-python-utils-2.9-3.el8_1.1.noarch : SELinux policy core python utilities
  Repo        : rhel-8-for-x86_64-baseos-rpms
  Matched from:
  Filename    : /usr/sbin/semanage

  policycoreutils-python-utils-2.9-9.el8.noarch : SELinux policy core python utilities
  Repo        : @System
  Matched from:
  Filename    : /usr/sbin/semanage

  policycoreutils-python-utils-2.9-9.el8.noarch : SELinux policy core python utilities
  Repo        : rhel-8-for-x86_64-baseos-rpms
  Matched from:
  Filename    : /usr/sbin/semanage
# yum install policycoreutils-python-utils -y

# Ubuntu
# 因Ubuntu自带apparmor,需要停止服务
apt update
systemctl stop apparmor

# 清除apparmor应用
apt remove apparmor
# 如果需要保留apparmor配置,改为
apt purge apparmor
# 更新系统,将系统重启
apt update & apt upgrade -y
root
# 安装SElinux相关的软件包
apt install selinux selinux-utils selinux-basics auditd audispd-plugins -y


实验:SELinux的用户管理

管理映射管理 Linus user -------> SELinux user

# 查看映射关系
semanage login -l
# 创建新的映射关系
semanage login -a -s staff_u tom
# 修改映射关系
semanage login -m -s sysadm_u tom
# 删除映射关系
semanage login -d tom

修改默认用户的映射关系

# 修改默认用户的敏感度等级
semanage login -m -r s0 __default__
# 修改默认用户的SELinux的用户
semanage login -m -s sysadm_u __default__
# 验证
semanage login -l

Login Name           SELinux User         MLS/MCS Range        Service

__default__          sysadm_u             s0                   *
# 恢复原来的配置只需将步骤反之即可

管理SELinux用户 SELinux user ---------> SELinux role

# 查看用户
semanage user -l
# 创建自定义用户
semanage user -a -R staff_r swift_u
# 修改自定义用户
semanage user -m -R "stass_r sysadm_r" swift_u
# 删除自定义用户
semanage user -d swift_u

布尔值 #

获取布尔值

# getsebool -a
abrt_anon_write --> off
abrt_handle_event --> off
abrt_upload_watch_anon_write --> on
antivirus_can_scan_system --> off
....省略....
zebra_write_config --> off
zoneminder_anon_write --> off
zoneminder_run_sudo --> off
# semange boolean -l
SELinux boolean                State  Default Description

abrt_anon_write                (off  ,  off)  Allow abrt to anon write
abrt_handle_event              (off  ,  off)  Allow abrt to handle event
abrt_upload_watch_anon_write   (on   ,   on)  Allow abrt to upload watch anon write
antivirus_can_scan_system      (off  ,  off)  Allow antivirus to can scan system
....省略....
zebra_write_config             (off  ,  off)  Allow zebra to write config
zoneminder_anon_write          (off  ,  off)  Allow zoneminder to anon write
zoneminder_run_sudo            (off  ,  off)  Allow zoneminder to run sudo
# ls -l /sys/fs/selinux/booleans/
-rw-r--r--. 1 root root 0 Jan 29 07:07 abrt_anon_write
-rw-r--r--. 1 root root 0 Jan 29 07:07 abrt_handle_event
-rw-r--r--. 1 root root 0 Jan 29 07:07 abrt_upload_watch_anon_write
....省略....
-rw-r--r--. 1 root root 0 Jan 29 07:07 zabbix_run_sudo
-rw-r--r--. 1 root root 0 Jan 29 07:07 zarafa_setrlimit
-rw-r--r--. 1 root root 0 Jan 29 07:07 zebra_write_config
-rw-r--r--. 1 root root 0 Jan 29 07:07 zoneminder_anon_write
-rw-r--r--. 1 root root 0 Jan 29 07:07 zoneminder_run_sudo

实验:考察SELinux的布尔值

修改默认的Boolean值

# getsebool user_exec_content
user_exec_content --> on
# setsebool user_exec_content off			------->使用的-p选项永久生效
# getsebool user_exec_content
user_exec_content --> off

# semanage login -a -s user_u tom
# semanage login -l

Login Name           SELinux User         MLS/MCS Range        Service

__default__          unconfined_u         s0-s0:c0.c1023       *
root                 unconfined_u         s0-s0:c0.c1023       *
tom                  user_u               s0                   *

Tom执行home及/tmp目录中的文件,查看实验结果

$ id -Z
user_u:user_r:user_t:s0
$ ./1.sh
-bash: ./1.sh: Permission denied
$ /tmp/1.sh 
-bash: /tmp/1.sh: Permission denied

修改SELinux user的配置需要重新登录才能生效,而修改系统的布尔值是立即神效的

文件的上下文 #

查看文件的SELinux上下文

# ls -Z ~/anaconda-ks.cfg 
system_u:object_r:admin_home_t:s0 /root/anaconda-ks.cfg

ls -dZ /root
system_u:object_r:admin_home_t:s0 /root
# touch ~/1.txt
# ls -Z ~/1.txt
unconfined_u:object_r:admin_home_t:s0 /root/1.txt

注;

创建新文件,会继承父文件夹的上下文

复制文件,会继承父文件夹上下文

移动文件,会保留原有的上下文

故障:将/root下的checktime文件移动到/etc/cron.d中,重启的crond服务,后发现crond出错

排错:查看crond的日志文件(/var/log/cron )发现以下错误:

((null)) Unauthorized SELinux context=system_u:system_r:system_cronjob_t:s0-s0:c0.c1023 file_context=unconfined_u:object_r:admin_home_t:s0 (/etc/cron.d/checktim)

这个错误表示checktime的SELinux文件类型与父文件夹/etc/cron.d的SELinux的类型不匹配

=> # ls -z

-rw-r–r–. 1 root root system_u:object_r:system_cron_spool_t:s0 128 Jun 12 2019 0hourly -rw-r–r–. 1 root root unconfined_u:object_r:admin_home_t:s0 26 Jan 29 10:02 checktim

排错方法1:

将/root文件夹中的checktime文件复制到/etc/cron.d中

=> # cp /root/checktime /etc/cron.d

=> # # ls -Z system_u:object_r:system_cron_spool_t:s0 0hourly unconfined_u:object_r:**admin_home_t:**s0 checktim unconfined_u:object_r:system_cron_spool_t:s0 checktim2

=> # systemctl restart crond.service

修改文件的SELinux上下文 #

-> 修改上下文:chcon

# 直接修改
# chcon -v -t system_cron_spool_t /etc/cron.d/checktime 
changing security context of '/etc/cron.d/checktime'
# ls -Zl /etc/cron.d
total 8
-rw-r--r--. 1 root root system_u:object_r:system_cron_spool_t:s0     128 Jun 12  2019 0hourly
-rw-r--r--. 1 root root unconfined_u:object_r:system_cron_spool_t:s0  26 Jan 31 08:35 checktime

# "照猫画虎"
# chcon --reference /etc/cron.d/0hourly /etc/cron.d/checktime 
# ls -lZ /etc/cron.d
total 8
-rw-r--r--. 1 root root system_u:object_r:system_cron_spool_t:s0 128 Jun 12  2019 0hourly
-rw-r--r--. 1 root root system_u:object_r:system_cron_spool_t:s0  26 Jan 31 08:38 checktime

-> 恢复上下文 restorecon

SELinux默认值的位置:/etc/selinux/targeted/contexts/files/file_contexts

# 查看定时服务的有关SELinux的默认配置
# cat /etc/selinux/targeted/contexts/files/file_contexts|grep /etc/cron
  ...略...
  /etc/cron\.d(/.*)?	system_u:object_r:system_cron_spool_t:s0
  ...略...
  
# restorecon /etc/cron.d/checktime           注:如果使用-F参数,则恢复所有字段
# ls -Zl
-rw-r--r--. 1 root root system_u:object_r:system_cron_spool_t:s0     128 Jun 12  2019 0hourly
-rw-r--r--. 1 root root unconfined_u:object_r:system_cron_spool_t:s0  26 Jan 31 08:31 checktime

----> 管理默认的上下文 semanage fcontext

实验:

实验环境准备

# 创建app1
# mkdir /var/www/html/app1
# echo "App1 page" > /var/www/html/app1/index.tml

# 创建app2
# mkdir /app2
# ehco "App2 page" > /app2/index.html
# vim /etc/httpd/conf.d/app2.conf
	Alias /app2 "/app2"
	<Directory "/app2">
 	 Require all granted
	</Directory>

访问wdbut.top/app1/index.html和wdbut.top/app2/出现以下错误

image-20210131221324392

image-20210131221349533

该怎样解决呢???

排错:

首先将SELinux临时关闭,再次访问,发现访问/app2是能够被访问,说明问题出现在SELinux配置上

然后进行排错

# 分别查看app1和app2的index文件
ls -Z /var/www/html/app1/index.tml 
unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/app1/index.tml
ls -Z /app2/index.html 
unconfined_u:object_r:default_t:s0 /app2/index.html
#从以上的内容来看,SELinux上下文的类型不同,就导致/app2/index.html无法被安全访问

# 方法:
# 1.给/app2的所有文件添加httpd_sys_content_t属性
semanage fcontext -a -t httpd_sys_content_t "/app2(/.*)?"
# 2.使用restorecon命令将/app2包括/app2下的所有文件恢复成http_sys_content_t的属性
restorecon /app2 -v -R
Relabeled /app2/index.html from unconfined_u:object_r:default_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0

进程和端口 #

进程 #

与文件的SElinux上下文不同,文件的SELinux上下文可以被修改,而进程的SELinux上下文在SELinux的策略中默认是不允许被修改。

例:

ps -eZ|grep httpd
system_u:system_r:httpd_t:s0      85280 ?        00:00:00 httpd
system_u:system_r:httpd_t:s0      85281 ?        00:00:00 httpd
system_u:system_r:httpd_t:s0      85282 ?        00:00:00 httpd
system_u:system_r:httpd_t:s0      85283 ?        00:00:00 httpd
system_u:system_r:httpd_t:s0      85284 ?        00:00:00 httpd

管理工具

默认安装

libselinux-utils ----------> SELinux的核心工具

​ 常用的核心命令

​ avcstat、getenforce、setenforce、matchpathcon avcstat

policycoreutils ----------> SELinux策略的核心实用程序

​ 常用的核心命令

​ secon、fixfiles、genhomedircon、restorecon、semodule、sestatus、sefiles、setsebool

通常需要额外安装的

policycoreutils-python-utils ---------> 管理SELinux环境的管理工具

settools-console -------------------------> SELinux策略分析工具

排错 #

做好排错的第一步

​ 应用程序直接输出的信息

​ 原始日志文件

​ /var/log/messages ----------------> 系统日志

​ /var/log/audit/audit.log ----> 审计日志

例
cat /var/log/messages | grep "SELinux is preventing"
cat /var/log/audit/audit.log | grep "denied" 

​ /var/log/secure

​ 辅助工具:ausearch、sealert

守护进程 记录到的日志文件
auditd on /var/log/audit/audit.log
auditd off && rsyslogd on /var/log/messages
auditd on && rsyslogd on && setroudleshootd on /var/log/audit/audit.log 同时将易读的日志此信息发送到: /var/log/messages

SElinux故障的“Top 3”

​ 上下文/标签

​ 布尔值

​ 新的SELinux规则与旧应用程序的矛盾

辅助工具:ausearch

​ 参数: -c =====> 命令或者服务的名称

​ -m =====> 消息的类型

ausearch -m    #按消息类型查找
ausearch -ul   #按登陆ID查找
ausearch -ua   #按uid和euid查找
ausearch -ui   #按uid查找
ausearch -ue   #按euid查找
ausearch -ga   #按gid和egid查找
ausearch -gi   #按gid查找
ausearch -ge   #按egid查找
ausearch -c    #按cmd查找
ausearch -x    #按exe查找
ausearch -sc   #按syscall查找
ausearch -p    #按pid查找
ausearch -sv   #按syscall的返回值查找(yes/no)
ausearch -f    #按文件名查找
ausearch -tm   #按连接终端查找(term/ssh/tty)
ausearch -hn   #按主机名查找
ausearch -k    #按特定的key值查找
ausearch -w    #按在audit rule设定的字符串查找

例:

ausearch -m avc -c su

time->Thu Feb  4 20:17:25 2021
type=PROCTITLE msg=audit(1612441045.720:8940): proctitle="su"
type=SYSCALL msg=audit(1612441045.720:8940): arch=c000003e syscall=257 success=no exit=-13 a0=ffffff9c a1=7fd2632cc850 a2=2 a3=0 items=0 ppid=89700 pid=89725 auid=1001 uid=1001 gid=1001 euid=0 suid=0 fsuid=0 egid=1001 sgid=1001 fsgid=1001 tty=pts1 ses=69 comm="su" exe="/usr/bin/su" subj=user_u:user_r:user_t:s0 key=(null)
type=AVC msg=audit(1612441045.720:8940): avc:  denied  { read write } for  pid=89725 comm="su" name="lastlog" dev="vda3" ino=26814405 scontext=user_u:user_r:user_t:s0 tcontext=system_u:object_r:lastlog_t:s0 tclass=file permissive=0

通过文本处理一下
||
||
||
\/
time->Thu Feb  4 20:17:25 2021
type=PROCTITLE msg=audit(1612441045.720:8940): proctitle="su"
type=SYSCALL 
msg=audit(1612441045.720:8940): arch=c000003e 
syscall=257 success=no exit=-13 
a0=ffffff9c a1=7fd2632cc850 a2=2 a3=0 
items=0 ppid=89700 
pid=89725 
auid=1001 
uid=1001 gid=1001 euid=0 suid=0 fsuid=0 egid=1001 sgid=1001 fsgid=1001 
tty=pts1 
ses=69 
comm="su" exe="/usr/bin/su" 
subj=user_u:user_r:user_t:s0 
key=(null)

type=AVC 
msg=audit(1612441045.720:8940): 
avc:  denied  { read write } for  pid=89725 
comm="su" name="lastlog" dev="vda3" ino=26814405 
scontext=user_u:user_r:user_t:s0 
tcontext=system_u:object_r:lastlog_t:s0 
tclass=file 
permissive=0

辅助工具2:sealert=====>安全日志分析工具

例:

sealert -a /var/log/audit/audit.log
...略...
--------------------------------------------------------------------------------

SELinux is preventing /usr/bin/su from 'read, write' accesses on the file lastlog.

*****  Plugin catchall (100. confidence) suggests   **************************

If you believe that su should be allowed read write access on the lastlog file by default.
Then you should report this as a bug.
You can generate a local policy module to allow this access.
Do
allow this access for now by executing:
# ausearch -c 'su' --raw | audit2allow -M my-su
# semodule -X 300 -i my-su.pp


Additional Information:
Source Context                user_u:user_r:user_t:s0
Target Context                system_u:object_r:lastlog_t:s0
Target Objects                lastlog [ file ]
Source                        su
Source Path                   /usr/bin/su
Port                          <Unknown>
Host                          <Unknown>
Source RPM Packages           util-linux-2.32.1-24.el8.x86_64
Target RPM Packages
...略...

注(各类日志): #

审计日志:/var/log/audit/audit.log

系统日志:/var/log/messages

实例记录 #

修改ssh端口

# 修改ssh配置文件,将端口改为22521,在没有把新端口配置好之前,还是将22端口保持打开
Port 22
Port 22521

# 查看ssh在SElinux中的安全字段
semanage port -l|grep ssh
# =====输出=====
ssh_port_t                     tcp      22

# 把22521端口添加到SElinux配置中
semanage port -a -t ssh_port_t -p tcp 22521
# 查看是够添加成功
ssh_port_t                     tcp      22521, 22

# 如果将防火墙开启,需将22521添加到防火墙开放配置中,并将重新加载防火墙
firewall-cmd --permanent --add-port=22521/tcp;firewall-cmd --reload
# 查看是否添加成功
[root@zabbix-server ~]# firewall-cmd --query-port=22521/tcp
yes

# 添加成功后将22端口禁用即可

部署mysql数据库,并修改数据存储位置

安装数据库(yum)

yum install -y mysql-server

创建新的数据库目录,查看目录安全上下文,并在mysql配置文件(/etc/my.cnf.d/mysql-server.cnf)中进行修改

vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
datadir=/data
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysql/mysqld.log
pid-file=/run/mysqld/mysqld.pid

# ls -ldZ /data
unconfined_u:object_r:default_t:s0 /data

而mysql舒勇数据目的安全上下文是system_u:object_r:mysqld_db_t:s0,需要将/data改成一致即可

# chcon --reference=/var/lib/mysql /data -R
# ls -dZ /data/
system_u:object_r:mysqld_db_t:s0 /data/

需要将新存储目录的属组和属主改为mysql用户,不然或出现mysqld: Can’t create/write to file ‘/data/is_writable’ (OS errno 13 - Permission denied)的报错

Security - AppArmor | Ubuntu