首页 > 代码库 > linux网络完全与防护

linux网络完全与防护

 

7.1 网络封包联机进入主机的流程

 
7.1.1 封包进入主机的流程
技术分享

 

1.经过防火墙的分析
  • iptables
    • 主要功能是封包过滤
    • 主要分析TCP/IP的封包表头来进行过滤的机制
    • 分析的是OSI的第二三四层,主要控制的就是
      • MAC,IP,ICMP,TCP,UDP的端口与状态SYN,ACK...)
  • tcp_wrappers
    • 在通过iptables的过滤之后,开始接受tcp_wrapppers的检验
    • 即/etc/hosts.allow 与/etc/hosts.deny两个配置文件
    • 同样可以地址或通过一些ip或者port
  • 防火墙的管控,我们可以将大部分来自因特网的垃圾联机丢弃,只允许自己开发的服务的联机进入本机而已,可以达到最基础的安全防护;
 

2.服务(daemon)的基本功能

  • 防火墙主要管理的是MAC,IP,Port等封包的表头方面的信息
  • 要控管一些目录的权限,就要使用服务软件本身的设置做限制
  • 举例:
    • 可以在 httpd.conf 这个配置文件之内规范某些 IP 来源不能使用 httpd 这个服务来取得主机的数据, 那么即使该 IP 通过前面两层的过滤,他依旧无法取得主机的资源喔
  • 注意
    • 如果 httpd 这支程序本来就有问题的话,那么client 端将可直接利用 httpd 软件的漏洞来入侵主机,而不需要取得主机内root 的密码
 

3. selinux对网络服务的细部权限控制

  • selinux(security enhanced Linux,安全强化 Linux)
  • 可以针对网络服务的权限来设定一些规则(policy)让程序能够进行的功能有限,因此即使使用者的权限设置错误,以及程序有问题时,该程序能够进行的动作还是被限制的,即使该程序使用的是root的权限也一样。
  • 举例
    • 前一个步骤的 httpd 真的被 cracker 攻击而让对方取得 root 的使用权,由于 httpd 已经被 SELinux 控制在 /var/www/html 里面,且能够进行的功能已经被规范住了,因此 cracker 就无法使用该程序来进行系统的进一步破坏啰。
4. 使用主机的文件系统资源
  • 文件的权限
    • R,W,X
 
7.1.2 常见的攻击手法与相关保护
 
1.取得账户信息后猜密码
2.利用系统的程序漏洞主动攻击
3.利用社交工程做欺骗
4.蠕虫或木马的rootkit
5.DDOS攻击
 
主机防护建议
  • 建立完善的登陆密码规则限制
  • 完善的主机权限设定
  • 设定自动升级与修补软件漏洞,及移除危险软件
  • 在每项系统服务的设定当中,强化安全设定的项目
  • 利用iptables,tcp_wrappers强化网络防火墙
  • 领主机监控软件MRTG与logwatch来分析主机状况与登录文件
 
7.1.3 主机能做的保护
  • 软件更新
  • 减少网络服务
  • 启动selinux
 
 
7.2 网络自动升级软件

 
7.2.1 如何自动升级
  • yum
  • apt
  • dpkg
7.2.2 centos的yum软件更新,映像站使用的原理
技术分享
  1. 先有配置文件判断yum server 所在IP地址
  2. 连接到yum server后,先下载新的rpm档案的表头数据
  3. 分析比较使用这所欲安装/升级的档案,并提供使用者确认
  4. 下载用户选择的档案到系统中/var/cache/yum,并进行实际安装
 
7.2.3 yum的使用
除了安装,升级,还可以查询;
用法
 
[root@www ~]# yum [option] [查询的工作项目] [相关参数]
选项与参数:
option:主要的参数,包括有:
-y :当 yum 询问使用者的意见时,主动回答 yes 而不需要由键盘输入;
 
[查询的工作项目]:由于不同的使用条件,而有一些选择的项目,包括:
install :指定安装的软件名称,所以后面需接『 软件名称 』
update :进行整体升级的行为;当然也可以接某个软件,仅升级一个软件;
remove :移除某个软件,后面需接软件名称;
search : 搜寻某个软件或者是重要关键字;
list :列出目前 yum 所管理的所有的软件名称与版本,有点类似 rpm -qa;
info :同上,不过有点类似 rpm -qai 的执行结果;
clean :下载的档案被放到 /var/cache/yum ,可使用 clean 将他移除,
        可清除的项目: packages | headers | metadata | cache 等;
 
