Linux--NiaoGe-Service-07网络安全与主机基本防护

 Linux系统内自带的防火墙有两层:

第一层:数据包过滤防火墙:IP Filtering和Net Filter

要进入Linux本机的数据包都会先通过Linux预先内置的防火墙(Net Filter),Net Filter是由iptables这个软件提供的,主要针对TCP/IP的数据包头部来进行过滤的机制,主要分析的是OSI的第2、3、4层,主要控制的是MAC、IP、ICMP、TCP与UDP等。

第二层:TCP Wrappers

通过NetFilter之后,网络数据包会开始接受Super Daemons及TCP Wrappers的检验。通俗的说,就是/etc/host.allow与/etc/host.deny的配置文件功能,这个功能也是针对TCP的Header进行再次分析,同理,用户也可以自定义一些机制来过滤某些IP或port,来来源端的数据包被丢弃或通过检验。

除此之外,减少信息暴露的机会、建立严格的密码设置规则、完善权限设置、关闭不需要的网络服务、及时更新系统、关闭不需要的软件功能等。

不要安装不明来源的软件,不要下载不明网站的文件数据等;不要让系统有过多的危险命令,如SUID/SGID等;定时使用RKHunter等类似的软件检查系统;

CentOS的yum软件更新过程

yum的功能

[root@www ~]# yum [option] [查询的工作项目] [相关参数]
选项与参数:
-y:默认yes
查询的工作项目:、
install:指定安装软件的名称,所以后面需接软件名称
update:进行整体升级行为;当然也可以借某个软件的名称,仅升级一个软件
remove:删除某个软件,remove后接要删除的软件名称
search:搜寻某个软件或是重要关键字
list:列出目前yum所管理的所有软件名称与版本,有点类似rpm -qa
info:类似rpm -qai的执行结果
clean :下载文件爱你被放到/var/cache/yum,可使用clean将它移除,可清除的项目有package|headers|metadata|cache等
grouplist:列出所有可使用的软件组,如Development Tools之类的
groupinfo:后接group_name则可了解该group内含的所有软件名
groupinstall:安装某个软件组,也常与--installroot=/some/path共享来安装系统更新
groupremove:删除某个软件组

实例1 搜寻CentOS官网提供的软件名称与raid相关

[root@www ~]# yum search raid
已加载插件:fastestmirror, security
Loading mirror speeds from cached hostfile
 * base: mirrors.shu.edu.cn
 * extras: mirrors.cqu.edu.cn
 * updates: mirrors.shu.edu.cn
base                                                        | 3.7 kB     00:00     
c6-media                                                    | 4.0 kB     00:00 ... 
extras                                                      | 3.4 kB     00:00     
updates                                                     | 3.4 kB     00:00     
================================ N/S Matched: raid ================================
dmraid.i686 : dmraid (Device-mapper RAID tool and library)
dmraid.x86_64 : dmraid (Device-mapper RAID tool and library)
dmraid-devel.x86_64 : Development libraries and headers for dmraid.
dmraid-events-logwatch.x86_64 : dmraid logwatch-based email reporting
dmraid-events.x86_64 : dmevent_tool (Device-mapper event tool) and DSO
firstaidkit-plugin-mdadm-conf.noarch : Firstaidkit plugin to diagnose software raid
                                     : configuration file
mdadm.x86_64 : The mdadm program controls Linux md devices (software RAID arrays)

  Name and summary matches only, use "search all" for everything.
[root@www ~]# yum search all raid
已加载插件:fastestmirror, security
Loading mirror speeds from cached hostfile
 * base: mirrors.shu.edu.cn
 * extras: mirrors.cqu.edu.cn
 * updates: mirrors.shu.edu.cn
================================== Matched: raid ==================================
dmraid.i686 : dmraid (Device-mapper RAID tool and library)
dmraid.x86_64 : dmraid (Device-mapper RAID tool and library)
dmraid-devel.x86_64 : Development libraries and headers for dmraid.
dmraid-events-logwatch.x86_64 : dmraid logwatch-based email reporting
dmraid-events.x86_64 : dmevent_tool (Device-mapper event tool) and DSO
mdadm.x86_64 : The mdadm program controls Linux md devices (software RAID arrays)
firstaidkit-plugin-mdadm-conf.noarch : Firstaidkit plugin to diagnose software raid
                                     : configuration file
gnome-disk-utility.x86_64 : Disk management application
lvm2.x86_64 : Userland logical volume management tools
sgpio.x86_64 : SGPIO captive backplane tool

实例2 根据实例1中的结果,如果想查询mdadm的功能是什么

[root@www ~]# yum info mdadm
已加载插件:fastestmirror, security
Loading mirror speeds from cached hostfile
 * base: mirrors.shu.edu.cn
 * extras: mirrors.cqu.edu.cn
 * updates: mirrors.shu.edu.cn
已安装的软件包
Name        : mdadm
Arch        : x86_64
Version     : 3.3.4
Release     : 8.el6
Size        : 805 k
Repo        : installed
From repo   : anaconda-CentOS-201703281317.x86_64
Summary     : The mdadm program controls Linux md devices (software RAID arrays)
URL         : http://www.kernel.org/pub/linux/utils/raid/mdadm/
License     : GPLv2+
Description : The mdadm program is used to create, manage, and monitor Linux MD
            : (software RAID) devices.  As such, it provides similar functionality
            : to the raidtools package.  However, mdadm is a single program, and it
            : can perform almost all functions without a configuration file, though
            : a configuration file can be used to help with some common tasks.

实例3 假如记不起某个软件的全程

