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的使用

除了安装,升级,还可以查询;

用法

[[email protected] ~]# 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 有关的?
[[email protected] ~]# yum search raid
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile <==这里就是在测试最快的映射站
* base: ftp.isu.edu.tw   <==共有四个容器内容
* extras: ftp.isu.edu.tw <==每个容器都在
ftp.isu.edu.tw 上
* updates: ftp.isu.edu.tw
base | 3.7 kB 00:00 <==下载软件的表头列表中
extras | 951 B 00:00
updates | 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 (software
RAID
....(底下省略)....

范例二:上述输出结果中, mdadm 的功能为何

# 范例二:上述输出结果中, mdadm 的功能为何?
[[email protected] ~]# yum info mdadm
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: ftp.twaren.net
* extras: ftp.twaren.net
* updates: ftp.twaren.net
Installed Packages <==这里说明这是已经安装的软件!
Name : mdadm
Arch : x86_64
Version : 3.1.3
Release : 1.el6
Size : 667 k
Repo : installed
From repo : anaconda-CentOS-201106060106.x86_64
Summary : The mdadm program controls Linux md devices (software RAID
URL : 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 这个软件名为例:
[[email protected] ~]# yum install mdadm
....(前面省略)....
Setting up Install Process
Package mdadm-3.1.3-1.el6.x86_64 already installed and latest version
Nothing to do
[[email protected] ~]# yum install mdadma
Setting up Install Process
No 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 格式

[[email protected] ~]# vim /etc/yum.repos.d/drbl.repo
[drbl]
name=This is DRBL site
baseurl=http://free.nchc.org.tw/drbl-core/i386/RPMS.drbl-stable/
enable=1
gpgcheck=0

[[email protected] ~]# yum search drbl
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
============================== Matched: drbl
==============================
clonezilla.i386 : Opensource Clone System (ocs), clonezilla
drbl.i386 : DRBL (Diskless Remote Boot in Linux) package.
drbl-chntpw.i386 : Offline NT password and registry editor
....(底下省略)....

[[email protected] ~]# yum repolist all
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
repo id repo name status
base CentOS-6 - Base enabled: 6,019
c6-media CentOS-6 - Media disabled
centosplus CentOS-6 - Plus disabled
contrib CentOS-6 - Contrib disabled
debug CentOS-6 - Debuginfo disabled
drbl This is DRBL site enabled: 36 <==新
的在此!
extras CentOS-6 - Extras enabled: 0
updates CentOS-6 - Updates enabled: 1,042
repolist: 7,097

7.3 限制联机端口号(port)


7.3.2 端口观察:netstat,nmap

 

netstat:

在本机上面以自己的程序监测自己的port

在服务器的Linux系统中,开启的网络服务越少越好。要了解自己的系统当中的服务项目,最简单的方法就是使用netstat.

用法:

范例一:列出在监听的网络服务

[[email protected] ~]# netstat -tunl

ctive Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
....(底下省略)....

范例二:列出已联机的网络联机状态

[[email protected] ~]# netstat -tun
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 52 192.168.1.100:22 192.168.1.101:2162
ESTABLISHED

范例三:查找pid号,

[[email protected] ~]# netstat -tunp
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/P name
tcp 0 52 192.168.1.100:22 192.168.1.101:2162 ESTABLISHED 1342/0

nmap

透过网络的侦测软件辅助,可以侦测非本机上的其他网络主机;

被系统管理员用来管理系统安全性查核的工具

用法:

[[email protected] ~]# 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)
[[email protected] ~]# yum install nmap
[[email protected] ~]# nmap localhost
PORT STATE SERVICE
22/tcp open ssh
25/tcp open smtp
111/tcp open rpcbind
# 在预设的情况下, nmap 仅会扫瞄 TCP 的协议喔!

范例二:同时扫瞄本机的 TCP/UDP 端口

# 范例二:同时扫瞄本机的 TCP/UDP 端口
[[email protected] ~]# nmap -sTU localhost
PORT STATE SERVICE
22/tcp open ssh
25/tcp open smtp
111/tcp open rpcbind
111/udp open rpcbind <==会多出 UDP 的通讯协议端口!

范例三:透过 ICMP 封包的检测,分析区网内有几部主机是启动的

[[email protected] ~]# nmap -sP 192.168.1.0/24
Starting Nmap 5.21 ( http://nmap.org ) at 2011-07-20 17:05 CST
Nmap 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.254
Host 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

范例一:关闭软件服务流程

[[email protected] ~]# netstat -tnlp | grep 111
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 990/rpcbind
tcp 0 0 :::111 :::* LISTEN 990/rpcbind
# 原来用的是 rpcbind 这个服务程序!
[[email protected] ~]# which rpcbind
/sbin/rpcbind
# 找到档案后,再以 rpm 处理处理
[[email protected] ~]# rpm -qf /sbin/rpcbind
rpcbind-0.2.0-8.el6.x86_64
# 找到了!就是这个软件!所以将他关闭的方法可能就是:[[email protected] ~]# rpm -qc rpcbind | grep init
/etc/rc.d/init.d/rpcbind
[[email protected] ~]# /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 就是了!这样比较好理解啦

安全性本文存在于主体程序中与目标档案资源中;

查看安全性文本:

[[email protected] ~]# 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 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这个目录说明

首先查看,这两个的安全性文本

[[email protected] ~]# 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 并没有实际运作。

查看模式

[[email protected] ~]# getenforce

Enforcing <==诺!就显示出目前的模式为 Enforcing 啰!

查看使用什么政策

[[email protected] ~]# vim /etc/selinux/config
SELINUX=enforcing <==调整 enforcing|disabled|permissive
SELINUXTYPE=targeted <==目前仅有 targeted 与 mls 

enforing与permissive之间切换的方法:

范例一:将 SELinux 在 Enforcing 与 permissive 之间切换与观察

# 范例一:将 SELinux 在 Enforcing 与 permissive 之间切换与观察
[[email protected] ~]# setenforce [0|1]
选项与参数:
0 :转成 permissive 宽容模式;
1 :转成 Enforcing 强制模式

[[email protected] ~]# setenforce 0
[[email protected] ~]# getenforce
Permissive
[[email protected] ~]# setenforce 1
[[email protected] ~]# getenforce
Enforcing#setenforce 无法在 Disabled 的模式底下进行模式的切换喔!

7.4.3 selinux type的修改

既然 SELinux 的类型字段 (type) 这么重要,那如何修改与变更这个字段,当然就是最重要的一件事

范例一:将 /etc/hosts 复制到 root 家目录,并观察相关的 SELinux 类型变化

# 范例:将 /etc/hosts 复制到 root 家目录,并观察相关的 SELinux 类型变化
[[email protected] ~]# cp /etc/hosts /root
[[email protected] ~]# 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
 可见type字段变成了和root的一样

范例二:将 /root/hosts 移动到 /tmp 下,并观察相关的 SELinux 类型变化

# 范例二:将 /root/hosts 移动到 /tmp 下,并观察相关的 SELinux 类型变化
[[email protected] ~]# mv /root/hosts /tmp
[[email protected] ~]# 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

由范例一,看出单纯的赋值,selinux的type字段是会继承目标目录的type字段的,而不是原来的被拷贝的type字段;

由范例二,看出移动时,目标目录的type字段,是原来被移动的type字段。

chcon:更改安全性文件的type字段

 

[[email protected] ~]# chcon [-R] [-t type] [-u user] [-r role] 档案

[[email protected] ~]# chcon [-R] --reference=范例文件 档案

选项与参数:

-R :连同该目录下的次目录也同时修改;

-t :后面接安全性本文的类型字段!例如 httpd_sys_content_t ;

-u :后面接身份识别,例如 system_u;

-r :后面街角色,例如 system_r;

--reference=范例文件:拿某个档案当范例来修改后续接的档案的类型!

 

范例一:将刚刚的 /tmp/hosts 类型改为 etc_t 的类型

# 范例一:将刚刚的 /tmp/hosts 类型改为 etc_t 的类型
[[email protected] ~]# chcon -t net_conf_t /tmp/hosts
[[email protected] ~]# 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 修改成该类型
[[email protected] ~]# ll -dZ /var/spool/mail
drwxrwxr-x. root mail system_u:object_r:mail_spool_t:s0
/var/spool/mail
[[email protected] ~]# chcon --reference=/var/spool/mail /tmp/hosts
[[email protected] ~]# 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

用法:

[[email protected] ~]# restorecon [-Rv] 档案或目录

选项与参数:

-R :连同次目录一起修改;

-v :将过程显示到屏幕上

范例一:将刚刚 /tmp/hosts 移动至 /root 并以预设的安全性本文改正过来

# 范例:将刚刚 /tmp/hosts 移动至 /root 并以预设的安全性本文改正过来
[[email protected] ~]# mv /tmp/hosts /root
[[email protected] ~]# ll -Z /root/hosts
-rw-r--r--. root root system_u:object_r:mail_spool_t:s0 /root/hosts
[[email protected] ~]# restorecon -Rv /root
restorecon reset /root/hosts context
system_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:默认目录的安全性文本查询与修改

[[email protected] ~]# semanage {login|user|port|interface|fcontext|translation} -l

[[email protected] ~]# 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 来查询;

[[email protected] ~]# yum install setools-console

[[email protected] ~]# seinfo [-Atrub]

选项与参数:

-A :列出 SELinux 的状态、规则布尔值、身份识别、角色、类别等所有信息

-t :列出 SELinux 的所有类别 (type) 种类

-r :列出 SELinux 的所有角色 (role) 种类

-u :列出 SELinux 的所有身份识别 (user) 种类

-b :列出所有规则的种类 (布尔值)

范例一:列出 SELinux 在此政策下的统计状态

# 范例一:列出 SELinux 在此政策下的统计状态
[[email protected] ~]# seinfo
tatistics for policy file: /etc/selinux/targeted/policy/policy.24
Policy Version & Type: v.24 (binary, mls) <==列出政策所在档与版本
Classes: 77 Permissions: 229
Sensitivities: 1 Categories: 1024
Types: 3076 Attributes: 251
Users: 9 Roles: 13
Booleans: 173 Cond. Expr.: 208
Allow: 271307 Neverallow: 0
Auditallow: 44 Dontaudit: 163738
Type_trans: 10941 Type_change: 38
Type_member: 44 Role allow: 20
Role_trans: 241 Range_trans: 2590
....(底下省略)....
# 从上面我们可以看到这个政策是 targeted ,此政策的 SELinux type 有3076 个;
# 而针对网络服务的规则 (Booleans) 共制订了 173 条规则!

范例二:列出与 httpd 有关的规则 (booleans) 有哪些

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

sesearch:查看详细规则

如果查询到相关的类别或者是布尔值后,想要知道详细的规则时, 就得要使用 sesearch 这个指令了

[[email protected] ~]# sesearch [--all] [-s 主体类别] [-t 目标类别] [-b 布尔值]
选项与参数:
--all :列出该类别或布尔值的所有相关信息
-t :后面还要接类别,例如 -t httpd_t
-b :后面还要接布尔值的规则,例如 -b httpd_enable_ftp_server

范例一:找出目标档案资源类别为 httpd_sys_content_t 的有关信息
# 范例一:找出目标档案资源类别为 httpd_sys_content_t 的有关信息
[[email protected] ~]# sesearch --all -t httpd_sys_content_t
Found 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 ,请问该布尔值规范多少规则?
[[email protected] ~]# sesearch -b httpd_enable_homedirs --all
Found 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) 啦

布尔值的查询与修改

[[email protected] ~]# getsebool [-a] [布尔值条款]

选项与参数:

-a :列出目前系统上面的所有布尔值条款设定为开启或关闭值

范例一:查询本系统内所有的布尔值设定状况

# 范例一:查询本系统内所有的布尔值设定状况
[[email protected] ~]# getsebool -a
abrt_anon_write --> off
allow_console_login --> on
allow_cvs_read_shadow --> off
....(底下省略)....
# 您瞧!这就告诉你目前的布尔值状态啰!

范例二:查询 httpd_enable_homedirs 是否为 on,若不为 on 请启动他

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

[[email protected] ~]# yum install setroubleshoot setroubleshoot-server

[[email protected] ~]# /etc/init.d/auditd restart <==整合到 auditd 当中了!

例子:

[[email protected] ~]# /etc/init.d/httpd start

[[email protected] ~]# netstat -tlnp | grep http

tcp 0 0 :::80 :::* LISTEN 2218/httpd

# 看到没?有启动 port 80 了!这是重点!

我们的 WWW 服务器就安装妥当了。我们的首页其实是放置到 /var/www/html目录下的,且文件名必须要是 index.html。 那如果我使用底下的模式来进行首页的处理时,可能就会产生 SELinux 的问题了!我们就来模拟一下出问题的状况吧。

[[email protected] ~]# echo "My first selinux check" > index.html

[[email protected] ~]# ll index.html

-rw-r--r--. 1 root root 23 2011-07-20 18:16 index.html <==权限没问题

[[email protected] ~]# mv index.html /var/www/html

此时我们就可以打开浏览器,然后在浏览器上面输入 Linux 自己的 IP 来查察看,看能不能连上自己的 WWW 首页。 因为我们这次安装并没有图形接口,所以使用 links 来查察 http://localhost/index.html 看看!你会得到如下的讯息:

[[email protected] ~]# 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 的内容吧!有点像这样:

[[email protected] ~]# 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 配合侦测到的错误代码来处理。 实际处理后会像这样:

[[email protected] ~]# 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: <==还有一些额外的信息!

....(底下省略)....

[[email protected] ~]# 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。不需要想太多!分析登录档就对啦
时间: 2024-10-01 07:33:28

linux网络完全与防护的相关文章

【服务器】构建高性能Linux网络服务器

关键 高性能网络服务器的关键在于并发,如何高效的使用多核心的服务器,让多个线程并发处理程序. 并发方式 基于时间的并行 基于空间的并行, 其他提法, 在计算机内部,最本质的是时间(CPU)和空间(内存)这两种资源,各种并行的界限并没有那么明显.所谓基于时间的并行,有两只猫,共同看守一个大仓库,但一个工作,另一个睡觉,两者不同时工作.所谓基于空间的并行,将仓库分为两个部分,这样两只猫可以分别看守不同的部分,两只猫在工作不紧张的时候就可以睡觉. 网络并发程序优化 对于网络并发程序,可以从各个角度进行

linux网络环境下socket套接字编程(UDP文件传输)

今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中,如果我们使用TCP传输,会造成传输速度较慢的情况,所以我们在进行文件传输的过程中,最好要使用UDP传输. 在其中,我们需要写两个程序,一个客户端,一个服务端,在一个终端中,先运行服务端,在运行客户端,在服务端和客户端都输入IP地址和端口号,注意服务端和客户端的端口号要相同,然后选择功能,在linux

linux网络编程-(socket套接字编程UDP传输)

今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中,如果我们使用TCP传输,会造成传输速度较慢的情况,所以我们在进行文件传输的过程中,最好要使用UDP传输. 在其中,我们需要写两个程序,一个客户端,一个服务端,在一个终端中,先运行服务端,在运行客户端,在服务端和客户端都输入IP地址和端口号,注意服务端和客户端的端口号要相同,然后选择功能,在linux

Linux网络服务之HTTP(1)

Linux网络服务之HTTP(1) 实验要求: 1.主机名设为:www.zhy.com,默认首页包括:index.html.index.php,开启保持连接,确认默认httpd是否支持php 2.只允许192.168.1.1访问www.zhy.com,允许所有用户访问www.zhy.com/user/index.html 3.客户端访问/var/www/html/admin/需要输入用户名密码验证 4.客户端访问http://www.zhy.com/bbs时可以访问/var/www/html/u

linux网络编程之shutdown() 与 close()函数详解

linux网络编程之shutdown() 与 close()函数详解 参考TCPIP网络编程和UNP: shutdown函数不能关闭套接字,只能关闭输入和输出流,然后发送EOF,假设套接字为A,那么这个函数会关闭所有和A相关的套接字,包括复制的:而close能直接关闭套接字. 1.close()函数 [cpp] view plain copy print? <span style="font-size:13px;">#include<unistd.h> int 

Linux网络编程socket选项之SO_LINGER,SO_REUSEADDR

from http://blog.csdn.net/feiyinzilgd/article/details/5894300 Linux网络编程中,socket的选项很多.其中几个比较重要的选项有:SO_LINGER(仅仅适用于TCP,SCTP), SO_REUSEADDR. SO_LINGER 在默认情况下,当调用close关闭socke的使用,close会立即返回,但是,如果send buffer中还有数据,系统会试着先把send buffer中的数据发送出去,然后close才返回. SO_L

Linux网络服务13——PXE高效能批量网络装机

Linux网络服务13--PXE高效能批量网络装机 一.PXE简介 PXE:Pre-boot Excution Environment,预启动执行环境 PXE是由Intel公司开发的网络引导技术,工作在Client/Server模式,允许客户机通过网络从远程服务器下载引导镜像,并加载安装文件或者整个操作系统. 若要搭建PXE网络体系,必须要满足以下条件: ·客户机的网卡支持PXE协议(集成BOOTROM芯片),且主板支持网络引导. ·网络中有一台DHCP服务器,以便为客户机分配地址.指定引导文件

Linux网络服务11——部署YUM仓库服务

Linux网络服务11--部署YUM仓库服务 一.YUM简介 YUM的前身是YUP(Yellow dog Updater)Yellow dog Linux的软件更新,最初由TSS公司(Terra Soft Solutions,INC.)使用Python语音开发而成,后由杜克大学(Duck University)的Linux开发队伍进行改进,命名为YUM(Yellow dog Updater , Modified) 借助于YUM软件仓库,可以完成安装.卸载.自动升级rpm软件包等任务,能够自动查找

Linux网络服务12——NFS共享服务

Linux网络服务12--NFS共享服务 一.NFS简介 端口号:TCP.UDP 111端口 NFS(Network File System)网络文件系统,是一种基于TCP/IP传输的网络文件系统协议,最初由SUM公司开发.通过使用NFS协议,客户机可以像访问本地目录一样访问远程服务器中的共享资源. NFS没有用户认证机制,而且数据在网络上明文传输,所以安全性很差,一般只能在局域网中使用.NFS服务的实现依赖于RPC(Remote Process Call)远程过程调用机制,以完成远程到本地的映