经过防火墙的分析:
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 就无法使用该程序来进行系统的进一步破坏。
使用主机的文件系统资源
文件权限。
netstat:在本机上面以自己的程序监测自己的 port;
nmap:透过网络的侦测软件辅助,可侦测非本机上的其他网络主机,但有违法之嫌。(很多 cracker 会直接以他来侦测别人的主机,这个时候就可能造成违法)
列出在监听的网络服务:
[root@www ~]# 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
....(底下省略)....
列出已联机的网络联机状态:
[root@www ~]# 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
删除已建立或在监听当中的联机:
[root@www ~]# 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
[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 localhost
PORT STATE SERVICE
22/tcp open ssh
25/tcp open smtp
111/tcp open rpcbind
# 在预设的情况下,nmap 仅会扫瞄 TCP 的协议!
# 范例二:同时扫瞄本机的 TCP/UDP 埠口
[root@www ~]# nmap -sTU localhost
PORT STATE SERVICE
22/tcp open ssh
25/tcp open smtp
111/tcp open rpcbind
111/udp open rpcbind <==会多出 UDP 的通讯协议埠口!
# 范例三:透过 ICMP 封包的检测,分析区网内有几部主机是启动的
[root@www ~]# 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
其实 port 是由执行某些软件之后被软件激活的,所以要关闭某些 port 时,那就直接将某个程序给他关闭,虽然可以用kill,但是这不是正常的关闭,想要正常关闭,我们可以使用系统提供的script。
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 111
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 990/rpcbind
tcp 0 0 :::111 :::* LISTEN 990/rpcbind
# 原来用的是 rpcbind 这个服务程序!
[root@www ~]# which rpcbind
/sbin/rpcbind
# 找到档案后,再以 rpm 处理处理
[root@www ~]# rpm -qf /sbin/rpcbind
rpcbind-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 使用所谓的委任式访问控制 (Mandatory Access Control, MAC) ,他可以针对特定的程序与特定的档案资源来进行权限的控管! 也就是说,即使你是 root ,那么在使用不同的程序时,你所能取得的权限并不一定是 root ,而得要看当时该程序的设定而定。 如此一来,我们针对控制的『主体』变成了『程序』而不是『使用者』。
主体 (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.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
安全性本文主要用冒号分为三个字段 (最后一个字段先略过不看),这三个字段的意义为:
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 搭配,则该程序才能够顺利的读取档案资源!
身份识别 | 角色 | 该对应在 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/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) 读取的类型。
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 权限的规范!