在[查询的工作项目]部分还可以具有整个群组软件的安装方式,如下所示:
grouplist :列出所有可使用的『软件群组』,例如 Development Tools之类的;
groupinfo :后面接 group_name,则可了解该 group 内含的所有软件名;
groupinstall:这个好用!可以安装一整组的软件群组,相当的不错用!
 
 
范例一:搜寻 CentOS 官网提供的软件名称是否有与 RAID 有关的
# 范例一:搜寻 CentOS 官网提供的软件名称是否有与 RAID 有关的?[root@www ~]# yum search raidLoaded plugins: fastestmirrorLoading mirror speeds from cached hostfile <==这里就是在测试最快的映射站* base: ftp.isu.edu.tw   <==共有四个容器内容* extras: ftp.isu.edu.tw <==每个容器都在ftp.isu.edu.tw 上* updates: ftp.isu.edu.twbase | 3.7 kB 00:00 <==下载软件的表头列表中extras | 951 B 00:00updates | 3.5 kB 00:00=================== Matched: raid =================<==找到的结果如下dmraid.i686 : dmraid (Device-mapper RAID tool and library)....(中间省略)....mdadm.x86_64 : The mdadm program controls Linux md devices (softwareRAID....(底下省略)....

 

范例二:上述输出结果中, mdadm 的功能为何
# 范例二:上述输出结果中, mdadm 的功能为何?[root@www ~]# yum info mdadmLoaded plugins: fastestmirrorLoading mirror speeds from cached hostfile* base: ftp.twaren.net* extras: ftp.twaren.net* updates: ftp.twaren.netInstalled Packages <==这里说明这是已经安装的软件!Name : mdadmArch : x86_64Version : 3.1.3Release : 1.el6Size : 667 kRepo : installedFrom repo : anaconda-CentOS-201106060106.x86_64Summary : The mdadm program controls Linux md devices (software RAIDURL : http://www.kernel.org/pub/linux/utils/raid/mdadm/License : GPLv2+Description: The mdadm program is used to create, manage, and monitor....(底下省略)....# 由上述底线的 Summary 关键词,知道这软件在达成软件磁盘阵列功能!!
 
范例三:安装某个软件吧!以 mdadm 这个软件名为例
#范例三:安装某个软件吧!以 mdadm 这个软件名为例:[root@www ~]# yum install mdadm....(前面省略)....Setting up Install ProcessPackage mdadm-3.1.3-1.el6.x86_64 already installed and latest versionNothing to do[root@www ~]# yum install mdadmaSetting up Install ProcessNo package mdadma available.Nothing to do
 
yum映像站的更改与软件制作
 
写入配置文件,并赋权,即可将软件使用yum来安装;
具体参照yum配置文件
/etc/yum.repos.d/CentOS-Base.repo
 
例子
有一个网址:http://free.nchc.org.tw/drbl-core/i386/RPMS.drbl-stable/ ,里面包含了台湾的国家高速网络中心所发展的自由软件。请依据该网址提供的数据,做成系统可以自动网络安装的 yum 格式
[root@www ~]# vim /etc/yum.repos.d/drbl.repo[drbl]name=This is DRBL sitebaseurl=http://free.nchc.org.tw/drbl-core/i386/RPMS.drbl-stable/enable=1gpgcheck=0 [root@www ~]# yum search drblLoaded plugins: fastestmirrorLoading mirror speeds from cached hostfile============================== Matched: drbl==============================clonezilla.i386 : Opensource Clone System (ocs), clonezilladrbl.i386 : DRBL (Diskless Remote Boot in Linux) package.drbl-chntpw.i386 : Offline NT password and registry editor....(底下省略).... [root@www ~]# yum repolist allLoaded plugins: fastestmirrorLoading mirror speeds from cached hostfilerepo id repo name statusbase CentOS-6 - Base enabled: 6,019c6-media CentOS-6 - Media disabledcentosplus CentOS-6 - Plus disabledcontrib CentOS-6 - Contrib disableddebug CentOS-6 - Debuginfo disableddrbl This is DRBL site enabled: 36 <==新的在此!extras CentOS-6 - Extras enabled: 0updates CentOS-6 - Updates enabled: 1,042repolist: 7,097

 

 
 
 
7.3 限制联机端口号(port)

 
7.3.2 端口观察:netstat,nmap
 