[root@www ~]# yum list javacc*
已加载插件:fastestmirror, security
Loading mirror speeds from cached hostfile
 * base: mirrors.shu.edu.cn
 * extras: mirrors.cqu.edu.cn
 * updates: mirrors.shu.edu.cn
可安装的软件包
javacc.x86_64                               4.1-0.5.el6                        base
javacc-demo.x86_64                          4.1-0.5.el6                        base
javacc-manual.x86_64                        4.1-0.5.el6                        base
安装试试
[root@www ~]# yum install -y javacc
已加载插件:fastestmirror, security
设置安装进程
Loading mirror speeds from cached hostfile
 * base: mirrors.shu.edu.cn
 * extras: mirrors.cqu.edu.cn
 * updates: mirrors.shu.edu.cn
解决依赖关系
--> 执行事务检查
---> Package javacc.x86_64 0:4.1-0.5.el6 will be 安装
--> 处理依赖关系 java-gcj-compat >= 1.0.31,它被软件包 javacc-4.1-0.5.el6.x86_64 需要
--> 处理依赖关系 java-gcj-compat >= 1.0.31,它被软件包 javacc-4.1-0.5.el6.x86_64 需要
--> 处理依赖关系 libgcj_bc.so.1()(64bit),它被软件包 javacc-4.1-0.5.el6.x86_64 需要
--> 执行事务检查
---> Package java-1.5.0-gcj.x86_64 0:1.5.0.0-29.1.el6 will be 安装
--> 处理依赖关系 sinjdoc,它被软件包 java-1.5.0-gcj-1.5.0.0-29.1.el6.x86_64 需要
---> Package libgcj.x86_64 0:4.4.7-23.el6 will be 安装
--> 执行事务检查
---> Package sinjdoc.x86_64 0:0.5-9.1.el6 will be 安装
--> 处理依赖关系 java_cup >= 0.10,它被软件包 sinjdoc-0.5-9.1.el6.x86_64 需要
--> 执行事务检查
---> Package java_cup.x86_64 1:0.10k-5.el6 will be 安装
--> 完成依赖关系计算

依赖关系解决

===================================================================================
 软件包                 架构           版本                     仓库          大小
===================================================================================
正在安装:
 javacc                 x86_64         4.1-0.5.el6              base         895 k
为依赖而安装:
 java-1.5.0-gcj         x86_64         1.5.0.0-29.1.el6         base         139 k
 java_cup               x86_64         1:0.10k-5.el6            base         197 k
 libgcj                 x86_64         4.4.7-23.el6             base          19 M
 sinjdoc                x86_64         0.5-9.1.el6              base         705 k

事务概要
===================================================================================
Install       5 Package(s)

总下载量:20 M
Installed size: 68 M
下载软件包:
(1/5): java-1.5.0-gcj-1.5.0.0-29.1.el6.x86_64.rpm           | 139 kB     00:00     
(2/5): java_cup-0.10k-5.el6.x86_64.rpm                      | 197 kB     00:00     
(3/5): javacc-4.1-0.5.el6.x86_64.rpm                        | 895 kB     00:00     
(4/5): libgcj-4.4.7-23.el6.x86_64.rpm                       |  19 MB     00:09     
(5/5): sinjdoc-0.5-9.1.el6.x86_64.rpm                       | 705 kB     00:00     
-----------------------------------------------------------------------------------
总计                                               2.0 MB/s |  20 MB     00:10     
运行 rpm_check_debug 
执行事务测试
事务测试成功
执行事务
  正在安装   : libgcj-4.4.7-23.el6.x86_64                                      1/5 
  正在安装   : java-1.5.0-gcj-1.5.0.0-29.1.el6.x86_64                          2/5 
  正在安装   : 1:java_cup-0.10k-5.el6.x86_64                                   3/5 
  正在安装   : sinjdoc-0.5-9.1.el6.x86_64                                      4/5 
  正在安装   : javacc-4.1-0.5.el6.x86_64                                       5/5 
  Verifying  : javacc-4.1-0.5.el6.x86_64                                       1/5 
  Verifying  : sinjdoc-0.5-9.1.el6.x86_64                                      2/5 
  Verifying  : libgcj-4.4.7-23.el6.x86_64                                      3/5 
  Verifying  : 1:java_cup-0.10k-5.el6.x86_64                                   4/5 
  Verifying  : java-1.5.0-gcj-1.5.0.0-29.1.el6.x86_64                          5/5 

已安装:
  javacc.x86_64 0:4.1-0.5.el6                                                      

作为依赖被安装:
  java-1.5.0-gcj.x86_64 0:1.5.0.0-29.1.el6      java_cup.x86_64 1:0.10k-5.el6     
  libgcj.x86_64 0:4.4.7-23.el6                  sinjdoc.x86_64 0:0.5-9.1.el6      

完毕!

实例4 查看系统的软件组有多少个

[root@www ~]# LANG=C yum grouplist
Loaded plugins: fastestmirror, security
Setting up Group Process
Loading mirror speeds from cached hostfile
 * base: mirrors.shu.edu.cn
 * extras: mirrors.cqu.edu.cn
 * updates: mirrors.shu.edu.cn
base/group_gz                                               | 242 kB     00:00     
c6-media/group_gz                                           | 226 kB     00:00 ... 
Installed Groups: 已安装的软件组
   Additional Development
   Base
   CIFS file server
   Compatibility libraries
   ......省略.......  
   Security Tools
   Server Platform
Installed Language Groups: 已安装的语言
   Arabic Support [ar]
   Armenian Support [hy]
   Chinese Support [zh]
   ....省略.....
   Tajik Support [tg]
