基于Linux之selinux中安全上下文、布尔值、监控冲突的管理及服务端口的设定

时间:2022-09-14 18:12:34

一、SELINUX

 

 1.基本 SELINUX 安全性概念

      SELINUX ( 安全增强型 Linux ) 是可保护你系统安全性的额外机制, 在某种程度上 , 它可以被看作是与标准权限系统并行的权限系统。在常规模式中 , 以用户身份运行进程 , 并且系统上的文件和其他资源都设置了权限 ( 控制哪些用户对哪些文件具有哪些访问权 SELINUX 的另一个不同之处在于 , 若要访问文件 ,你必须具有普通访问权限和 SELINUX 访问权限。因此 , 即使以超级用户身份root 运行进程 , 根据进程以及文件或资源的 SELinux 安全性上下文可能拒绝访问文件或资源限 ) 标签。

2.selinux 安全上下文访问规则

     WEB 服务器HTTPD 进程设置了 SELINUX 上下文system_u:system_r:httpd_t 标签。该上下文的重要部分是第三个用冒号分隔的字段 SELINUX 类型 : httpd_t系统上的文件和资源也设置了 SELINUX 上下文标签 , 并且重要的部分是 SELINUX 类型。例如 , /var/www/html 中的文件具有类型 httpd_sys_content_t 。 /tmp 和 /var/tmp 中的文件通常具有类型 tmp_t。
     Seliux 策略具有允许以 httpd_t 身份运行的进程访问标记为httpd_sys_content_t 的文件的规则。没有规则允许这些进程访问标记有 tmp_t 的文件 , 因此将拒绝这些访问 , 即使常规文件权限指出应该允许这些访问SELINUX 模式。

3.显示及更改 SELINUX 模式

  getenforce

 setenforce 0|1

 0 表示 permissive      # 警告

 1 表示 enforcing        # 强制

 

4.显示 SELinux 文件上下文

    什么确定文件的初始 SELinux 上下文 ? 通常是父目录。将父目录的上下文指定给新创建的文件。这对 vimcp 和 touch等命令起作用 , 但是 , 如果文件是在其他位置创建的并且保留了权限 ( 与 mv 或 cp -a 一样 ) 则还将保留 SELinux上下文许多处理文件的命令具有一个用于显示或设置 SELinux 上下文的选项 ( 通常是 -Z ) 。例如 , ps 、 ls 、 cp 和mkdir 都使用 -Z 选项显示或设置 SELinux 上下文。

                        实验一:修改 selinux 安全上下文     

chcon -t”   ————   一次性定制安全上下文 。

实验前提
[root@localhost ftp]# vim /etc/sysconfig/selinux
SELINUX=enforcing

[root@localhost ~]# lftp 172.25.254.126
lftp 172.25.254.126:~> ls
-rw-r--r--    1 0        0               0 May 05 07:22 file
drwxr-xr-x    2 0        0              30 Mar 07  2014 pub
lftp 172.25.254.126:/> quit
[root@localhost ~]# cd /mnt
[root@localhost mnt]# touch westos3
[root@localhost mnt]# cd /var/ftp
[root@localhost ftp]# ls
file  pub  westos3
[root@localhost ftp]# mv /mnt/westos3 /var/ftp/  ##移动是重命名的过程,不改变安全上下文。复制是新建的过程,改变安全上下文。