netstat:
在本机上面以自己的程序监测自己的port
在服务器的Linux系统中,开启的网络服务越少越好。要了解自己的系统当中的服务项目,最简单的方法就是使用netstat.
用法:
范例一:列出在监听的网络服务
[root@www ~]# netstat -tunl
ctive Internet connections (only servers)Proto Recv-Q Send-Q Local Address Foreign Address Statetcp 0 0 0.0.0.0:111 0.0.0.0:* LISTENtcp 0 0 0.0.0.0:22 0.0.0.0:* LISTENtcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN....(底下省略)....

 

范例二:列出已联机的网络联机状态
[root@www ~]# netstat -tunActive Internet connections (w/o servers)Proto Recv-Q Send-Q Local Address Foreign Address Statetcp 0 52 192.168.1.100:22 192.168.1.101:2162ESTABLISHED

 

范例三:查找pid号,
[root@www ~]# netstat -tunpActive Internet connections (w/o servers)Proto Recv-Q Send-Q Local Address Foreign Address State PID/P nametcp 0 52 192.168.1.100:22 192.168.1.101:2162 ESTABLISHED 1342/0
 
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-1023, 30000-60000 等等的使用方式
 
[Hosts 地址与范围]:这个有趣多了,有几种类似的类型
192.168.1.100 :直接写入 HOST IP 而已,仅检查一部;
192.168.1.0/24 :为 C Class 的型态,
192.168.*.* :嘿嘿!则变为 B Class 的型态了!扫瞄的范围变广了!
 
范例一:使用预设参数扫瞄本机所启用的 port (只会扫瞄 TCP)
# 范例一:使用预设参数扫瞄本机所启用的 port (只会扫瞄 TCP)[root@www ~]# yum install nmap[root@www ~]# nmap localhostPORT STATE SERVICE22/tcp open ssh25/tcp open smtp111/tcp open rpcbind# 在预设的情况下, nmap 仅会扫瞄 TCP 的协议喔!

 

范例二:同时扫瞄本机的 TCP/UDP 端口
# 范例二:同时扫瞄本机的 TCP/UDP 端口[root@www ~]# nmap -sTU localhostPORT STATE SERVICE22/tcp open ssh25/tcp open smtp111/tcp open rpcbind111/udp open rpcbind <==会多出 UDP 的通讯协议端口!

 

范例三:透过 ICMP 封包的检测,分析区网内有几部主机是启动的
[root@www ~]# nmap -sP 192.168.1.0/24Starting Nmap 5.21 ( http://nmap.org ) at 2011-07-20 17:05 CSTNmap scan report for www.centos.vbird (192.168.1.100)Host is up.Nmap scan report for 192.168.1.101 <==这三行讲的是 192.168.101 的范例!Host is up (0.00024s latency).MAC Address: 00:1B:FC:58:9A:BB (Asustek Computer)Nmap scan report for 192.168.1.254Host is up (0.00026s latency).MAC Address: 00:0C:6E:85:D5:69 (Asustek Computer)Nmap done: 256 IP addresses (3 hosts up) scanned in 3.81 seconds

 

7.3.3 端口与服务的启动/关闭及开机时状态设定
 
关闭服务使用kill,似乎太暴力不是正道;
使用系统提供的script来关闭就很好;
 
传统服务有哪几种类型?
  • stand alone 
    • 直接执行该服务的执行档,让执行档案直接加载到内存中运行。
    • 这种服务启动script都会放在/etc/init.d中
    • 常常使用/etc/init.d/sshd restart来重启
    • 网络服务响应速度快的优点
  • super daemon
    • 用一个超级服务作为总管,来统一管理某些特殊的服务。
    • centos6.x是xinetd 这个super daemon
    • 虽然在响应速度上比较慢但super daemon可以提供一些控管;
      • 何时启动,何时可以进行联机,哪个ip可以连进来,是否允许同时联机等等一些管控。
    • 一般在/etc/xinetd.d/中
    • 使用/etc/init.d/xinetd  restart
 
范例一:关闭软件服务流程
[root@www ~]# netstat -tnlp | grep 111tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 990/rpcbindtcp 0 0 :::111 :::* LISTEN 990/rpcbind# 原来用的是 rpcbind 这个服务程序!
[root@www
~]# which rpcbind/sbin/rpcbind# 找到档案后,再以 rpm 处理处理
[root@www
~]# rpm -qf /sbin/rpcbindrpcbind-0.2.0-8.el6.x86_64# 找到了!就是这个软件!所以将他关闭的方法可能就是:
[root@www
~]# rpm -qc rpcbind | grep init/etc/rc.d/init.d/rpcbind
[root@www
~]# /etc/init.d/rpcbind stop

 

7.4 selinux 管理原则

 
     SELinux 使用所谓的委任式访问控制 (Mandatory Access Control, MAC) ,他可以针对特定的程序与特定的档案资源来进行权限的控管!
