信息安全公益宣传,信息安全知识启蒙。
加微信群回复公众号:微信群;QQ群:16004488
加微信群或QQ群可免费索取:学习教程
教程列表见微信公众号底部菜单
在实际工作中,最难防的就是接近应用层的攻击。比如针对直播私有协议的机器人,冲击你的频道服务、登陆服务、支付服务等等,量大了也会变成 DDoS攻击。
越接近应用层,防御和对抗难度越大、挑战越大,误伤越大。这需要结合大数据、机器学习、业务流量模型等知识来进行综合应对,很复杂。偏底层则相对简单,有比较成熟的技术方案,越往应用层越复杂,自然人和机器人的攻击行为和正常行为就越难区分。
我们很难做的就是业务层的 DDoS,比如私有协议、YY 协议,还有我们的音频、视频协议。如果真有大量的冲击,比如你只能支撑两千万的 PCU,如果超过两千万,你怎么防御?所以需要柔性可活的思路。
本文将分成以下3部分来讲解:
1、Linux 下的安全形势
2、Linux 下的攻击手段
3、Linux 的防御对抗
每个互联网公司或者每个公司后台用的服务器都不太一样,在YY这种主营业务是纯互联网的公司,Linux 服务器占比很高,全网几万台服务器,Windows 只有几百台,剩下都是 Linux,越是互联网公司用 Linux 的比例越高。
Linux 的安全形势为什么这么复杂?
我早年毕业的时候在华为网络安全部,当时 Linux 还不是主流,那时使用的是其他系统,比如 Hp-Unix,Aix 等,当时的使用率并没有这么普遍。随着互联网业务和开源技术的飞速发展,Linux 越来越普及了,为什么?
有一个重要原因就是Linux上面的开源应用非常多,包括技术框架,业务选型的技术框架等等,现在基于 Linux 的应用越来越多,导致 Linux 操作系统在整个服务器领域的应用越来越广。
当然,这么多的应用在 Linux 操作系统上使用,带来的安全问题也越来越多,下面列出的是给安全人员带来巨大挑战的漏洞们:
Struts2 远程代码执行漏洞通告(CVE-2017-5638)
Linux 内核提权漏洞(Dirty Cow) (CVE-2016-5195)
ElasticSearch 远程执行代码安全漏洞(CVE-2014-3120)
Bash 远程执行命令漏洞(Bash破壳) (CVE-2014-6271)
Nginx 远程执行代码安全漏洞(CVE-2014-0088)
MongoDB 匿名登录漏洞
心脏流血漏洞
著名的 Struts2,我印象中这几年闹了几拨,每拨都有几百人升级业务、修复补丁,几乎都要求24小时内修复。我们曾经有一个很重要的业务修复 Struts2 的时候,业务不兼容,版本不能上线,最后老大们决定暂停业务,直到修复为止,这说明这些漏洞给整个平台带来影响很大。
Dirty cow 漏洞也很出名,在这边很多服务器也会中招,是在2016年非常出名的提权漏洞,还有 elastic search的漏洞等等很多这样的漏洞。
2016年比较火的 DDoS 勒索,这个业务天天 DDoS 打你,那个业务,天天 DDoS 打你,直到给“保护费”为止,有的业务一天给500,有的业务甚至一天给2000......
看来黑产也是“讲理”的…
MongoDB 的勒索也是很火的,几乎每种事件都可以造成勒索,这就是 Linux 下的安全形势。
很多搞安全的人接触比较多,比较熟悉的漏洞是心脏流血,还有这个著名的 Dirty cow 提权,本质是 Linux 的内存的写权限管理 bug,导致不具有写权限的进程写入权限。
2016年年底出名的事件,我们国家浙江一个厂商躺枪了。这种案例很多,僵尸物联网“肉鸡”把半个美国都打瘫痪了。
业务版本快速迭代、业务开放、网络边界复杂、开源组件多元化、技术架构复杂、标准化和规范化缺乏等等,这些都是挑战。
前面介绍了 Linux 的开源组件用得比较多,同时在 Server 端用得比较广。这边总结了为什么 Linux 下的安全挑战比较多,可能和传统制造业有些区别。
对于互联网公司来说业务版本迭代很快,要有很好的安全防御的理解。比如认证机制要设计好,鉴权机制要完善,其实设计完善是不容易的。往往老板的指标是一周上线,想设计好并没有那么多的时间。业务迭代版本过于频繁也给安全带来很大的挑战。
互联网业务本来就很开放,像以前在华为有明显的网络边界,内部都是内网,网络边界很明显。互联网业务本来就是对外,所以这就造成了业务整个边界外延,整个都是开放的。机房几十上百个,整个网络都是对外开放状态。
网络边界的复杂,互联网讲求分布式部署、高可用,一般5个点、10个点、20个点。分布式部署带来网络边界过于复杂,交叉认证。
开源组件多元化,开源组件很多,五花八门,例如缓存中间件,这个哥们儿用这个架构,另一个用那个架构,一个公司有十几个架构。如果在你公司没有达到一定高度的时候,标准化、规范化没有很完善的情况下,就更加复杂,挑战更大。
同样业务端也很复杂,很多还有 Windows 端、移动端、Web端,各种各样的业务。今天这个功能上线,明天那个功能下线,所以技术架构是一点点积累,想做很标准的技术架构也不容易。
由于前面的版本迭代、网络边界等,带来标准化、规范化都是滞后的,像 BAT 可能做得好一点,但多数公司的标准化、规范化还是不太健全。
上图展示的都是 Linux 安全挑战真实的案例,都是实实在在的工作中遇到的安全问题。
对于普通运维团队或者安全团队可能都比较常见的,像服务器资源被占用,但是不知道是哪个进程占用;发现某个进程占用资源,但是却杀不死,或者杀死一会儿又启动,因为它有守护或者自动拉起。还有密钥泄露,这个很常见。
有些人把密钥放在邮箱或者服务器什么地方存着,如果他的办公机被入侵,他的邮箱被撞破,他的密钥就泄露了。密钥泄露不是最惨的,而是密钥的密码和他的邮箱密码或者是跟他什么 CSDN 的密码用同一个,这个更惨。
大家说这是小概率事件,但是一千人,千分之一的概率发生就入侵了。还有业务被挂马,这是 Web 业务中很常见的;还有 Redis 缓存突然失效,导致 MySQL 扛不住,整个业务直接瘫痪,而且扩容不了,我只是说有这种可能性。
如果你的业务使用 Redis 缓存,而且 Redis 是默认匿名,如果真的有人做 APT 研究你们,把你的 Redis 都干掉了,业务就瘫痪了,大公司可能很长时间都恢复不起来。
操作系统 OOM,很多人说服务器怎么又 OOM?前两天才刚重装,为什么又 OOM?因为有一个木马不断提权,一提权就崩,所以肯定有 OOM,这也是实际过程中的一个案例。
做防御首先要了解进攻的方式。这是一个真实的案例,了解攻防的人可以看到,这是典型的 Linux 匿名,Redis 默认匿名登陆,不需要用户名、密码。
Redis 还有几个奇怪的功能我可以分享一下:Linux 有一个功能可以通过一个端口写到本地文件,如果我要写一个文件,而这个文件是木马,那就自动拉起了。如果写入自己签名的公钥,用自己的私钥解公钥,自己解自己的,所以直接替换公钥,就是通过 Redis。
有人问,你怎么记录下来这些呢?其实很多攻击者都会去清除掉日志,我们需要想些办法让他不能清除,保证审计可追溯,否则入侵之后就追溯不出到底是什么原因。
所以黑客用 Dirty cow 提权,黑客上来就把自己的操作清除掉了,不让你看见。你知道他要清除,你就想办法不让他侵掉,不然追查不到。
其实他入侵你的服务器不是最终目的,最终的目的是扩大战果,最简单的方式是监听和收集相关的通信,再做一些扫描之类。如果这些机器有关于运维体系的脚本、域名,可能都危险了。
以前给外面做分享,都觉得你说的攻击方式发生概率不是很高。不说真实案例,大家就觉得真实概率不是很高;有了真实案例,大家觉得小概率事件还是会发生。
Linux 下面渗透的方式有这么几个步骤:
首先扫描,他知道你IP是否存活,前端是否有防火墙;
扫描之后尝试渗透,看有哪些端口的权限是什么;
接下来看通过开源的应用或者渗透方式怎么入侵,有哪些东西可以利用;
入侵之后,普通账号怎么提权到 root,最后怎么扩大战果。
这是 Linux 常用的渗透,扫描之类的,大家可以试一下。
在很多公司规范里面,SSH 不允许对外开放,要开放给跳板机,这都是有目的的。换个端口,很多默认扫描是指定的 22,这样可以减少被发现的概率。
如果 SSH 登陆只认跳板机也可以防止被撞库。大家想一想你们自己的密码,和在公司用的密码,服务器的密码和私钥密码和互联网的密码有多少是相同的?比如12306、京东等都有可能相同,人家一旦泄露了,密码就泄露。所以这个撞库的概率不能避免,因此要应对暴力破解。
黑客侵袭你的服务器之后,histroy 给他提供很多线索,所以你的帐号退出之后 histroy 要清掉。
上图演示了怎么通过 Redis 写入反弹 shell,黑客常用这种案例。Redis 默认就是匿名,他信任可信客户端。所以这种机制导致你在使用上要整合很多认证机制和访问控制,否则会非常危险。另外这个功能都是可以关闭的,servers 可以不要写的。
Redis 匿名,如果公司没有统一的规范和标准,一般作为开发人员来说,直接 Redis 是匿名最简单、最高效,所以Redis匿名漏洞在互联网环境中非常多。PoC工具也非常多,基本直接沦陷。
这是 Linux 的声卡内核提权的漏洞,我介绍两个提权,这是其中一个,从普通用户提权到 root。现场有演示视频,这里放几个关键截图做展示:
真实案例的提权和这个一样,没有太多区别。再给大家看看 Dirty cow 的提权,这是2016年最火的提权漏洞,80%的 Linux 会沦陷。
刚才给大家演示了两个视频,这是提权的过程,从普通用户怎么提到 root的。这种怎么防御后面会有介绍。要及时修复这些补丁,不要以为提权影响不大,其实影响很大的。root 能干的事和普通帐号能干的事差别很大。
给大家演示了 Dirty cow 的提权,其实最关键的漏洞在于Linux里有一个内存管理写权限的 bug,导致不该具有写权限的进程它写进去了。
我们写的代码,根本产生的原因是很多线程竞争资源的时候,Linux bug 出现的概率非常高。所以要写很多的线程通入经营资源,这里面还用了一些东西的注入,后面会有介绍。本来不具有写一个 password 权限的,但是 Linux 写权限产生 bug 的时候,会导致你可以写进去。
上图演示的代码,我准备用 sinclude 注到这个里面去,分别是两个进程在跑。其实注入有几个基本的,你要了解 Linux ELF 文件格式,还有系统调用,还有 CPU 执行过程中的整个逻辑。
这是我准备注入的目标进程,最关键的是找到写起始地址,把地址找到之后,下一个 RIP 寄存器,写的地址就变成你的了。这是整个寄存器的历史,我们关键是用 RIP 指令寄存器的地址。它跑的时候,那段代码已经注进来了。
多线程之间的进程很关键,这个情况我现在遇到的不多,真正我们遇到被入侵事件中,内核态木马的遇到不多,以前 Windows 有很多。我们自己有写过这种木马,所以这种情况我很少遇到过。只是之前在其他的领域确实遇到过几次,所以给大家介绍这种。相当于 Windows 状态下的一种木马,在 Linux 情况下也存在,杀伤力还很大。
我介绍一下执行的原理,这些系统调用内核态的执行过程。你原来的执行过程是这样的:我要把你 hook 掉,系统调用执行过程后我转给你,无论是进程起用,文件读写都被我控制了,可做的事情很多,而且隐蔽性很大很难找。
这是我们做的测试代码,首先建了目录,目录里面写了一些文件进去,但是把内核态木马加进去之后,你再进去,就没有了。这种一般守护的时候比较有用,要隐藏木马或者守护木马文件、进程文件比较有用,你看不到的时候依然可以读写。
你明明在里面 insmod 一个模块,但是看不到,它把你 insmod 内核模块 read 也给劫持了,所以你看不到它。
再演示一下这个代码,这很常见,服务器中为什么莫名其妙解析错了?
Linux 有一个解析的配置,加了这个代码,其实我有注掉。但是加载了这个之后,我看的时候,普通运维人员、研发人员看不到。大家看百度还是会解到本地的,其实已经被本地劫持了,但是很难查。
我前面有介绍反弹唤醒的技术,一种是木马主动向控制器去上报我自己的IP和端口,达到控制。
还有等待对方的唤醒,唤醒报文很讲究,这个唤醒用 ICMP 报文载荷定制一个特殊的“key”报文,做一个特殊的字符唤醒。唤醒木马,这是一个特殊的报文,完全可以唤醒我的木马对那台机器执行操作。“.168”这是典型的ICMP 唤醒的技术。再加上内核,应用很难发现。
我刚才介绍了很多 Linux 下的一些嗅探、注入、提权等机制。我们有针对性的了解这些机制,是为了保证业务稳定可靠的运行,肯定要有对应的防御手段。
不管是否做到自动化,或者手动也好,总要有手段。不同的公司在不同的规模、不同的发展阶段,策略不一样。我先介绍一下我们现在的防御想法、思路和进展情况。
漏洞扫描、入侵检测、主动防御、事件预警、行为审计、应急响应、标准规范等都是防御策略。
我们防御考虑不一定是通过某个环境,绝对的识别到这次入侵或者拦截到这次防御。但是要层层设防,比如业务上线前,不可能像 CMMI 那种,有很多评审点,在互联网公司里面版本快速迭代,基本做不到CMMI的要求,没有评审通过就不能上线,我觉得做不到。
如果真的拖慢了业务上线的速度,业务死了,安全团队也没有价值,所以,肯定是业务第一。
我觉得业务在上线的时候,我做异步的时候做扫描,并发评估,尽可能不影响业务上线。包括 Redis 的匿名等,都可以做匿名,在构建的时候发布一条线,还可以扫到另外一条线。
还有入侵检测机制,被入侵的情况还是要有些预警或者防御的手段。至少你要知道,全网可能几百台、几千台甚至几万台服务器,完全不知道状况,那就没办法做后续相关的跟进了。
如果能做到更牛逼的防御,比如主动防御,这是大家最终的理想状况,很多公司做不到。我曾经想过,木马起动的时候,如果不在签名的进程不让它起,代码写出来了,而且Demo 写了但是不敢上线,因为我担心出内核兼容性问题,要背锅,主动防御这里涉及到整个平台的所有服务器的兼容,需要谨慎,是下一个里程碑。
所以我觉得有些东西可以做一些妥协。比如木马文件的自动化隔离,检测是一条思路,如果主动防御可以自动隔离掉,不让有任何写权限、启动权限当然会更好。
预警,出了事情要知道,不要等到业务保障或者用户投诉到客服。业务已经瘫痪了,你还不知道什么原因?一查,好像两台服务器被入侵,很多数据被删了。所以要提前预警,优先于业务保障之前及时掌握安全状况。
行为审计,刚才我介绍的入侵的案例,没有行为审计。很多入侵事件不一定找到入侵路径,很多同学出问题找不到原因最喜欢的是“重装操作系统”。其实重装并没有任何意义,因为漏洞依然存在,重装是没有任何意义的,还是要想办法溯源,找到入侵路径在哪里。
应急响应,要有应急响应的机制,因为你将来不是绝对安全,一定有漏洞,一定有弱点,每种方式要做出相应的预案。
规范化和标准化,不同公司发展阶段不同,其实它程度也不一样。
我们这边可能会有内部的自动化扫描,如果业务存在漏洞,会直接触发一封邮件,要求24小时修复,给剩余的修复时间。
相关的自动化预警,我们做得并不完善,只是把著名的开源软件做到,其实我们还做不到那么完善。
入侵检测,如果发现有可疑的进程,我们会直接预警出来,避免对业务造成影响。
我们这边有恶意IP的识别,外挂、机器人之类的会收录下来,你历史上攻击过我们或者冲击我们服务的ip,我们会收录下来。如果你服务和黑产进行通信,我们都会预警。这里面可能误报,但是我们肯定会跟进这个事。
刚才我提到应急响应要有应急预案。刚才讲 DDoS 也是一样,DDoS 一定有一个防御的上限,比如120G,比如你并发处理能力是1万,如果超过1万,怎么办?到底是攻击还是由于活动造成的陡增?都要有预案。对今天讲的 Linux 的入侵,攻防,最主要入侵事件要找到入侵路径。
即使找不到也要推出几种可能性,而且这几种可能性要有针对性的修复或者改进,否则你单纯的重装操作系统,我觉得完全没戏,只是给后面安全问题留下更大的坑。
规范化、标准化,这需要跟公司的企业文化、公司的发展阶段,跟公司整体要搭。我们正在持续努力中,对我们来说推进挑战也是很多,有些可以推,有些也不容易。
我们每出一次安全事件都借这个安全事件推动很多规范,以事件为导向推动安全规范相对容易一些。所以这需要下点功夫,而且要结合公司自己的运维体系、发布体系、监控体系做这个事。
安全永远没有绝对的安全,永远存在漏洞。这时候你和业务一定要有平衡,不要为了绝对安全而影响业务。不能绝对说存在问题、存在风险,这个业务不能上线,这种决策还是要评估一下。
我觉得业务做起来,安全才有更大的机会,完全阻碍业务版本的迭代,其实安全也会有问题。毕竟业务发展起来,平台大了,安全才有更大的产出。
另外就是效率,安全和效率永远有冲突,你让他登陆跳板机,服务器不能交叉认证,再回跳板机,再跳服务器,很多人就怒了。几十上百台服务器天天维护,太麻烦了。
安全和效率之间的冲突,有些要做平衡,有些还是要坚持。需要持续的改进,我认为 PDCA 这种模型非常适合 Linux 的攻防对抗去持续改进、持续 check。
1、强化:密码管理
设定登录密码是一项非常重要的安全措施,如果用户的密码设定不合适,就很容易被破译,尤其是拥有超级用户使用权限的用户,如果没有良好的密码,将给系统造成很大的安全漏洞。
目前密码破解程序大多采用字典攻击以及暴力攻击手段,而其中用户密码设定不当,则极易受到字典攻击的威胁。很多用户喜欢用自己的英文名、生日或者账户等信息来设定密码,这样,黑客可能通过字典攻击或者是社会工程的手段来破解密码。所以建议用户在设定密码的过程中,应尽量使用非字典中出现的组合字符,并且采用数字与字符相结合、大小写相结合的密码设置方式,增加密码被黑客破解的难度。而且,也可以使用定期修改密码、使密码定期作废的方式,来保护自己的登录密码。
在多用户系统中,如果强迫每个用户选择不易猜出的密码,将大大提高系统的安全性。但如果passwd程序无法强迫每个上机用户使用恰当的密码,要确保密码的安全度,就只能依靠密码破解程序了。实际上,密码破解程序是黑客工具箱中的一种工具,它将常用的密码或者是英文字典中所有可能用来作密码的字都用程序加密成密码字,然后将其与Linux系统的/etc/passwd密码文件或/etc/shadow影子文件相比较,如果发现有吻合的密码,就可以求得明码了。在网络上可以找到很多密码破解程序,比较有名的程序是crack和john the ripper.用户可以自己先执行密码破解程序,找出容易被黑客破解的密码,先行改正总比被黑客破解要有利。
2、限定:网络服务管理
早期的Linux版本中,每一个不同的网络服务都有一个服务程序(守护进程,Daemon)在后台运行,后来的版本用统一的/etc/inetd服务器程序担此重任。Inetd是Internetdaemon的缩写,它同时监视多个网络端口,一旦接收到外界传来的连接信息,就执行相应的TCP或UDP网络服务。由于受inetd的统一指挥,因此Linux中的大部分TCP或UDP服务都是在/etc/inetd.conf文件中设定。所以取消不必要服务的第一步就是检查/etc/inetd.conf文件,在不要的服务前加上“#”号。
一般来说,除了http、smtp、telnet和ftp之外,其他服务都应该取消,诸如简单文件传输协议tftp、网络邮件存储及接收所用的imap/ipop传输协议、寻找和搜索资料用的gopher以及用于时间同步的daytime和time等。还有一些报告系统状态的服务,如finger、efinger、systat和netstat等,虽然对系统查错和寻找用户非常有用,但也给黑客提供了方便之门。例如,黑客可以利用finger服务查找用户的电话、使用目录以及其他重要信息。因此,很多Linux系统将这些服务全部取消或部分取消,以增强系统的安全性。Inetd除了利用/etc/inetd.conf设置系统服务项之外,还利用/etc/services文件查找各项服务所使用的端口。因此,用户必须仔细检查该文件中各端口的设定,以免有安全上的漏洞。
在后继的Linux版本中(比如Red Hat Linux7.2之后),取而代之的是采用xinetd进行网络服务的管理。
当然,具体取消哪些服务不能一概而论,需要根据实际的应用情况来定,但是系统管理员需要做到心中有数,因为一旦系统出现安全问题,才能做到有步骤、有条不紊地进行查漏和补救工作,这点比较重要。
3、严格审计:系统登录用户管理
在进入Linux系统之前,所有用户都需要登录,也就是说,用户需要输入用户账号和密码,只有它们通过系统验证之后,用户才能进入系统。
与其他Unix操作系统一样,Linux一般将密码加密之后,存放在/etc/passwd文件中。Linux系统上的所有用户都可以读到/etc/passwd文件,虽然文件中保存的密码已经经过加密,但仍然不太安全。因为一般的用户可以利用现成的密码破译工具,以穷举法猜测出密码。比较安全的方法是设定影子文件/etc/shadow,只允许有特殊权限的用户阅读该文件。
在Linux系统中,如果要采用影子文件,必须将所有的公用程序重新编译,才能支持影子文件。这种方法比较麻烦,比较简便的方法是采用插入式验证模块(PAM)。很多Linux系统都带有Linux的工具程序PAM,它是一种身份验证机制,可以用来动态地改变身份验证的方法和要求,而不要求重新编译其他公用程序。这是因为PAM采用封闭包的方式,将所有与身份验证有关的逻辑全部隐藏在模块内,因此它是采用影子档案的最佳帮手。
此外,PAM还有很多安全功能:它可以将传统的DES加密方法改写为其他功能更强的加密方法,以确保用户密码不会轻易地遭人破译;它可以设定每个用户使用电脑资源的上限;它甚至可以设定用户的上机时间和地点。
Linux系统管理人员只需花费几小时去安装和设定PAM,就能大大提高Linux系统的安全性,把很多攻击阻挡在系统之外。
4、设定:用户账号安全等级管理
除密码之外,用户账号也有安全等级,这是因为在Linux上每个账号可以被赋予不同的权限,因此在建立一个新用户ID时,系统管理员应该根据需要赋予该账号不同的权限,并且归并到不同的用户组中。
在Linux系统中的部分文件中,可以设定允许上机和不允许上机人员的名单。其中,允许上机人员名单在/etc/hosts.allow中设置,不允许上机人员名单在/etc/hosts.deny中设置。此外,Linux将自动把允许进入或不允许进入的结果记录到/var/log/secure文件中,系统管理员可以据此查出可疑的进入记录。
每个账号ID应该有专人负责。在企业中,如果负责某个ID的职员离职,管理员应立即从系统中删除该账号。很多入侵事件都是借用了那些很久不用的账号。
在用户账号之中,黑客最喜欢具有root权限的账号,这种超级用户有权修改或删除各种系统设置,可以在系统中畅行无阻。因此,在给任何账号赋予root权限之前,都必须仔细考虑。
Linux系统中的/etc/securetty文件包含了一组能够以root账号登录的终端机名称。例如,在RedHatLinux系统中,该文件的初始值仅允许本地虚拟控制台(rtys)以root权限登录,而不允许远程用户以root权限登录。最好不要修改该文件,如果一定要从远程登录为root权限,最好是先以普通账号登录,然后利用su命令升级为超级用户。
5、谨慎使用:“r系列”远程程序管理
在Linux系统中有一系列r字头的公用程序,比如rlogin,rcp等等。它们非常容易被黑客用来入侵我们的系统,因而非常危险,因此绝对不要将root账号开放给这些公用程序。由于这些公用程序都是用。rhosts文件或者hosts.equiv文件核准进入的,因此一定要确保root账号不包括在这些文件之内。
由于r等远程指令是黑客们用来攻击系统的较好途径,因此很多安全工具都是针对这一安全漏洞而设计的。例如,PAM工具就可以用来将r字头公用程序有效地禁止掉,它在/etc/pam.d/rlogin文件中加上登录必须先核准的指令,使整个系统的用户都不能使用自己home目录下的。rhosts文件。
6、限制:root用户权限管理
Root一直是Linux保护的重点,由于它权力无限,因此最好不要轻易将超级用户授权出去。但是,有些程序的安装和维护工作必须要求有超级用户的权限,在这种情况下,可以利用其他工具让这类用户有部分超级用户的权限。sudo就是这样的工具。
sudo程序允许一般用户经过组态设定后,以用户自己的密码再登录一次,取得超级用户的权限,但只能执行有限的几个指令。例如,应用sudo后,可以让管理磁带备份的管理人员每天按时登录到系统中,取得超级用户权限去执行文档备份工作,但却没有特权去作其他只有超级用户才能作的工作。
sudo不但限制了用户的权限,而且还将每次使用sudo所执行的指令记录下来,不管该指令的执行是成功还是失败。在大型企业中,有时候有许多人同时管理Linux系统的各个不同部分,每个管理人员都有用sudo授权给某些用户超级用户权限的能力,从sudo的日志中,可以追踪到谁做了什么以及改动了系统的哪些部分。
值得注意的是,sudo并不能限制所有的用户行为,尤其是当某些简单的指令没有设置限定时,就有可能被黑客滥用。例如,一般用来显示文件内容的/etc/cat指令,如果有了超级用户的权限,黑客就可以用它修改或删除一些重要的文件。
7、追踪黑客踪迹:日志管理
当用户仔细设定了各种与Linux相关的配置(最常用日志管理选项),并且安装了必要的安全防护工具之后,Linux操作系统的安全性的确大为提高,但是却并不能保证防止那些比较熟练的网络黑客的入侵。
在平时,网络管理人员要经常提高警惕,随时注意各种可疑状况,并且按时检查各种系统日志文件,包括一般信息日志、网络连接日志、文件传输日志以及用户登录日志等。在检查这些日志时,要注意是否有不合常理的时间记载。例如:
正常用户在半夜三更登录;
不正常的日志记录,比如日志只记录了一半就切断了,或者整个日志文件被删除了;
用户从陌生的网址进入系统;
因密码错误或用户账号错误被摈弃在外的日志记录,尤其是那些一再连续尝试进入失败,但却有一定模式的试错法;
非法使用或不正当使用超级用户权限su的指令;
重新开机或重新启动各项服务的记录。
上述这些问题都需要系统管理员随时留意系统登录的用户状况以及查看相应日志文件,许多背离正常行为的蛛丝马迹都应当引起高度注意。
8、横向扩展:综合防御管理
防火墙、IDS等防护技术已经成功地应用到网络安全的各个领域,而且都有非常成熟的产品。
在Linux系统来说,有一个自带的Netfilter/Iptables防火墙框架,通过合理地配置其也能起到主机防火墙的功效。在Linux系统中也有相应的轻量级的网络入侵检测系统Snort以及主机入侵检测系统LIDS(Linux Intrusion Detection System),使用它们可以快速、高效地进行防护。
需要提醒注意的是:在大多数的应用情境下,我们需要综合使用这两项技术,因为防火墙相当于安全防护的第一层,它仅仅通过简单地比较IP地址/端口对来过滤网络流量,而IDS更加具体,它需要通过具体的数据包(部分或者全部)来过滤网络流量,是安全防护的第二层。综合使用它们,能够做到互补,并且发挥各自的优势,最终实现综合防御。
9、评测:漏洞追踪及管理
Linux作为一种优秀的开源软件,其自身的发展也日新月异,同时,其存在的问题也会在日后的应用中慢慢暴露出来。黑客对新技术的关注从一定程度上来说要高于我们防护人员,所以要想在网络攻防的战争中处于有利地位,保护Linux系统的安全,就要求我们要保持高度的警惕性和对新技术的高度关注。用户特别是使用Linux作为关键业务系统的系统管理员们,需要通过Linux的一些权威网站和论坛上尽快地获取有关该系统的一些新技术以及一些新的系统漏洞的信息,进行漏洞扫描、渗透测试等系统化的相关配套工作,做到防范于未然,提早行动,在漏洞出现后甚至是出现前的最短时间内封堵系统的漏洞,并且在实践中不断地提高安全防护的技能,这样才是一个比较的解决办法和出路。
10、保持更新:补丁管理
Linux作为一种优秀的开源软件,其稳定性、安全性和可用性有极为可靠的保证,世界上的Linux高手共同维护着个优秀的产品,因而起流通渠道很多,而且经常有更新的程序和系统补丁出现,因此,为了加强系统安全,一定要经常更新系统内核。
Kernel是Linux操作系统的核心,它常驻内存,用于加载操作系统的其他部分,并实现操作系统的基本功能。由于Kernel控制计算机和网络的各种功能,因此,它的安全性对整个系统安全至关重要。早期的Kernel版本存在许多众所周知的安全漏洞,而且也不太稳定,只有2.0.x以上的版本才比较稳定和安全(一般说来,内核版本号为偶数的相对稳定,而为奇数的则一般为测试版本,用户们使用时要多留意),新版本的运行效率也有很大改观。在设定Kernel的功能时,只选择必要的功能,千万不要所有功能照单全收,否则会使Kernel变得很大,既占用系统资源,也给黑客留下可乘之机。
在Internet上常常有最新的安全修补程序,Linux系统管理员应该消息灵通,经常光顾安全新闻组,查阅新的修补程序。
来源:高效运维
下面阅读原文,有啥 ?