Available Groups:尚未安装的软件组
   Backup Client
   .....省略.....
   Upper Sorbian Support [hsb]
   Urdu Support [ur]
   Uzbek Support [uz]
   Venda Support [ve]
   Vietnamese Support [vi]
   Walloon Support [wa]
   Welsh Support [cy]
   Xhosa Support [xh]
   Zulu Support [zu]
Done

实例 5 Desktop Platform内含多少个rpm软件

[root@www ~]# yum groupinfo "Desktop Platform"
已加载插件:fastestmirror, security
设置组进程
Loading mirror speeds from cached hostfile
 * base: mirrors.shu.edu.cn
 * extras: mirrors.cqu.edu.cn
 * updates: mirrors.shu.edu.cn

组:桌面平台
 描述:支持的用于红帽企业版 Linux 桌面平台的程序库。
 必要的软件包:
   atk
   cairo
   dbus
   dbus-libs
   fontconfig
   ....省略.....
   qt
   qt3
   redhat-lsb-graphics
   redhat-lsb-printing
 可选的软件包:
   qt-mysql
   qt-odbc
   qt-postgresql
   qt3-MySQL
   qt3-ODBC
   qt3-PostgreSQL

安装的话直接使用yum groupinstall "Desktop Platform"来安装。

设置系统自动更新

[root@www ~]# crontab -e

30 4 * * * root yum -y update && yum clean packages

自定义镜像站点

对于自定义的景象站点,比较重要的一个目录是repodata,该目录是分析rpm软件后所产生的软件属性相依数据放置处。
国内可以使用的镜像站点:
http://mirrors.ustc.edu.cn/centos/  科大
https://mirrors.tuna.tsinghua.edu.cn/centos/   清华
https://mirrors.aliyun.com/centos/  阿里云
http://mirrors.163.com/centos/ 网易
其他自己可以搜索。
[root@www ~]# ls /etc/yum.repos.d/
CentOS-Base.repo       CentOS-fasttrack.repo  CentOS-Vault.repo
CentOS-Debuginfo.repo  CentOS-Media.repo
[root@www ~]# vim  /etc/yum.repos.d/CentOS-Base.repo  //自定义的话,只需将这个文件内的原来的连接替换成上面的连接即可。
查看当前系统版本号
[root@www ~]# cat /etc/redhat-release 
CentOS release 6.10 (Final)
以USTC为例,USTC提供了文件模板
连接http://mirrors.ustc.edu.cn/help/centos.html
[root@www ~]# yum repolist all | grep repolist
repolist: 13,572
当本地缓存里的数据与yum服务器的列表不同步的时候,可以使用以下方法
[root@www ~]# yum clean [packages | headers | all]
选项与参数
packages:将已经下载的软件文件删除
headers:将下载的软件头删除
all:将所有的容器数据都删除
范例:删除已下载过的所有容器的相关数据(含软件本身列表)
[root@www ~]# yum clean all

限制连接端口(port)

服务器端启动的监听端口所对应的服务是固定的,如www的port80、FTP的port21、Email的port25.

一般主机会有65536个port,这些port以1024为界,只有root才能启动保留的port,在小于1024的端口,都是以root身份才能启动的,这些port主要是用于一些常见的通信服务,在Linux系统中,常见的协议与port对应关系记录在/etc/services文件里面。

大于1024用户Client端的Port:大于1024以上的Port主要是作为Client端的软件激活端口。

是否需要三次握手

建立可靠的连接服务需要使用到TCP协议,也就是需要所谓的三次握手,如果是非面向连接的服务,如DNS与视频系统,则只需UDP协议即可。

通信协议可以启用在非正规的Port

比如说:通常情况下WWW的默认启动的port是80,那么我们也可以通过修改配置文件,使之启动在其他port上,如8088,8008等,更改过端口口,客户端访问时只需在IP后面加port即可。

端口查看命令:netstat、nmap

列出正在监听的网络服务

[root@www ~]# netstat -lntu
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State      
tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      
tcp        0      0 0.0.0.0:445                 0.0.0.0:*                   LISTEN
......省略.....

列出已经连接的网络状态

[root@www ~]# netstat -tun
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State      
tcp        0     64 192.168.30.12:22            192.168.30.1:5009           ESTABLISHED

删除已建立或正在监听当中的连接

[root@www ~]# netstat -tunp 
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0     64 192.168.30.12:22            192.168.30.1:5009           ESTABLISHED 2147/sshd           
[root@www ~]# kill -9 port

nmap的安装和使用

[root@www ~]# yum install -y nmap
[root@www ~]# nmap [扫描类型] [扫描参数] [hosts 地址与范围]
选项与参数:
扫描类型:
-sT:扫描TCP数据包已建立的连接connect()
-sS:扫面TCP数据包带有SYN卷标的数据
-sP:以ping的方式进行扫描
-sU:以UDP的数据包格式进行扫描
-sO:以IP的协议(protocol)进行主机的扫描
扫描参数:
-PT:使用TCP里头的ping的方式进行扫描,可以获知目前有几台计算机存在(较常用)
-PI:使用实际的ping(带有ICMP数据包的)来进行扫描
-p:这个port range,如1024-、80-102330000-60000等的使用方式
Hosts地址与范围:
192.168.1.100:直接写入HOST IP而已,仅检查一台
192.168.1.0/24:为C Class的形态
192.168.*.*:扫描B类地址
192.168.1.0-5060-100103200:这种变形是的主机范围

使用默认参数扫描本机所启用的port(只会扫描TCP)

[root@www ~]# nmap localhost