也就是说,即使你是 root ,那么在使用不同的程序时,你所能取得的权限并不一定是 root ,而得要看当时该程序的设定而定。
     
     这个权限的管理模式就特别适合网络服务的『程序』了! 因为,即使你的程序使用 root 的身份去启动,如果这个程序被攻击而被取得操作权,那该程序能作的事情还是有限的, 因为被 SELinux 限制住了能进行的工作了。
     
7.4.1 selinux的运作模式
     SELinux 是透过 MAC 的方式来控管程序,他控制的主体是程序, 而目标则是该程序能否读取的『档案资源』;
 
  • 主体 (Subject):
    • SELinux 主要想要管理的就是程序,因此你可以将『主体』跟本章谈到的 process划上等号;
  • 目标 (Object):
    • 主体程序能否存取的『目标资源』一般就是文件系统。因此这个目标项目可以等文件系统划上等号;
  •  政策 (Policy):
    • 由于程序与档案数量庞大,因此 SELinux 会依据某些服务来制订基本的存取安全性政策。这些政策内还会有详细的规则 (rule) 来指定不同的服务开放某些资源的存取与否。
    • 在目前的 CentOS 6.x 里面仅有提供两个主要的政策如下,一般来说,使用预设的 target 政策即可。
      • targeted:针对网络服务限制较多,针对本机限制较少,默认的政策;
      • mls:完整的 SELinux 限制,限制方面较为严格。
  • 安全性本文 (security context):
    • 我们刚刚谈到了主体、目标与政策面,但是主体能不能存取目标除了要符合政策指定之外,主体与目标的安全性本文必须一致才能够顺利存取。
      • 简单理解
        • 能不能存取还得要看两者的安全性文本是否匹配。而安全性文本中,就是看主体的domain与目标的type是否搭配。而这种搭配是在政策中规定好的。但最终主体能不能拿到目标还要看,目标的rwx是否服务Linux权限的规范。
    • 安全性本文的内容与设定是非常重要的! 如果设定错误,你的某些服务(主体程序)就无法存取文件系统(目标资源),当然就会一直出现『权限不符』的错误
 
技术分享

 

(1)主体程序必须要通过 SELinux 政策内的规则放行后,就可以与目标资源进行安全性本文的比对
(2)若比对失败则无法存取目标,若比对成功则可以开始存取目标。问题是,最终能否存取目标还是与文件系统的 rwx 权限设定有关!如此一来,加入了SELinux 之后,出现权限不符的情况时,你就得要一步一步的分析可能的问题了
 
 
安全性文本(security context)
CentOS 6.x 的 target 政策已经帮我们制订好非常多的规则了,因此你只要知道如何开启/关闭某项规则的放行与否即可。
 
安全性文本比较麻烦,因为需要自行配置文件的安全性文本;
为何需要自行设定啊? 举例来说,你不也常常进行档案的 rwx 的重新设定吗?这个安全性本文你就将他想成 SELinux 内必备的 rwx 就是了!这样比较好理解啦
 
安全性本文存在于主体程序中与目标档案资源中;
 
查看安全性文本:
[root@www ~]# ls -Z-rw-------. root root system_u:object_r:admin_home_t:s0 anaconda-ks.cfgdrwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 bin-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# 上述特殊字体的部分,就是安全性本文的内容!

 

安全性文本主要用冒号分为三段(最后一个字段先略过不看),这三个字段的意义为:
system_u:object_r:admin_home_t
Identify:role:type
身份识别:角色:类型
  • 身份识别 (Identify):相当于账号方面的身份识别!主要的身份识别则有底下三种常见的类型:
    • root:表示 root 的账号身份,如同上面的表格显示的是 root 家目录下的数据啊!
    • system_u:表示系统程序方面的识别,通常就是程序啰;
    • user_u:代表的是一般使用者账号相关的身份。
  • 角色 (Role): 透过角色字段,我们可以知道这个数据是属于程序、档案资源还是代表使用者。一般的角色有:
    • object_r:代表的是档案或目录等档案资源,这应该是最常见的啰;
    • system_r:代表的就是程序啦!不过,一般使用者也会被指定成为system_r 喔!
  • 类型 (Type):
    • 在预设的 targeted 政策中, Identify 与 Role 字段基本上是不重要的!重要的在于这个类型 (type) 字段! 基本上,一个主体程序能不能读取到这个档案资源,与类型字段有关!
    • 类型字段在档案与程序的定义不太相同,分别是:
      • type:在档案资源 (Object) 上面称为类型 (Type);
      • domain:在主体程序 (Subject) 则称为领域 (domain) 了
      • domain 需要与 type 搭配,则该程序才能够顺利的读取档案资源啦
  • 程序与档案selinux type 字段的相关性
 
 
