Linux--NiaoGe-Service-07网络安全与主机基本防护
阅读原文时间:2023年07月14日阅读:3

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 :
c6-media | 4.0 kB : …
extras | 3.4 kB :
updates | 3.4 kB :
================================ 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.
Release : .el6
Size : k
Repo : installed
From repo : anaconda-CentOS-.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 :4.1-0.5.el6 will be 安装
--> 处理依赖关系 java-gcj-compat >= 1.0.,它被软件包 javacc-4.1-0.5.el6.x86_64 需要
--> 处理依赖关系 java-gcj-compat >= 1.0.,它被软件包 javacc-4.1-0.5.el6.x86_64 需要
--> 处理依赖关系 libgcj_bc.so.()(64bit),它被软件包 javacc-4.1-0.5.el6.x86_64 需要
--> 执行事务检查
---> Package java-1.5.-gcj.x86_64 :1.5.0.0-29.1.el6 will be 安装
--> 处理依赖关系 sinjdoc,它被软件包 java-1.5.-gcj-1.5.0.0-29.1.el6.x86_64 需要
---> Package libgcj.x86_64 :4.4.-.el6 will be 安装
--> 执行事务检查
---> Package sinjdoc.x86_64 :0.5-9.1.el6 will be 安装
--> 处理依赖关系 java_cup >= 0.10,它被软件包 sinjdoc-0.5-9.1.el6.x86_64 需要
--> 执行事务检查
---> Package java_cup.x86_64 :.10k-.el6 will be 安装
--> 完成依赖关系计算

依赖关系解决

===================================================================================

软件包 架构 版本 仓库 大小

正在安装:
javacc x86_64 4.1-0.5.el6 base k
为依赖而安装:
java-1.5.-gcj x86_64 1.5.0.0-29.1.el6 base k
java_cup x86_64 :.10k-.el6 base k
libgcj x86_64 4.4.-.el6 base M
sinjdoc x86_64 0.5-9.1.el6 base k

事务概要

Install Package(s)

总下载量: M
Installed size: M
下载软件包:
(/): java-1.5.-gcj-1.5.0.0-29.1.el6.x86_64.rpm | kB :
(/): java_cup-.10k-.el6.x86_64.rpm | kB :
(/): javacc-4.1-0.5.el6.x86_64.rpm | kB :
(/): libgcj-4.4.-.el6.x86_64.rpm | MB :

(/): sinjdoc-0.5-9.1.el6.x86_64.rpm | kB :

总计 2.0 MB/s | MB :
运行 rpm_check_debug
执行事务测试
事务测试成功
执行事务
正在安装 : libgcj-4.4.-.el6.x86_64 /
正在安装 : java-1.5.-gcj-1.5.0.0-29.1.el6.x86_64 /
正在安装 : :java_cup-.10k-.el6.x86_64 /
正在安装 : sinjdoc-0.5-9.1.el6.x86_64 /
正在安装 : javacc-4.1-0.5.el6.x86_64 /
Verifying : javacc-4.1-0.5.el6.x86_64 /
Verifying : sinjdoc-0.5-9.1.el6.x86_64 /
Verifying : libgcj-4.4.-.el6.x86_64 /
Verifying : :java_cup-.10k-.el6.x86_64 /
Verifying : java-1.5.-gcj-1.5.0.0-29.1.el6.x86_64 /

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

作为依赖被安装:
java-1.5.-gcj.x86_64 :1.5.0.0-29.1.el6 java_cup.x86_64 :.10k-.el6
libgcj.x86_64 :4.4.-.el6 sinjdoc.x86_64 :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 | kB :
c6-media/group_gz | kB : …
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

* * * 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: ,
当本地缓存里的数据与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 127.0.0.1: 0.0.0.0:* LISTEN
tcp 127.0.0.1: 0.0.0.0:* LISTEN
tcp 0.0.0.0: 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 192.168.30.12: 192.168.30.1: 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 192.168.30.12: 192.168.30.1: ESTABLISHED /sshd
[root@www ~]# kill - 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-、-、-60000等的使用方式
Hosts地址与范围:
192.168.1.100:直接写入HOST IP而已,仅检查一台
192.168.1.0/:为C Class的形态
192.168.*.*:扫描B类地址
192.168.1.0-,-,,:这种变形是的主机范围

使用默认参数扫描本机所启用的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 (.0000050s latency).
Other addresses for localhost (not scanned): 127.0.0.1
Not shown: closed ports
PORT STATE SERVICE
/tcp open ssh
/tcp open smtp
/tcp open rpcbind
/tcp open netbios-ssn
/tcp open microsoft-ds
/tcp open ipp

