概述
从Google的BeyondCorp计划说起。
Google的这项行动计划名为BeyondCorp,目的是为了彻底打破内外网之别。其基本假设是——内部网络实际上跟互联网一样危险,原因有两点:
1)一旦内网边界被突破,攻击者就很容易访问到企业内部应用。
2)现在的企业越来越多采用移动和云技术,边界保护变得越来越难。所以干脆一视同仁,不外区分内外网,用一致的手段去对待。
本文不深入阐述Google的这个方案是如何做的,从这个案例只想说明一个问题,随着信息安全漏洞层出不穷,而且利用手法也日益精妙,内部网络也会面临极大的风险(除非是完全物理隔离的内网)。所以需要同时关注内部网络和边界网络的安全。
原理篇
有段时间经常看中央一套的《今日说法》,其中有一个案件寻找破案线索的过程令我印象非常深刻。当时大概的案情是在一段没有监控的路上,有个女的被绑架了,这个时候寻找绑架作案的车辆就非常重要。由于事发路段没有监控,寻找作案车辆就陷入了困难,后面公安干警想出了一个非常简单的办法找到了作案的车辆。在绑架的现场是没有监控的,但在路的两头是有监控的,干警用给每辆车计时的方法来查找作案的车辆。如果要作案,必须要有作案的时间,也就是说这辆车的通过时间要比其他车辆时间要长。这就是最简单的逻辑推理破案。
同理,网络安全事件的发生也会有类似的逻辑,很多时候通过直接的手段很难发现入侵行为,但如果用推理的方式,入侵一定会存在某些不同寻常的行为。就像刚才的案件,没有直接监控发现,但车辆通过的时间会比其他时间长。如果我们拥有多样化的纵深防御能力,对进攻行为体系化防御,就带来了更多的防御点和监测点,样就可以极大的降低安全的风险。
防御具有排兵布阵的的先发优势,在精心策划下,可以通过深度防御防止单点突破造成的入侵。我们以主机入侵为例来说明深度防御的架构。对于主机来说,主要有几个层面的内容,网络,进程,文件,操作命令,文件操作,系统事件大概几个方面。通过这几个方面的综合分析,就可以发现绝大多数的入侵行为。
无标题
我们从一些假设的攻击开始分析,大多数的攻击都是从弱点开始,包括一些漏洞、弱口令、0day等等,由其是0day,大多数基于规则的安全防护都是失效的。攻击的第一步是踩点,踩点的行为有多种多样,最常用的是扫描,包括主机扫描,端口扫描,漏洞扫描等,扫描的发现可以从两个方面来发现,一是从网络上发现流量的异常行为,比如端口扫描就会发现一台主机在短时间内容会有大量的不同端口请求。一是从主机上可以发现,比如密码猜测扫描就会发现大量的登录失败的日志等。
当发现主机有漏洞的时候,下一步要做的事情是漏洞利用,漏洞的利用过程有时候很难被感知,比如缓冲区溢出等,但利用后的结果还是从系统中可以发现。比如如果有弱口令就会发现有异常登录行为,包括时间异常,登录源IP异常等等。比如文件的上传行为,用户操作行为,大多数黑客攻击成功后会到服务器上上传一些木马等文件,会做一些操作行为,比如创建一些隐蔽账号等。
当一台主机被黑客控制后,往往这台机器机会沦为黑客的肉鸡,这个时候也会产生一些异常的行为,比如在网络上,会有非法外联,不管是木马主动发起还是木马被动监听,都会在网络上产生这些异常信息。在进程层面,很多时候会产生异常进程,很多进程会通过伪装成系统进程名,但是只要留意依然能够被发现。
技术篇
对linux系统而言,这些参数和指标都是比较容易的。下面是我经常用的一些脚本可以参考下。
进程:ps aux|sed -n '2,$p'|awk 'BEGIN{count=0;}{suser[count]=$1;pid[count]=$2;cpu[count]=$3;mem[count]=$4;p[count]=$11;count++;};END{for (i = 1; i < NR; i++)print "seci-host-process user="suser[i]" pid="pid[i]" cpu="cpu[i]" mem="mem[i]" process="p[i]}' |sort |uniq|egrep -v "suser|grep|ps|sed|awk|sort|uniq|egrep|[[*]"
端口:ss -ntu|sed -n '2,$p'|awk 'BEGIN{count=0;}{pr[count]=$1;fl[count]=$4;si[count]=substr($5,1,index($5,":")-1);sp[count]=substr($5,index($5,":")+1,length($5));ti[count]=substr($6,1,index($6,":")-1);tp[count]=substr($6,index($6,":")+1,length($6));count++;};END{for (i = 0; i < NR; i++)if(si[i]!=ti[i])print "seci-host-network pro="pr[i]" sendFlow="fl[i]" sourceIp="si[i]" sourcePort="sp[i]" targetIp="ti[i]" targetPort="tp[i];}'
操作命令审计:export PROMPT_COMMAND='{ msg=$(history 1 | { read x y; echo $y; });logger " secisland user=$(whoami)" client=$SSH_CLIENT path=`pwd` command: "$msg"; }'
系统事件:正常在/var/log/secure文件中,比如登录成功失败等。
上传下载:目前linux sshd会自带的sftp协议日志,通过配置可以记录sftp的日志。
配置:#vi /etc/ssh/sshd_config
修改 Subsystem sftp /usr/libexec/openssh/sftp-server
如下Subsystem sftp internal-sftp -l INFO -f local0
去掉下面一行的注释 #LogLevel INFO
修改syslog配置 vi /etc/rsyslog.conf
# 增加一行
local0.* @ip
文件修改:对文件修改的监控稍微麻烦点,可以通过轮询文件修改时间,通过实现对文件进行打标签对比。效果比较好的方式是利用linux的inotify机制来监控文件操作。
Inotify 是一个 Linux特性,它监控文件系统操作,比如读取、写入和创建。Inotify 反应灵敏,用法非常简单,并且比 cron 任务的繁忙轮询高效得多。多用在主机防篡改,网页防篡改中,比较重要所以系统也集成了此功能。
安装SeciInofify,这个版本支持syslog发送,安装好后,运行:
nohup ./inotifywait -c -rme create,modify,delete,move,attrib,delete_self /home /etc &
这样就对指定的目录/home /etc进行监控,这两个目录中文件的任何变化都会发送到日志服务器中。
总结
如果在日常运维中能构建深度防御体系,实时的分析主机中的网络,进程,操作命令,文件操作,系统操作,上传下载行为,能把这些环节都记录加以分析的话,应该大多数的情况下能第一时间发现入侵行为。这样就降低了很大的风险。但这些东西如果都手工来做,效率还是比较低的,可以借助日志收集分析工具来进行分析,比如splunk,arcsight,SeciLog,elk等。这样就会达到事半功倍的效果。
申请创业报道,分享创业好点子。点击此处,共同探讨创业新机遇!