三字段的利用:
主体程序的对应资料在targeted政策下的对应:
技术分享

 

类型

其实最重要的字段是类型字段,主体与目标之间是否具有可以读写的权限,与程序的 domain 及档案的 type 有关
 
举例来说:httpd,与/var/www/html这个目录说明
首先查看,这两个的安全性文本
 
[root@www ~]# ll -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 这个可以执行的domain,而 /var/www/html 则属于httpd_sys_content_t 这个可以让 httpd 领域 (domain) 读取的类型。
技术分享

 

上图的意义:
  • 首先,我们触发一个可执行的目标档案,那就是具有 httpd_exec_t 这个类型的 /usr/sbin/httpd
  • 该档案的类型会让这个档案所造成的主体程序 (Subject) 具有 httpd 这个领域 (domain), 我们的政策针对这个领域已经制定了许多规则,其中包括这个领域可以读取的目标资源类型;
  • 由于 httpd domain 被设定为可以读取 httpd_sys_content_t 这个类型的目标档案 (Object), 因此你的网页放置到 /var/www/html/ 目录下,就能够被httpd 那支程序所读取了;
  • 但最终能不能读到正确的资料,还得要看 rwx 是否符合 Linux 权限的规范!
 
注意:
  • 政策内需要制订详细的 domain/type 相关性;
  • 若档案的 type 设定错误, 那么即使权限设定为 rwx 全开的 777 ,该主体程序也无法读取目标档案资源的啦
 
7.4.2 selinux的启动,关闭,观察
 
selinux支持三种模式
  • enforcing:强制模式,代表 SELinux 运作中,且已经正确的开始限domain/type 了;
  • permissive:宽容模式:代表 SELinux 运作中,不过仅会有警告讯息并不 会实际限制 domain/type 的存取。这种模式可以运来作为 SELinux 的 debug 之用;
  • disabled:关闭, SELinux 并没有实际运作。
 
查看模式
[root@www ~]# getenforce
Enforcing <==诺!就显示出目前的模式为 Enforcing 啰!
 
查看使用什么政策
[root@www ~]# vim /etc/selinux/configSELINUX=enforcing <==调整 enforcing|disabled|permissiveSELINUXTYPE=targeted <==目前仅有 targeted 与 mls 
 
enforing与permissive之间切换的方法:
范例一:将 SELinux 在 Enforcing 与 permissive 之间切换与观察
# 范例一:将 SELinux 在 Enforcing 与 permissive 之间切换与观察[root@www ~]# setenforce [0|1]选项与参数:0 :转成 permissive 宽容模式;1 :转成 Enforcing 强制模式[root@www ~]# setenforce 0[root@www ~]# getenforcePermissive[root@www ~]# setenforce 1[root@www ~]# getenforceEnforcing
#setenforce 无法在 Disabled 的模式底下进行模式的切换喔!
 
7.4.3 selinux type的修改
既然 SELinux 的类型字段 (type) 这么重要,那如何修改与变更这个字段,当然就是最重要的一件事
 
范例一:将 /etc/hosts 复制到 root 家目录,并观察相关的 SELinux 类型变化
# 范例:将 /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/hostsdr-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 
可见type字段变成了和root的一样
 
范例二:将 /root/hosts 移动到 /tmp 下,并观察相关的 SELinux 类型变化
# 范例二:将 /root/hosts 移动到 /tmp 下,并观察相关的 SELinux 类型变化[root@www ~]# mv /root/hosts /tmp[root@www ~]# ls -dZ /tmp /tmp/hostsdrwxrwxrwt. 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

 

由范例一,看出单纯的赋值,selinux的type字段是会继承目标目录的type字段的,而不是原来的被拷贝的type字段;
由范例二,看出移动时,目标目录的type字段,是原来被移动的type字段。
 
 
chcon:更改安全性文件的type字段
 
