1、攻击者的计划:
a> 搜集目标系统的信息(系统信息,版本信息,网络拓扑,关联机器等),信息泄露会给攻击者计划攻击提供便利;
b> 寻找目标的弱点(可用端口,缺陷的软件版本,Man-in-Middle缺陷等);
c> 搜集一切可以跟目标沟通的方式(Web访问,普通帐号登录,数据库访问,无用的服务等);
d> 利用一个弱点侵入系统(提权);
e> 抹除痕迹防止反击(删日志,种rootkit,种后门);
2、验证和授权:安全的登录机制需要分为2步:验证身份,而后给予授权。即先确认你不是假冒的,而后根据你的身份限制你的权力;
3、攻击的大类:
a> Dos —— 使服务不可用;
b> 协议缺陷 —— 越过验证身份那一步;
c> 不正确的信任关系 —— 不越过验证的那一步,但是放大自己的权限;
4、Dos(Denial Of Service)攻击:
a> 通常因为版本BUG或者配置错误引起;
b> Dos掉一台机器的目的很可能是为了可以伪装成这台机器以发动下一步攻击;
c> Linux内核提供了一些防止Dos攻击的方法,但更重要的是保持软件更新和保持对系统的监控,尤其是对异常流量的监控;
d> DDos(Distributed denial of service)分布式拒绝服务攻击;
5、针对验证机制的攻击:
a> 密码嗅探。明文的协议是不安全的,如telnet;
b> 不恰当的授权。将自己与一个已验证或可以通过验证的用户关联起来;要将服务的授权缩到所需的最小,一个普通用户可以完成的工作就不要启用root去做;
6、输入验证攻击:
对输入是不是符合预期没有做验证。应用软件难免有BUG。
a> 一种输入验证攻击是试图去填满buffer导致溢出(buffer overflow attack),这还可以导致将数据区的代码填充到执行区导致代码执行。
b> 另一种是format string attack,利用输出执行某些超出预期的代码(SQL注入就是其中一种);
7、Linux提供的防御机制:
a> 防火墙、proxy、包过滤。最好一起启动。包过滤(iptables)是底层的安全措施,可以很好的控制网络流量,因为它只检查包头,因此效率很高。也因为这个,它不能对包内容做检查,而这正是proxy所擅长的,所以它们经常搭档。proxy(Squid)因为要对包内容解析,一般还做做cache啥的,对机器配置要求会高些;
b> tcpwrapper(libwrap.so),httpd不支持,sshd支持;
c> xinetd内建的一些机制(只能作用与xinetd托管的服务);
d> PAM(Pluggable Authentication Modules),可以对登陆进行包括时间段、资源占用等在内的各种限制;
e> SELinux(Security Enhanced Linux),通过上下文来保护系统。相当于即使某些进程或者用户被占领了,也还有一层ACL挡在后面。有点像是复杂化的带有规则的chroot,进程的活动被限制在某些文件/端口/连接之内。其实主要就是为了防止用户没有把权限弄好(777啥的),又加上一层权限控制;
f> ExecShield是Linux包含的隔离内存数据区和可执行区域的模块开关。也就是 sysctl -w kernel.exec-shield。当CPU支持 NX/XD技术时,它会使用CPU内建的方案,否则它会使用较为简单、效率较低的segment limit方案(纯基于软件的);
g> 服务和应用自身的安全机制。以上做的都是传输层和系统的安全,应用层的安全需要应用层自己做好;
8、服务通常是从内部瓦解的,而且proxy和包过滤加一起也并不能完成所有的安全工作,本地安全(包括使用者的安全意识)是十分重要的。
9、最基本的安全意识:
a> 只跑需要的服务,最好能把各个服务分开部署。如果能做到隔离,那是最好,虚拟化技术在这方面有它的用武之地;;
b> 保持软件更新,包括订阅各种安全的消息;
c> 关键服务一定要加以访问限制;