FreeBSD.org 这次的入侵事件

| 2 Comments | No TrackBacks |

我回国之前, FreeBSD 安全团队内部正在准备一项重要的安全公告,不过这次不是由于 FreeBSD 的代码本身,而是由于 FreeBSD 项目集群中的一部分受到了入侵。这份公告后来于 11 月 17 日正式 发表

经过事后分析,这次入侵,最早可以追溯到在今年大约9月的时候的一次针对某家公司的入侵。攻击者通过穷举的方式获得了这家公司一台机器的 root 账户,并获得了对应的 master.passwd 文件。根据事后的日志分析,攻击者应该是通过离线破解的方式得到了这台机器上所有用户的密码明文(旧式 FreeBSD 系统预设的散列方式是 salted MD5),并以这台机器为跳板扫描了一系列的其他系统,并找到了一位 committer 的未经保护的 ssh 私钥。这个私钥令攻击者获得了另外一台服务器的权限(其中包括一台机器上的 root 权限),并在那台服务器上进一步获得了另外一位 committer 的未经保护的 ssh 私钥。

那位 committer 的 ssh 私钥拥有 FreeBSD 用于联编预编译包的 Pointyhat 集群的 root 权限,而这个集群尽管和 FreeBSD.org 集群在一定程度上是隔离的,但在最初建立时,为了方便,以只读方式挂载了 FreeBSD.org 集群所有用户 /home 目录的 Filer。由于两组集群上都启用了内核审计机制 (audit),集群管理员发现,有人以 root 的身份访问了部分用户的 /home 目录,并很可能复制走了一些私钥文件。

至此,我们认为整个集群已出现了重大安全风险,应立即停止有风险的服务器的运行,并根据备份对全部文件进行审计。除了切断了大部分服务器的电源之外,扫描并停用了所有在 FreeBSD.org 集群上存有私钥的公钥的登录权限,对某些系统上运行的操作系统替换成了经过审计的 -CURRENT。

由于时间关系,不可能对每个二进制包都重新做审计,因此比较简便的办法,便是全部删去,从备份中恢复没有问题的,并重新联编其他的二进制包。为了尽快恢复服务,这次经过讨论还做出了准备提前淘汰 CVSup 的计划。

公众可见的变化包括:

  • 未来的所有 CVS 导出,都会变成以 "svnexp" 的身份进行。这个脚本会将 svn 中的代码取出,并 commit 到 CVS 中。
  • 全部 FreeBSD.org 目前依赖 CVS 的服务,都会过渡到采用 svn 作为源头。未来将不会再提供 CVS 和 CVSup 服务。
  • 目前 pkgng 网站还没有恢复,具体恢复时间还没有确定。
  • FreeBSD 9.1-RELEASE 将在包联编完之后正式发布。
  • 部分 committer 访问 FreeBSD.org 集群的权限可能受到了影响。由于目前对个人身份的认定很大程度上依赖于 PGP 签名而不是个人身份证件,相关的恢复作业进行了相当久的时间。

我从这次事件中学到的教训是:

  • 设置有效的入侵检测系统十分重要,及时检测入侵,可以有效阻止伤害继续加深(FreeBSD -CURRENT提供了新的分布式审计机制 auditstd,可以作为入侵检测的辅助手段);
  • 现有采用 MD5 的系统应立即升级到采用 SHA512 或 Blowfish 散列;
  • 避免使用弱密码,以及在不同的地方使用同一个密码;
  • 保存 SSH 私钥时,应进行加密,并且使用强密码;
  • 根据角色采用不同的 SSH 私钥,如果使用 SSH authentication agent,应令私钥在一定时间内过期;
  • 正确实施的二元认证,可以帮助拖延攻击者的脚步和令入侵检测系统及时发现问题;
  • 充足的离线备份非常重要;

No TrackBacks

TrackBack URL: https://blog.delphij.net/mt/mt-tb.cgi/1913

2 Comments

从这次事件可以看出安全防范还是很不到位。不知道是不是因为开源社区无法像公司那样强制推行高强度的安全隔离制度。

sshd是可以被改造的。让sshd支持基于PKI体系的证书认证,通过CRL就能即时的吊销证书。私钥不加密码保护说明使用者太粗忽大意,而且不只一人这样。某司的私钥都是放在阿拉丁那样的usb key当中,可让ssh client通过pkcs 11完成密钥交换,这个过程中私钥不出硬件key。于是,想通过文件系统拿到私钥是不可能的,即便拿到了root权限,也得通过在kernel中加钩子才有希望拿到私钥。

还有,既然大家现在都有智能手机。搞一套OTP方案通过手机下发动态密码也是不错的选择。

总之,多一个验证因子,就多一份安全。就像0.001*0.001=0.000001一样。


Leave a comment

Monthly Archives

Pages

OpenID accepted here Learn more about OpenID
Powered by Movable Type 5.2.3