[root@localhost ftp]# ls
file  pub  westos3
[root@localhost ftp]# lftp 172.25.254.126       ##此时看不见新移动过来的文件
lftp 172.25.254.126:~> ls
-rw-r--r--    1 0        0               0 May 05 07:22 file
drwxr-xr-x    2 0        0              30 Mar 07  2014 pub
lftp 172.25.254.126:/> quit
[root@localhost ftp]# ls -Z westos3            ##查看安区上下文
-rw-r--r--. root root unconfined_u:object_r:mnt_t:s0   westos3
[root@localhost ftp]# ls -Z file
-rw-r--r--. root root system_u:object_r:public_content_t:s0 file   ##比对不同
[root@localhost ftp]# chcon -t public_content_t westos3   ##将westos3的安区上下文修改为public_content_t。
[root@localhost ftp]# ls -Z westos3
-rw-r--r--. root root unconfined_u:object_r:public_content_t:s0 westos3  ##修改成功。
[root@localhost ftp]# lftp 172.25.254.126
lftp 172.25.254.126:~> ls
-rw-r--r--    1 0        0               0 May 05 07:22 file
drwxr-xr-x    2 0        0              30 Mar 07  2014 pub
-rw-r--r--    1 0        0               0 May 06 08:51 westos3   ##此时查看则可以看到。
lftp 172.25.254.126:/> quit
[root@localhost ftp]# semanage fcontext -l |grep /var/ftp     ##查看看/var/ftp目录中许可的安区上下文。
/var/ftp(/.*)?                                     all files          system_u:object_r:public_content_t:s0 
/var/ftp/bin(/.*)?                                 all files          system_u:object_r:bin_t:s0 
/var/ftp/etc(/.*)?                                 all files          system_u:object_r:etc_t:s0 
/var/ftp/lib(/.*)?                                 all files          system_u:object_r:lib_t:s0 
/var/ftp/lib/ld[^/]*\.so(\.[^/]*)*                 regular file     

截图展示:

基于Linux之selinux中安全上下文、布尔值、监控冲突的管理及服务端口的设定

基于Linux之selinux中安全上下文、布尔值、监控冲突的管理及服务端口的设定

以上的修改是临时的,在selinux重启后配置会还原!!!!

[root@localhost ~]# mkdir /westos               #新建一个目录。用来将此目录指定为用户默认家目录。

[root@localhost ~]# touch /westos/westosfile

