Teleport是用Golang语言开发的sshserver来替代sshd。支持SSH或HTTPS远程访问,支持集群、Web登录、回放SSH历史记录等操作。共享和安全审计,基于Golangssh包构建开发,完全兼容OpenSSH。Teleport4.2中最近添加的ssh增强会话记录功能用于接收非结构化的ssh会话,并通过结构化事件流输出。该功能使用了Linux内核中集成的一项新技术eBPF(简称BPF)。用于改进Teleport审计功能的不足。这篇文章,虫虫就给大家介绍一下如何在Teleport中进行操作。背景Teleport的一个优点是它可以记录整个ssh会话。此功能捕获用户屏幕上显示的所有内容。之后,可以使用该录音回放来恢复所有操作以进行审核。这些记录易于理解,并提供有关用户在会话期间所做和显示的信息。不过和其他同类工具(堡垒机)一样,Teleport也有缺点,用户可以使用一些方法绕过sessionrecording。其中包括:混淆命令:例如通过加密或其他方法混淆命令。例如下面的语句将要执行的命令与base64编码混淆。回声Y3VybCBodHRwOi8vd3d3LmV4YW1wbGUuY29tCg==|base64-d|sh所以不会直接记录实际执行的命令(curlexample.com)。Shell脚本:如果用户上传并执行脚本,则无法捕获脚本中运行的命令,只能捕获脚本的输出。终端控制:ssh终端可以支持多种控制,比如用户可以关闭终端回显的控制,通常在一些应用中会用到。例如提示用户输入密码时的sudo命令。这也不可能在ssh记录中捕获它们。此外,由于TTY流的非结构化性质,会话记录可能有点难以捕获和监控。技术实现为了解决安全审计中的这些不足,Teleport需要一种能够将非结构化ssh会话转换为结构化事件流的方法。这就是本文要讲的增强会话记录功能。具体功能如下:通过各种方式进行技术选型比较,包括从正则表达式模式匹配等临时方式到自己解析原始SSH会话等方式的内容。我还探索了Linux提供的各种API和系统,例如Audit、fanotify和BPF。比较技术时,要考虑的两个标准是准确性和性能:减少误报,最好是零。对于监控系统(安全审计),首先要考虑系统的准确性。如果告警较多,则对告警的关注度会降低。严重的问题可能会被忽视。减少(最好是零)监控造成的任何性能影响。监控系统应尽量避免影响系统的性能。在许多方法中,误报是一个严重的问题。无法准确解析和解释构成SSH会话的字节流并不能防止警报疲劳。还有一些方法存在性能问题。比如Linux审计。通过查看文件系统访问,有一些替代方案。突出的两个是inotify和fanotify。inotify是一个很好的初始选择,但它缺乏递归目录监控。fanotify更有前途,但也有两个问题。BrendanGreg在BPF性能工具书中提到,在重负载下,opensnoop与fanotify对比,fanotify占用了67%的CPU,而opensnoop只使用了1%。Linux内核最近被合并成一个补丁,以提高fanotify的性能,使其更适合监控整个文件系统,可以与Teleport更紧密地结合使用。但是,该补丁需要在Linux5.1中合并,目前主流发行版不支持开箱即用。考虑到这些因素,Teleport最终选择了构建在BPF程序链之上的解决方案,这样可以减少误报并且对性能的影响最小。BPF简介BPF,最初是Unix的一个包过滤器,BerkeleyPacketFilter(伯克利包过滤器)。它后来被移植到Linux。2013年,AlexeiStarovoitov完善和改进了BPF。新版本被命名为eBPF(extendedBPF),缩写为BPF,旧的BPF被称为cBPF(classicBPF)。eBPF增加了映射和尾调用等新特性,还重写了JIT编译器。新版本的语言比cBPF更接近本地机器语言。BPF允许用户空间程序以安全有效的方式挂钩到内核中的特定位置并从中发出事件。安全意味着BPF程序不会陷入无限循环并导致系统崩溃。与内核模块相比,BPF程序不太可能使整个操作系统崩溃。BPF程序也很高效,如果不能足够快地消耗事件,就会丢弃事件,而不是拖累整个系统的性能。目前Linux中大量的系统工具都是基于BPF重构的(比如iptables)。BrendanGreg的书《BPF高性能工具》(在博客中)介绍了大量的工具供大家学习。Teleport连接BPFTeleport使用三个BPF程序:execsnoop捕获程序执行,opensnoop捕获程序打开的文件,tcpconnect捕获程序建立的TCP连接。为了更好地理解这些BPF程序的功能,请查看运行时execsnoop的manls输出。看起来简单地运行man二进制文件就是在幕后执行许多其他程序。Teleport将这些程序嵌入到它的二进制文件中,当启用“增强会话记录”功能时,它会构建并运行它们。这些程序本身是用于调试和跟踪的出色工具,可以了解系统上正在发生的事情,而不仅仅是一个用户。为了将程序执行与特定的SSH会话相关联,还使用了cgroup(尤其是cgroupv2)。当Teleport启动SSH会话时,它首先会自行重启并将其置于cgroup中。这不仅允许该进程,而且允许使用唯一ID跟踪由Teleport启动的所有未来进程。Teleport运行的BPF程序已更新为还发出执行它们的程序的cgroupID。这使得将事件与特定SSH会话和身份相关联成为可能。局限性目前Teleport没有实现增强的会话记录。在未来的版本中仍然存在一些差距。值得指出的是,通过会话记录,Teleport由于其特权位置可以捕获构成会话的字节流(字节流必须流经Teleport)。至关重要的是,会话记录的完整性不依赖于主机本身报告的任何信息。但是,增强审计依赖于主机向Teleport准确报告信息。如果主机的完整性受到损害,增强审核的完整性也会受到损害。另外,Teleport只监控系统中最关键的部分系统调用,而不是所有的调用。目前,增强会话日志记录最适合非根用户,有几种方法可以为具有根访问权限的用户禁用增强会话日志记录。练习在没有背景的情况下,下面的脚本可用于增强会话记录。首先启动Ubuntu19.04或RHEL/CentOS8VM,然后运行上面的脚本。此脚本安装内核标头和bcc-tools,它们是运行增强型会话记录的先决条件。另外,该脚本还安装了jq,一个基于命令的json解析工具(在虫虫上一篇文章中有介绍,大家可以参考一下),有助于可视化结构化事件流。按照提示进入终端后,在屏幕上可以看到类似如下的信息:可以看出curl程序是通过两种方式被用户执行的。首先是程序本身的执行。其次是程序的行为,curl发起了网络请求,也可以看出来。您可以尝试执行其他操作,例如混淆命令,或脚本执行等,您应该在日志中查看执行结果。要求Teleport增强会话日志记录的最低要求需要启用BPF支持的Linux内核4.18。有几个开箱即用的发行版,包括Ubuntu19.04、Debian10和RHEL/CentOS8。还需要安装内核头文件和bcc-tools。对于上面列出的操作系统,将它们安装在发行版的包管理器中。例如,对于Centos8,只需运行yuminstall-ykernel-headersbcc-tools或执行aptinstall-ylinux-headers-$(uname-r)bpfcc-tools如果bcc-tools尚未打包,则必须从源代码构建。要在Teleport中启用增强会话记录,只需在文件配置中启用它,如下所示:ssh_service:enhanced_recording:enabled:yes找出问题并采取适当的行动。Teleport增强的会话记录功能为系统上运行的命令的安全审计提供了更好的日志记录和操作可见性。