Nmap done: IP address ( 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 (.00083s latency).
Other addresses for localhost (not scanned): 127.0.0.1
Not shown: closed ports
PORT STATE SERVICE
/tcp open ssh
/tcp open smtp
/tcp open rpcbind
/tcp open netbios-ssn
/tcp open microsoft-ds
/tcp open ipp
/udp open|filtered dhcpc
/udp open rpcbind
/udp open netbios-ns
/udp open|filtered netbios-dgm
/udp open|filtered ipp

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

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

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

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 (.00013s latency).
MAC Address: :::C0:: (VMware)
Nmap scan report for 192.168.30.2
Host is up (.00014s latency).
MAC Address: :::F8:1A:6B (VMware)
Nmap scan report for 192.168.30.9
Host is up (.000076s latency).
MAC Address: :0C::CF::BA (VMware)
Nmap scan report for 192.168.30.11
Host is up (.00020s latency).
MAC Address: :0C::C6:: (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 (.000064s latency).
MAC Address: :0C::C6:: (VMware)
Nmap scan report for 192.168.30.254
Host is up (.000038s latency).
MAC Address: :::FA::FA (VMware)
Nmap done: IP addresses ( hosts up) scanned in 7.48 seconds

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

[root@www ~]# nmap 192.168.30.0/

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
tcp 0.0.0.0: 0.0.0.0:* LISTEN /rpcbind
tcp ::: :::* LISTEN /rpcbind
[root@www ~]# which rpcbind
/sbin/rpcbind
[root@www ~]# rpm -qf /sbin/rpcbind
rpcbind-0.2.-.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
tcp ::: :::* LISTEN /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
[root@www ~]# getenforce
Permissive
[root@www ~]# setenforce
[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 :
c6-media/filelists_db | 6.3 MB : …
extras/filelists_db | kB :
updates/filelists_db | kB :
libsemanage-devel-2.0.-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.-5.1.el6.i686 : Header files and libraries used to build
: policy manipulation tools
Repo : base
匹配来自于:
Filename : /usr/include/semanage
policycoreutils-python-2.0.-30.1.el6_8.x86_64 : SELinux policy core python
: utilities
Repo : base
匹配来自于:
Filename : /usr/sbin/semanage
policycoreutils-python-2.0.-30.1.el6_8.x86_64 : SELinux policy core python
: utilities
Repo : c6-media
匹配来自于:
Filename : /usr/sbin/semanage
libsemanage-devel-2.0.-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.-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.-.el6.x86_64 : Policy analysis command-line tools for SELinux
Repo : base
匹配来自于:
Filename : /usr/bin/seinfo
setools-console-3.3.-.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.
Policy Version & Type: v. (binary, mls)

Classes: Permissions:
Sensitivities: Categories:
Types: Attributes:
Users: Roles:
Booleans: Cond. Expr.:
Allow: Neverallow:
Auditallow: Dontaudit:
Type_trans: Type_change:
Type_member: Role allow:
Role_trans: Range_trans:
Constraints: Validatetrans:
Initial SIDs: Fs_use:
Genfscon: Portcon:
Netifcon: Nodecon:
Permissives: Polcap:

实例 列出与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 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 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] 布尔值=[|]
选项与参数
-P:直接将设置值写入配置文件,该设置数据未来会生效的
实例 查询httpd_enable_homedirs是否为on,若不为on,将其设为on,
[root@www ~]# getsebool httpd_enable_homedirs
httpd_enable_homedirs --> off
[root@www ~]# setsebool -P httpd_enable_homedirs=
[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 ::: :::* LISTEN /httpd
[root@www ~]# echo "My First SELinux Check " > index.html
[root@www ~]# ls -l index.html
-rw-r--r--. root root 9月 : 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. (CentOS) Server at localhost Port 

[root@www ~]# cat /var/log/messages | grep setroubleshoot
Sep :: www yum[]: Installed: setroubleshoot-plugins-3.0.-4.1.el6.noarch
Sep :: www yum[]: Installed: setroubleshoot-server-3.0.-.el6.x86_64
Sep :: www yum[]: Installed: setroubleshoot-3.0.-.el6.x86_64
Sep :: 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 :: 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.-.el6.centos.x86_64
目标 RPM 软件包 file /var/www/html/index.html is not owned by any
package
策略 RPM selinux-policy-3.7.-.el6.noarch
Selinux 已经激活 True
策略类型 targeted
强制模式 Enforcing
主机名 www.xueji.com
平台 Linux www.xueji.com 2.6.-754.3..el6.x86_64 #
SMP Tue Aug :: UTC x86_64 x86_64
警报计数
第一个 2018年09月10日 星期一 22时01分04秒
最后一个 2018年09月10日 星期一 22时01分04秒
本地 ID 62c087fe-77ee-46f1-94b3-f78bff0cbf0b

原始核查信息
type=AVC msg=audit(1536588064.275:): avc: denied { getattr } for pid= comm="httpd" path="/var/www/html/index.html" dev=sda6 ino= 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:): arch=x86_64 syscall=lstat success=no exit=EACCES a0=5604518a6488 a1=7ffe904c5470 a2=7ffe904c5470 a3= items= ppid= pid= auid= uid= gid= euid= suid= fsuid= egid= sgid= fsgid= tty=(none) ses= 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@.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,再次测试网络服务。