SELlinux
SELlinux(基于Red_Hat_Enterprise_Linux_8) #
概述 #
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
# 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
用户管理 #
安装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/出现以下错误
该怎样解决呢???
排错:
首先将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)的报错