Starting Nmap 5.51 ( http://nmap.org ) at 2018-09-10 19:18 CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0000050s latency).
Other addresses for localhost (not scanned): 127.0.0.1
Not shown: 994 closed ports
PORT    STATE SERVICE
22/tcp  open  ssh
25/tcp  open  smtp
111/tcp open  rpcbind
139/tcp open  netbios-ssn
445/tcp open  microsoft-ds
631/tcp open  ipp

Nmap done: 1 IP address (1 host up) scanned in 0.09 seconds

扫描本机的TCP/UDP端口

[root@www ~]# nmap -sTU localhost

Starting Nmap 5.51 ( http://nmap.org ) at 2018-09-10 19:20 CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00083s latency).
Other addresses for localhost (not scanned): 127.0.0.1
Not shown: 1989 closed ports
PORT    STATE         SERVICE
22/tcp  open          ssh
25/tcp  open          smtp
111/tcp open          rpcbind
139/tcp open          netbios-ssn
445/tcp open          microsoft-ds
631/tcp open          ipp
68/udp  open|filtered dhcpc
111/udp open          rpcbind
137/udp open          netbios-ns
138/udp open|filtered netbios-dgm
631/udp open|filtered ipp

Nmap done: 1 IP address (1 host up) scanned in 1.34 seconds

通过ICMP数据包的检测,分析局域网内有几台主机是启动的

[root@www ~]# nmap -sP 192.168.30.0/24

Starting Nmap 5.51 ( http://nmap.org ) at 2018-09-10 19:23 CST
Nmap scan report for 192.168.30.1
Host is up (0.00013s latency).
MAC Address: 00:50:56:C0:00:08 (VMware)
Nmap scan report for 192.168.30.2
Host is up (0.00014s latency).
MAC Address: 00:50:56:F8:1A:6B (VMware)
Nmap scan report for 192.168.30.9
Host is up (0.000076s latency).
MAC Address: 00:0C:29:CF:02:BA (VMware)
Nmap scan report for 192.168.30.11
Host is up (0.00020s latency).
MAC Address: 00:0C:29:C6:12:12 (VMware)
Nmap scan report for www.xueji.com (192.168.30.12)
Host is up.
Nmap scan report for 192.168.30.13
Host is up (0.000064s latency).
MAC Address: 00:0C:29:C6:12:12 (VMware)
Nmap scan report for 192.168.30.254
Host is up (0.000038s latency).
MAC Address: 00:50:56:FA:92:FA (VMware)
Nmap done: 256 IP addresses (7 hosts up) scanned in 7.48 seconds

如果是想要将各个主机的启动Port做一番检测的话,使用如下命令:

[root@www ~]# nmap 192.168.30.0/24

stand alone与super daemon

stand alone:是直接执行该服务的可执行文件,让该文件直接加载到内存当中运行,用这种方式来启动的优点是可以让服务具有较快速的相应。一般来说,这种哦哦那个服务的启动script都会放置到/etc/init.d/这个目录下,所以通常可以使用/etc/init.d/service name restart来重启service name。

super daemon:用一个超级服务作为总管来统一管理某些特殊的服务,在CentOS 6.x系列中使用的是xinetd这个super daemon,这种方式启动的网络服务虽然在响应速度上会比较慢,但是,可以动过super daemon额外提供一些管理,如控制何时启动、何时可以进行连接、哪个IP可以连进来、是否允许同时连接的等。通常个别服务的配置文件放置在/etc/xinetd.d/这个目录下,配置完成后需要/etc/init.d/xinetd restart来重新启动是配置生效。

实例 想知道系统中的port 111是否关闭了

root@www ~]# netstat -tnlp | grep 111
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      1581/rpcbind        
tcp        0      0 :::111                      :::*                        LISTEN      1581/rpcbind        
[root@www ~]# which rpcbind
/sbin/rpcbind
[root@www ~]# rpm -qf /sbin/rpcbind 
rpcbind-0.2.0-16.el6.x86_64
[root@www ~]# rpm -qc rpcbind | grep init
/etc/rc.d/init.d/rpcbind
[root@www ~]# /etc/init.d/rpcbind stop
停止 rpcbind:                                             [确定]
[root@www ~]# 

实例 启动系统中的Telnet服务

[root@www ~]# rpm -qa | grep telnet-server 首先查看系统中是否安装的了telenet服务
[root@www ~]# yum install -y telnet-server 
[root@www ~]# vim /etc/xinetd.d/telnet
# default: on
# description: The telnet server serves telnet sessions; it uses \
#       unencrypted username/password pairs for authentication.
service telnet
{
        flags           = REUSE
        socket_type     = stream
        wait            = no
        user            = root
        server          = /usr/sbin/in.telnetd
        log_on_failure  += USERID
        disable         = no  原值yes,改为no
}
[root@www ~]# /etc/init.d/xinetd restart
停止 xinetd:                                              [失败]
正在启动 xinetd:                                          [确定]
[root@www ~]# netstat -tnlp | grep 23
tcp        0      0 :::23                       :::*                        LISTEN      3168/xinetd

常见的必须存在的系统服务

服务名称 服务内容
acpid 新版的电源管理模块,通常建议开启,某些笔记本电脑不支持,那就得关闭了。
atd 管理单一计划命令执行的服务,可以启动
crond 管理计划任务的重要服务,必须启动
haldaemon 用于检测系统硬件变更的服务,与USB设备关系很大
iptables Linux内建的防火墙,可以启动
network Linux的网络服务,如果不需要网络的话,那就不需要启动
postfix 系统内部的邮件传递服务,建议启动
rsyslog 系统的登录文件记录,建议启动
sshd 默认启动,远程连接用到
xinetd super Daemon,建议启动

 

 

 

 

 

 

 

 

 

 

 

SELinux相关

[root@www ~]# ls -Z 
-rw-------. root root system_u:object_r:admin_home_t:s0 anaconda-ks.cfg
drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 bin
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 e1000e-3.4.2.1.tar.gz
-rw-r--r--. root root system_u:object_r:admin_home_t:s0 install.log
-rw-r--r--. root root system_u:object_r:admin_home_t:s0 install.log.syslog
说明
中间用冒号隔开的分别表示
Identify:role:type即身份识别:角色:类型
身份识别(identify):账号方面的身份识别,主要有
    root:表示root的账号身份
    system_u:表示系统程序方面的识别,通常就是程序
    user_u:一般用户帐号相关的身份
角色(role):通过角色字段,我们可以知道这个数据是不是代表程序,文件资源还是用户
    object_r:代表的是文件或目录等文件资源,这是最常见的
    system_r:代表程序,不过,一般用户也会被指定为system_r.
类型(type):在默认的target策略中,identifiy与role字段基本上是不重要的,重要的在于这个类型(Type)字段,基本上,一个主体程序能不能呢个读取到这个文件资源,与类型字段有关,而类型字段在文件与程序中的定义不太相同,分别是:
    type:在文件资源(object)中成为类型(type)
    domain:在主体程序(subject)中则称为域(domain)
domain需要与type搭配,该程序才能够顺利地读取文件资源

程序与文件SELinux Type字段的相关性

身份识别 角色 该对应在target的意义
root system_r 代表供root账号登录时所取得的权限
system-u system_r 由于未系统账号,因此是非交互的系统运行程序
user_u system_r 一般可登录用户的程序

 

 

 

如上所述,最重要的自大unshi类型字段,主题与目标之间是否具有可以读写的权限,与程序的domain及文件的type有关,这两者的关系我们可以使用实现www服务功能的http程序与/var/www/html/网页存储目录来说明,首先,看看两者的安全性环境内容:

[root@www ~]# yum install -y httpd 
[root@www ~]# ls -Zd /usr/sbin/httpd  /var/www/html/
-rwxr-xr-x. root root system_u:object_r:httpd_exec_t:s0 /usr/sbin/httpd
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/
注意两者的角色都是object_r,代表都是文件,而httpd属于httpd-exec_t类型,/var/www/html则属于httpd_sys_content_t这个类型
由以上信息克制,httpd属于httpd_exec_t这个可执行的类型,而/var/www/html/属于httpd_sys_content_t这个可以让httpd域(domain)读取的类型。

SELinux的启动、关闭与查看

值得注意的是,不是所有的Linux distribution都支持SELinux;

SELinux的三种模式:

enforcing:强制模式,代表SELinux已经启动,且已经开始限制domain/type了。

permissive:宽容模式,代表SELinux已经启动,但是只会发出警告并不会实际限制。

disabled:禁用,代表SELinux已经不再运行。

SELinux的状态的查看、更改

[root@www ~]# getenforce 
Enforcing
[root@www ~]# setenforce 0
[root@www ~]# getenforce 
Permissive
[root@www ~]# setenforce 1
[root@www ~]# getenforce 
Enforcing
[root@www ~]# vim /etc/selinux/config
......
SELINUX=disabled   //永久关闭
.......

如果在更改了SELinux的状态后,某些服务在启动的时候抛出没有权限读取/lib/xxx里面的数据时,解决办法:将SELinux重新设为Permissive的状态,使用”restorecon -Rv /“重新还原所有的SELinux的类型即可。

SELinux Type的修改

chcon命令

[root@www ~]# chcon [-R] [-t type] [-u user] [-r role] 文件
[root@www ~]# chcon [-R] --reference=范例文件 文件
选项与参数
-R:连同该目录下的子目录也同时修改
-t:后面接安全性环境的类型字段,如httpd_sys_content_t
-u:后面接身份识别,如system_u
-r:后面接角色,如system_r
--reference=范例文件:以某个文件为范例修改后续接的文件的文件类型

将/etc/hosts复制到/root/目录下,查看相关SELinux类型变化

[root@www ~]# cp /etc/hosts /root/
[root@www ~]# ls -dZ /etc/hosts /root/hosts  /root/
-rw-r--r--. root root system_u:object_r:net_conf_t:s0  /etc/hosts
dr-xr-x---. root root system_u:object_r:admin_home_t:s0 /root/
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 /root/hosts
[root@www ~]# mv /root/hosts /tmp/ [root@www
~]# ls -dZ /tmp/ /tmp/hosts drwxrwxrwt. root root system_u:object_r:tmp_t:s0 /tmp/ -rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 /tmp/hosts 如何将/tmp/hosts变更为最原始的net_conf_t,就要用到chcon命令 [root@www ~]# chcon -t net_conf_t /tmp/hosts [root@www ~]# ls -lZ /tmp/hosts -rw-r--r--. root root unconfined_u:object_r:net_conf_t:s0 /tmp/hosts #以/var/spool/mail为依据,将/tmp/hosts修改成该类型 [root@www ~]# ls -lZ /var/spool/mail/ -rw-------. root mail system_u:object_r:mail_spool_t:s0 root -rw-rw----. rpc mail system_u:object_r:mail_spool_t:s0 rpc -rw-rw----. student mail unconfined_u:object_r:mail_spool_t:s0 student -rw-rw----. test mail unconfined_u:object_r:mail_spool_t:s0 test -rw-rw----. xueji01 mail unconfined_u:object_r:mail_spool_t:s0 xueji01 -rw-rw----. xueji02 mail unconfined_u:object_r:mail_spool_t:s0 xueji02 -rw-rw----. xueji03 mail unconfined_u:object_r:mail_spool_t:s0 xueji03 -rw-rw----. xueji04 mail unconfined_u:object_r:mail_spool_t:s0 xueji04 -rw-rw----. xueji05 mail unconfined_u:object_r:mail_spool_t:s0 xueji05 [root@www ~]# chcon --reference=/var/spool/mail/ /tmp/hosts [root@www ~]# ls -lZ /tmp/hosts -rw-r--r--. root root system_u:object_r:mail_spool_t:s0 /tmp/hosts

恢复原有的SELinux Type命令:restorecon

[root@www ~]# restorecon [-Rv] 文件或目录
选项与参数
-R:连同子目录一起修改
-v :将过程显示到屏幕上

实例 将/tmp/hosts移动至/root并以默认的安全性环境修正过来

[root@www ~]# mv /tmp/hosts /root/
[root@www ~]# ls -lZ /root/hosts 
-rw-r--r--. root root system_u:object_r:mail_spool_t:s0 /root/hosts
[root@www ~]# restorecon -Rv /root/
restorecon reset /root/hosts context system_u:object_r:mail_spool_t:s0->system_u:object_r:admin_home_t:s0

通过semanage查询与修改默认的SELinux Type类型

[root@www ~]# yum provides */semanage
已加载插件:fastestmirror, security
Loading mirror speeds from cached hostfile
base/filelists_db                                           | 6.4 MB     00:03     
c6-media/filelists_db                                       | 6.3 MB     00:00 ... 
extras/filelists_db                                         |  24 kB     00:00     
updates/filelists_db                                        | 852 kB     00:00     
libsemanage-devel-2.0.43-5.1.el6.x86_64 : Header files and libraries used to build
                                        : policy manipulation tools
Repo        : base
匹配来自于:
Filename    : /usr/include/semanage
libsemanage-devel-2.0.43-5.1.el6.i686 : Header files and libraries used to build
                                      : policy manipulation tools
Repo        : base
匹配来自于:
Filename    : /usr/include/semanage
policycoreutils-python-2.0.83-30.1.el6_8.x86_64 : SELinux policy core python
                                                : utilities
Repo        : base
匹配来自于:
Filename    : /usr/sbin/semanage
policycoreutils-python-2.0.83-30.1.el6_8.x86_64 : SELinux policy core python
                                                : utilities
Repo        : c6-media
匹配来自于:
Filename    : /usr/sbin/semanage
libsemanage-devel-2.0.43-5.1.el6.i686 : Header files and libraries used to build
                                      : policy manipulation tools
Repo        : c6-media
匹配来自于:
Filename    : /usr/include/semanage
libsemanage-devel-2.0.43-5.1.el6.x86_64 : Header files and libraries used to build
                                        : policy manipulation tools
Repo        : c6-media
匹配来自于:
Filename    : /usr/include/semanage
[root@www ~]# yum install -y policycoreutils-python

semanage命令

[root@www ~]# semanage {login | user | port | interface | fcontext | translation} -l
[root@www ~]# semanage fcontext -{a|d|m} -[frst] file_spec
选项与参数:
fcontext:主要用在安全性环境方面,-l为查询的意思
-a:增加,用户可以增加一些目录的默认安全性环境类型设置
-m:修改
-d:删除

实例 查询/var/www的默认安全性环境的设置

[root@www ~]# semanage fcontext -l | grep '/var/www'
/var/www(/.*)?                                     all files          system_u:object_r:httpd_sys_content_t:s0 
/var/www/[^/]*/cgi-bin(/.*)?                       all files          system_u:object_r:httpd_sys_script_exec_t:s0 
........省略........

实例 利用semanage设置/srv/xueji/目录的默认安全性环境为public_content_t

[root@www ~]# mkdir /srv/xueji
[root@www ~]# ls -lZd /srv/xueji/
drwxr-xr-x. root root unconfined_u:object_r:var_t:s0   /srv/xueji/
[root@www ~]# semanage fcontext -l | grep '/srv/'
/srv/.*                                            all files          system_u:object_r:var_t:s0 
/srv/([^/]*/)?ftp(/.*)?                            all files          system_u:object_r:public_content_t:s0 
..........省略.........
[root@www ~]# semanage fcontext -a -t public_content_t "/srv/xueji(/.*)?"
[root@www ~]# semanage fcontext -l | grep '/srv/xueji'
/srv/xueji(/.*)?                                   all files          system_u:object_r:public_content_t:s0
[root@www ~]# cat /etc/selinux/targeted/contexts/files/file_contexts.local 
# This file is auto-generated by libsemanage
# Do not edit directly.

/srv/xueji(/.*)?    system_u:object_r:public_content_t:s0
恢复默认值
[root@www ~]# restorecon -Rv /srv/xueji*
restorecon reset /srv/xueji context unconfined_u:object_r:var_t:s0->unconfined_u:object_r:public_content_t:s0
[root@www ~]# ls -lZd /srv/xueji/
drwxr-xr-x. root root unconfined_u:object_r:public_content_t:s0 /srv/xueji/

SELinux策略内的规则与布尔值

[root@www ~]# yum provides */seinfo
已加载插件:fastestmirror, security
Loading mirror speeds from cached hostfile
setools-console-3.3.7-4.el6.x86_64 : Policy analysis command-line tools for SELinux
Repo        : base
匹配来自于:
Filename    : /usr/bin/seinfo
setools-console-3.3.7-4.el6.x86_64 : Policy analysis command-line tools for SELinux
Repo        : c6-media
匹配来自于:
Filename    : /usr/bin/seinfo
[root@www ~]# yum install -y setools-console

seinfo命令用来查阅targetd策略

[root@www ~]# seinfo [-Atrub]
选项与参数
-A:列出SELinux的状态、规则布尔值、身份识别、角色、类别等所有信息
-t:列出SELinux的所有类别(type)种类
-r:列出SELinux的所有角色(role)种类
-u:列出SELinux的所有身份识别(user)种类
-b:列出所有规则的种类(布尔值)

实例 列出SELinux在此策略下统计状态

[root@www ~]# seinfo 

Statistics for policy file: /etc/selinux/targeted/policy/policy.24
Policy Version & Type: v.24 (binary, mls)

   Classes:            81    Permissions:       238
   Sensitivities:       1    Categories:       1024
   Types:            3920    Attributes:        295
   Users:               9    Roles:              12
   Booleans:          237    Cond. Expr.:       277
   Allow:          323336    Neverallow:          0
   Auditallow:        141    Dontaudit:      274738
   Type_trans:      42431    Type_change:        38
   Type_member:        48    Role allow:         19
   Role_trans:        386    Range_trans:      6258
   Constraints:        90    Validatetrans:       0
   Initial SIDs:       27    Fs_use:             23
   Genfscon:           84    Portcon:           474
   Netifcon:            0    Nodecon:             0
   Permissives:        90    Polcap:              2

实例 列出与httpd有关的规则(Booleans)

[root@www ~]# seinfo -b | grep httpd
   httpd_manage_ipa
   httpd_run_stickshift
   httpd_use_fusefs
   httpd_use_openstack
   allow_httpd_mod_auth_pam
   ......省略......

查询详细规则适用sesearch

经过查询,sesearch也是由setool-console提供的
[root@www ~]# sesearch [--all] [-s 主体类别] [-t 目标类别] [-b 布尔值]
选项与参数
--all:列出该类别或布尔值的所有相关信息
-t:后接类别,如-t httpd_t
-b:后接布尔值的规则,如-b httpd_enable_ftp_server

实例 找出目标文件资源类别为httpd_sys_content_t的相关信息

[root@www ~]# sesearch --all -t httpd_sys_content_t
Found 802 semantic av rules:
   allow ntop_t httpd_sys_content_t : file { ioctl read getattr lock open } ;
   allow antivirus_domain httpd_sys_content_t : file { ioctl read getattr lock open } ;
   allow httpd_suexec_t httpd_sys_content_t : dir { getattr search open } ;
   allow ntop_t httpd_sys_content_t : dir { ioctl read getattr lock search open } ;
.........省略........

实例 查询布尔值httpd_enable_homedirs的规范

[root@www ~]# sesearch -b httpd_enable_homedirs --all > out2.txt
Found 46 semantic av rules:
   allow httpd_suexec_t home_root_t : dir { ioctl read getattr lock search open } ; 
   allow httpd_suexec_t home_root_t : lnk_file { read getattr } ;
.......省略.......

实例 布尔值的查询与修改

[root@www ~]# getsebool [-a] [布尔值条款]
选项与参数
-a:列出目前系统上面的所有布尔值条款设置为开启或关闭值
实例 查询当前系统内所有的布尔值设置状况
[root@www ~]# getsebool -a
abrt_anon_write --> off
abrt_handle_event --> off
allow_console_login --> on
allow_cvs_read_shadow --> off
allow_daemons_dump_core --> on
allow_daemons_use_tcp_wrapper --> off
.......省略.........
[root@www ~]# setsebool -[P] 布尔值=[0|1]
选项与参数
-P:直接将设置值写入配置文件,该设置数据未来会生效的
实例 查询httpd_enable_homedirs是否为on,若不为on,将其设为on,
[root@www ~]# getsebool httpd_enable_homedirs
httpd_enable_homedirs --> off
[root@www ~]# setsebool -P httpd_enable_homedirs=1
[root@www ~]# getsebool httpd_enable_homedirs
httpd_enable_homedirs --> on

SELinux日志文件记录所需的服务

1.setroubleshoot:将错误信息写入/var/log/messages

几乎所有SELinux相关的程序都是以se开头,setroubleshoot服务会将错误信息和解决办法记录到/var/log/messages和/var/log/setroubleshoot/*中,setroubleshoot的安装与启动如下

[root@www ~]# yum install -y setroubleshoot
[root@www ~]# /etc/init.d/auditd start
正在启动 auditd:
[root@www ~]# /etc/init.d/httpd start 
正在启动 httpd:                                           [确定]
[root@www ~]# netstat -tlnp | grep http
tcp        0      0 :::80                       :::*                        LISTEN      2337/httpd 
[root@www ~]# echo "My First SELinux Check " > index.html
[root@www ~]# ls -l index.html 
-rw-r--r--. 1 root root 24 9月  10 22:00 index.html
[root@www ~]# mv index.html /var/www/html/
[root@www ~]# links http://localhost/index.html --dump
                                   Forbidden

   You don't have permission to access /index.html on this server.

   --------------------------------------------------------------------------

    Apache/2.2.15 (CentOS) Server at localhost Port 80

[root@www ~]# cat /var/log/messages | grep setroubleshoot
Sep 10 21:47:05 www yum[2238]: Installed: setroubleshoot-plugins-3.0.40-4.1.el6.noarch
Sep 10 21:47:06 www yum[2238]: Installed: setroubleshoot-server-3.0.47-14.el6.x86_64
Sep 10 21:47:06 www yum[2238]: Installed: setroubleshoot-3.0.47-14.el6.x86_64
Sep 10 22:01:07 www setroubleshoot: SELinux is preventing /usr/sbin/httpd from getattr access on the file /var/www/html/index.html. For complete SELinux messages. run sealert -l 62c087fe-77ee-46f1-94b3-f78bff0cbf0b
Sep 10 22:01:07 www setroubleshoot: SELinux is preventing /usr/sbin/httpd from getattr access on the file /var/www/html/index.html. For complete SELinux messages. run sealert -l 62c087fe-77ee-46f1-94b3-f78bff0cbf0b
根据提示,解决问题
[root@www ~]# sealert -l 62c087fe-77ee-46f1-94b3-f78bff0cbf0b
SELinux is preventing /usr/sbin/httpd from getattr access on the 文件 /var/www/html/index.html.

*****  插件 restorecon (99.5 置信度) 建议  ******************************************

If 您想要修复标签。 
/var/www/html/index.html 默认标签应为 httpd_sys_content_t。
Then 您可以运行 restorecon。
Do
# /sbin/restorecon -v /var/www/html/index.html

*****  插件 catchall (1.49 置信度) 建议  ********************************************

If 您确定应默认允许 httpd getattr 访问 index.html file。
Then 您应该将这个情况作为 bug 报告。
您可以生成本地策略模块允许这个访问。
Do
请执行以下命令此时允许这个访问:
# grep httpd /var/log/audit/audit.log | audit2allow -M mypol
# semodule -i mypol.pp


更多信息:
源上下文                          unconfined_u:system_r:httpd_t:s0
目标上下文                         unconfined_u:object_r:admin_home_t:s0
目标对象                          /var/www/html/index.html [ file ]
源                             httpd
源路径                           /usr/sbin/httpd
端口                            <未知>
主机                            www.xueji.com
源 RPM 软件包                     httpd-2.2.15-69.el6.centos.x86_64
目标 RPM 软件包                    file /var/www/html/index.html is not owned by any
                              package
策略 RPM                        selinux-policy-3.7.19-312.el6.noarch
Selinux 已经激活                  True
策略类型                          targeted
强制模式                          Enforcing
主机名                           www.xueji.com
平台                            Linux www.xueji.com 2.6.32-754.3.5.el6.x86_64 #1
                              SMP Tue Aug 14 20:46:41 UTC 2018 x86_64 x86_64
警报计数                          2
第一个                           2018年09月10日 星期一 22时01分04秒
最后一个                          2018年09月10日 星期一 22时01分04秒
本地 ID                         62c087fe-77ee-46f1-94b3-f78bff0cbf0b

原始核查信息
type=AVC msg=audit(1536588064.275:77): avc:  denied  { getattr } for  pid=2341 comm="httpd" path="/var/www/html/index.html" dev=sda6 ino=2478 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:admin_home_t:s0 tclass=file


type=SYSCALL msg=audit(1536588064.275:77): arch=x86_64 syscall=lstat success=no exit=EACCES a0=5604518a6488 a1=7ffe904c5470 a2=7ffe904c5470 a3=1 items=0 ppid=2337 pid=2341 auid=0 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=1 comm=httpd exe=/usr/sbin/httpd subj=unconfined_u:system_r:httpd_t:s0 key=(null)

Hash: httpd,httpd_t,admin_home_t,file,getattr

audit2allow

#============= httpd_t ==============
allow httpd_t admin_home_t:file getattr;

audit2allow -R

#============= httpd_t ==============
allow httpd_t admin_home_t:file getattr;
[root@www ~]# restorecon -Rv '/var/www/html/index.html'
restorecon reset /var/www/html/index.html context unconfined_u:object_r:admin_home_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
[root@www ~]# /etc/init.d/httpd restart 
停止 httpd:                                               [确定]
正在启动 httpd:                                           [确定]
[root@www ~]# links http://localhost/index.html --dump
   My First SELinux Check

用E-mail或在命令列上直接提供setroubleshoot错误信息

[root@www ~]# cp /etc/setroubleshoot/setroubleshoot.conf{,.bak}
[root@www ~]# vim /etc/setroubleshoot/setroubleshoot.conf
.....
recipients_filepath = /var/lib/setroubleshoot/email_alert_recipients //确保此行存在
..........
console = True //原值false改为True
[root@www ~]# cp /var/lib/setroubleshoot/email_alert_recipients{,.bak}
[root@www ~]# vim /var/lib/setroubleshoot/email_alert_recipient
root@localhost
xueji@163.com
[root@www ~]# /etc/init.d/auditd restart
停止 auditd:                                              [确定]
正在启动 auditd:                                          [确定]

一些特殊情况处理,如果因为一些原因,CentOS没有规范到setroubleshoot信息,可能还是无法了解到问题到底是出在哪里,此时建按如下处理:

1)在服务于rwx权限都没有问题,却无法正常使用网络服务时,先使用setenforce 0设置为宽容模式

2)再次使用该网络服务,如果正常,表明是SELinux出现问题,接着向下处理问题;如果仍不可用,则表明不是SELinux的问题,需要考虑其他方面。

3)分析/var/log/messages内的信息,找到sealert -l相关的信息并执行。

4)过滤Allow Access关键词,按照其中的动作来执行SELinux的错误解决办法

5)处理完成后,setenfoce 1,再次测试网络服务。

 

posted on 2018-09-10 14:16  Lucky_7  阅读(747)  评论(0编辑  收藏  举报

导航