吉姆,什么是FIM ?
好问题!一个文件完整性监视器(FIM)是一种软件,用于监视和(理想情况下)警告文件的任何更改。这些项目有助于维护中央情报局三位一体的诚信支柱。FIMs通常以一种非常简单的方式运行:管理员通过在任何要监视的系统上安装二进制文件来设置FIM,然后使用要监视的敏感文件列表来配置它。然后,监视器计算每个文件的哈希值,并将结果存储在经过加密签名的本地数据库或使用TLS与之通信的远程认证服务器中。最终,FIM是一个相当简单的软件,但是由于FIM本身可能成为潜在的攻击者在系统上建立持久性的必要且有吸引力的目标,因此试图保护FIM本身不被篡改的做法增加了复杂性。
目标
在深入讨论之前,我们应该先确定FIM的目标是什么:
- 利用在要监视的服务器上运行的最小/无定制代码
- 只需要极少或不需要手动配置
- 可扩展到添加的其他服务器、文件或警报机制
- 能够在内部服务器和未来可能的EC2实例上运行
- 发送Slack消息以获取关键警报(例如:文件正在更改)
- 减少成本
解决方案概述
我们通过CloudWatch Events触发Lambda函数。我们解决方案的伪代码大致如下:
- 我们的Lambda函数从AWS Secrets Manager中检索ssh密钥,然后将其写入NamedTemporaryFile(确保设置delete=False或返回文件处理程序)。
- 然后,我们使用Paramiko.
- 对于我们要监控的服务器列表中的每个服务器:
*连接到它通过我们的堡垒服务器;paramiko
不幸的是,它本身没有proxyjump功能,所以我们建立了一个隧道,然后通过它连接:

一旦我们建立了连接(通过我们的bastion服务器),我们循环遍历敏感文件列表,每个文件:
>使用ssh force命令(稍后详细介绍)来获取文件的哈希值
>从表中检索相应的哈希值
>进行比较
>警报,如果需要
回顾我们的目标
现在我们已经对我们的解决方案做了一些概述,让我们重新审视我们的目标:
最小的自定义代码运行在我们的服务器上
有了这个解决方案,我们正在运行的最接近自定义代码的东西是通过ssh force命令执行的bash一行程序。现在是时候复习一下这些是什么了。力ssh命令允许我们在用户ssh到服务器后运行命令。通过不允许FIM用户通过Lambda实际运行任意命令,我们可以利用这一点来增强解决方案的安全性。此外,与仅仅运行bash脚本相比,我们还有更多的透明性。ssh force命令的语法如下:<命令> <关键> <评论>
.为了实现这种动态,我们需要利用SSH_ORIGINAL_COMMAND
环境变量,存储用户传递给ssh的命令。我们可以做一些基本的坏字符过滤,并以如下命令结束:

这使我们能够通过在Lambda中传递文件名来运行完整的命令:

需要最小/不手动配置
这次我们也做得很好。我们需要做的唯一手工配置是创建用户,添加ssh force命令,并且—假设我们想要管理仅供用户阅读的文件根
- - - - - -修改/etc/sudoers
让FIM用户能够运行/usr/bin/sha256sum
作为根
可扩展性
我们将在稍后关于Terraform的讨论中讨论文件和服务器的可扩展性,但只要说我们已经实现了这一点就足够了。在提醒方面,我们目前只提醒懈怠,但我们可以很平常地使用SNS发送到电子邮件或类似的方法发送到SIEM或寻呼机。
能够在混合模式下运行
考虑到我们只依赖ssh
从服务器,FIM是相当不可知的ssh
荷兰国际集团(ing)。
发送松弛的消息
这在Python中很容易做到:

尽量减少成本
特别是与商业产品相比,我们发现DynamoDB表+ Lambda运行的成本是非常划算的。
地球化云
我们的解决方案的一个关键组件是通过起程拓殖.这使我们能够极大地简化部署过程。Terraform使我们能够指定我们想要在代码中创建哪些AWS资源,这些资源可以提交给GitHub并进行跟踪。我们还获得了使用变量和循环等编程结构的能力。例如,在创建dynamodb表的Terraform文件中,我们可以为我们想要监视的文件列表和我们想要监视的服务器使用变量。然后,我们可以根据要监视的文件列表的长度设置读写容量,并可以循环遍历服务器列表:

结论
我们发现,在AWS上创建一个云原生FIM是一个有趣的挑战,它被证明比仅仅提升和改变我们当前的解决方案更好。如果这听起来像是你想做的事,我们招聘安全工程师!