【鸟哥的linux私房菜-学习笔记】网络安全与主机基本防护

来源:互联网 发布:生意参谋数据抓取 编辑:程序博客网 时间:2024/05/17 02:07

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

1.封包进入主机的流程

这里写图片描述

  • 经过防火墙的分析:
    Linux 系统有内建的防火墙机制,预设的 Linux 防火墙就有两个机制,这两个机制都是独立存在的。第一层是封包过滤式的 netfilter 防火墙, 另一个则是透过软件控管的 TCP Wrappers 防火墙。

  • 封包过滤防火墙:IP Filtering 或 Net Filter
    要进入 Linux 本机的封包都会先通过 Linux 核心的预设防火墙,就是称为 netfilter 的咚咚,简单的说,就是 iptables 这个软件所提供的防火墙功能。为何称为封包过滤呢?因为他主要是分析 TCP/IP 的封包表头来进行过滤的机制,主要分析的是 OSI 的第二、三、四层,主要控制的就是 MAC, IP, ICMP, TCP 与 UDP 的埠口与状态 (SYN, ACK…) 等。

  • 第二层防火墙:TCP Wrappers
    通过 netfilter 之后,网络封包会开始接受 Super daemons 及 TCP_Wrappers 的检验,那个是什么呢? 说穿了就是 /etc/hosts.allow 与 /etc/hosts.deny 的配置文件功能。 这个功能也是针对 TCP 的 Header 进行再次的分析,同样你可以设定一些机制来抵制某些 IP 或 Port ,好让来源端的封包被丢弃或通过检验;

  • 服务 (daemon) 的基本功能:
    举例来说,你可以在 httpd.conf 这个配置文件之内规范某些 IP 来源不能使用 httpd 这个服务来取得主机的数据, 那么即使该 IP 通过前面两层的过滤,他依旧无法取得主机的资源。

  • SELinux 对网络服务的细部权限控制:
    简单的说,SELinux 可以针对网络服务的权限来设定一些规则 (policy) ,让程序能够进行的功能有限, 因此即使使用者的档案权限设定错误,以及程序有问题时,该程序能够进行的动作还是被限制的,即使该程序使用的是 root 的权限也一样。举例来说,前一个步骤的 httpd 真的被 cracker 攻击而让对方取得 root 的使用权,由于 httpd 已经被 SELinux 控制在 /var/www/html 里面,且能够进行的功能已经被规范住了,因此 cracker 就无法使用该程序来进行系统的进一步破坏。

  • 使用主机的文件系统资源
    文件权限。

2.主机防护的一些建议

  • 建立完善的登入密码规则限制;
  • 完善的主机权限设定;
  • 设定自动升级与修补软件漏洞、及移除危险软件;
  • 在每项系统服务的设定当中,强化安全设定的项目;
  • 利用 iptables, TCP_Wrappers 强化网络防火墙;
  • 利用主机监控软件如 MRTG 与 logwatch 来分析主机状况与登录文件;

3.主机能作的保护: 软件更新、减少网络服务、启动 SELinux

二.限制联机端口 (port)

1.端口的观察: netstat, nmap

netstat:在本机上面以自己的程序监测自己的 port;
nmap:透过网络的侦测软件辅助,可侦测非本机上的其他网络主机,但有违法之嫌。(很多 cracker 会直接以他来侦测别人的主机,这个时候就可能造成违法)