[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=范例文件:拿某个档案当范例来修改后续接的档案的类型!
 
范例一:将刚刚的 /tmp/hosts 类型改为 etc_t 的类型
# 范例一:将刚刚的 /tmp/hosts 类型改为 etc_t 的类型[root@www ~]# chcon -t net_conf_t /tmp/hosts[root@www ~]# ll -Z /tmp/hosts-rw-r--r--. root root unconfined_u:object_r:net_conf_t:s0 /tmp/hosts

 

范例二:以 /var/spool/mail/ 为依据,将 /tmp/hosts 修改成该类型
# 范例二:以 /var/spool/mail/ 为依据,将 /tmp/hosts 修改成该类型[root@www ~]# ll -dZ /var/spool/maildrwxrwxr-x. root mail system_u:object_r:mail_spool_t:s0/var/spool/mail[root@www ~]# chcon --reference=/var/spool/mail /tmp/hosts[root@www ~]# ll -Z /tmp/hosts-rw-r--r--. root root system_u:object_r:mail_spool_t:s0 /tmp/hosts

 

chcon 的修改方式中,我们必须要知道最终我们的 SELinux type 是啥类型后,才能够变更成功。
如果你想要作的是『复原成原有的 SELinux type』呢?那可以参考底下的指令来进行呦!
 
restoreson:恢复默认type
用法:
[root@www ~]# restorecon [-Rv] 档案或目录
选项与参数:
-R :连同次目录一起修改;
-v :将过程显示到屏幕上
 
范例一:将刚刚 /tmp/hosts 移动至 /root 并以预设的安全性本文改正过来
# 范例:将刚刚 /tmp/hosts 移动至 /root 并以预设的安全性本文改正过来[root@www ~]# mv /tmp/hosts /root[root@www ~]# ll -Z /root/hosts-rw-r--r--. root root system_u:object_r:mail_spool_t:s0 /root/hosts[root@www ~]# restorecon -Rv /rootrestorecon reset /root/hosts contextsystem_u:object_r:mail_spool_t:s0->system_u:object_r:admin_home_t:s0# 表示将 hosts 由 mail_spool_t 改为 admin_home_t

 

restoreson,的依据文件是/etc/selinux/targeted/contexts,
因为该目录内有很多不同的数据,内容太多,想用文本编辑器查阅比较麻烦,此时可以通过semanage这个指令来查看;
 
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 :删除的意思。
 
7.4.4 selinux政策内的规则布尔值修订
 
要通过 SELinux 的验证之后才能开始档案权限 rwx 的判断,而SELinux 的判断主要是:
  1.  政策内的规则比对与
  2.  程序与档案的 SELinux type 
 
seinfo:政策查阅
 
CentOS 6.x 预设使使用 targeted 政策,那么这个政策提供多少相关的规则呢?此时可以透过 seinfo 来查询;
 
[root@www ~]# yum install setools-console
[root@www ~]# seinfo [-Atrub]
选项与参数:
-A :列出 SELinux 的状态、规则布尔值、身份识别、角色、类别等所有信息
-t :列出 SELinux 的所有类别 (type) 种类
-r :列出 SELinux 的所有角色 (role) 种类
-u :列出 SELinux 的所有身份识别 (user) 种类
-b :列出所有规则的种类 (布尔值)
 
范例一:列出 SELinux 在此政策下的统计状态
# 范例一:列出 SELinux 在此政策下的统计状态[root@www ~]# seinfotatistics for policy file: /etc/selinux/targeted/policy/policy.24Policy Version & Type: v.24 (binary, mls) <==列出政策所在档与版本Classes: 77 Permissions: 229Sensitivities: 1 Categories: 1024Types: 3076 Attributes: 251Users: 9 Roles: 13Booleans: 173 Cond. Expr.: 208Allow: 271307 Neverallow: 0Auditallow: 44 Dontaudit: 163738Type_trans: 10941 Type_change: 38Type_member: 44 Role allow: 20Role_trans: 241 Range_trans: 2590....(底下省略)....# 从上面我们可以看到这个政策是 targeted ,此政策的 SELinux type 有3076 个;# 而针对网络服务的规则 (Booleans) 共制订了 173 条规则!

 

范例二:列出与 httpd 有关的规则 (booleans) 有哪些
# 范例二:列出与 httpd 有关的规则 (booleans) 有哪些?[root@www ~]# seinfo -b | grep httpdConditional Booleans: 173allow_httpd_mod_auth_pamhttpd_setrlimithttpd_enable_ftp_server....(底下省略)....# 你可以看到,有非常多的与 httpd 有关的规则订定呢!

 

sesearch:查看详细规则
如果查询到相关的类别或者是布尔值后,想要知道详细的规则时, 就得要使用 sesearch 这个指令了
[root@www ~]# sesearch [--all] [-s 主体类别] [-t 目标类别] [-b 布尔值]选项与参数:--all :列出该类别或布尔值的所有相关信息-t :后面还要接类别,例如 -t httpd_t-b :后面还要接布尔值的规则,例如 -b httpd_enable_ftp_server 范例一:找出目标档案资源类别为 httpd_sys_content_t 的有关信息# 范例一:找出目标档案资源类别为 httpd_sys_content_t 的有关信息[root@www ~]# sesearch --all -t httpd_sys_content_tFound 683 semantic av rules:allow avahi_t file_type : filesystem getattr ;allow corosync_t file_type : filesystem getattr ;allow munin_system_plugin_t file_type : filesystem getattr ;....(底下省略)....# 『 allow 主体程序安全性本文类别 目标档案安全性本文类别 』# 如上,说明这个类别可以被那个主题程序的类别所读取,以及目标档案资源的格式。

 

你可以很轻易的查询到某个主体程序 (subject) 可以读取的目标档案资源 (Object)
 
范例三:我知道有个布尔值为 httpd_enable_homedirs ,请问该布尔值规范多少规则?
#范例三:我知道有个布尔值为 httpd_enable_homedirs ,请问该布尔值规范多少规则?[root@www ~]# sesearch -b httpd_enable_homedirs --allFound 43 semantic av rules:allow httpd_user_script_t user_home_dir_t : dir { getattr search open } ;allow httpd_sys_script_t user_home_dir_t : dir { ioctl read getattr } ;....(后面省略)....

 

这个布尔值的设定我们可以看到里面规范了非常多的主体程序与目标档案资源的放行与否!
实际规范这些规则的,就是布尔值的项目!那也就是我们之前所说的一堆规则是也! 你的主体程序能否对某些目标档案进行存取,与这个布尔值非常有关系喔!
因为布尔值可以将规则设定为启动 (1) 或者是关闭 (0) 啦
 
布尔值的查询与修改
[root@www ~]# getsebool [-a] [布尔值条款]
选项与参数:
-a :列出目前系统上面的所有布尔值条款设定为开启或关闭值
 
范例一:查询本系统内所有的布尔值设定状况
# 范例一:查询本系统内所有的布尔值设定状况[root@www ~]# getsebool -aabrt_anon_write --> offallow_console_login --> onallow_cvs_read_shadow --> off....(底下省略)....# 您瞧!这就告诉你目前的布尔值状态啰!

 

范例二:查询 httpd_enable_homedirs 是否为 on,若不为 on 请启动他
[root@www ~]# setsebool [-P] 布尔值=[0|1]选项与参数:-P :直接将设定值写入配置文件,该设定数据未来会生效的!# 范例一:查询 httpd_enable_homedirs 是否为 on,若不为 on 请启动他![root@www ~]# getsebool httpd_enable_homedirshttpd_enable_homedirs --> off <==结果是 off ,依题意给他启动![root@www ~]# setsebool -P httpd_enable_homedirs=1[root@www ~]# getsebool httpd_enable_homedirshttpd_enable_homedirs --> on

 

7.4.5 selinux登陆文件记录所需服务
 
setroubleshoot --> 错误讯息写入 /var/log/messages
 
     这个服务会将关于 SELinux 的错误讯息与克服方法记录到/var/log/messages 与 /var/log/setroubleshoot/* 里头,所以你一定得要启动这个服务才好
 
     启动这个服务之前当然就是得要安装它啦! 这玩意儿总共需要两个软件,分别是
     setroublshoot 与 setroubleshoot-server,如果你没有安装,请自行使用 yum安装!
 
      原本的 SELinux 信息本来是以两个服务来记录的,分别是 auditd 与setroubleshootd。既然是同样的信息, 因此 CentOS 6.x 将两者整合在 auditd 当中啦!
所以,并没有 setroubleshootd 的服务存在了喔!因此, 当你安装好了setroubleshoot-server 之后,请记得要重新启动 auditd,否则 setroubleshootd 的功能不会被启动的
 
[root@www ~]# yum install setroubleshoot setroubleshoot-server
[root@www ~]# /etc/init.d/auditd restart <==整合到 auditd 当中了!
 
例子:
 
[root@www ~]# /etc/init.d/httpd start
[root@www ~]# netstat -tlnp | grep http
tcp 0 0 :::80 :::* LISTEN 2218/httpd
# 看到没?有启动 port 80 了!这是重点!
 
     我们的 WWW 服务器就安装妥当了。我们的首页其实是放置到 /var/www/html目录下的,且文件名必须要是 index.html。 那如果我使用底下的模式来进行首页的处理时,可能就会产生 SELinux 的问题了!我们就来模拟一下出问题的状况吧。
 
[root@www ~]# echo "My first selinux check" > index.html
[root@www ~]# ll index.html
-rw-r--r--. 1 root root 23 2011-07-20 18:16 index.html <==权限没问题
[root@www ~]# mv index.html /var/www/html
 
此时我们就可以打开浏览器,然后在浏览器上面输入 Linux 自己的 IP 来查察看,看能不能连上自己的 WWW 首页。 因为我们这次安装并没有图形接口,所以使用 links 来查察 http://localhost/index.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
 
你并没有权限可以存取 index.html 的!见鬼了!明明权限是对的喔!那怎办? 没关系,就透过 setroubleshoot 的功能去检查看看。此时请分析一下 /var/log/messages 的内容吧!有点像这样:
 
[root@www ~]# cat /var/log/messages | grep setroubleshoot
Jul 21 14:53:20 www setroubleshoot: SELinux is preventing
/usr/sbin/httpd
"getattr" access to /var/www/html/index.html. For complete SELinux messages.
run sealert -l 6c927892-2469-4fcc-8568-949da0b4cf8d
 
 
     说的是『 SElinux 被用来避免 httpd 读取到错误的安全性本文, 想要查阅完整的数据,请执行 sealert -l ...』没错!
重点就是 sealert -l 啦! 上面提供的信息并不完整,想要更完整的说明得要靠sealert 配合侦测到的错误代码来处理。 实际处理后会像这样:
 
[root@www ~]# sealert -l 6c927892-2469-4fcc-8568-949da0b4cf8d
Summary:
SELinux is preventing /usr/sbin/httpd "getattr" access to
/var/www/html/index.html. <==刚刚在 messages 里面看到的信息!
Detailed Description: <==接下来是详细的状况解析!要看喔!
SELinux denied access requested by httpd. /var/www/html/index.html may
be a mislabeled. /var/www/html/index.html default SELinux type is
httpd_sys_content_t, but its current type is admin_home_t. Changing
this file back to the default type, may fix your problem.
....(中间省略)....
Allowing Access: <==超重要的项目!要看要看!
You can restore the default system context to this file by executing the
restorecon command. restorecon ‘/var/www/html/index.html‘, if this file
is a directory, you can recursively restore using
restorecon -R ‘/var/www/html/index.html‘.
Fix Command:
/sbin/restorecon ‘/var/www/html/index.html‘ <==知道如何解决了吗?
Additional Information: <==还有一些额外的信息!
....(底下省略)....
[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->system_u:object_r:httpd_sys_content_t:s0
 
     不管出了啥 SELinux 的问题,绝大部分在 setroubleshoot 的服务中就会告诉你解决之道!所以,很多东西都不用背的!
 
 
用 email 或在指令列上面直接提供 setroubleshoot 错误讯息
 
     我们可以让setroubleshoot 主动的发送产生的信息到我们指定的 email,这样可以方便我们实时的分析喔!怎么办到?就修改 setroubleshoot 的配置文件即可。你可以查阅/etc/setroubleshoot/setroubleshoot.cfg 这个档案的内容。
 
selinux错误克服总结
因为你的网络联机要通过 SELinux 才的权限判定后才能够继续 rwx 的权限比对。而 SELinux 的比对主要又分为:
(1)需要通过政策的各项规则比对后
(2)才能够进行 SELinux type 安全性本文的比对,这两项工作都得要正确才行。
后续的 SELinux 修改主要是透过 chcon, restorecon, setsebool 等指令来处理的。但是如何处理呢?可以透过分析 /var/log/messages 内提供的setroubleshoot 的信息来处置!这样就很轻松的可以管理你的 SELinux
 
但是如果因为某些原因,举例来说 CentOS 没有规范到的 setroubleshoot 信息时,可能你还是无法了解到事情到底是哪里出错。 那此时我们会这样建议:
  1. 在服务与 rwx 权限都没有问题,却无法成功的使用网络服务时;
  2. 先使用 setenforce 0 设定为宽容模式;
  3. 再次使用该网络服务,如果这样就能用,表示 SELinux 出问题,请往下继续处理。如果这样还不能用,那问题就不是在 SELinux 上面!请再找其他解决方法,底下的动作不适合你;
  4. 分析 /var/log/messages 内的信息,找到 sealert -l 相关的信息并且执行;
  5. 找到 Allow Access 的关键词,照里面的动作来进行 SELinux 的错误克服;
  6. 处理完毕重新 setenforce 1 ,再次测试网络服务吧!这样就能够很轻松的管理你的 SELinux。不需要想太多!分析登录档就对啦
 
 

linux网络完全与防护