如何掌握,比对,怎么判断封包数据,控制封包

私房菜为取得较佳浏览结果,请爱用
浏览本网页
最近更新日期:
  7.1.2 :
  7.2.3 : ,
  7.3.2 : ,
  7.3.3 : ,
  7.4.1 : ,
  7.4.2 : ,
  7.4.3 : ,
  7.4.4 : ,
7.1 网路封包连线进入主机的流程
在这一章当中,我们要讨论的是,当来自一个网路上的连线要求想进入我们的主机时,
这个网路封包在进入主机实际取得资料的整个流程是如何?瞭解了整个流程之后,
你才会发现:原来系统操作的基本概念是如此的重要!
而你也才会瞭解要如何保护你的主机安全吶!闲话少说,咱们赶紧来瞧一瞧先。
7.1.1 封包进入主机的流程
在我们就谈过网路连线的流程,
当时举的例子是希望你可以理解为啥架设伺服器需要瞭解作业系统的基本观念。在这一章当中,我们要将该流程更细緻化说明,
因为,透过这个流程分析,你会知道为啥我们的主机需要进行过一些防护之后,系统才能够比较强壮。此外,透过解释后,你也瞭解了网路是双向的,伺服器与用户端都得要有
IP:port 才能够让彼此的软体互相沟通。那么现在,假设你的主机是 WWW 伺服器,透过底下的图示,网路封包如何进入你的主机呢?
图 7.1-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 之后,网路封包会开始接受
的检验,那个是什么呢?
说穿了就是 /etc/hosts.allow 与 /etc/hosts.deny 的设定档功能啰。
这个功能也是针对 TCP 的 Header 进行再次的分析,同样你可以设定一些机制来抵制某些
IP 或 Port ,好让来源端的封包被丢弃或通过检验;
透过防火墙的管控,我们可以将大部分来自网际网路的垃圾连线丢弃,只允许自己开放的服务的连线进入本机而已,
可以达到最基础的安全防护。
服务 (daemon) 的基本功能:
预设的防火墙是 Linux 的内建功能,但防火墙主要管理的是 MAC, IP, Port 等封包表头方面的资讯,如果想要控管某些目录可以进入,
某些目录则无法使用的功能,那就得要透过权限以及伺服器软体提供的相关功能了。举例来说,你可以在 httpd.conf
这个设定档之内规范某些 IP 来源不能使用 httpd 这个服务来取得主机的资料,
那么即使该 IP 通过前面两层的过滤,他依旧无法取得主机的资源喔!但要注意的是,
如果 httpd 这支程式本来就有问题的话,那么 client
端将可直接利用 httpd 软体的漏洞来入侵主机,而不需要取得主机内 root 的密码!因此,
要小心这些启动在网际网路上面的软体喔!
SELinux 对网路服务的细部权限控制:
为了避免前面一个步骤的权限误用,或者是程序有问题所造成的资安状况,因此 Security Enhanced Linux (安全强化 Linux)
就来发挥它的功能啦!简单的说,SELinux 可以针对网路服务的权限来设定一些规则 (policy) ,让程序能够进行的功能有限,
因此即使使用者的档案权限设定错误,以及程序有问题时,该程序能够进行的动作还是被限制的,即使该程序使用的是 root
的权限也一样。举例来说,前一个步骤的 httpd 真的被 cracker 攻击而让对方取得 root 的使用权,由于 httpd
已经被 SELinux 控制在 /var/www/html 里面,且能够进行的功能已经被规范住了,因此 cracker
就无法使用该程序来进行系统的进一步破坏啰。现在这个 SELinux 一定要开启喔!
使用主机的档案系统资源:
想一想,你使用浏览器连接到 WWW 主机最主要的目的是什么?当然就是读取主机的 WWW 资料啦!
那 WWW 资料是啥?就是档案啊!^_^!所以,最终网路封包其实是要向主机要求档案系统的资料啦。
我们这里假设你要使用 httpd 这支程式来取得系统的档案资料,但 httpd 预设是由一个系统帐号名称为
httpd 来启动的,所以:你的网页资料的权限当然就是要让 httpd
这支程式可以读取才行啊!如果你前面三关的设定都 OK ,最终权限设定错误,使用者依旧无法浏览你的网页资料的。
在这些步骤之外,我们的 Linux 以及相关的软体都可能还会支援登录档记录的功能,为了记录历史历程,
以方便管理者在未来的错误查询与入侵侦测,良好的分析登录档的习惯是一定要建立的,尤其是 /var/log/messages 与
/var/log/secure 这些个档案!虽然各大主要 Linux distribution 大多有推出适合他们自己的登录档分析软体,例如 CentOS 的
logwatch ,不过毕竟该软体并不见得适合所有的 distributions ,所以鸟哥尝试自己写了一个 logfile.sh 的
shell script,你可以在底下的网址下载该程式:
好了,那么根据这些流程,你觉得 cracker 这些个坏蛋能够怎样的攻击我们的系统呢?得要先到对方想要怎么破坏,
我们才能够想办法来补强系统嘛!底下先讲讲基本的攻击手法啰。
7.1.2 常见的攻击手法与相关保护
我们由 瞭解到资料传送到本机时所需要经过的几道防线后,那个权限是最后的关键啦!
现在你应该比较清楚为何我们常常在基础篇里面一直谈到设定正确的权限可以保护你的主机了吧?
那么 cracker 是如何透过上述的流程还能够攻击你的系统啊?底下就让我们来分析分析。
取得帐号资讯后猜密码
由于很多人喜欢用自己的名字来作为帐号资讯,因此帐号的取得是很容易的!举例来说,如果你的朋友将你的 email address
不小心洩漏出去,例如: dmtsai@your.host.name 之类的样式,那么人家就会知道你有一部主机,名称为
your.host.name,且在这部主机上面会有一个使用者帐号,帐号名称为 dmtsai ,之后这个坏傢伙再利用某些特殊软体例如 nmap
来进行你主机的 port scan 之后,嘿嘿!他就可以开始透过你主机有启动的软体功能来猜你这个帐号的密码了!
另外,如果你常常观察你的主机登录档,那你也会发现如果你的主机有启动 Mail server 的服务时,
你的登录档就会常常出现有些怪傢伙尝试以一些奇怪的常见帐号在试图猜测你的密码,
举例来说像:admin, administrator, webmaster .... 之类的帐号,尝试来窃取你的私人信件。
如果你的主机真的有这类的帐号,而且这类的帐号还没有良好的密码规划,那就容易『中标』!
唉!真是麻烦!所以我们常讲,系统帐号千万不能给予密码,容易被猜密码啊!
这种猜密码的攻击方式算是最早期的入侵模式之一了,攻击者知道你的帐号,或者是可以猜出来你的系统有哪些帐号,
欠缺的就只是密码而已,因此他会『很努力的』去猜你的密码,此时,你的密码规划如果不好的话,很容易就被攻击了!
主机也很容易被绑架啊!所以,良好的密码设置习惯是很重要的。
不过这种攻击方式比较费时,因为目前很多软体都有密码输入次数的限制,如果连续输入三次密码还不能成功的登入,
那该次连线就会被断线!所以,这种攻击方式日益减少,目前偶而还会看到就是了!这也是初级 cracker 会使用的方式之一。
那我们要如何保护呢?基本方式是这样的:
减少资讯的曝光机会:例如不要将 Email Address 随意散佈到 Internet 上头;
建立较严格的密码设定规则:包括 /etc/shadow, /etc/login.defs 等档案的设定,
建议你可以参考内的那一章来规范你的使用者密码变更时间等等,
如果主机够稳定且不会持续加入某些帐号时,也可以考虑使用
来限制帐号 (/etc/passwd, /etc/shadow) 的更改;
完善的权限设定:由于这类的攻击方式会取得你的某个使用者帐号的登入权限,
所以如果你的系统权限设定得宜的话,那么攻击者也仅能取得一般使用者的权限而已,对于主机的伤害比较有限啦!
所以说,权限设定是重要的;
利用系统的程式漏洞『主动』攻击
由 里面的第二个步骤中,我们知道如果你的主机有开放网路服务时,
就必须有启动某个网路软体嘛!我们也知道由于软体可能撰写方式的问题,可能产生一些会被 cracker
乱用的臭虫程式码,而这些臭虫程式码由于产生问题的大小,有分为 bug (臭虫,可能会造成系统的不稳定或当机) 与
Security (安全问题,程式码撰写方式会导致系统的使用权限被恶意者所掌握) 等问题。
当程式的问题被公布后,某些较高阶的 cracker 会尝试撰写一些针对这个漏洞的攻击程式码,
并且将这个程式码放置到 cracker 常去的网站上面,藉以推销自己的『功力』.....
鸟哥要提醒的是,这种程式码『是很容易被取得的』。
当更多『盈盈美黛子(台语,闲闲没事干之意)』取得这些程式码后,他可能会想要『试一试这个攻击程式的威力』,
所以就拿来『扫射』一番,如果你八字比较轻,或者当天星座学家说你比较倒楣时,可能就会被不小心的攻击到...
这种攻击模式是目前最常见的,因为攻击者只要拿到攻击程式就可以进行攻击了,
『而且由攻击开始到取得你系统的 root 权限不需要猜密码,
不需要两分钟,就能够立刻入侵成功』,所以『盈盈美黛子』们最爱的就是这个咚咚了。
但这个玩意儿本身是靠『你主机的程式漏洞』来攻击的,所以,如果你的主机随时保持在即时更新的阶段,
或者是关闭大部分不需要的程式,那就可以躲避过这个问题。因此,你应该要这样做:
关闭不需要的网路服务:开的 port 越少,可以被入侵的管道越少,
一部主机负责的服务越单纯,越容易找出问题点。
随时保持更新:这个没话讲!一定要进行的!
关闭不需要的软体功能:举例来说,后面会提到的远端登入伺服器 SSH
可以提供 root 由远端登入,那么危险的事情当然要给他取消啊!^_^
利用社交工程作欺骗
社交工程 (Social Engineering) 指的其实很简单,就是透过人与人的互动来达到『入侵』的目的!
@_@!人与人的互动可以入侵你的主机?鸟哥在唿咙你吗?当然不是。
近日在台湾的社会你不是常看到某些人会以『退税、中奖、花小钱买贵重物品』等名义来欺骗善良老百姓,
让老百姓掏出口袋里的金钱给那些可恶的金光党吗?社交工程也是类似的方法。在大公司里面,
或许你可能会接到这样的电话:『我是人事部门的经理,我的帐号为何突然间不能登入了?
你给我看一看,恩?干脆直接帮我另建一个帐号,我告诉你我要的密码是....』。如果你一时不查给他帐号密码的话,
你的主机可能就这样被绑走了~
社交工程的欺骗方法多的是,包括使用『好心的 email 通知』、『警告信函』、『中奖单』等等,
在在都是要欺骗你的帐号密码,有的则利用钓鱼方式来欺骗你在某些恶意网站上面输入你的帐号密码,
很讨厌的啦!举例来说,我们崑山计中的 email 常常会收到系统维护的信件,要我们将帐号密码提交给系统管理员统一控管,
这当然是假的!计中根本不会寄出这样的信件啊!伤脑筋啦!所以要注意啊!那要如何防范呢?
追踪对谈者:不要一味的相信对方,你必须要有信心的向上呈报,
不要一时心慌就中了计!
不要随意透露帐号/密码等资讯:最好不要随意在 Internet 上面填写这些资料,
真的很危险的!因为在 Internet 上面,你永远不知道对方萤幕前面坐着的是谁?
利用程式功能的『被动』攻击
啥?除了主动攻击之外,还有所谓的被动攻击喔?没错啊,『系金ㄟ』!那如何作被动攻击呢?
那就得要由『恶意网站』讲起了。如果你喜欢上网随意浏览的话,那么有的时候可能会连上一些广告很多,
或者是一堆弹出式视窗的网站,这些网站有时还会很好心的『提供你很多好用的软体自动下载与安装』的功能,
如果该网站是你所信任的,例如 Red Hat, CentOS, Windows 官网的话,那还好,
如果是一个你也不清楚他是干嘛的网站,那你是否要同意下载安装该软体?
如果你常常在注意一些网路危机处理的相关新闻时,常会发现 Windows 的浏览器 (IE) 有问题,
有时则是全部的浏览器 (Firefox, Netscap, IE...) 都会出现问题。那你会不会觉得奇怪啊,
怎么『浏览器也会有问题?』这是因为很多浏览器会主动的答应对方 WWW 主机所提供的各项程式功能,
或者是自动安装来自对方主机的软体,有时浏览器还可能由于程式发生安全问题,
让对方 WWW 浏览器得以传送恶意程式码给你的主机来执行,嘿嘿!中标!
那你又会想啊,那我干嘛浏览那样的恶意网站?呵呵!总是会有些粗心大意的时候啊!如果你今天不小心收到一个
email ,里面告诉你你的银行帐号有问题,希望你赶紧连上某个网页去看看你的帐号是否在有问题的行列中,你会不会去?
如果今天有个网路消息说某某网页在提供大特价商品,那你会不会去碰碰运气?
都是可能的啊!不过,这也就很容易被对方攻击到了。
那如何防备啊?当然建立良好的习惯最重要了:
随时更新主机上的所有软体:如果你的浏览器是没有问题的,
那对方传递恶意程式码时,你的浏览器就不会执行,那自然安全的多啊!
较小化软体的功能:举例来说,让你的收信软体不要主动的下载档案,
让你的浏览器在安装某些软体时,要通过你的确认后才安装,这样就比较容易克服一些小麻烦;
不要连接到不明的主机:其实鸟哥认为这个才最难!
因为很多时候我们都用 google 在搜寻问题的解决之道啊,那你如何知道对方是否是骗人的?
所以,前面两点防备还是很重要的!不要以为没有连接上恶意网站就不会有问题啊!
蠕虫或木马的 rootkit
rootkit 意思是说可以取得 root 权限的一群工具组 (kit),就如同前面主动攻击程式漏洞的方法一样,
rootkit 主要也是透过主机的程式漏洞。不过, rootkit 也会透过社交工程让使用者下载、安装 rootkit 软体,
结果让 cracker 得以简单的绑架对方主机啊!
rootkit 除了可以透过上述的方法来进行入侵之外,rootkit 还会伪装或者是进行自我复制,
举例来说,很多的 rootkit 本身就是蠕虫或者是木马间谍程式。蠕虫会让你的主机一直发送封包向外攻击,
结果会让你的网路频宽被吃光光,例如
年间的 Nimda, Code Red 等等;至于木马程式 (Trojan Horse)
则会对你的主机进行开启后门 (开一个 port 来让 cracker 主动的入侵),结果就是....绑架、绑架、绑架!
rootkit 其实挺不好追踪的,因为很多时候他会主动的去修改系统观察的指令,
包括 ls, top, netstat, ps, who, w, last, find 等等,让你看不到某些有问题的程式,
如此一来,你的 Linux 主机就很容易被当成是跳板了!有够危险!那如何防备呢?
不要随意安装不明来源的档案或者是不明网站的档案资料;
不要让系统有太多危险的指令:例如 SUID/SGID 的程式,
这些程式很可能会造成使用者不当的使用,而使得木马程式有机可趁!
可以定时以 rkhunter 之类的软体来追查:有个网站提供 rootkit
程式的检查,你可以前往下载与分析你的主机:
DDoS 攻击法 (Distributed Denial of Service )
这类型的攻击中文翻译成『分散式阻断服务攻击』,从字面上的意义来看,它就是透过分散在各地的僵尸电脑进行攻击,
让你的系统所提供的服务被阻断而无法顺利的提供服务给其他用户的方式。
这种攻击法也很要命,而且方法有很多,最常见的就属 SYN Flood
攻击法了!还记得我们在里面提到的,当主机接收了一个带有
SYN 的 TCP 封包之后,就会启用对方要求的 port 来等待连线,并且发送出回应封包 (带有 SYN/ACK 旗标的
TCP 封包),并等待 Client 端的再次回应。
好了,在这个步骤当中我们来想一想,如果 cient 端在发送出 SYN 的封包后,却将来自 Server
端的确认封包丢弃,那么你的 Server 端就会一直空等,而且 Client
端可以透过软体功能,在短短的时间内持续发送出这样的 SYN 封包,那么你的 Server
就会持续不断的发送确认封包,并且开启大量的 port 在空等~呵呵!等到全部主机的 port
都启用完毕,那么.....系统就挂了!
更可怕的是,通常攻击主机的一方不会只有一部!他会透过 Internet 上面的僵尸网路
(已经成为跳板,但网站主却没有发现的主机) 发动全体攻击,让你的主机在短时间内就立刻挂点。
这种 DDoS 的攻击手法比较类似『玉石俱焚』的手段,
他不是入侵你的系统,而是要让你的系统无法正常提供服务!
最常被用来作为阻断式服务的网路服务就是 WWW 了,因为 WWW 通常得对整个 Internet 开放服务。
这种攻击方法也是最难处理的,因为要嘛就得要系统核心有支援自动抵挡 DDoS 攻击的机制,
要嘛你就得要自行撰写侦测软体来判断!真是麻烦啊~而除非你的网站非常大,
并且『得罪不少人』,否则应该不会被 DDoS 攻击啦! ^_^
上面提到的都是比较常见的攻击方法,是还有一些高竿的攻击法啦,不过那些攻击法都需要有比较高的技术水准,例如 IP
欺骗。他可以欺骗你主机告知该封包来源是来自信任网域,而且透过封包传送的机制,
由攻击的一方持续的主动发送出确认封包与工作指令。如此一来,你的主机可能就会误判该封包确实有回应,
而且是来自内部的主机。
不过我们知道网际网路是有路由的,而每部主机在每一个时段的 ACK 确认码都不相同,
所以这个方式要达成可以登入,会比较麻烦,所以说,不太容易发生在我们这些小型主机上面啦!
不过你还是得要注意一下说:
设定规则完善的防火墙:利用 Linux 内建的防火墙软体 iptables
建立较为完善的防火墙,可以防范部分的攻击行为;
核心功能:这部份比较复杂,你必须要对系统核心有很深入的瞭解,
才有办法设定好你的核心网路功能。
登录档与系统监控:你可以透过分析登录档来瞭解系统的状况,
另外也可以透过类似
来即时瞭解到系统是否有异常,这些工作都是很好的努力方向!
要让你的系统更安全,没有『三两三』是没办法『上梁山』的!我们也一直鼓吹,
『维护网站比架设网站还要重要』的观念!因为『一人得道鸡犬升天』,同样的道理:『一人中标全员挂点』,
不要以为你的主机没有啥重要资料,被入侵或被植入木马也没有关系,
因为我们的伺服器通常会对内部来源的主机规范的较为宽松,如果你的主机在公司内部,
但是不小心被入侵的话,那么贵公司的伺服器是否就会暴露在危险的环境当中了?
另外,在蠕虫很『发达』的年代,我们也会发现只要区域网路里面有一部主机中标,整个区域网路就会无法使用网路了,
因为频宽已经被蠕虫塞爆!如果老闆发现他今天没有办法收信了,但无法收信的原因并非伺服器挂点,
而是因为内部人员的某部个人电脑中了蠕虫,而那部主机中蠕虫的原因只是因为该使用者不小心去看了一下色情网站,
你觉得老闆会高兴的跟该员工一起看色情网站还是 fire 掉该人员?
所以啊,主机防护还是很重要的!不要小看了!提供几个方向给大家思考看看吧:
建立完善的登入密码规则限制;
完善的主机权限设定;
设定自动升级与修补软体漏洞、及移除危险软体;
在每项系统服务的设定当中,强化安全设定的项目;
利用 iptables, TCP_Wrappers 强化网路防火墙;
利用主机监控软体如 MRTG 与 logwatch 来分析主机状况与登录档;
7.1.3 主机能作的保护:
软体更新、减少网路服务、启动 SELinux
根据本章前面的分析,现在你知道封包的流向以及主机基本需要进行的防护了。不过你或许还是有疑虑,那就是,
既然我都已经有了防火墙,那么权限的控管啦、密码的严密性啦、伺服器软体的更新啦、SELinux 啦等等的,
是否就没有这么重要呢?毕竟它是封包进入的第一关卡!这关把关严格,后续可以稍微宽松吗?其实...你错了!
对于开放某些服务的伺服器来说,你的防火墙『根本跟屁一样,是没有用的!』怎么说呢?
软体更新的重要性
让我们瞧一瞧 的流程好了,假设你需要对全世界开放 WWW ,那么提供 WWW 服务的 httpd
这只程式就得要执行,并且,你的防火墙得要打开 port 80 让全世界都可以连接到你的 port 80 ,这样才是一部合理的 WWW
伺服器嘛!问题来啦,如果 httpd 这只程式有资安方面的问题时,请问防火墙有没有效用?当然没有!因为防火墙原本就得要开放
port 80 啊!此时防火墙对你的 WWW 一点防护也没有。那怎办?
没啥好说的,就是软体持续更新到最新就对了!因为自由软体就是有这个好处,当你的程式有问题时,
开发商会在最短的时间内取得志工提供的修补程式 (patch) ,并将该程式码补充到软体更新资料库中,
让一般用户可以直接透过网路来自动更新。因此,要克服这个伺服器软体的问题,更新系统软体就对了。
但是你得要注意,你的系统能否更新软体与系统的版本有关!举例来说,2003 年左右发佈的 Red Hat 9 目前已经没有支援了,
如果你还是执意要安装 Red Hat 9 这套系统,那么很抱歉,你得要手动将系统内的软体透过 make 动作来重新编译到最新版,
因此,很麻烦~同样的, Fedora 最新版虽然有提供网路自动更新,但是 Fedora 每一个版本的维护期间较短,
你可能需要常常大幅度的变更你的版本,这对伺服器的设定也不妥当。此时一个企业版本的 Linux distributions 就很重要啦!
举例来说,鸟站的主机截至目前为止 (2011/07) 还是使用 CentOS 4.x ,因为这个版本目前还是持续维护中。
这对伺服器来说,是相当重要的!稳定与安全比什么都重要!
想要瞭解软体的安全通报,可以参考如下的网站资料喔!
台湾电脑危机处理小组(TWCERT):
Red Hat 的官方说明:
认识系统服务的重要性
再回到 当中,同时思考一下第二章网路基础里面谈到的网路连线是双向这件事,
我们会得到一个答案,那就是在图 7.1-1 内的第二个步骤中,如果能够减少伺服器上面的监听埠口,
此时因为伺服器端没有可供连线的埠口,用户端当然也就无法连线到伺服器端嘛!那么如何限制伺服器开启的埠口呢?
第二章就谈到过了,关闭埠口的方式是透过关闭网路服务。没错啊!所以啰,此时能够减少网路服务就减少,可以避免很多不必要的麻烦。
权限与 SELinux 的辅助
根据网路上面多年来的观察,很多朋友在发生权限不足方面的问题后,都会直接将某个目录直接修订成为 chmod -R 777 /some/path/。
如果这部主机只是测试用的没有上网提供服务,那还好。如果有上网提供某些服务时,那可就伤脑筋了!因为目录的 wx 权限设定一起后,
代表该身份可以进行新增与删除的动作。偏偏你又给 777 (rwxrwxrwx) ,代表所有的人都可以在该目录下进行新增与删除!
万一不小心某支程式被攻击而被取得操作权,想想看,你的系统不就可能被写入某些可怕的东西了吗?
所以不要随便设定权限啊!
那如果由于当初规划的帐号身份与群组设定的太杂乱,导致无法使用单纯的三种身份的三种权限来设定你的系统时,那该如何是好?
没关系的,可以透过 ACL 这个好用的东西! ACL 可以针对单一帐号或单一群组进行特定的权限设定,相当好用喔!
他可以辅助传统 Unix 的权限设定方面的困扰哩。详情请参考基础篇的内容呦!
那如何避免使用者乱用系统,乱设定权限呢?这个时候就得要透过 SELinux 来控制了。SELinux
可以在程序与档案之间再加入一道细部的权限控制,因此,即使程序与档案的权限符合了操作动作,但如果程序与档案的
SELinux 类型 (type) 不吻合时,那么该程序就无法读取该档案喔!
此外,我们的 CentOS 也针对了某些常用的网路服务制订了许多的档案使用规则 (rule),如果这些规则没有启用,
那么即使权限、SELinux 类型都对了,该网路服务的功能还是无法顺利的运作喔!
根据这样的分析,我们可以知道,随时更新系统软体、限制连线埠口以及透过启动 SELinux
来限制网路服务的权限,经过这三个简单的步骤,你的系统将可以获得相当大的保护!当然啦,
后续的防火墙以及系统登录档分析工作仍是需要进行的。本章后续将依据这三点来深入介绍。
7.2 网路自动升级软体
在现在的网际网路上面,cracker 实在是太多了!这些闲人会利用已经存在的系统漏洞,来进行侦测、入侵你的主机。
因此,除了未来架设防火墙之外,最重要的 Linux 日常管理工作,莫过于软体的升级了!
不过,如果使用者还得要自己每天观察网路安全通报,并主动去查询各大 distribution 针对这些漏洞来提供升级软体包,
那真是太不人性化了!因此,目前就有很多线上直接更新的机制出现了!有了这些线上直接更新软体的手段与方法,
我们系统管理员在管理主机系统上面,可就轻松的多啰!
7.2.1 如何进行软体升级
通常鸟哥安装好 Linux 之后,会先开启系统预设的防火墙机制,然后第一件事情就是进行全系统更新啦!
不论是哪一套 Linux 鸟哥都是这样做的,因为要避免软体资安的问题嘛!好了,那么 Linux 上面的软体该如何进行更新与升级呢?
还记得你是如何安装软体的吗?不就是 ,
与 dpkg 吗?
所以啰,你的软体如果想要升级,那就得依据当时你安装该软体的方式来进行升级啊!而每种方式都有其适用性:
这是目前最常见于 Linux distribution 当中的软体管理方式,包括 CentOS / Fedora / SuSE / Red Hat /
Mandriva 等等,都是使用这个方式来管理的;
利用软体的官方网站所释出的原始码在您的系统上面编译与安装,
一般来说,由于软体是直接在自己的机器上面编译的,所以效能会比较好一些。
不过,升级的时候就比较麻烦,因为又得要下载新的原始码并且重新编译一次。
这种安装模式常见于某些特殊软体 (没有包含在 distribution 当中),或者是 Gentoo
这个强调效能的 distribution;
是 debian 这个 distribution 所使用的软体管理方式,与
RPM 很类似,都是透过预先编译的处理,可以让 end user 直接使用来升级与安装。
举例来说,如果你的系统是 CentOS ,我们知道他使用的是 RPM 类型的软体管理模式,那如果你想要安装 B2D
的软体怎办?要注意, B2D 是使用 debian 的 dpkg 来管理软体的,两者并不相同啊!要互相安装太难了!
所以说,要升级的话,得先瞭解到你系统上的软体安装与管理的方法才行。
不过,有个特殊案例,那就是旧版本的 Linux (例如 Red Hat 9) 的软体升级该如何是好?
由于旧版本的软体支援度本来就比较差,商业公司或者是社群也没有这么多心力放在旧版本的支援上,
所以,你这个时候可以选择: (1)升级到较新的版本,例如 CentOS 6.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 软体与方式上面就有所不同,
也就有底下这些不同的线上升级机制啦:
CentOS 与 Fedora 所常用的自动升级机制,透过 FTP 或 WWW 来进行线上升级以及线上直接安装软体;
最早由 debian 这个 distribution 所发展,现在 B2D 也是使用 apt ,同时由于 apt 的可移植性,
所以只要你的 RPM 可以使用 apt 来管理的话,就可以自行建立 apt 伺服器来提供其他使用者进行线上安装与升级。
所谓的 Yast Online Update (YOU) 是由 SuSE 所自行开发出来的线上安装升级方式,
经过註册取得一组帐号密码后,就能够使用 you 的机制来进行线上升级。不过如果是免费的版本,
则仅有 60 天的试用期!
这个则是 Mandriva 所提供的线上升级机制!
讲了这些升级机制并且与 distribution 作了对应,你就该瞭解到:『每个
distribution 可以使用的线上升级机制都不相同』的啊!所以请参考你的 distribution
所提供的文件来进行线上升级的设定喔!否则就得要自行手动下载安装了! @_@
鸟哥这里都是使用 CentOS 这个 Red Hat 相容的 distributions 来介绍的,因此,底下仅介绍了 yum 而已。
不过,yum 已经能够适用于 CentOS, Red Hat Enterprise Linux, Fedora 等等,也应该是挺够用的了!
另外,基础篇里面已经谈过 rpm 与 yum 的用法,所以在这里仅是加强介绍与更新有关的用法而已喔!
7.2.2 CentOS 的 yum
软体更新、映射站使用的原理
我们曾经在基础篇里面谈过 yum 了,基本上他的原理是,我们的 CentOS 会跑到 yum 伺服器上头,下载了官方网站释出的 RPM
表头清单资料,该资料除了记载每个 RPM 软体的相依性之外,也说明了 RPM 档案所放置的容器 (repository)
所在。因此透过分析这些资料,我们的 CentOS 就能够直接使用 yum 去下载与安装所需要的软体了!
详细图示与流程有点像这样:
图 7.2-1、使用 yum 下载清单表头与取得容器相关资料示意图
先由设定档判断 yum server 所在 IP 位址;
连接到 yum server 后,先下载新的 RPM 档案的表头资料;
分析比较使用者所欲安装/升级的档案,并提供使用者确认;
下载使用者选择的档案到系统中的 /var/cache/yum ,并进行实际安装;
由于你所下载的清单当中已经含有所有官方网站所释出的 RPM 档案的表头相依属性的关系,
所以如果你想要安装的软体包含某些尚未安装的相依软体时,我们的 yum 会顺便帮你下载所需要的其他软体,预先安装后,
再安装你所实际需要的软体!从分析、下载到安装,全部一口气搞定!很简单的啦!
不过,恐怕还是有问题。如果全世界使用 CentOS 的朋友通通连线到同一部 Yum 伺服器去下载所需要的 RPM 档案,哇!
那频宽不就很容易被塞爆!那怎办?没关系,有所谓的映射站啊! CentOS 在世界各地都有映射站,这些映射站会将官网的
yum 伺服器的资料复制一份,同时在映射站上面也提供同样的 yum 功能,因此,你可以在任何一部 yum
伺服器的映射站上面下载与安装软体。底下是 CentOS 官网上面列出的亚洲地区映射站一览表:
现在的 yum 又很聪明,它会自动的去分析离你的主机最近的那部映射站,然后直接使用该部映射主机作为你的 yum 来源,
因此,『理论上』你不需要更动任何设定,在台湾,你的 CentOS 就会使用台湾地区的 yum 伺服器啰!就这么简单!
所以,接下来就让我们直接来谈谈怎么使用 yum 吧!
yum 的原理与相关使用,我们在基础篇里面已经分门别类的介绍过了,因此底下仅就比较重要的部分介绍一下啰!
7.2.3 yum 的使用:
安装, 软体群组, 全系统更新
yum 可不止能够线上自动升级而已,他还可以作查询、软体群组的安装、整体版本的升级等等,好用的哩!
先来谈论一下 yum 这个指令的用法吧:
[root@www ~]# yum [option] [查询的工作项目] [相关参数]
选项与参数:
option:主要的参数,包括有:
-y :当 yum 询问使用者的意见时,主动回答 yes 而不需要由键盘输入;
[查询的工作项目]:由于不同的使用条件,而有一些选择的项目,包括:
install :指定安装的软体名称,所以后面需接『 软体名称 』
:进行整体升级的行为;当然也可以接某个软体,仅升级一个软体;
:移除某个软体,后面需接软体名称;
:搜寻某个软体或者是重要关键字;
:列出目前 yum 所管理的所有的软体名称与版本,有点类似 rpm -qa;
:同上,不过有点类似 rpm -qai 的执行结果;
:下载的档案被放到 /var/cache/yum ,可使用 clean 将他移除,
可清除的项目:packages | headers | metadata | cache 等;
在[查询的工作项目]部分还可以具有整个群组软体的安装方式,如下所示:
:列出所有可使用的『软体群组』,例如 Development Tools 之类的;
:后面接 group_name,则可瞭解该 group 内含的所有软体名;
groupinstall:这个好用!可以安装一整组的软体群组,相当的不错用!
更常与 --installroot=/some/path 共用来安装新系统
groupremove :移除某个软体群组;
# 范例一:搜寻 CentOS 官网提供的软体名称是否有与 RAID 有关的?
[root@www ~]# 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
&==下载软体的表头清单中
=================== Matched: raid =================&==找到的结果如下
dmraid.i686 : dmraid (Device-mapper RAID tool and library)
....(中间省略)....
mdadm.x86_64 : The mdadm program controls Linux md devices (software RAID
....(底下省略)....
# 范例二:上述输出结果中, mdadm 的功能为何?
[root@www ~]# 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
&==这里说明这是已经安装的软体!
: installed
: anaconda-CentOS-.x86_64
: The mdadm program controls Linux md devices (software RAID
: http://www.kernel.org/pub/linux/utils/raid/mdadm/
Description: The mdadm program is used to create, manage, and monitor
....(底下省略)....
# 由上述底线的 Summary 关键字,知道这软体在达成软体磁碟阵列功能!!
yum 真是个很好用的东西,它可以直接查询是否有某些特殊的软体名称。举例来说,你可以利用底下的两个方式取得软体名称:
yum search "一些关键字"
yum list (可列出所有的软体档名)
然后再以正规表示法取得关键字,或者是『 yum
info "软体名称" 』就能够知道该软体的用途,最后再决定要不要安装啊!上面的范例一就是在找出磁碟阵列的管理软体。
如果确定要安装时,那就参考参考底下的流程吧!
利用 yum 进行安装
# 范例三:安装某个软体吧!以 mdadm 这个软体名为例:
[root@www ~]# yum install mdadm
....(前面省略)....
Setting up Install Process
Package mdadm-3.1.3-1.el6.x86_64 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
available)』。作这个范例是希望朋友们能够仔细的看输出的讯息啦!好啦!我们还是来安装一个不曾装过的,
就拿 javacc 这套软体来装看看好了!
[root@www ~]# yum list javacc*
Available Packages
javacc.x86_64
4.1-0.5.el6
javacc-demo.x86_64
4.1-0.5.el6
javacc-manual.x86_64
4.1-0.5.el6
# 共有三套软体,分别是 javacc, javacc-demo, javacc-manual ,版本为 4.1-0.5.el6,
# 软体是放置到名称为 base 的容器当中存放的。
[root@www ~]# yum install javacc
....(前面省略)....
Setting up Install Process
Resolving Dependencies
--& Running transaction check
&==开始检查有没有相依属性的软体问题
---& Package javacc.x86_64 0:4.1-0.5.el6 set to be updated
....(中间省略)....
=========================================================================
Repository
=========================================================================
Installing:
4.1-0.5.el6
Installing for dependencies:
java-1.5.0-gcj
1.5.0.0-29.1.el6
1:0.10k-5.el6
0.5-9.1.el6
Transaction Summary
=========================================================================
4 Package(s)
&==安装软体彙整,共安装 4 个,升级 0 个软体
0 Package(s)
Total download size: 1.9 M
Installed size: 5.6 M
Is this ok [y/N]: y
&==让你确认要下载否!
Downloading Packages:
(1/4): java-1.5.0-gcj-1.5.0.0-29.1.el6.x86_64.rpm
(2/4): java_cup-0.10k-5.el6.x86_64.rpm
(3/4): javacc-4.1-0.5.el6.x86_64.rpm
(4/4): sinjdoc-0.5-9.1.el6.x86_64.rpm
-------------------------------------------------------------------------
3.1 MB/s | 1.9 MB
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
Installing
: java-1.5.0-gcj-1.5.0.0-29.1.el6.x86_64
Installing
: 1:java_cup-0.10k-5.el6.x86_64
Installing
: sinjdoc-0.5-9.1.el6.x86_64
Installing
: javacc-4.1-0.5.el6.x86_64
Installed:
&==主要需要安装的
javacc.x86_64 0:4.1-0.5.el6
Dependency Installed: &==为解决相依性额外装的
java-1.5.0-gcj.x86_64 0:1.5.0.0-29.1.el6
java_cup.x86_64 1:0.10k-5.el6
sinjdoc.x86_64 0:0.5-9.1.el6
瞧!经过 yum 我们可以很轻松的就安装好一个软体,并且这个软体已经主动的帮我们做好相依属性的克服了,
真是方便到爆!另外,CentOS 6.x 预设的情况下,yum 下载的资料除了每个容器的表头清单档案之外,所有下载的 RPM 档案都会在安装完毕之后予以删除!
这样你的系统就不会有容量被下载的资料塞爆的问题。但如果你想要下载的 RPM 档案继续保留在 /var/cache/yum
当中,就得要修改 /etc/yum.conf 设定档了!
[root@www ~]# vim /etc/yum.conf
&==看看就好,不要真的作!
cachedir=/var/cache/yum/$basearch/$releasever
keepcache=1
debuglevel=2
logfile=/var/log/yum.log
exactarch=1
obsoletes=1
....(底下省略)....
上述的特殊字体地方将 0 改成 1 ,这样就能够让你的 RPM 档案保存下来。不过,除非你有好多部主机要更新,
你想利用一台先 yum 升级且下载,然后将所有的 RPM 档案收集起来给内网的机器升级 (rpm -Fvh *.rpm)
上面的 vim 修改动作不建议修改!因为你的 /var 恐怕会被塞爆啊!再次提醒!
yum 安装软体群组
什么是『软体群组』呢?由于 RPM 软体将一个大专案分成好几个小计画来执行,每个小计画都可以独立安装,
这样的好处是可以让使用者与软体发展者安装不同的环境!举例来说,在桌面系统中 (Desktop),一般用户应该不会跑去发展软体吧?
所以针对桌上型电脑,软体群组又分为 "Desktop Platform" 与开发者 "Desktop Platform Development" 两部份,
每个软体群组内又含有多个不同的 RPM 软体档案!这样做的用途是方便使用者安装一整套的专案啦!
那么系统有多少软体群组呢?又该如何观察某个软体群组有拥有的 RPM 档案呢?我们就利用 Desktop
Platform 这个专案来说明一下啰:
# 范例四:查询系统有的软体群组有多少个?
[root@www ~]# LANG=C yum grouplist
Installed Groups:
&==这个是已安装的软体群组
Additional Development
Arabic Support
Armenian Support
....(中间省略)....
Available Groups:
&==这个是尚可安装的软体群组
Afrikaans Support
Albanian Support
Amazigh Support
....(中间省略)....
Desktop Platform
Desktop Platform Development
....(后面省略)....
# 范例五:那么 Desktop Platform 内含多少个 RPM 软体呢?
[root@www ~]# yum groupinfo "Desktop Platform"
Group: 桌面环境平台
Description: 受支援的 CentOS Linux 桌面平台函式库。
Mandatory Packages: &==主要的会被安装的软体有这些
....(中间省略)....
Optional Packages:
&==额外可选择的软体是这些
....(底下省略)....
# 如果你确定要安装这个软体群组的话,那就这样做:
[root@www ~]# yum groupinstall "Desktop Platform"
# 因为这里在介绍伺服器的环境,所以上面的动作鸟哥是按下 n 来拒绝安装的!
利用这个『 yum groupinstall "软体群组名" 』可以让你一口气安装很多的软体,
而不必担心某个软体忘记装了!实在是很不错啦~而且利用 groupinfo 的功能你也可以发现一些不错的软体资料,
如此一来,你就可以更方便的管理你的 Linux 系统了,很不错吧!
全系统更新
我们都知道使用『yum update』就可以进行软体的更新。不过你晓得吗?
yum update 也可以直接进行同一版本的升级喔!举例来说,你可以从 6.0 升级到 6.1 版本哩!而且中间过程完全无痛呦!
就跟一般软体升级而已,并没有不同呦!够愉快吧!
不过,如果你是想要从较旧版的 CentOS 5.x 升级到 6.x
的话,那么可能就得要多费些功夫了。为啥不要重灌比较快呢?因为你可能已经有些资料设定好,所以不想变更嘛!
但老实说,不同版本 (ex& 5.x --& 6.x) 间的升级最好还是不要尝试啦!重新安装可能是最好的状况。
底下列出酷学园的前辈提供的升级方式,以及 CentOS 官网直接提供的升级方式给你参考参考:
酷学园 TWU2 兄提供的 Red Hat 9 升级到 CentOS 3.x 的方法:
CentOS 官网提供的 CentOS 4.x 升级到 5.x 的方法:
CentOS 维基百科提供的 CentOS 4.4 升级到 5.1 的方法:
请设定一下工作排程,让你的 CentOS 可以每天自动更新系统
可以使用『 crontab -e 』来动作,也可以编辑『 vim /etc/crontab 』来动作,
由于这个更新是系统方面的,所以鸟哥习惯使用 vim /etc/crontab 来进行指令的说明。
其实内容很简单:40 5 * * * root yum -y update && yum clean packages这样就可以自动更新了,
时间订在每天的凌晨 5:40 。
7.2.4 挑选特定的映射站:修改 yum
设定档与清除 yum 快取
虽然 yum 是你的主机能够连线上 Internet 就可以直接使用的,不过,由于 CentOS 的映射站台可能会选错,
举例来说,我们在台湾,但是 CentOS 的映射站台却选择到了大陆北京或者是日本去,有没有可能发生啊!
有啊!鸟哥教学方面就常常发生这样的问题,要知道,我们连线到大陆或日本的速度是非常慢的呢!那怎办?
当然就是手动的修改一下 yum 的设定档就好啰!
在台湾,鸟哥熟悉的 CentOS 映射站台主要有、高速网路中心与义守大学。
在学术网路之外,鸟哥近来比较偏好高速网路中心,似乎更新的速度比较快,而且连接台湾学术网路也非常快速哩!
因此,鸟哥底下建议台湾的朋友使用高速网路中心的 ftp 主机资源来作为 yum 伺服器来源喔!不过,因为鸟哥的机器很多都在崑山科大,
所以在学术网路上,使用的反而是崑山科大的 FTP 啰。目前高速网路中心对于 CentOS 所提供的相关网址如下:
如果你连接到上述的网址后,就会发现里面有一堆连结,那些连结就是这个 yum 伺服器所提供的容器了!
所以高速网路中心也提供了 addons, centosplus, extras, fasttrack, os, updates 等容器,最好认的容器就是
os (系统预设的软体) 与 updates (软体升级版本) 啰!由于鸟哥在我的测试用主机是利用 x86_64 的版本,
因此那个 os 再点进去就会得到如下的可提供安装的网址:
为什么在上述的网址内呢?有什么特色!最重要的特色就是那个『 repodata
』的目录!该目录就是分析 RPM 软体后所产生的软体属性相依资料放置处!因此,当你要找容器所在网址时,
最重要的就是该网址底下一定要有个名为 repodata 的目录存在!那就是容器的网址了!
其他的容器正确网址,就请各位看倌自行寻找一下喔!现在让我们修改设定档吧!
[root@www ~]# vim /etc/yum.repos.d/CentOS-Base.repo
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-6
如上所示,鸟哥仅列出 base 这个容器的原始内容而已,其他的容器内容请自行查阅啰!上面的资料需要注意的是:
代表容器的名字!中刮号一定要存在,里面的名称则可以随意取。但是不能有两个相同的容器名称,否则 yum
会不晓得该到哪里去找容器相关软体清单档案。
name:只是说明一下这个容器的意义而已,重要性不高!
mirrorlist=:
列出这个容器可以使用的映射站台,如果不想使用,可以註解到这行。由于等一下我们是直接设定映射站,
因此这行待会儿确实是需要註解掉的喔!
baseurl=:这个最重要,因为后面接的就是容器的实际网址! mirrorlist
是由 yum 程式自行去捉映射站台, baseurl
则是指定固定的一个容器网址!我们刚刚找到的网址放到这里来啦!
enable=1:
就是让这个容器被启动。如果不想启动可以使用 enable=0 喔!
gpgcheck=1:
还记得 RPM 的数位签章吗?这就是指定是否需要查阅 RPM 档案内的数位签章!
gpgkey=:就是数位签章的公钥档所在位置!使用预设值即可
瞭解这个设定档之后,接下来让我们修改整个档案的内容,让我们这部主机可以直接使用高速网路中心的资源吧!
修改的方式鸟哥仅列出 base 这个容器项目而已,其他的项目请您自行依照上述的作法来处理即可!
[root@www ~]# vim /etc/yum.repos.d/CentOS-Base.repo
name=CentOS-$releasever - Base
baseurl=http://ftp.twaren.net/Linux/CentOS/6/os/x86_64/
&==就属它最重要!
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
# 底下其他的容器项目,请自行到高速网路中心去查询后自己处理!
[root@www ~]# yum clean all
&==改过设定档,最好清除既有清单
接下来当然就是给他测试一下啰!如何测试呢?再次使用 yum 即可啊!
# 范例:列出目前 yum server 所使用的容器有哪些?
[root@www ~]# yum repolist all
CentOS-6 - Base
enabled: 6,019
CentOS-6 - Media
centosplus
CentOS-6 - Plus
CentOS-6 - Contrib
CentOS-6 - Debuginfo
CentOS-6 - Extras
CentOS-6 - Updates
enabled: 1,042
repolist: 7,061
# 在 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 :将下载的软体档头删除
:将所有容器资料都删除!
# 范例:删除已下载过的所有容器的相关资料 (含软体本身与清单)
[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 的容器设定档。
你可以这么做的:
[root@www ~]# vim /etc/yum.repos.d/drbl.repo
name=This is DRBL site
baseurl=http://free.nchc.org.tw/drbl-core/i386/RPMS.drbl-stable/
gpgcheck=0
[root@www ~]# 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
....(底下省略)....
[root@www ~]# yum repolist all
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
CentOS-6 - Base
enabled: 6,019
CentOS-6 - Media
centosplus
CentOS-6 - Plus
CentOS-6 - Contrib
CentOS-6 - Debuginfo
This is DRBL site
36 &==新的在此!
CentOS-6 - Extras
CentOS-6 - Updates
enabled: 1,042
repolist: 7,097
drbl 这个新增的容器里面,拥有 36 个软体喔!这样够清楚吗?
7.3 限制连线埠口 (port)
为什么我们的主机会回应网路上面的一些要求封包呢?例如我们设定了一部 WWW 主机后,当有来自 Internet 的 WWW
要求时,我们的主机就会予以回应,这是因为我们的主机有启用了 WWW 的监听埠口啊!所以,当我们启用了一个 daemon
时,就可能会造成主机的埠口在进行监听的动作,此时该 daemon 就是已经对网路上面提供服务了!万一这个
daemon 程式有漏洞,因为他提供了 Internet 的服务,所以就容易被 Internet 上面的 cracker
所攻击了!所以说,仔细的检查自己系统上面的埠口到底开了多少个,并且予以严格的管理,才能够降低被攻击的可能性啊!
7.3.1 什么是 port
快讲到烂掉了!当妳启动一个网路服务,这个服务会依据 TCP/IP 的相关通讯协定启动一个埠口在进行监听,
那就是 TCP/UDP 封包的 port (埠口) 了。我们从第二章也知道网路连线是双向的,伺服器端得要启动一个监听的埠口,
用户端得要随机启动一个埠口来接收回应的资料才行。那么伺服器端的服务是否需要启动在固定的埠口?
用户端的埠口是否又是固定的呢?我们将第二章中与 port 有关的资料给她彙整一下先:
伺服器端启动的监听埠口所对应的服务是固定的:
例如 WWW 服务开启在 port 80 ,FTP 服务开启在 port 21,email 传送开启在 port 25 等等,都是通讯协定上面的规范!
用户端启动程式时,随机启动一个大于 1024以上的埠口:
用户端启动的 port 是随机产生的,主要是开启在大于 1024 以上的埠口。这个 port 也是由某些软体所产生的,
例如浏览器、Filezilla 这个 FTP 用户端程式等等。
一部伺服器可以同时提供多种服务:
所谓的『监听』是某个服务程式会一直常驻在记忆体当中,所以该程式启动的 port 就会一直存在。
只要伺服器软体启动的埠口不同,那就不会造成冲突。当用户端连接到此伺服器时,透过不同的埠口,就可以取得不同的服务资料啰。
所以,一部主机上面当然可以同时启动很多不同的服务啊!
共 65536 个 port:
由第二章的 TCP/UDP 表头资料中,就知道 port 佔用 16 个位元,因此一般主机会有 65536 个 port,而这些 port
又分成两个部分,以 port 1024 作区隔:
只有 root 才能启动的保留的 port:
在小于 1024 的埠口,都是需要以 root 的身份才能启动的,这些 port 主要是用于一些常见的通讯服务,在 Linux
系统下,常见的协定与 port 的对应是记录在 /etc/services 里面的。
大于 1024 用于 client 端的 port:
在大于 1024 以上的 port 主要是作为 client 端的软体启动的 port 。
是否需要三向交握:
建立可靠的连线服务需要使用到 TCP 协定,也就需要所谓的三向交握了,如果是非连线导向的服务,例如 DNS 与视讯系统,
那只要使用 UDP 协定即可。
通讯协定可以启用在非正规的 port:
我们知道浏览器预设会连接到 WWW 主机的 port 80,那么你的 WWW 是否可以启动在非 80 的其他埠口?
当然可以啊!你可以透过 WWW 软体的设定功能将该软体使用的 port 启动在非正规的埠口,
只是如此一来,您的用户端要连接到你的主机时,就得要在浏览器的地方额外指定你所启用的非正规的埠口才行。
这个启动在非正规的埠口功能,常常被用在一些所谓的地下网站啦!^_^。另外,
某些软体预设就启动在大于 1024 以上的埠口,如 MySQL 资料库软体就启动在 3306。
所谓的 port 的安全性:
事实上,没有所谓的 port 的安全性!因为『Port 的启用是由服务软体所造成的』,
也就是说,真正影响网路安全的并不是 port ,而是启动 port 的那个软体 (程式)!
或许你偶而会听到:『没有修补过漏洞的 bind 8.x 版,很容易被黑客所入侵,请尽快升级到
bind 9.x 以后版本』,所以啰,对安全真正有危害的是『某些不安全的服务』
而不是『开了哪些 port 』才是!因此,没有必要的服务就将他关闭吧!
尤其某些网路服务还会启动一些 port 哩!另外,那些已启动的软体也需要持续的保持更新喔!
7.3.2 埠口的观察: netstat, nmap
好了,我们现在知道这个 port 是什么鬼东西了,再来就是要来瞭解一下,我们的主机到底是开了多少的 port
呢?由于 port 的启动与服务有关,那么『服务』跟『 port 』对应的档案是哪一个?再提醒一次呦!是『
/etc/services 』啦!而常用来观察 port 的则有底下两个程式:
netstat:在本机上面以自己的程式监测自己的 port;
nmap:透过网路的侦测软体辅助,可侦测非本机上的其他网路主机,但有违法之虞。
见他的大头王!怎么使用 nmap 会违法?由于 nmap 的功能太强大了,所以很多 cracker
会直接以他来侦测别人的主机,这个时候就可能造成违法啦!只要你使用 nmap
的时候不要去侦测别人的电脑主机,那么就不会有问题啦!底下我们分别来说一说这两个宝贝吧!
在做为伺服器的 Linux 系统中,开启的网路服务越少越好!
因为较少的服务可以较容易除错 (debug) 与瞭解安全漏洞,并可避免不必要的入侵管道!
所以,这个时候请瞭解一下您的系统当中有没有哪些服务被开启了呢?
要瞭解自己的系统当中的服务项目,最简便的方法就是使用
了!这个东西不但简单,而且功能也是很不错的。
这个指令的使用方法在 指令介绍当中提过了,
底下我们仅提供如何使用这个工具的方法啰!
列出在监听的网路服务:
[root@www ~]# netstat -tunl
ctive Internet connections (only servers)
Proto Recv-Q Send-Q Local Address
Foreign Address
0 0.0.0.0:111
0 0.0.0.0:22
0 127.0.0.1:25
....(底下省略)....
上面说明了我的主机至少有启动 port 111, 22, 25 等,而且观察各连线介面,可发现 25 为 TCP 埠口,但只针对 lo
内部迴圈测试网路提供服务,网际网路是连不到该埠口的。至于 port 22 则有提供网际网路的连线功能。
列出已连线的网路连线状态:
[root@www ~]# netstat -tun
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address
Foreign Address
52 192.168.1.100:22
192.168.1.101:2162
ESTABLISHED
从上面的资料来看,我的本地端伺服器 (Local Address, 192.168.1.100) 目前仅有一条已建立的连线,那就是与 192.168.1.101
那部主机连接的连线,并且连线方线是由对方连接到我主机的 port 22
来取用我伺服器的服务吶!
删除已建立或在监听当中的连线:
如果想要将已经建立,或者是正在监听当中的网路服务关闭的话,最简单的方法当然就是找出该连线的 PID,
然后将他 kill 掉即可啊!例如下面的范例:
[root@www ~]# netstat -tunp
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address
Foreign Address
PID/P name
52 192.168.1.100:22 192.168.1.101:2162
ESTABLISHED 1342/0
如上面的范例,我们可以找出来该连线是由 sshd 这个程式来启用的,并且他的 PID 是 1342,
希望你不要心急的用
这个指令,否则容易删错人 (因为你的主机里面可能会有多个 sshd 存在),
应该要使用
这个指令才对喔!
[root@www ~]# kill -9 1342
如果你要侦测的设备并没有可让你登入的作业系统时,那该怎么办?举例来说,你想要瞭解一下公司的网路印表机是否有开放某些协定时,
那该如何处理啊?现在你知道
可以用来查阅本机上面的许多监听中的通讯协定,
那例如网路印表机这样的非本机的设备,要如何查询啊?呵呵!用 nmap 就对了!
nmap ()的软体说明之名称为:『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--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
STATE SERVICE
111/tcp open
# 在预设的情况下,nmap 仅会扫瞄 TCP 的协定喔!
nmap 的用法很简单吶!就直接在指令后面接上 IP 或者是主机名称即可。不过,在预设的情况下 nmap
仅会帮你分析 TCP 这个通讯协定而已,像上面这个例子的输出结果。但优点是顺道也将开启该埠口的服务也列出来了,
真是好! ^_^!那如果想要同时分析 TCP/UDP 这两个常见的通讯协定呢?可以这样做:
# 范例二:同时扫瞄本机的 TCP/UDP 埠口
[root@www ~]# nmap -sTU localhost
STATE SERVICE
111/tcp open
111/udp open
&==会多出 UDP 的通讯协定埠口!
嘿嘿!与前面的范例比较一下,你会发现这次多了几个 UDP 的埠口,这样分析好多了!然后,
如果你想要瞭解一下到底有几部主机活在你的网路当中时,则可以这样做:
# 范例三:透过 ICMP 封包的检测,分析区网内有几部主机是启动的
[root@www ~]# nmap -sP 192.168.1.0/24
Starting Nmap 5.21 ( http://nmap.org ) at
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
看到否?鸟哥的环境当中有三部主机活着吶 (Host is up)!并且该 IP 所对应的 MAC 也会被记录下来,
很不错吧!如果你还想要将各个主机的启动的 port 作一番侦测的话,那就得要使用:
[root@www ~]# nmap 192.168.1.0/24
之后你就会看到一堆 port number 被输出到萤幕上啰~如果想要随时记录整个网段的主机是否不小心开放了某些服务,
嘿嘿!利用 nmap 配合资料流重导向 (&, && 等) 来输出成为档案,
那随时可以掌握住您区域网路内每部主机的服务启动状况啊! ^_^
请特别留意,这个 nmap 的功能相当的强大,也是因为如此,所以很多刚在练习的黑客会使用这个软体来侦测别人的电脑。
这个时候请您特别留意,目前很多的人已经都有『特别的方式』来进行登录的工作!例如以
(/etc/hosts.allow, /etc/hosts.deny) 的功能来记录曾经侦测过该 port 的 IP!
这个软体用来『侦测自己机器的安全性』是很不错的一个工具,但是如果用来侦测别人的主机,
可是会『吃上官司』的!特别留意!!
埠口与服务的启动/关闭及开机时状态设定
从第二章的资料我们就知道,其实 port 是由执行某些软体之后被软体启动的。所以要关闭某些 port
时,那就直接将某个程式给他关闭就是了!关闭的方法你当然可以使用
,不过这毕竟不是正统的解决之道,因为 kill
这个指令通常具有强制关闭某些程式的功能,但我们想要正常的关闭该程式啊!
所以,就利用系统给我们的 script
来关闭就好了啊。
在此同时,我们就得再来稍微复习一下,一般传统的服务有哪几种类型?
stand alone 与 super daemon
我们在内谈到,在一般正常的 Linux
系统环境下,服务的启动与管理主要有两种方式:
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 』重新来启动才行!
关于更详细的服务说明,请参考基础篇的一文,
鸟哥在这里不再赘述。好,那么如果我想要将我系统上面的 port 111 关掉的话,
那应该如何关闭呢?最简单的作法就是先找出那个 port 111 的启动程式喔!
[root@www ~]# netstat -tnlp | grep 111
0 0.0.0.0:111
990/rpcbind
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
透过上面的这个分析的流程,你可以利用系统提供的很多方便的工具来达成某个服务的关闭!
为啥这么麻烦?不是利用 kill -9 990 就可以删掉该服务了吗?
是没错啦!不过,你知道该服务是做啥用的吗?你知道将他关闭之后,你的系统会出什么问题吗?
如果不知道的话,那么利用上面的流程不就可以找出该服务软体,再利用 rpm 查询功能,
不就能够知道该服务的作用了?所以说,这个方式还是对您会有帮助的啦!
底下请您试着将您 CentOS 或者是其他版本的 Linux 的 Telnet 打开试看看。
我们知道系统的 Telnet 服务通常是以 super daemon 来控管的,请您启动您系统的 telnet 试看看。
要启动 telnet 首先必须要已经安装了 telnet 的伺服器才行,所以请先以 rpm 查询看看是否有安装 telnet-server 呢?
『rpm -qa | grep telnet-server』如果没有安装的话,请利用原版光碟来安装,或者使用『yum install telnet-server』
安装一下先;
由于是 super daemon 控管,所以请编辑 /etc/xinetd.d/telnet 这个档案,将其中的『disable = yes』改成
『disable = no』之后以『/etc/init.d/xinetd restart』重新启动 super daemon 吧!
利用 netstat -tnlp 察看是否有启动 port 23 呢?
预设启动的服务
刚刚上头的作法仅是『立即将该服务启动或关闭』喔!并不会影响到下次开机时,这个服务是否预设启动的情况。
如果你想要在开机的时候就启动或不启动某项服务时,那就得要瞭解一下的内容啦!在 Unix like
的系统当中我们都是透过 run level 来设定某些执行等级需要启动的服务,以 Red Hat 系统来说,这些 run level
启动的资料都是放置在 /etc/rc.d/rc[0-6].d/ 里面的,那如何管理该目录下的 script
呢?手动处理吗?会疯掉的吶!所以你必须要熟悉
这几个指令才行!
这几个指令不熟吗?这个时候鸟哥不得不说了:『有 man 堪用直需用,莫待无 man 空自猜』赶紧给他 man 下去啦!
(1)如何查阅 rpcbind 这个程式一开机就执行? (2)如果开机就执行,如何将他改为开机时不要启动?
(3)如何立即关闭这个 rpcbind 服务?
可以透过『 chkconfig --list | grep rpcbind 』与『 runlevel 』确认一下你的环境与 rpcbind 是否启动?
如果有启动,可透过『 chkconfig --level 35 rpcbind off 』来设定开机时不要启动;
可以透过『 /etc/init.d/rpcbind stop 』来立即关闭他!
聪明的你一定会问说:『鸟哥,你的意思是只要将系统所有的服务都关闭,那系统就会安全啰?』
当然....不是!因为『很多的系统服务是必须要存在的,否则系统将会出问题』
举例来说,那个保持系统可以具有工作排程的
服务就一定要存在,而那个记录系统状况的
也当然要存在~否则怎知道系统出了啥问题?所以啰,除非你知道每个服务的目的是啥,否则不要随便关闭该服务。
底下鸟哥列出几个常见的必须要存在的系统服务给大家参考参考先!这些服务请不要关闭啊!
新版的电源管理模组,通常建议开启,不过,某些笔记型电脑可能不支援此项服务,那就得关闭
在管理单一预约命令执行的服务,应该要启动的
在管理工作排程的重要服务,请务必要启动啊!
作系统硬体变更侦测的服务,与 USB 设备关系很大
Linux 内建的防火墙软体,这个也可以启动啦!
这个重要了吧?要网路就要有他啊!
系统内部邮件传递服务,不要随便关闭他!
系统的登录档记录,很重要的,务必启动啊!
这是系统预设会启动的,可以让你在远端以文字型态的终端机登入喔!
就是那个 super daemon 嘛!所以也要启动啦!
上面列出的是主机需要的重点服务,请您不要关闭他!除非你知道作了之后会有什么后果。举例来说,你如果不需要管理电源,
那么将 acpid 关闭也没有关系啊!如果你不需要提供远端连线功能,那么 sshd 也可以关闭啊!那其他你不知道的服务怎办?
没关系,只要不是网路服务,你都可以保留他!如果是网路服务呢?那...鸟哥建议你不知道的服务就先关闭他!
以后我们谈到每个相关的服务时,再一个一个打开即可。底下我们就来做作看关闭网路服务这个部分!
安全性考量-关闭网路服务埠口
我们的 Linux distribution 很好心的帮使用者想到很多了,所以在一安装完毕之后,
系统会开启一堆有的没有的网路服务,例如那个 rpcbind 之类的咚咚,这些东西你或许知道或许不知道,不过他就是有开启~
但我们的主机明明就是用来做为伺服器的,所以这些本来预计要给 client 使用的服务其实有点『多此一举』的感觉~
所以啦,请你将他关闭吧!底下我们举个简单的例子来处理,将你的网路服务关闭就好,其他在系统内部的服务,就暂时保留吧!
找出目前系统上面正在运作中的服务,并且找到相对应的启动脚本 (在 /etc/init.d 内的档名之意)。
要找出服务,就利用 netstat -tunlp 即可找到!以鸟哥从第一章安装的示范机为例,鸟哥目前启动的网路服务有底下这些:
[root@www ~]# netstat -tlunp
Active Internet connections (only servers)
Local Address
PID/Program name
0.0.0.0:22
127.0.0.1:25
1252/master
0.0.0.0:37753
1008/rpc.statd
1851/xinetd
1252/master
1008/rpc.statd
0.0.0.0:111
1873/rpcbind
1873/rpcbind
0 0.0.0.0:111
1873/rpcbind
0 0.0.0.0:776
1873/rpcbind
1873/rpcbind
1873/rpcbind
0.0.0.0:760
1008/rpc.statd
0.0.0.0:52525
1008/rpc.statd
1008/rpc.statd
# 上述的输出鸟哥有稍微简化一些喔,所以有些栏位不见了。
# 这个重点只是要展现出最后一个栏位而已啦!
看起来总共有 sshd, master, rpc.statd, xinetd, rpcbind 等这几个服务,对照前一小节的资料内容来看,
master (port 25), sshd 不能关掉,那么其他的就予以关闭啊!透过前两个小节的介绍,使用 which 与 rpm 搜寻吧!举例来说,
rpc.statd 的启动脚本在:『rpm -qc $(rpm -qf $(which rpc.statd) ) | grep init』这样找,结果是在『/etc/rc.d/init.d/nfslock』这里!
因此最终的结果如下:
rpc.statd /etc/rc.d/init.d/nfs
/etc/rc.d/init.d/nfslock
/etc/rc.d/init.d/rpcgssd
/etc/rc.d/init.d/rpcidmapd
/etc/rc.d/init.d/rpcsvcgssd
/etc/rc.d/init.d/xinetd
/etc/rc.d/init.d/rpcbind
接下来就是将该服务关闭,并且设定为开机不启动吧!
[root@www ~]# vim bin/closedaemon.sh
for daemon in nfs nfslock rpcgssd rpcidmapd rpcsvcgssd xinetd rpcbind
chkconfig $daemon off
/etc/init.d/$daemon stop
[root@www ~]# sh bin/closedaemon.sh
做完上面的例子之后,你再次下达 netstat -tlunp 之后,会得到仅剩 port 25, 22 而已!
如此一来,绝大部分伺服器用不到的服务就被你关闭,而且即使重新开机也不会被启动的啦! ^_^
7.4 SELinux 管理原则
SELinux 使用所谓的委任式存取控制 (Mandatory Access Control, MAC) ,他可以针对特定的程序与特定的档案资源来进行权限的控管!
也就是说,即使你是 root ,那么在使用不同的程序时,你所能取得的权限并不一定是 root ,而得要看当时该程序的设定而定。
如此一来,我们针对控制的『主体』变成了『程序』而不是『使用者』喔!因此,这个权限的管理模式就特别适合网路服务的『程序』了!
因为,即使你的程序使用 root 的身份去启动,如果这个程序被攻击而被取得操作权,那该程序能作的事情还是有限的,
因为被 SELinux 限制住了能进行的工作了嘛!
举例来说, WWW 伺服器软体的达成程序为 httpd 这支程式, 而预设情况下, httpd 仅能在 /var/www/ 这个目录底下存取档案,如果
httpd 这个程序想要到其他目录去存取资料时,除了规则设定要开放外,目标目录也得要设定成 httpd 可读取的模式 (type)
才行喔!限制非常多! 所以,即使不小心 httpd 被 cracker 取得了控制权,他也无权浏览 /etc/shadow 等重要的设定档喔!
7.4.1 SELinux 的运作模式
再次的重复说明一下,SELinux 是透过 MAC 的方式来控管程序,他控制的主体是程序,
而目标则是该程序能否读取的『档案资源』!所以先来说明一下这些咚咚的相关性啦!
主体 (Subject):
SELinux 主要想要管理的就是程序,因此你可以将『主体』跟本章谈到的 process 划上等号;
目标 (Object):
主体程序能否存取的『目标资源』一般就是档案系统。因此这个目标项目可以等档案系统划上等号;
政策 (Policy):
由于程序与档案数量庞大,因此 SELinux 会依据某些服务来制订基本的存取安全性政策。这些政策内还会有详细的规则 (rule)
来指定不同的服务开放某些资源的存取与否。在目前的 CentOS 6.x 里面仅有提供两个主要的政策如下,一般来说,使用预设的
target 政策即可。
targeted:针对网路服务限制较多,针对本机限制较少,是预设的政策;
mls:完整的 SELinux 限制,限制方面较为严格。
安全性本文 (security context):
我们刚刚谈到了主体、目标与政策面,但是主体能不能存取目标除了要符合政策指定之外,主体与目标的安全性本文必须一致才能够顺利存取。
这个安全性本文 (security context) 有点类似档案系统的 rwx 啦!安全性本文的内容与设定是非常重要的!
如果设定错误,你的某些服务(主体程序)就无法存取档案系统(目标资源),当然就会一直出现『权限不符』的错误讯息了!
图 7.4-1、SELinux 运作的各元件之相关性(本图参考小州老师的上课讲义)
上图的重点在『主体』如何取得『目标』的资源存取权限!
由上图我们可以发现,(1)主体程序必须要通过 SELinux 政策内的规则放行后,就可以与目标资源进行安全性本文的比对,
(2)若比对失败则无法存取目标,若比对成功则可以开始存取目标。问题是,最终能否存取目标还是与档案系统的 rwx
权限设定有关喔!如此一来,加入了 SELinux 之后,出现权限不符的情况时,你就得要一步一步的分析可能的问题了!
安全性本文 (Security Context)
CentOS 6.x 的 target 政策已经帮我们制订好非常多的规则了,因此你只要知道如何开启/关闭某项规则的放行与否即可。
那个安全性本文比较麻烦!因为你可能需要自行设定档案的安全性本文呢!为何需要自行设定啊?
举例来说,你不也常常进行档案的 rwx 的重新设定吗?这个安全性本文你就将他想成
SELinux 内必备的 rwx 就是了!这样比较好理解啦。
安全性本文存在于主体程序中与目标档案资源中。程序在记忆体内,所以安全性本文可以存入是没问题。
那档案的安全性本文是记录在哪里呢?事实上,安全性本文是放置到档案的 inode
内的,因此主体程序想要读取目标档案资源时,同样需要读取 inode ,
这 inode 内就可以比对安全性本文以及 rwx 等权限值是否正确,而给予适当的读取权限依据。
那么安全性本文到底是什么样的存在呢?我们先来看看 /root 底下的档案的安全性本文好了。
观察安全性本文可使用『 ls -Z 』去观察如下:(注意:你必须已经启动了 SELinux
才行!若尚未启动,这部份请稍微看过一遍即可。底下会介绍如何启动 SELinux 喔!)
[root@www ~]# ls -Z
-rw-------. root
system_u:object_r:admin_home_t:s0
anaconda-ks.cfg
drwxr-xr-x. root
unconfined_u:object_r:admin_home_t:s0 bin
-rw-r--r--. root
system_u:object_r:admin_home_t:s0
install.log
-rw-r--r--. 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 政策下的对应如下:
该对应在 targeted 的意义
代表供 root 帐号登入时所取得的权限
由于为系统帐号,因此是非交谈式的系统运作程序
一般可登入使用者的程序啰!
但就如上所述,其实最重要的栏位是类型栏位,主体与目标之间是否具有可以读写的权限,与程序的 domain 及档案的
type 有关!这两者的关系我们可以使用达成 WWW 伺服器功能的 httpd 这支程式与 /var/www/html 这个网页放置的目录来说明。
首先,看看这两个咚咚的安全性本文内容先:
[root@www ~]# yum install httpd
[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) 读取的类型。文字看起来不太容易瞭解吧!我们使用图示来说明这两者的关系!
图 7.4-2、主体程序取得的 domain 与目标档案资源的 type 相互关系
上图的意义我们可以这样看的:
首先,我们触发一个可执行的目标档案,那就是具有 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 ,该主体程序也无法读取目标档案资源的啦!不过如此一来,
也就可以避免使用者将他的家目录设定为 777 时所造成的权限困扰。
7.4.2 SELinux 的启动、关闭与观察
并非所有的 Linux distributions 都支援 SELinux 的,所以你必须要先观察一下你的系统版本为何!
鸟哥这里介绍的 CentOS 6.x 本身就有支援 SELinux 啦!所以你不需要自行编译 SELinux 到你的 Linux 核心中!
目前 SELinux 支援三种模式,分别如下:
enforcing:强制模式,代表 SELinux 运作中,且已经正确的开始限制 domain/type 了;
permissive:宽容模式:代表 SELinux 运作中,不过仅会有警告讯息并不会实际限制
domain/type 的存取。这种模式可以运来作为 SELinux 的 debug 之用;
disabled:关闭,SELinux 并没有实际运作。
那你怎么知道目前的 SELinux 模式呢?就透过 getenforce 吧!
[root@www ~]# getenforce
&==诺!就显示出目前的模式为 Enforcing 啰!
另外,我们又如何知道 SELinux 的政策 (Policy) 为何呢?这时可以来观察设定档啦:
[root@www ~]# vim /etc/selinux/config
SELINUX=enforcing
&==调整 enforcing|disabled|permissive
SELINUXTYPE=targeted
&==目前仅有 targeted 与 mls
SELinux 的启动与关闭
上面是预设的政策与启动的模式!你要注意的是,如果改变了政策则需要重新开机;如果由 enforcing 或 permissive
改成 disabled ,或由 disabled 改成其他两个,那也必须要重新开机。这是因为 SELinux 是整合到核心里面去的,
你只可以在 SELinux 运作下切换成为强制 (enforcing) 或宽容 (permissive) 模式,不能够直接关闭 SELinux 的!
如果刚刚你发现 getenforce 出现 disabled 时,请到上述档案修改成为 enforcing 然后重新开机吧!
不过你要注意的是,如果从 disable 转到启动 SELinux 的模式时,
由于系统必须要针对档案写入安全性本文的资讯,因此开机过程会花费不少时间在等待重新写入 SELinux 安全性本文
(有时也称为 SELinux Label) ,而且在写完之后还得要再次的重新开机一次喔!你必须要等待粉长一段时间!
等到下次开机成功后,再使用
来观察看看有否成功的启动到 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
不过请注意, setenforce 无法在 Disabled 的模式底下进行模式的切换喔!
在某些特殊的情况底下,你从 Disabled 切换成 Enforcing 之后,竟然有一堆服务无法顺利启动,都会跟你说在 /lib/xxx
里面的资料没有权限读取,所以启动失败。这大多是由于在重新写入 SELinux type (Relable) 出错之故,使用 Permissive
就没有这个错误。那如何处理呢?最简单的方法就是在 Permissive 的状态下,使用『 restorecon -Rv / 』重新还原所有
SELinux 的类型,就能够处理这个错误!
7.4.3 SELinux type 的修改
既然 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: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
# 范例:将 /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:s0
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 /tmp/hosts
看到没有?当你单纯的复制时,SELinux 的 type 栏位是会继承目标目录的,所以 /root/hosts 的类型就会变成
admi}

我要回帖

更多关于 比对试验如何判断差异 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信