列出在监听的网络服务:[root@www ~]# netstat -tunlctive 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:2162  ESTABLISHED
删除已建立或在监听当中的联机:[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[root@www ~]# kill -9 1342

nmap 的软件说明之名称为:『Network exploration tool and security / port scanner』,顾名思义, 这个东西是被系统管理员用来管理系统安全性查核的工具。

[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 的型态了!扫瞄的范围变广了!    192.168.1.0-50,60-100,103,200 :这种是变形的主机范围啦!很好用吧!# 范例一:使用预设参数扫瞄本机所启用的 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 埠口[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

2. 端口与服务的启动/关闭及开机时状态设定

其实 port 是由执行某些软件之后被软件激活的,所以要关闭某些 port 时,那就直接将某个程序给他关闭,虽然可以用kill,但是这不是正常的关闭,想要正常关闭,我们可以使用系统提供的script。

回顾:stand alone 与 super daemon

  • Stand alone
    顾名思义,stand alone 就是直接执行该服务的执行档,让该执行文件直接加载到内存当中运作, 用这种方式来启动可以让该服务具有较快速响应的优点。一般来说,这种服务的启动 script 都会放置到 /etc/init.d/ 这个目录底下,所以你通常可以使用:『 /etc/init.d/sshd restart 』之类的方式来重新启动这种服务;

  • Super daemon
    用一个超级服务作为总管,来统一管理某些特殊的服务。在 CentOS 6.x 里面使用的则是 xinetd 这个 super daemon 啊!这种方式启动的网络服务虽然在响应上速度会比较慢, 不过,可以透过 super daemon 额外提供一些控管,例如控制何时启动、何时可以进行联机、 那个 IP 可以连进来、是否允许同时联机等等。通常个别服务的配置文件放置在 /etc/xinetd.d/ 当中,但设定完毕后需要重新以『 /etc/init.d/xinetd restart 』重新来启动才行!

例子:关闭111端口

[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

一些必要的服务,不要关闭!

服务名称 服务内容 acpid 新版的电源管理模块,通常建议开启,不过,某些笔记本电脑可能不支持此项服务,那就得关闭 atd 在管理单一预约命令执行的服务,应该要启动的 crond 在管理工作排程的重要服务,请务必要启动啊! haldaemon 作系统硬件变更侦测的服务,与 USB 设备关系很大 iptables Linux 内建的防火墙软件,这个也可以启动啦! network 这个重要了吧?要网络就要有他啊! postfix 系统内部邮件传递服务,不要随便关闭他! rsyslog 系统的登录文件记录,很重要的,务必启动啊! sshd 这是系统默认会启动的,可以让你在远程以文字型态的终端机登入喔! xinetd 就是那个 super daemon,所以也要启动!

关闭服务相关指令:chkconfig

三.SELinux 管理原则

SELinux 使用所谓的委任式访问控制 (Mandatory Access Control, MAC) ,他可以针对特定的程序与特定的档案资源来进行权限的控管! 也就是说,即使你是 root ,那么在使用不同的程序时,你所能取得的权限并不一定是 root ,而得要看当时该程序的设定而定。 如此一来,我们针对控制的『主体』变成了『程序』而不是『使用者』。

1.SELinux 的运作模式

  • 主体 (Subject):
    SELinux 主要想要管理的就是程序,因此你可以将『主体』跟process 划上等号;

  • 目标 (Object):
    主体程序能否存取的『目标资源』一般就是文件系统。因此这个目标项目可以等文件系统划上等号;

  • 政策 (Policy):
    由于程序与档案数量庞大,因此 SELinux 会依据某些服务来制订基本的存取安全性政策。这些政策内还会有详细的规则 (rule) 来指定不同的服务开放某些资源的存取与否。在目前的 CentOS 6.x 里面仅有提供两个主要的政策如下,一般来说,使用预设的 target 政策即可。

    targeted:针对网络服务限制较多,针对本机限制较少,是预设的政策;mls:完整的 SELinux 限制,限制方面较为严格。
  • 安全性本文 (security context):
    我们刚刚谈到了主体、目标与政策,但是主体能不能存取目标除了要符合政策指定之外,主体与目标的安全性本文必须一致才能够顺利存取。 这个安全性本文 (security context) 有点类似文件系统的 rwx !安全性本文的内容与设定是非常重要的! 如果设定错误,你的某些服务(主体程序)就无法存取文件系统(目标资源),当然就会一直出现『权限不符』的错误讯息了!

这里写图片描述

安全性本文 (Security Context):可以将他想成 SELinux 内必备的 rwx。安全性本文是放置到档案的 inode 内的,因此主体程序想要读取目标档案资源时,同样需要读取 inode , 这 inode 内就可以比对安全性本文以及 rwx 等权限值是否正确,而给予适当的读取权限依据。

观察安全性本文可使用『 ls -Z 』去观察如下:

[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

安全性本文主要用冒号分为三个字段 (最后一个字段先略过不看),这三个字段的意义为:

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 的意义 root system_r 代表供 root 账号登入时所取得的权限 system_u system_r 由于为系统账号,因此是非交谈式的系统运作程序 user_u system_r 一般可登入用户的程序

例子:

[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/httpddrwxr-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) 读取的类型。

1.首先,我们触发一个可执行的目标档案,那就是具有 httpd_exec_t 这个类型的 /usr/sbin/httpd;
2.该档案的类型会让这个档案所造成的主体程序 (Subject) 具有 httpd 这个领域 (domain), 我们的政策针对这个领域已经制定了许多规则,其中包括这个领域可以读取的目标资源类型;
3.由于 httpd domain 被设定为可以读取 httpd_sys_content_t 这个类型的目标档案 (Object), 因此你的网页放置到 /var/www/html/ 目录下,就能够被 httpd 那支程序所读取了;
4.但最终能不能读到正确的资料,还得要看 rwx 是否符合 Linux 权限的规范!

2.SELinux 的启动、关闭与观察: getenforce, setenforce

3.SELinux type 的修改: chcon, restorecon, semanage

4.SELinux 政策内的规则布尔值修订: seinfo, sesearch, getsebool, setsebool

5.SELinux 登录文件记录所需服务:setroubleshoot, sealert

0 0