认识 cracker 的攻击手法,以及通过该手法我们该如何保护主机本身!
在这一章当中,我们要讨论的是,当来自一个网络上的连接要求想进入我们的主机时,
这个网络封包在进入主机实际取得数据的整个流程是如何?了解了整个流程之后,
你才会发现:原来系统操作的基本概念是如此的重要!
而你也才会了解要如何保护你的主机安全呐!闲话少说,咱们赶紧来瞧一瞧先。
在第一章我们就谈过网络连接的流程, 当时举的例子是希望你可以理解为啥架设服务器需要了解操作系统的基本观念。在这一章当中,我们要将该流程更细致化说明, 因为,通过这个流程分析,你会知道为啥我们的主机需要进行过一些防护之后,系统才能够比较强壮。此外,通过第二章的网络概念解释后,你也了解了网络是双向的,服务器与用户端都得要有 IP:port 才能够让彼此的软件互相沟通。那么现在,假设你的主机是 WWW 服务器,通过底下的图标,网络封包如何进入你的主机呢?
在这些步骤之外,我们的 Linux 以及相关的软件都可能还会支持注册表记录的功能,为了记录历史历程, 以方便管理者在未来的错误查找与入侵侦测,良好的分析注册表的习惯是一定要创建的,尤其是 /var/log/messages 与 /var/log/secure 这些个文件!虽然各大主要 Linux distribution 大多有推出适合他们自己的注册表分析软件,例如 CentOS 的 logwatch ,不过毕竟该软件并不见得适合所有的 distributions ,所以鸟哥尝试自己写了一个 logfile.sh 的 shell script,你可以在底下的网址下载该程序:
好了,那么根据这些流程,你觉得 cracker 这些个坏蛋能够怎样的攻击我们的系统呢?得要先到对方想要怎么破坏, 我们才能够想办法来补强系统嘛!底下先讲讲基本的攻击手法啰。
我们由图 7.1-1 了解到数据发送到本机时所需要经过的几道防线后,那个权限是最后的关键啦! 现在你应该比较清楚为何我们常常在基础篇里面一直谈到设置正确的权限可以保护你的主机了吧? 那么 cracker 是如何通过上述的流程还能够攻击你的系统啊?底下就让我们来分析分析。
根据本章前面的分析,现在你知道封包的流向以及主机基本需要进行的防护了。不过你或许还是有疑虑,那就是,
既然我都已经有了防火墙,那么权限的控管啦、密码的严密性啦、服务器软件的更新啦、SELinux 啦等等的,
是否就没有这么重要呢?毕竟它是封包进入的第一关卡!这关把关严格,后续可以稍微宽松吗?其实...你错了!
对于开放某些服务的服务器来说,你的防火墙『根本跟屁一样,是没有用的!』怎么说呢?
根据这样的分析,我们可以知道,随时更新系统软件、限制连接端口口以及通过启动 SELinux 来限制网络服务的权限,经过这三个简单的步骤,你的系统将可以获得相当大的保护!当然啦, 后续的防火墙以及系统注册表分析工作仍是需要进行的。本章后续将依据这三点来深入介绍。
在现在的互联网上面,cracker 实在是太多了!这些闲人会利用已经存在的系统漏洞,来进行侦测、入侵你的主机。
因此,除了未来架设防火墙之外,最重要的 Linux 日常管理工作,莫过于软件的升级了!
不过,如果用户还得要自己每天观察网络安全通报,并主动去查找各大 distribution 针对这些漏洞来提供升级软件包,
那真是太不人性化了!因此,目前就有很多在线直接更新的机制出现了!有了这些在线直接更新软件的手段与方法,
我们系统管理员在管理主机系统上面,可就轻松的多啰!
通常鸟哥安装好 Linux 之后,会先打开系统缺省的防火墙机制,然后第一件事情就是进行全系统更新啦! 不论是哪一套 Linux 鸟哥都是这样做的,因为要避免软件资安的问题嘛!好了,那么 Linux 上面的软件该如何进行更新与升级呢? 还记得你是如何安装软件的吗?不就是 rpm, tarball 与 dpkg 吗? 所以啰,你的软件如果想要升级,那就得依据当时你安装该软件的方式来进行升级啊!而每种方式都有其适用性:
举例来说,如果你的系统是 CentOS ,我们知道他使用的是 RPM 类型的软件管理模式,那如果你想要安装 B2D 的软件怎办?要注意, B2D 是使用 debian 的 dpkg 来管理软件的,两者并不相同啊!要互相安装太难了! 所以说,要升级的话,得先了解到你系统上的软件安装与管理的方法才行。
不过,有个特殊案例,那就是旧版本的 Linux (例如 Red Hat 9) 的软件升级该如何是好? 由于旧版本的软件支持度本来就比较差,商业公司或者是社群也没有这么多心力放在旧版本的支持上, 所以,你这个时候可以选择: (1)升级到较新的版本,例如 CentOS 5.x,或者是 (2)利用 Tarball 来自行升级内核与软件。不过,比较建议升级到新版本啦,因为要自行以手动方式由 Tarball 安装到最新的版本,实在是很费时费力,而且还得要常常查阅官方网站所推出的最新消息, 漏过一则都可能发生无法预期的状况。
我们都晓得在 Windows 的环境下,他有提供一个 Live update 的项目可以自动的在线升级, 甚至很多的杀毒软件与防木马软件也都有推出即时的在线更新,如此一来可以让您的软件维持在最新版的状况, 真是好啊!咦!那我们的 Linux 是否有这样的功能?如果有的话,那么系统自动进行软件升级, 不就可以轻松又快乐了?没错!确实是这样的!所以就让我们来谈一谈 Linux 的在线升级机制吧!
在 Linux 最常见的软件安装方式: RPM / Tarball / dpkg 当中,Tarball 由于取得的是原代码, 所以要用 Tarball 来作在线自动更新是不太可能进行的,所以仅能用 RPM 或 dpkg 这两种软件管理的方式来进行在线更新了。
但 RPM 与 dpkg 不是有所谓的相依属性吗?这倒不需要担心呐!因为我们的 RPM 与 dpkg 软件文件都有一些软件的基本信息, 并同时记录了软件的相依属性 (记得使用 rpm -q 的查找吗),所以当分析这些基本信息并使用一些机制将这些相依信息记录下来后, 再通过一些额外的网络功能,就能够自动的分析你的系统与修补软件之间的差异, 并可进一步帮你分析所需要升级与相依属性的软件,就可达成自动升级的理想啦!
由于各家 distributions 在管理系统上都有自己独特的想法,所以在分析 RPM 或 dpkg 软件与方式上面就有所不同, 也就有底下这些不同的在线升级机制啦:
讲了这些升级机制并且与 distribution 作了对应,你就该了解到:『每个 distribution 可以使用的在线升级机制都不相同』的啊!所以请参考你的 distribution 所提供的文档来进行在线升级的设置喔!否则就得要自行手动下载安装了! @_@
鸟哥这里都是使用 CentOS 这个 Red Hat 兼容的 distributions 来介绍的,因此,底下仅介绍了 yum 而已。 不过,yum 已经能够适用于 CentOS, Red Hat Enterprise Linux, Fedora 等等,也应该是挺够用的了! 另外,基础篇里面已经谈过 rpm 与 yum 的用法,所以在这里仅是加强介绍与更新有关的用法而已喔!
我们曾经在基础篇里面谈过 yum 了,基本上他的原理是,我们的 CentOS 会跑到 yum 服务器上头,下载了官方网站发布的 RPM 表头清单数据,该数据除了记载每个 RPM 软件的相依性之外,也说明了 RPM 文件所放置的容器 (repository) 所在。因此通过分析这些数据,我们的 CentOS 就能够直接使用 yum 去下载与安装所需要的软件了! 详细图标与流程有点像这样:
由于你所下载的清单当中已经含有所有官方网站所发布的 RPM 文件的表头相依属性的关系, 所以如果你想要安装的软件包含某些尚未安装的相依软件时,我们的 yum 会顺便帮你下载所需要的其他软件,预先安装后, 再安装你所实际需要的软件!从分析、下载到安装,全部一口气搞定!很简单的啦!
不过,恐怕还是有问题。如果全世界使用 CentOS 的朋友通通连接到同一部 Yum 服务器去下载所需要的 RPM 文件,哇! 那带宽不就很容易被塞爆!那怎办?没关系,有所谓的映射站啊! CentOS 在世界各地都有映射站,这些映射站会将官网的 yum 服务器的数据拷贝一份,同时在映射站上面也提供同样的 yum 功能,因此,你可以在任何一部 yum 服务器的映射站上面下载与安装软件。底下是 CentOS 官网上面列出的亚洲地区映射站一览表:
现在的 yum 又很聪明,它会自动的去分析离你的主机最近的那部映射站,然后直接使用该部映射主机作为你的 yum 来源, 因此,『理论上』你不需要更动任何设置,在台湾,你的 CentOS 就会使用台湾地区的 yum 服务器啰!就这么简单! 所以,接下来就让我们直接来谈谈怎么使用 yum 吧!
yum 可不止能够在线自动升级而已,他还可以作查找、软件群组的安装、整体版本的升级等等,好用的哩! 先来谈论一下 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:这个好用!可以安装一整组的软件群组,相当的不错用! 更常与 --installroot=/some/path 共用来安装新系统 groupremove :移除某个软件群组; # 范例一:搜索 CentOS 官网提供的软件名称是否有与 RAID 有关的? [root@www ~]# yum search raid Loaded plugins: fastestmirror Determining fastest mirrors <==这里就是在测试最快的映射站 * addons: ftp.twaren.net <==共有四个容器内容 * base: ftp.twaren.net <==每个容器都在 ftp.twaren.net 上 * extras: ftp.twaren.net * updates: ftp.twaren.net addons | 951 B 00:00 <==下载软件的表头清单中 base | 2.1 kB 00:00 extras | 2.1 kB 00:00 extras/primary_db | 187 kB 00:00 updates | 1.9 kB 00:00 =============== Matched: raid ====================== <==找到的结果如下 ....(中间省略).... lvm2.i386 : 图形化的逻辑卷册管理工具 mdadm.i386 : mdadm 控制 Linux md 设备(软件 RAID 数组) mkinitrd.i386 : 创建预载模块所需的初始 ramdisk 映像档。 # 范例二:上述输出结果中, mdadm 的功能为何? [root@www ~]# yum info mdadm Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * addons: ftp.twaren.net * base: ftp.twaren.net * extras: ftp.twaren.net * updates: ftp.twaren.net Installed Packages <==这里说明这是已经安装的软件! Name : mdadm Arch : i386 Version : 2.6.9 Release : 3.el5 Size : 1.8 M Repo : installed Summary : mdadm 控制 Linux md 设备(软件 RAID 数组) URL : http://www.kernel.org/pub/linux/utils/raid/mdadm/ License : GPL ....(底下省略).... |
yum 真是个很好用的东西,它可以直接查找是否有某些特殊的软件名称。举例来说,你可以利用底下的两个方式取得软件名称:
然后再以正规表示法取得关键字,或者是『 yum
list "软件名称" 』就能够知道该软件的用途,最后再决定要不要安装啊!上面的范例一就是在找出磁盘数组的管理软件。
如果确定要安装时,那就参考参考底下的流程吧!
# 范例三:安装某个软件吧!以 mdadm 这个软件名为例: [root@www ~]# yum install mdadm ....(前面省略).... Setting up Install Process Package mdadm-2.6.9-3.el5.i386 already installed and latest version Nothing to do [root@www ~]# yum install mdadma Setting up Install Process No package mdadma available. Nothing to do |
仔细的看上述的两个指令,第二个指令鸟哥故意写错字,让软件名称由 mdadm 变成 mdadma 了!仿真同学如果打错字时所输出的消息。由上述的消息你可以知道,同样结果是『Nothing to do』,但是 yum 会告诉你该软件是『已安装 (installed and lastest version)』还是『没有该软件 (No package mdadma avaliable)』。作这个范例是希望朋友们能够仔细的看输出的消息啦!好啦!我们还是来安装一个不曾装过的, 就拿 javacc 这套软件来装看看好了!
[root@www ~]# yum list javacc* Available Packages javacc.i386 4.0-3jpp.3 base javacc-demo.i386 4.0-3jpp.3 base javacc-manual.i386 4.0-3jpp.3 base # 共有三套软件,分别是 javacc, javacc-demo, javacc-manual ,版本为 4.0-3jpp.3, # 软件是放置到名称为 base 的容器当中存放的。 [root@www ~]# yum install javacc ....(前面省略).... Setting up Install Process Resolving Dependencies --> Running transaction check <==开始检查有没有相依属性的软件问题 ---> Package javacc.i386 0:4.0-3jpp.3 set to be updated --> Finished Dependency Resolution Dependencies Resolved ======================================================= Package Arch Version Repository Size ======================================================= Installing: javacc i386 4.0-3jpp.3 base 850 k Transaction Summary ======================================================= Install 1 Package(s) <==安装软件汇整,共安装 1 个,升级 0 个软件 Upgrade 0 Package(s) Total download size: 850 k Is this ok [y/N]: y Downloading Packages: javacc-4.0-3jpp.3.i386.rpm | 850 kB 00:00 Running rpm_check_debug Running Transaction Test Finished Transaction Test Transaction Test Succeeded Running Transaction Installing : javacc 1/1 Installed: javacc.i386 0:4.0-3jpp.3 Complete! |
瞧!经过 yum 我们可以很轻松的就安装好一个软件,并且这个软件已经主动的帮我们做好相依属性的克服了, 真是方便到爆!另外,CentOS 5.x 缺省的情况下,yum 下载的数据除了每个容器的表头清单文件之外,所有下载的 RPM 文件都会在安装完毕之后予以删除! 这样你的系统就不会有容量被下载的数据塞爆的问题。但如果你想要下载的 RPM 文件继续保留在 /var/cache/yum 当中,就得要修改 /etc/yum.conf 设置档了!
[root@www ~]# vim /etc/yum.conf [main] cachedir=/var/cache/yum keepcache=1 debuglevel=2 logfile=/var/log/yum.log distroverpkg=redhat-release tolerant=1 exactarch=1 obsoletes=1 gpgcheck=1 plugins=1 |
上述的特殊字体地方将 0 改成 1 ,这样就能够让你的 RPM 文件保存下来。不过,除非你有好多部主机要更新,
你想利用一台先 yum 升级且下载,然后将所有的 RPM 文件收集起来给内网的机器升级 (rpm -Fvh *.rpm) 之外,
上面的 vim 修改动作不建议修改!因为你的 /var 恐怕会被塞爆啊!再次提醒!
什么是『软件群组』呢?由于 RPM 软件将一个大项目分成好几个小计划来运行,每个小计划都可以独立安装, 这样的好处是可以让用户与软件发展者安装不同的环境!举例来说,我们使用 KDE 桌面,就是一般用户的使用而已, 并没有需要在 Linux 底下安装 KDE 的发展工具组吧?而 KDE 项目计划将软件分成一般使用环境 "KDE (K Desktop Environment)" 及发展者 "KDE Software Development" 环境,每个软件群组内又含有多个不同的 RPM 软件文件! 这样做的用途是方便用户安装一整套的项目啦!
那么系统有多少软件群组呢?又该如何观察某个软件群组有拥有的 RPM 文件呢?我们就利用 KDE 这个项目来说明一下啰:
# 范例四:查找系统有的软件群组有多少个? [root@www ~]# LANG=C yum grouplist Installed Groups: <==这个是已安装的软件群组 Administration Tools DNS Name Server Dialup Networking Support Editors FTP Server ....(中间省略).... Available Groups: <==这个是尚可安装的软件群组 Authoring and Publishing Base Beagle Cluster Storage ....(中间省略).... KDE (K Desktop Environment) KDE Software Development ....(后面省略).... # 范例五:那么 KDE (K Desktop Environment) 内含多少个 RPM 软件呢? [root@www ~]# yum groupinfo "KDE (K Desktop Environment)" Group: KDE 桌面环境 Description: KDE 是个功能强大的图形用户接口,它含有面板、桌面、系统图标 以及图形文件管理员。 Mandatory Packages: arts kdebase Default Packages: <==主要的会被安装的软件有这些 desktop-printing im-chooser kdeaccessibility kdeaddons ....(中间省略).... Optional Packages: <==此外你尚可挑选的软件有这些 kdeadmin # 如果你确定要安装这个软件群组的话,那就这样做: [root@www ~]# yum groupinstall "KDE (K Desktop Environment)" |
利用这个『 yum groupinstall "软件群组名" 』可以让你一口气安装很多的软件,
而不必担心某个软件忘记装了!实在是很不错啦~而且利用 groupinfo 的功能你也可以发现一些不错的软件数据,
如此一来,你就可以更方便的管理你的 Linux 系统了,很不错吧!
我们都知道使用『yum update』就可以进行软件的更新。不过你晓得吗? yum update 也可以直接进行同一版本的升级喔!举例来说,你可以从 5.5 升级到 5.6 版本哩!而且中间过程完全无痛呦! 就跟一般软件升级而已,并没有不同呦!够愉快吧!
不过,如果你是想要从较旧版的 CentOS 4.x 升级到 5.x 的话,那么可能就得要多费些功夫了。为啥不要重装比较快呢?因为你可能已经有些数据设置好,所以不想变更嘛! 但老实说,不同版本 (ex> 4.x --> 5.x) 间的升级最好还是不要尝试啦!重新安装可能是最好的状况。 底下列出酷学园的前辈提供的升级方式,以及 CentOS 官网直接提供的升级方式给你参考参考:
例题:
请设置一下工作调度,让你的 centOS 可以每天自动更新系统
答:
可以使用『 crontab -e 』来动作,也可以编辑『 vim /etc/crontab 』来动作,
由于这个更新是系统方面的,所以鸟哥习惯使用 vim /etc/crontab 来进行指令的说明。
其实内容很简单:
40 5 * * * root yum -y update && yum clean packages这样就可以自动更新了, 时间订在每天的凌晨 5:40 。 |
虽然 yum 是你的主机能够连接上 Internet 就可以直接使用的,不过,由于 CentOS 的映射站台可能会选错, 举例来说,我们在台湾,但是 CentOS 的映射站台却选择到了大陆北京或者是日本去,有没有可能发生啊! 有啊!鸟哥教学方面就常常发生这样的问题,要知道,我们连接到大陆或日本的速度是非常慢的呢!那怎办? 当然就是手动的修改一下 yum 的设置档就好啰!
在台湾,鸟哥熟悉的 CentOS 映射站台主要有高速网络中心与义首大学,鸟哥近来比较偏好高速网络中心, 似乎更新的速度比较快,而且连接台湾学术网络也非常快速哩!因此,鸟哥底下建议台湾的朋友使用高速网络中心的 ftp 主机资源来作为 yum 服务器来源喔!目前高速网络中心对于 CentOS 所提供的相关网址如下:
如果你连接到上述的网址后,就会发现里面有一堆链接,那些链接就是这个 yum 服务器所提供的容器了! 所以高速网络中心也提供了 addons, centosplus, extras, fasttrack, os, updates 等容器,最好认的容器就是 os (系统缺省的软件) 与 updates (软件升级版本) 啰!由于鸟哥在我的测试用主机是利用 i386 的版本, 因此那个 os 再点进去就会得到如下的可提供安装的网址:
为什么在上述的网址内呢?有什么特色!最重要的特色就是那个『 repodata 』的目录!该目录就是分析 RPM 软件后所产生的软件属性相依数据放置处!因此,当你要找容器所在网址时, 最重要的就是该网址底下一定要有个名为 repodata 的目录存在!那就是容器的网址了! 其他的容器正确网址,就请各位看倌自行寻找一下喔!现在让我们修改设置档吧!
[root@www ~]# vim /etc/yum.repos.d/CentOS-Base.repo
[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
|
如上所示,鸟哥仅列出 base 这个容器内容而已,其他的容器内容请自行查阅啰!上面的数据需要注意的是:
了解这个设置档之后,接下来让我们修改整个文件的内容,让我们这部主机可以直接使用高速网络中心的资源吧! 修改的方式鸟哥仅列出 base 这个容器项目而已,其他的项目请您自行依照上述的作法来处理即可!
[root@www ~]# vim /etc/yum.repos.d/CentOS-Base.repo [base] name=CentOS-$releasever - Base baseurl=http://ftp.twaren.net/Linux/CentOS/5/os/i386/ gpgcheck=1 gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5 # 底下其他的容器项目,请自行到高速网络中心去查找后自己处理! |
接下来当然就是给他测试一下啰!如何测试呢?再次使用 yum 即可啊!
# 范例:列出目前 yum server 所使用的容器有哪些? [root@www ~]# yum repolist all repo id repo name status addons CentOS-5 - Addons enabled: 0 base CentOS-5 - Base enabled: 2,599 c5-media CentOS-5 - Media disabled centosplus CentOS-5 - Plus disabled contrib CentOS-5 - Contrib disabled extras CentOS-5 - Extras enabled: 335 updates CentOS-5 - Updates enabled: 488 repolist: 3,422 # 在 status 上写 enabled 才是有启动的!由于 /etc/yum.repos.d/ # 有多个设置档,所以你会发现还有其他的容器存在。 |
由于我们是修改系统缺省的设置档,事实上,我们应该要在 /etc/yum.repos.d/ 底下新建一个文件, 该扩展名必须是 .repo 才行!但因为我们使用的是指定特定的映射站台,而不是其他软件开发生提供的容器, 因此才修改系统缺省设置档。但是可能由于使用的容器版本有新旧之分,你得要知道, yum 会先下载容器的清单到本机的 /var/cache/yum 里面去!那我们修改了网址却没有修改容器名称 (中刮号内的文本), 可能就会造成本机的清单与 yum 服务器的清单不同步,此时就会出现无法更新的问题了!
那怎么办啊?很简单,就清除掉本机上面的旧数据即可!需要手动处理吗?不需要的, 通过 yum 的 clean 项目来处理即可!
[root@www ~]# yum clean [packages|headers|all] 选项与参数: packages:将已下载的软件文件删除 headers :将下载的软件档头删除 all :将所有容器数据都删除! # 范例:删除已下载过的所有容器的相关数据 (含软件本身与清单) [root@www ~]# yum clean all |
例题:
有一个网址: http://free.nchc.org.tw/drbl-core/i386/RPMS.drbl-stable/ ,里面包含了台湾的国家高速网络中心所发展的自由软件。
请依据该网址提供的数据,做成系统可以自动网络安装的 yum 格式。
答:
由于 http://free.nchc.org.tw/drbl-core/i386/RPMS.drbl-stable/ 里面就有 repodata/ 目录,因此,这个网址可以直接做成 yum 的容器设置档。
你可以这么做的:
|
为什么我们的主机会回应网络上面的一些要求封包呢?例如我们设置了一部 WWW 主机后,当有来自 Internet 的 WWW
要求时,我们的主机就会予以回应,这是因为我们的主机有激活了 WWW 的监听端口口啊!所以,当我们激活了一个 daemon
时,就可能会造成主机的端口口在进行监听的动作,此时该 daemon 就是已经对网络上面提供服务了!万一这个
daemon 程序有漏洞,因为他提供了 Internet 的服务,所以就容易被 Internet 上面的 cracker
所攻击了!所以说,仔细的检查自己系统上面的端口口到底开了多少个,并且予以严格的管理,才能够降低被攻击的可能性啊!
快讲到烂掉了!当妳启动一个网络服务,这个服务会依据 TCP/IP 的相关通信协定启动一个端口口在进行监听, 那就是 TCP/UDP 封包的 port (端口口) 了。我们从第二章也知道网络连接是双向的,服务器端得要启动一个监听的端口口, 用户端得要随机启动一个端口口来接收回应的数据才行。那么服务器端的服务是否需要启动在固定的端口口? 用户端的端口口是否又是固定的呢?我们将第二章中与 port 有关的数据给她汇整一下先:
好了,我们现在知道这个 port 是什么鬼东西了,再来就是要来了解一下,我们的主机到底是开了多少的 port 呢?由于 port 的启动与服务有关,那么『服务』跟『 port 』对应的文件是哪一个?再提醒一次呦!是『 /etc/services 』啦!而常用来观察 port 的则有底下两个程序:
见他的大头王!怎么使用 nmap 会违法?由于 nmap 的功能太强大了,所以很多 cracker 会直接以他来侦测别人的主机,这个时候就可能造成违法啦!只要你使用 nmap 的时候不要去侦测别人的电脑主机,那么就不会有问题啦!底下我们分别来说一说这两个宝贝吧!
在做为服务器的 Linux 系统中,打开的网络服务越少越好! 因为较少的服务可以较容易调试 (debug) 与了解安全漏洞,并可避免不必要的入侵管道! 所以,这个时候请了解一下您的系统当中有没有哪些服务被打开了呢? 要了解自己的系统当中的服务项目,最简便的方法就是使用 netstat 了!这个东西不但简单,而且功能也是很不错的。 这个指令的使用方法在 Linux 常用网络功能指令介绍当中提过了, 底下我们仅提供如何使用这个工具的方法啰!
[root@www ~]# netstat -tunl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 127.0.0.1:2208 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
tcp 0 0 :::22 :::* LISTEN
udp 0 0 0.0.0.0:111 0.0.0.0:*
udp 0 0 0.0.0.0:631 0.0.0.0:*
|
[root@www ~]# netstat -tun
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 132 192.168.1.11:22 192.168.201.101:2896 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 148 192.168.1.11:22 192.168.201.101:2896 ESTABLISHED 2549/sshd |
[root@www ~]# kill -9 2549
|
如果你要侦测的设备并没有可让你登录的操作系统时,那该怎么办?举例来说,你想要了解一下公司的网络打印机是否有开放某些协定时, 那该如何处理啊?现在你知道 netstat 可以用来查阅本机上面的许多监听中的通信协定, 那例如网络打印机这样的非本机的设备,要如何查找啊?呵呵!用 nmap 就对了!
nmap (注1)的软件说明之名称为:『Network exploration tool and security / port scanner』,顾名思义, 这个东西是被系统管理员用来管理系统安全性查核的工具!他的具体描述当中也提到了, nmap 可以经由程序内部自行定义的几个 port 对应的指纹数据,来查出该 port 的服务为何,所以我们也可以借此了解我们主机的 port 到底是干嘛用的!在 CentOS 里头是有提供 nmap 的, 如果你没有安装,那么就使用 yum 去安装他吧!
[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 ~]# nmap localhost PORT STATE SERVICE 22/tcp open ssh 25/tcp open smtp 111/tcp open rpcbind 631/tcp open ipp # 在缺省的情况下, nmap 仅会扫瞄 TCP 的协定喔! |
nmap 的用法很简单呐!就直接在指令后面接上 IP 或者是主机名称即可。不过,在缺省的情况下 nmap 仅会帮你分析 TCP 这个通信协定而已,像上面这个例子的输出结果。但优点是顺道也将打开该端口口的服务也列出来了, 真是好! ^_^!那如果想要同时分析 TCP/UDP 这两个常见的通信协定呢?可以这样做:
# 范例二:同时扫瞄本机的 TCP/UDP 端口口 [root@www ~]# nmap -sTU localhost PORT STATE SERVICE 22/tcp open ssh 25/tcp open smtp 111/tcp open rpcbind 631/tcp open ipp 137/udp open|filtered netbios-ns 138/udp open|filtered netbios-dgm 631/udp open|filtered unknown |
嘿嘿!与前面的范例比较一下,你会发现这次多了几个 UDP 的端口口,这样分析好多了!然后, 如果你想要了解一下到底有几部主机活在你的网络当中时,则可以这样做:
# 范例三:通过 ICMP 封包的检测,分析区网内有几部主机是启动的 [root@www ~]# nmap -sP 192.168.1.0/24 Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2010-09-15 00:30 CST Host www.centos.vbird (192.168.1.11) appears to be up. Host 192.168.1.254 appears to be up. MAC Address: 00:0C:6E:85:D5:69 (Asustek Computer) Nmap finished: 256 IP addresses (2 hosts up) scanned in 5.596 seconds |
看到否?鸟哥的环境当中有两部主机活着呐!并且该 IP 所对应的 MAC 也会被记录下来, 很不错吧!如果你还想要将各个主机的启动的 port 作一番侦测的话,那就得要使用:
[root@www ~]# nmap 192.168.1.0/24
|
之后你就会看到一堆 port number 被输出到屏幕上啰~如果想要随时记录整个网段的主机是否不小心开放了某些服务, 嘿嘿!利用 nmap 配合数据流重导向 (>, >> 等) 来输出成为文件, 那随时可以掌握住您局域网路内每部主机的服务启动状况啊! ^_^
请特别留意,这个 nmap 的功能相当的强大,也是因为如此,所以很多刚在练习的黑客会使用这个软件来侦测别人的电脑。 这个时候请您特别留意,目前很多的人已经都有『特别的方式』来进行登录的工作!例如以 TCP_Wrappers (/etc/hosts.allow, /etc/hosts.deny) 的功能来记录曾经侦测过该 port 的 IP! 这个软件用来『侦测自己机器的安全性』是很不错的一个工具,但是如果用来侦测别人的主机, 可是会『吃上官司』的!特别留意!!
从第二章的数据我们就知道,其实 port 是由运行某些软件之后被软件启动的。所以要关闭某些 port
时,那就直接将某个程序给他关闭就是了!关闭的方法你当然可以使用
kill,不过这毕竟不是正统的解决之道,因为 kill
这个指令通常具有强制关闭某些程序的功能,但我们想要正常的关闭该程序啊!
所以,就利用系统给我们的 script 来关闭就好了啊。
在此同时,我们就得再来稍微复习一下,一般传统的服务有哪几种类型?
我们在基础学习篇内谈到,在一般正常的 Linux 系统环境下,服务的启动与管理主要有两种方式:
关于更详细的服务说明,请参考基础篇的认识服务一文, 鸟哥在这里不再赘述。好,那么如果我想要将我系统上面的 port 631 关掉的话, 那应该如何关闭呢?最简单的作法就是先找出那个 port 631 的启动程序喔!
[root@www ~]# netstat -tnlp | grep 631 tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 2058/cupsd # 原来用的是 cupsd 这个服务程序! [root@www ~]# which cupsd /usr/sbin/cupsd # 找到文件后,再以 rpm 处理处理 [root@www ~]# rpm -qf /usr/sbin/cupsd cups-1.3.7-18.el5_5.4 # 找到了!就是这个软件!所以将他关闭的方法可能就是: [root@www ~]# rpm -qc cups | grep init /etc/rc.d/init.d/cups [root@www ~]# /etc/init.d/cups stop |
通过上面的这个分析的流程,你可以利用系统提供的很多方便的工具来达成某个服务的关闭! 为啥这么麻烦?不是利用 kill -9 2058 就可以删掉该服务了吗? 是没错啦!不过,你知道该服务是做啥用的吗?你知道将他关闭之后,你的系统会出什么问题吗? 如果不知道的话,那么利用上面的流程不就可以找出该服务套件,再利用 rpm 查找功能, 不就能够知道该服务的作用了?所以说,这个方式还是对您会有帮助的啦! 底下请您试着将您 CentOS 或者是其他版本的 Linux 的 Telnet 打开试看看。
例题:
我们知道系统的 Telnet 服务通常是以 super daemon 来控管的,请您启动您系统的 telnet 试看看。
答:
|
刚刚上头的作法仅是『立即将该服务启动或关闭』喔!并不会影响到下次开机时,这个服务是否缺省启动的情况。 如果你想要在开机的时候就启动或不启动某项服务时,那就得要了解一下基础学习篇里面谈到的开机流程管理的内容啦!在 Unix like 的系统当中我们都是通过 run level 来设置某些运行等级需要启动的服务,以 Red Hat 系统来说,这些 run level 启动的数据都是放置在 /etc/rc.d/rc[0-6].d/ 里面的,那如何管理该目录下的 script 呢?手动处理吗?会疯掉的呐!所以你必须要熟悉 chkconfig 或 Red Hat 系统的 ntsysv 这几个指令才行!
例题:
(1)如何查阅 portmap 这个程序一开机就运行? (2)如果开机就运行,如何将他改为开机时不要启动?
(3)如何立即关闭这个 portmap 服务?
答:
|
聪明的你一定会问说:『鸟哥,你的意思是只要将系统所有的服务都关闭,那系统就会安全啰?』 当然....不是!因为『很多的系统服务是必须要存在的,否则系统将会出问题』 举例来说,那个保持系统可以具有工作调度的 crond 服务就一定要存在,而那个记录系统状况的 syslogd 也当然要存在~否则怎知道系统出了啥问题?所以啰,除非你知道每个服务的目的是啥,否则不要随便关闭该服务。 底下鸟哥列出几个常见的必须要存在的系统服务给大家参考参考先!这些服务请不要关闭啊!
服务名称 | 服务内容 |
acpid | 新版的电源管理模块,通常建议打开,不过,某些笔记本电脑可能不支持此项服务,那就得关闭 |
atd | 在管理单一预约命令运行的服务,应该要启动的 |
crond | 在管理工作调度的重要服务,请务必要启动啊! |
haldaemon | 作系统硬件变更侦测的服务,与 USB 设备关系很大 |
iptables | Linux 内置的防火墙软件,这个也可以启动啦! |
network | 这个重要了吧?要网络就要有他啊! |
sendmail | 系统内部邮件传递服务,不要随便关闭他! |
sshd | 这是系统缺省会启动的,可以让你在远程以文本型态的终端机登录喔! |
syslog | 系统的注册表记录,很重要的,务必启动啊! |
xinetd | 就是那个 super daemon 嘛!所以也要启动啦! |
xfs | 用来管理 X Window 字形数据的服务,如果你会需要 X Window 时,这个服务要启动。 |
上面列出的是主机需要的重点服务,请您不要关闭他!除非你知道作了之后会有什么后果。举例来说,你如果不需要 X window , 那么将 xfs 关闭也没有关系啊!如果你不需要提供远程连接功能,那么 sshd 也可以关闭啊!那其他你不知道的服务怎办? 没关系,只要不是网络服务,你都可以保留他!如果是网络服务呢?那...鸟哥建议你不知道的服务就先关闭他! 以后我们谈到每个相关的服务时,再一个一个打开即可。底下我们就来做作看这个部分!
我们的 Linux distribution 很好心的帮用户想到很多了,所以在一安装完毕之后, 系统会打开一堆有的没有的网络服务,例如那个 portmap 之类的咚咚,以及网络打印机的 cups 服务等等, 这些东西你或许知道或许不知道,不过他就是有打开~但我们的主机明明就是用来做为服务器的, 所以这些本来预计要给 client 使用的服务其实有点『多此一举』的感觉~ 所以啦,请你将他关闭吧!底下我们举个简单的例子来处理,将你的网络服务关闭就好,其他在系统内部的服务, 就暂时保留吧!
例题:
找出目前系统上面正在运作中的服务,并且找到相对应的启动脚本 (在 /etc/init.d 内的文件名之意)。
答:
要找出服务,就利用 netstat -tunlp 即可找到!以鸟哥从第一章安装的示范机为例,鸟哥目前启动的网络服务有底下这些:
|
做完上面的例子之后,你再次下达 netstat -tlunp 之后,会得到仅剩 port 25, 22 而已! 如此一来,绝大部分服务器用不到的服务就被你关闭,而且即使重新开机也不会被启动的啦! ^_^
SELinux 使用所谓的委任式访问控制 (Mandatory Access Control, MAC) ,他可以针对特定的进程与特定的文件资源来进行权限的控管! 也就是说,即使你是 root ,那么在使用不同的进程时,你所能取得的权限并不一定是 root ,而得要看当时该进程的设置而定。 如此一来,我们针对控制的『主体』变成了『进程』而不是『用户』喔!因此,这个权限的管理模式就特别适合网络服务的『进程』了! 因为,即使你的进程使用 root 的身份去启动,如果这个进程被攻击而被取得操作权,那该进程能作的事情还是有限的, 因为被 SELinux 限制住了能进行的工作了嘛!
举例来说, WWW 服务器软件的达成进程为 httpd 这支程序, 而缺省情况下, httpd 仅能在 /var/www/ 这个目录底下访问文件,如果
httpd 这个进程想要到其他目录去访问数据时,除了规则设置要开放外,目标目录也得要设置成 httpd 可读取的模式 (type)
才行喔!限制非常多! 所以,即使不小心 httpd 被 cracker 取得了控制权,他也无权浏览 /etc/shadow 等重要的设置档喔!
再次的重复说明一下,SELinux 是通过 MAC 的方式来控管进程,他控制的主体是进程, 而目标则是该进程能否读取的『文件资源』!所以先来说明一下这些咚咚的相关性啦!
上图的重点在『主体』如何取得『目标』的资源访问权限!
由上图我们可以发现,(1)主体进程必须要通过 SELinux 政策内的规则放行后,就可以与目标资源进行安全性本文的比对,
(2)若比对失败则无法访问目标,若比对成功则可以开始访问目标。问题是,最终能否访问目标还是与文件系统的 rwx
权限设置有关喔!如此一来,加入了 SELinux 之后,出现权限不符的情况时,你就得要一步一步的分析可能的问题了!
CentOS 5.x 的 target 政策已经帮我们制订好非常多的规则了,因此你只要知道如何打开/关闭某项规则的放行与否即可。 那个安全性本文比较麻烦!因为你可能需要自行设置文件的安全性本文呢!为何需要自行设置啊? 举例来说,你不也常常进行文件的 rwx 的重新设置吗?这个安全性本文你就将他想成 SELinux 内必备的 rwx 就是了!这样比较好理解啦。
安全性本文存在于主体进程中与目标文件资源中。进程在内存内,所以安全性本文可以存入是没问题。 那文件的安全性本文是记录在哪里呢?事实上,安全性本文是放置到文件的 inode 内的,因此主体进程想要读取目标文件资源时,同样需要读取 inode , 这 inode 内就可以比对安全性本文以及 rwx 等权限值是否正确,而给予适当的读取权限依据。
那么安全性本文到底是什么样的存在呢?我们先来看看 /root 底下的文件的安全性本文好了。 观察安全性本文可使用『 ls -Z 』去观察如下:(注意:你必须已经启动了 SELinux 才行!若尚未启动,这部份请稍微看过一遍即可。底下会介绍如何启动 SELinux 喔!)
[root@www ~]# ls -Z drwxr-xr-x root root root:object_r:user_home_t Desktop -rw-r--r-- root root root:object_r:user_home_t install.log -rw-r--r-- root root root:object_r:user_home_t install.log.syslog # 上述特殊字体的部分,就是安全性本文的内容! |
如上所示,安全性本文主要用冒号分为三个字段,这三个字段的意义为:
Identify:role:type 身份识别:角色:类型 |
那么这三个字段如何利用呢?首先我们来瞧瞧主体进程在这三个字段的意义为何!通过身份识别与角色字段的定义, 我们可以约略知道某个进程所代表的意义喔!基本上,这些对应数据在 targeted 政策下的对应如下:
身份识别 | 角色 | 该对应在 targeted 的意义 |
root | system_r | 代表供 root 帐号登录时所取得的权限 |
system_u | system_r | 由于为系统帐号,因此是非交谈式的系统运作进程 |
user_u | system_r | 一般可登录用户的进程啰! |
但就如上所述,其实最重要的字段是类型字段,主体与目标之间是否具有可以读写的权限,与进程的 domain 及文件的 type 有关!这两者的关系我们可以使用达成 WWW 服务器功能的 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 /usr/sbin/httpd drwxr-xr-x root root system_u:object_r:httpd_sys_content_t /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) 读取的类型。文本看起来不太容易了解吧!我们使用图标来说明这两者的关系!
上图的意义我们可以这样看的:
上述的流程告诉我们几个重点,第一个是政策内需要制订详细的 domain/type 相关性;第二个是若文件的 type 设置错误, 那么即使权限设置为 rwx 全开的 777 ,该主体进程也无法读取目标文件资源的啦!不过如此一来, 也就可以避免用户将他的家目录设置为 777 时所造成的权限困扰。
并非所有的 Linux distributions 都支持 SELinux 的,所以你必须要先观察一下你的系统版本为何! 鸟哥这里介绍的 CentOS 5.x 本身就有支持 SELinux 啦!所以你不需要自行编译 SELinux 到你的 Linux 内核中! 目前 SELinux 支持三种模式,分别如下:
那你怎么知道目前的 SELinux 模式呢?就通过 getenforce 吧!
[root@www ~]# getenforce Enforcing <==诺!就显示出目前的模式为 Enforcing 啰! |
另外,我们又如何知道 SELinux 的政策 (Policy) 为何呢?这时可以来观察设置档啦:
[root@www ~]# vim /etc/selinux/config SELINUX=enforcing <==调整 enforcing|disabled|permissive SELINUXTYPE=targeted <==目前仅有 targeted 与 strict |
上面是缺省的政策与启动的模式!你要注意的是,如果改变了政策则需要重新开机;如果由 enforcing 或 permissive 改成 disabled ,或由 disabled 改成其他两个,那也必须要重新开机。这是因为 SELinux 是集成到内核里面去的, 你只可以在 SELinux 运作下切换成为强制 (enforcing) 或宽容 (permissive) 模式,不能够直接关闭 SELinux 的! 如果刚刚你发现 getenforce 出现 disabled 时,请到上述文件修改成为 enforcing 然后重新开机吧!
不过你要注意的是,如果从 disable 转到启动 SELinux 的模式时, 由于系统必须要针对文件写入安全性本文的信息,因此开机过程会花费不少时间在等待重新写入 SELinux 安全性本文 (有时也称为 SELinux Label) ,而且在写完之后还得要再次的重新开机一次喔!你必须要等待粉长一段时间! 等到下次开机成功后,再使用 getenforce 来观察看看有否成功的启动到 Enforcing 的模式啰!
如果你已经在 Enforcing 的模式,但是可能由于一些设置的问题导致 SELinux 让某些服务无法正常的运作, 此时你可以将 Enforcing 的模式改为宽容 (permissive) 的模式,让 SELinux 只会警告无法顺利连接的消息, 而不是直接抵挡主体进程的读取权限。让 SELinux 模式在 enforcing 与 permissive 之间切换的方法为:
[root@www ~]# setenforce [0|1] 选项与参数: 0 :转成 permissive 宽容模式; 1 :转成 Enforcing 强制模式 # 范例一:将 SELinux 在 Enforcing 与 permissive 之间切换与观察 [root@www ~]# setenforce 0 [root@www ~]# getenforce Permissive [root@www ~]# setenforce 1 [root@www ~]# getenforce Enforcing |
不过请注意, setenforce 无法在 Disabled 的模式底下进行模式的切换喔!
既然 SELinux 的类型字段 (type) 这么重要,那如何修改与变更这个字段,当然就是最重要的一件事啰。 首先,我们来看看如果拷贝一个文件到不同的目录去,会发生什么状况吧!
# 范例:将 /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:etc_t /etc/hosts drwxr-x--- root root root:object_r:user_home_dir_t /root -rw-r--r-- root root root:object_r:user_home_t /root/hosts # 范例:将 /root/hosts 移动到 /tmp 下,并观察相关的 SELinux 类型变化 [root@www ~]# mv /root/hosts /tmp [root@www ~]# ls -dZ /tmp /tmp/hosts drwxrwxrwt root root system_u:object_r:tmp_t /tmp -rw-r--r-- root root root:object_r:user_home_t /tmp/hosts |
看到没有?当你单纯的拷贝时,SELinux 的 type 字段是会继承目标目录的,所以 /root/hosts 的类型就会变成 user_home_t 这个类型了。但是如果是移动呢?那么连同 SELinux 的类型也会被移动过去,因此 /tmp/hosts 会依旧保持 user_home_t 而不会变成 /tmp 的 tmp_t 这个类型呦!要注意!要注意!那么,如何将 /tmp/hosts 变更成为最原始的 etc_t 这个类型呢?那就得要使用 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=范例档:拿某个文件当范例来修改后续接的文件的类型! # 范例:将刚刚的 /tmp/hosts 类型改为 etc_t 的类型 [root@www ~]# chcon -t etc_t /tmp/hosts [root@www ~]# ll -Z /tmp/hosts -rw-r--r-- root root root:object_r:etc_t /tmp/hosts # 范例:以 /var/spool/mail/ 为依据,将 /tmp/hosts 修改成该类型 [root@www ~]# ll -dZ /var/spool/mail drwxrwxr-x root mail system_u:object_r:mail_spool_t /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 /tmp/hosts |
chcon 的修改方式中,我们必须要知道最终我们的 SELinux type 是啥类型后,才能够变更成功。 如果你想要作的是『复原成原有的 SELinux type』呢?那可以参考底下的指令来进行呦!
[root@www ~]# restorecon [-Rv] 文件或目录 选项与参数: -R :连同次目录一起修改; -v :将过程显示到屏幕上 # 范例:将刚刚 /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 /root/hosts [root@www ~]# restorecon -Rv /root restorecon reset /root/hosts context system_u:object_r:mail_spool_t:s0-> root:object_r:user_home_t:s0 # 上面这两行其实是同一行喔!表示将 hosts 由 mail_spool_t 改为 user_home_t |
通过上面这几个练习,你就会知道啦,SELinux type 恐怕会在文件的拷贝/移动时产生一些变化,因此需要善用 chcon, restorecon 等指令来进行修订。那你应该还是会想到一件事,那就是, restorecon 怎么会知道每个目录记载的缺省 SELinux type 类型呢?这是因为系统有记录嘛!记录在 /etc/selinux/targeted/contexts,但是该目录内有很多不同的数据, 要使用文本编辑器去查阅很麻烦,此时,我们可以通过 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' SELinux fcontext type Context /var/www(/.*)? all files system_u:object_r:httpd_sys_content_t:s0 ....(后面省略).... |
从上面的说明,我们知道其实 semanage 可以处理非常多的任务,不过,在这个小节我们主要想了解的是每个目录的缺省安全性本文。 如上面范例所示,我们可以查找的到每个目录的安全性本文啦!而目录的设置可以使用正规表示法去指定一个范围。那么如果我们想要增加某些自订的目录的安全性本文呢? 举例来说,我想要制订 /srv/vbird 成为 public_content_t 的类型时,应该如何指定呢?
# 范例:利用 semanage 设置 /srv/vbird 目录的缺省安全性本文为 public_content_t [root@www ~]# mkdir /srv/vbird [root@www ~]# ll -Zd /srv/vbird drwxr-xr-x root root root:object_r:var_t /srv/vbird # 如上所示,缺省的情况应该是 var_t 这个咚咚的! [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 ....(底下省略).... # 上面则是缺省的 /srv 底下的安全性本文数据,不过,并没有指定到 /srv/vbird 啦 [root@www ~]# semanage fcontext -a -t public_content_t "/srv/vbird(/.*)?" [root@www ~]# semanage fcontext -l | grep '/srv/vbird' /srv/vbird(/.*)? 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 # Please use the semanage command to make changes /srv/vbird(/.*)? system_u:object_r:public_content_t:s0 # 其实就是写入这个文件的啰! ^_^ [root@www ~]# restorecon -Rv /srv/vbird* <==尝试恢复默认值 [root@www ~]# ll -Zd /srv/vbird drwxr-xr-x root root system_u:object_r:public_content_t /srv/vbird # 有默认值,以后用 restorecon 来修改比较简单! |
semanage 的功能很多,不过鸟哥主要用到的仅有 fcontext 这个项目的动作而已。如上所示, 你可以使用 semanage 来查找所有的目录默认值,也能够使用他来增加默认值的设置!如果您学会这些基础的工具, 那么 SELinux 对你来说,也不是什么太难的咚咚啰!
前面讲到,要通过 SELinux 的验证之后才能开始文件权限 rwx 的判断,而 SELinux 的判断主要是 (1)政策内的规则比对与
(2)进程与文件的 SELinux type 要符合才能够放行。前一个小节谈的是 SELinux 的 type ,这个小节就是要谈一下政策内的规则啰,
包括如何查找与修改相关的规则放行与否啰。
CentOS 5.x 缺省使使用 targeted 政策,那么这个政策提供多少相关的规则呢?此时可以通过 seinfo 来查找喔!
[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.21 Policy Version & Type: v.21 (binary, MLS) <==列出政策所在档与版本 Classes: 61 Permissions: 220 Types: 1831 Attributes: 214 Users: 3 Roles: 6 Booleans: 263 Cond. Expr.: 246 Sensitivities: 1 Categories: 1024 Allow: 128513 Neverallow: 0 Auditallow: 42 Dontaudit: 7215 Role allow: 5 Role trans: 0 ....(底下省略).... # 从上面我们可以看到这个政策是 targeted ,此政策的 SELinux type 有 1831 个; # 而针对网络服务的规则 (Booleans) 共制订了 263 条规则! # 范例二:列出与 httpd 有关的规则 (booleans) 有哪些? [root@www ~]# seinfo -b | grep httpd Rule loading disabled Conditional Booleans: 263 allow_httpd_mod_auth_pam allow_httpd_bugzilla_script_anon_write httpd_enable_ftp_server ....(底下省略).... # 你可以看到,有非常多的与 httpd 有关的规则订定呢! |
从上面我们可以看到与 httpd 有关的布尔值,同样的,如果你想要找到有 httpd 字样的安全性本文类别时, 就可以使用『 seinfo -t | grep httpd 』来查找了!如果查找到相关的类别或者是布尔值后,想要知道详细的规则时, 就得要使用 sesearch 这个指令了!
[root@www ~]# sesearch [-a] [-s 主体类别] [-t 目标类别] [-b 布尔值] 选项与参数: -a :列出该类别或布尔值的所有相关信息 -t :后面还要接类别,例如 -t httpd_t -b :后面还要接布尔值的规则,例如 -b httpd_enable_ftp_server # 范例一:找出目标文件资源类别为 httpd_sys_content_t 的有关信息 [root@www ~]# sesearch -a -t httpd_sys_content_t Found 95 av rules: allow rpm_t httpd_sys_content_t : file { ioctl read write ... }; allow semanage_t httpd_sys_content_t : file { ioctl read ... }; allow rpm_t httpd_sys_content_t : dir { ioctl read write ... }; ....(底下省略).... # 『 allow 主体进程安全性本文类别 目标文件安全性本文类别 』 # 如上,说明这个类别可以被那个主题进程的类别所读取,以及目标文件资源的格式。 # 范例二:找出主体进程为 httpd_t 且目标文件类别为 httpd 相关的所有信息 [root@www ~]# sesearch -s httpd_t -t httpd_* -a Found 205 av rules: ....(中间省略).... allow httpd_t httpd_sys_content_t : file { ioctl read getattr lock }; allow httpd_t httpd_sys_content_t : dir { ioctl read getattr lock search }; allow httpd_t httpd_sys_content_t : lnk_file { ioctl read getattr lock }; ....(后面省略).... # 从上面的数据就可以看出当进程为 httpd_t 这个类别,是可以读取 # httpd_sys_content_t 的! |
你可以很轻易的查找到某个主体进程 (subject) 可以读取的目标文件资源 (Object) , 从我们上面的练习,我们也可以很轻松的就知道,为何 httpd_t 可以读取 httpd_sys_content_t 啰! 那如果是布尔值呢?里面又规范了什么?让我们来看看先:
# 范例三:我知道有个布尔值为 httpd_enable_homedirs ,请问该布尔值规范多少规则? [root@www ~]# sesearch -b httpd_enable_homedirs -a Found 21 av rules: allow httpd_suexec_t user_home_dir_t : dir { getattr search }; allow httpd_suexec_t cifs_t : file { ioctl read getattr ... }; allow httpd_suexec_t cifs_t : dir { ioctl read getattr ... }; ....(后面省略).... |
从这个布尔值的设置我们可以看到里面规范了非常多的主体进程与目标文件资源的放行与否!
所以你知道了,实际规范这些规则的,就是布尔值的项目啦!那也就是我们之前所说的一堆规则是也!
你的主体进程能否对某些目标文件进行访问,与这个布尔值非常有关系喔!因为布尔值可以将规则设置为启动 (1)
或者是关闭 (0) 啦!
上面我们通过 sesearch 知道了,其实 Subject 与 Object 能否有访问的权限,是与布尔值有关的, 那么系统有多少布尔值可以通过 seinfo -b 来查找,但,每个布尔值是启动的还是关闭的呢?这就来查找看看吧:
[root@www ~]# getsebool [-a] [布尔值条款] 选项与参数: -a :列出目前系统上面的所有布尔值条款设置为打开或关闭值 # 范例一:查找本系统内所有的布尔值设置状况 [root@www ~]# getsebool -a NetworkManager_disable_trans --> off aisexec_disable_trans --> off allow_console_login --> off ....(底下省略).... # 您瞧!这就告诉你目前的布尔值状态啰! |
那么如果查找到某个布尔值,并且以 sesearch 知道该布尔值的用途后,想要关闭或启动他,又该如何处置?
[root@www ~]# setsebool [-P] 布尔值=[0|1] 选项与参数: -P :直接将设置值写入设置档,该设置数据未来会生效的! # 范例一:查找 httpd_enable_homedirs 是否为关闭,若不为关闭,请关闭他! [root@www ~]# getsebool httpd_enable_homedirs httpd_enable_homedirs --> on <==结果是 on ,依题意给他关闭! [root@www ~]# setsebool -P httpd_enable_homedirs=0 [root@www ~]# getsebool httpd_enable_homedirs httpd_enable_homedirs --> off |
这个 setsebool 最好记得一定要加上 -P 的选项!因为这样才能将此设置写入设置档! 这是非常棒的工具组!你一定要知道如何使用 getsebool 与 setsebool 才行!
上述的指令功能当中,尤其是 setsebool, chcon, restorecon 等,都是为了当你的某些网络服务无法正常提供相关功能时,
才需要进行修改的一些指令动作。但是,我们怎么知道哪个时候才需要进行这些指令的修改啊?我们怎么知道系统因为 SELinux
的问题导致网络服务不对劲啊?如果都要靠用户端连接失败才来哭诉,那也太没有效率了!所以,我们的 CentOS 5.x
有提供一支侦测的服务在登录 SELinux 产生的错误喔!那就是 setroubleshoot 。
几乎所有 SELinux 相关的程序都会以 se 为开头,这个服务也是以 se 为开头!而 troubleshoot 大家都知道是错误克服, 因此这个 setroubleshoot 自然就得要启动他啦!这个服务会将关于 SELinux 的错误消息与克服方法记录到 /var/log/messages 里头,所以你一定得要启动这个服务才好。启动这个服务之前当然就是得要安装它啦!这玩意儿总共需要两个软件,分别是 setroublshoot 与 setroubleshoot-server,如果你没有安装,请自行使用 yum 安装吧! 那如何在开机的时候就启动 setroubleshoot 呢?这样处理先:
[root@www ~]# chkconfig --list setroubleshoot setroubleshoot 0:off 1:off 2:off 3:on 4:on 5:on 6:off # 我们的 Linux 运作模式是在 3 或 5 号,因此这两个要 on 即可。 [root@www ~]# chkconfig setroubleshoot on # 关于 chkconfig 我们会在后面章节介绍, --list 是列出目前的运行等级是否有启动, # 如果加上 on ,则是在开机时启动,若为 off 则开机时不启动。 |
这支服务缺省几乎都会启动啦!除非你看到 3:off 或 5:off 时,才需要以『 chkconfig setroubleshoot on 』 去设置一下。那么如果有发生错误时,消息像什么呢?我们使用 httpd 这支程序产生的错误来说明好了。假设你需要启动 WWW 服务器, 我们的 WWW 是由 httpd 这支服务提供的,因此你必须要安装且启动它才行:
[root@www ~]# yum install httpd [root@www ~]# /etc/init.d/httpd start [root@www ~]# netstat -tlnp | grep http tcp 0 0 :::80 :::* LISTEN 2455/httpd tcp 0 0 :::443 :::* LISTEN 2455/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 9月 20 23:27 index.html <==权限没问题 [root@www ~]# mv index.html /var/www/html |
此时我们就可以打开浏览器,然后在浏览器上面输入 Linux 自己的 IP 来查察看,看能不能连上自己的 WWW 首页。 记得网址列需要这样输入才行:https://#/index.html,你会看到如下的画面喔:
画面最明显的地方就是告诉你,你并没有权限可以访问 index.html 的!见鬼了!明明权限是对的喔!那怎办? 没关系,就通过 setroubleshoot 的功能去检查看看。此时请分析一下 /var/log/messages 的内容吧!有点像这样:
[root@www ~]# cat /var/log/messages | grep setroubleshoot Sep 20 23:29:55 www setroubleshoot: SELinux is preventing the httpd from using potentially mislabeled files (/var/www/html/index.html). For complete SELinux messages. run sealert -l 077202c1-561a-4f27-9ba7-bf08e134f006 |
上面的错误消息可是同一行喔!大纲说的是『SElinux 被用来避免 httpd 读取到错误的安全性本文, 想要查阅完整的数据,请运行 sealert -l ...』没错!你注意到了!重点就是 sealert -l 啦! 上面提供的信息并不完整,想要更完整的说明得要靠 sealert 配合侦测到的错误代码来处理。 实际处理后会像这样:
[root@www ~]# sealert -l 077202c1-561a-4f27-9ba7-bf08e134f006 Summary: SELinux is preventing the httpd from using potentially mislabeled files (/var/www/html/index.html). <==就是刚刚 /var/log/messages 的消息 Detailed Description: <==底下是更完整的描述!要看! SELinux has denied httpd access to potentially mislabeled file(s) (/var/www/html/index.html). This means that SELinux will not allow httpd to use these files. It is common for users to edit files in their home directory or tmp directories and then move (mv) them to system directories. The problem is that the files end up with the wrong file context which confined applications are not allowed to access. Allowing Access: <==若要允许访问,你需要进行的动作! If you want httpd to access this files, you need to relabel them using restorecon -v '/var/www/html/index.html'. You might want to relabel the entire directory using restorecon -R -v '/var/www/html'. ....(底下省略).... |
重点就是上面特殊字体显示的地方!你只要照着『Allowing Access』里面的提示去进行处理,
就能够完成你的 SELinux 类型设置了!比对刚刚我们上个小节提到的 restorecon
与 chcon 你就能够知道, setroubleshoot 提供的消息有多有效了吧!
不管出了啥 SELinux 的问题,绝大部分在 setroubleshoot 的服务中就会告诉你解决之道!所以,很多东西都不用背的!
如果每次测试都得要到 /var/log/messages 去分析,那真是挺麻烦的啊!没关系,我们可以通过 email 或 console 的方式来将信息产生! 也就是说,我们可以让 setroubleshoot 主动的发送产生的信息到我们指定的 email ,这样可以方便我们即时的分析喔!怎么办到? 就修改 setroubleshoot 的设置档即可。你可以查阅 /etc/setroubleshoot/setroubleshoot.cfg 这个文件的内容, 我们只需要修改的地方如下:
[root@www ~]# vim /etc/setroubleshoot/setroubleshoot.cfg [email] # 大约在 76 行左右,这行要存在才行! recipients_filepath = /var/lib/setroubleshoot/email_alert_recipients # 大约在 169 行左右,将原本的 False 修改成 True 先! console = True [root@www ~]# vim /var/lib/setroubleshoot/email_alert_recipients root@localhost your@email.address [root@www ~]# /etc/init.d/setroubleshoot restart |
之后你就可以通过分析你的 email 来取得 SELinux 的错误消息啰!非常的简单吧!只是要注意,上述的填写 email 的文件中, 不能只写帐号,你要连同 @localhost 都写上,这样本机上面的 root 才能收到信件喔!就这么简单哩! ^_^
我们来简单的做个总结吧!因为你的网络连接要通过 SELinux 才的权限判定后才能够继续 rwx 的权限比对。而 SELinux 的比对主要又分为: (1)需要通过政策的各项规则比对后 (2)才能够进行 SELinux type 安全性本文的比对,这两项工作都得要正确才行。而后续的 SELinux 修改主要是通过 chcon, restorecon, setsebool 等指令来处理的。但是如何处理呢?可以通过分析 /var/log/messages 内提供的 setroubleshoot 的信息来处置!这样就很轻松的可以管理你的 SELinux 啰!
但是如果因为某些原因,举例来说 CentOS 没有规范到的 setroubleshoot 信息时,可能你还是无法了解到事情到底是哪里出错。 那此时我们会这样建议:
这样就能够很轻松的管理你的 SELinux 啦!不需要想太多!分析注册表就对啦!
如果你的主机被攻击而被取得操纵权的话,而你也由于了解到主机监控的需要,所以在最短的时间内发现此一事件,
那么该如何针对这个被入侵的主机来修复?那如果你要修复的话,你这个网管人员还需要哪些额外的技能?
底下我们就来谈一谈。
从本章第一小节的分析当中,你会发现网管还真的是挺累的,他需要对操作系统有一定程度的熟悉, 对于进程的运作与权限概念则需要更了解,否则就麻烦了!那除了操作系统的基本概念之外, 咱们网管还需要啥特殊技巧呢?当然需要啊!其实一部主机最常发生问题的状况, 都是由『内部的网络误用所产生的』,所以啊,你只管好主机而已是『没有办法杜绝问题』的啦! 底下就来谈谈你还需要啥技巧呢?
所谓『百密一疏』啊,人不是神,总会有考虑不周的情况,万一你的主机就因为这『一疏』导致被入侵了, 那该怎么办?由上面的说明当中,我们知道『木马』是很严重的,因为他会在你的系统下开个后门 (Back door) 让攻击者可以登录你的主机,而且还会窜改你 Linux 上面的程序,让你找不到该木马程序!怎么办?
很多朋友都习惯『反正只要将 root 的密码改回来就好了』 这样的观点,事实上,那样一部主机还是有被做为中继站的危险啊!所以, 万一你的主机被入侵了,最好的方法还是『重新安装Linux 』会比较干净!
那该如何重新安装呢?很多朋友一再地安装,却一再地被入侵~为什么呢?因为他没有『记取教训』啊!呵呵! 底下我们就来谈一谈,一部被入侵的主机应该如何修复比较好?
经过这一连串的动作后,你的主机应该会恢复到比较干净的环境,此时还不能掉以轻心, 最好还是参考防火墙的设置,并且多方面的参考 Internet 上面一些老手的经验,好让你的主机可以更安全一些!