[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf    #添加家目录

 anon_root=/westos       #添加内容

 
[root@localhost ~]# systemctl restart vsftpd.service   #重启服务

[root@localhost ~]# ls -Z /var/ftp

-rw-r--r--. root root system_u:object_r:public_content_t:s0 file

-rw-r--r--. root root unconfined_u:object_r:mnt_t:s0   file2

drwxr-xr-x. root root system_u:object_r:public_content_t:s0 pub

drwxrwxrwt. root root system_u:object_r:mnt_t:s0       westos

-rw-r--r--. root root unconfined_u:object_r:public_content_t:s0 westos3

[root@localhost ~]# chcon -t public_content_t /westos -R     #将家目录安全上下文修改为public_content_t,-R表示目录本身及目录内所有。

[root@localhost ~]# lftp 172.25.254.126

lftp 172.25.254.126:~> ls

-rw-r--r--    1 0        0               0 May 12 02:02 westosfile    #此时可以查看

lftp 172.25.254.126:/> quit

[root@localhost ~]# touch /.autorelabel         #新建一个文件,此文件在重起后会自动重启selinux服务。

[root@localhost ~]# reboot                    #重启

Connection to 172.25.254.126 closed by remote host.

Connection to 172.25.254.126 closed.

[kiosk@foundation26 ~]$ ssh root@172.25.254.126  #重新连接

root@172.25.254.126's password:

Last login: Fri May 11 21:19:24 2018 from 172.25.254.26

[root@localhost ~]# lftp 172.25.254.126       

lftp 172.25.254.126:~> ls

lftp 172.25.254.126:/> quit                          

#此时无法看到文件,证明了chcon的修改是临时的                                                                                              [root@localhost ~]# ls -Z /westos
-rw-r--r--. root root unconfined_u:object_r:default_t:s0 westosfile   #安全上下文回到之前默认值
[root@localhost ~]# semanage fcontext -l | grep /westos
[root@localhost ~]#             #默认selinux重启后westos目录没有安全上下文

基于Linux之selinux中安全上下文、布尔值、监控冲突的管理及服务端口的设定

基于Linux之selinux中安全上下文、布尔值、监控冲突的管理及服务端口的设定

基于Linux之selinux中安全上下文、布尔值、监控冲突的管理及服务端口的设定

#此时无法看到文件,证明了chcon的修改是临时的

               实验二:semanage 命令    ————   永久性定制安全上下文 

[root@localhost ~]# semanage fcontext -a -t public_content_t '/westos(/.*)?' 
#永久修改wetos目录的安区上下文,-a,新建、-t,指定类型、'/westos(/.*)?‘,目录本身及其内所有内容和隐藏文件。/westos(/.*)?=/westos/*
[root@localhost ~]# restorecon -FvvR /westos/   #刷新配置
restorecon reset /westos context unconfined_u:object_r:default_t:s0->system_u:object_r:public_content_t:s0
restorecon reset /westos/westosfile context unconfined_u:object_r:default_t:s0->system_u:object_r:public_content_t:s0
[root@localhost ~]# lftp 172.25.254.126
lftp 172.25.254.126:~> ls
-rw-r--r--    1 0        0               0 May 12 02:02 westosfile   #此时可以查看
lftp 172.25.254.126:/> quit
[root@localhost ~]# reboot   #重启,.autorelabel文件和会默认在重启时重启selinux服务。
Connection to 172.25.254.126 closed by remote host.
Connection to 172.25.254.126 closed.
[kiosk@foundation26 ~]$ rht-vmctl view desktop 
[kiosk@foundation26 ~]$ ssh root@172.25.254.126
root@172.25.254.126's password: 
Last login: Fri May 11 22:10:13 2018 from 172.25.254.26
[root@localhost ~]# lftp 172.25.254.126
lftp 172.25.254.126:~> ls
-rw-r--r--    1 0        0               0 May 12 02:02 westosfile
lftp 172.25.254.126:/> quit           #此时可以查看,则永久修改成功。

基于Linux之selinux中安全上下文、布尔值、监控冲突的管理及服务端口的设定


                             实验三:管理 SELinux 布尔值

        SELinux 布尔值是更改 SELinux 策略行为的开关。 SELinux 布尔值是可以启用或禁用的规则。安全管理员可以使 SELinux 布尔值来调整策略 , 以有选择地进行调整许多软件包都具有 man page *_selinux(8), 其中详细说明了所使用的一些布尔值 ; man -k ‘_selinux’ 可以轻松地找到这些手册getsebool 用于显示布尔值 , setsebool 用于修改布尔值setsebool -P 修改 SELinux 策略 , 以永久保留修改。

semanage boolean -l 将显示布尔值是否永久。

[root@localhost ~]# ll -d /home/student     
drwxrwxr-x. 6 student student 1024 May 11 23:49 /home/student
#查看student用户的目录权限,此时是可写的,因此可以利用lftp上传文件。
[root@localhost ~]# lftp 172.25.254.126 -u student
Password: 
lftp student@172.25.254.126:~> ls
lftp student@172.25.254.126:~> put /etc/passwd
put: Access failed: 553 Could not create file. (passwd)
lftp student@172.25.254.126:~> quit     ##无法上传
[root@localhost ~]# setenforce 0        ##修改为警告模式
[root@localhost ~]# lftp 172.25.254.126 -u student
Password: 
lftp student@172.25.254.126:~> ls      
lftp student@172.25.254.126:~> put /etc/passwd
2186 bytes transferred                         
lftp student@172.25.254.126:~> quit   ##上传成功,则说明是selinux服务阻止了上传。
[root@localhost ~]# setenforce 1       ##修改为强制模式

[root@localhost ~]# getsebool -a |grep ftp  ##查看selinux的开启和禁用规则
ftp_home_dir --> off           ##关闭
ftpd_anon_write --> off
ftpd_connect_all_unreserved --> off
ftpd_connect_db --> off
ftpd_full_access --> off
ftpd_use_cifs --> off
ftpd_use_fusefs --> off
ftpd_use_nfs --> off
ftpd_use_passive_mode --> off
httpd_can_connect_ftp --> off
httpd_enable_ftp_server --> off
sftpd_anon_write --> off
sftpd_enable_homedirs --> off
sftpd_full_access --> off
sftpd_write_ssh_home --> off
tftp_anon_write --> off
tftp_home_dir --> off
[root@localhost ~]# setsebool -P ftp_home_dir on    #打开
[root@localhost ~]# getsebool -a |grep ftp
ftp_home_dir --> on
ftpd_anon_write --> off
ftpd_connect_all_unreserved --> off
ftpd_connect_db --> off
ftpd_full_access --> off
ftpd_use_cifs --> off
ftpd_use_fusefs --> off
ftpd_use_nfs --> off
ftpd_use_passive_mode --> off
httpd_can_connect_ftp --> off
httpd_enable_ftp_server --> off
sftpd_anon_write --> off
sftpd_enable_homedirs --> off
sftpd_full_access --> off
sftpd_write_ssh_home --> off
tftp_anon_write --> off
tftp_home_dir --> off
[root@localhost ~]# lftp 172.25.254.126 -u student
Password: 
lftp student@172.25.254.126:~> put /etc/group
905 bytes transferred             ##此时即可上传成功。

基于Linux之selinux中安全上下文、布尔值、监控冲突的管理及服务端口的设定

基于Linux之selinux中安全上下文、布尔值、监控冲突的管理及服务端口的设定

基于Linux之selinux中安全上下文、布尔值、监控冲突的管理及服务端口的设定

基于Linux之selinux中安全上下文、布尔值、监控冲突的管理及服务端口的设定

                   

                        实验四:监控 SELinux 冲突    

     必须安装 setroubleshoot-server 软件包 , 才能将 SELinux消息发送至 /var/log/messages , setroubleshoot-server 侦听 /var/log/audit/audit.log 中的审核信息并将简短摘要发送至 /var/log/messages,摘要包括 SELinux 冲突的唯一标识符 ( UUIDs ), 可用于收集更多信息。 Sealert -l UUID 用于生成特定事件的报告。 Sealert -a /var/log/audit/audit.log 用于在该文件中生成所有事件的报告。

[root@localhost ~]# rpm -qa |grep setrouble    #查看是否有setrouble软件setroubleshoot-server-3.2.17-2.el7.x86_64
setroubleshoot-3.2.17-2.el7.x86_64
setroubleshoot-plugins-3.0.59-1.el7.noarch
[root@localhost~]#yum remove setroubleshoot-server-3.2.17-2.el7.x86_64
Loaded plugins: langpacks                       #卸载setrouble软件
Resolving Dependencies
--> Running transaction check
[root@localhost ~]# > /var/log/messages         #清空日志
[root@localhost ~]# > /var/log/audit/audit.log  #清空系统审核信息日志
[root@localhost ~]# touch /mnt/file
[root@localhost ~]# mv /mnt/file /var/ftp/                                                                                              使用浏览器访问ftp服务
[root@localhost ~]# cat /var/log/audit/audit.log   #查看系统审核信息日志
type=AVC msg=audit(1526104058.698:272): avc:  denied  { getattr } for  pid=3145 comm="vsftpd" path="/yifan" dev="vda1" ino=33572719 scontext=system_u:system_r:ftpd_t:s0-s0:c0.c1023 tcontext=unconfined_u:object_r:mnt_t:s0 tclass=file
type=SYSCALL msg=audit(1526104058.698:272): arch=c000003e syscall=6 success=no exit=-13 a0=7fa1ac280620 a1=7fa1ac2887a0 a2=7fa1ac2887a0 a3=2020202020203020 items=0 ppid=3143 pid=3145 auid=4294967295 uid=14 gid=50 euid=14 suid=14 fsuid=14 egid=50 sgid=50 fsgid=50 tty=(none) ses=4294967295 comm="vsftpd" exe="/usr/sbin/vsftpd" subj=system_u:system_r:ftpd_t:s0-s0:c0.c1023 key=(null)                           [root@localhost ~]# cat /var/log/messages          #查看日志,无报错
[root@localhost ~]# yum install setroubleshoot-server-3.2.17-2.el7.x86_64 -y   #重新安装etroubleshoot-server-3.2.17-2.el7.x86_64软件。   浏览器访问ftp服务。
[root@localhost ~]# cat /var/log/messages   #查看日志
May 12 01:50:01 localhost systemd: Starting Session 19 of user root.
May 12 01:50:01 localhost systemd: Started Session 19 of user root.
May 12 01:50:27 localhost dbus-daemon: dbus[545]: [system] Reloaded configuration
May 12 01:50:27 localhost dbus[545]: [system] Reloaded configuration
May 12 01:50:27 localhost dbus-daemon: dbus[545]: [system] Reloaded configuration
May 12 01:50:27 localhost dbus[545]: [system] Reloaded configuration
May 12 01:50:28 localhost systemd: Reloading.
May 12 01:50:28 localhost systemd: [/usr/lib/systemd/system/rtkit-daemon.service:
restorecon -v '$FIX_TARGET_PATH'  #报错提醒建议
[root@localhost ~]# restorecon -v /var/ftp/*  #修复
restorecon reset /var/ftp/yifan context unconfined_u:object_r:mnt_t:s0->unconfined_u:object_r:public_content_t:s0

基于Linux之selinux中安全上下文、布尔值、监控冲突的管理及服务端口的设定

基于Linux之selinux中安全上下文、布尔值、监控冲突的管理及服务端口的设定

基于Linux之selinux中安全上下文、布尔值、监控冲突的管理及服务端口的设定

基于Linux之selinux中安全上下文、布尔值、监控冲突的管理及服务端口的设定

基于Linux之selinux中安全上下文、布尔值、监控冲突的管理及服务端口的设定

基于Linux之selinux中安全上下文、布尔值、监控冲突的管理及服务端口的设定

基于Linux之selinux中安全上下文、布尔值、监控冲突的管理及服务端口的设定

基于Linux之selinux中安全上下文、布尔值、监控冲突的管理及服务端口的设定

基于Linux之selinux中安全上下文、布尔值、监控冲突的管理及服务端口的设定


二、 服务默认端口的添加

以httpd服务为例

[root@localhost ~]# systemctl start httpd       ##打开httpd服务

[root@localhost ~]# vim /etc/httpd/conf/httpd.conf     ##http的配置文件

>---编辑内容 ---<

 41 #Listen 12.34.56.78:80

 42 Listen 80      ---->改为---->        42 Listen 6666   #修改端口值

 43 #

 
[root@localhost ~]# systemctl restart httpd

Job for httpd.service failed. See 'systemctl status httpd.service' and 'journalctl -xn' for details.              ##重启失败

[root@localhost ~]# semanage port -l | grep http   #列出http服务允许端口

http_cache_port_t              tcp      8080, 8118, 8123, 10001-10010

http_cache_port_t              udp      3130

http_port_t                    tcp      80, 81, 443, 488, 8008, 8009, 8443, 9000

pegasus_http_port_t            tcp      5988

pegasus_https_port_t           tcp      5989

 

##”semanage port -l | grep http”与“ cat /etc/services | grep http”命令作用相同,“/etc/services”为系统中存放端口的文件。##

 

[root@localhost ~]# semanage port -a -t http_port_t -p tcp 6666

 libsemanage.semanage_reload_policy: load_policy returned error code -1. (Interrupted system call).  ##添加6666为其允许端口

[root@localhost ~]# semanage port -l | grep http

http_cache_port_t              tcp      8080, 8118, 8123, 10001-10010

http_cache_port_t              udp      3130

http_port_t                    tcp      6666, 80, 81, 443, 488, 8008, 8009, 8443, 9000

pegasus_http_port_t            tcp      5988

pegasus_https_port_t           tcp      5989    ##添加成功

[root@localhost ~]# systemctl restart httpd   ##重启服务,成功

 

基于Linux之selinux中安全上下文、布尔值、监控冲突的管理及服务端口的设定

基于Linux之selinux中安全上下文、布尔值、监控冲突的管理及服务端口的设定

基于Linux之selinux中安全上下文、布尔值、监控冲突的管理及服务端口的设定

基于Linux之selinux中安全上下文、布尔值、监控冲突的管理及服务端口的设定