导读 Teleport是一款Golang语言开发的用来替代sshd的ssh服务器,支持通过 SSH 或者 HTTPS 远程访问,支持集群、Web登陆、SSH历史记录还重放用以操作分享和安全审计,基于Golang ssh包构建开发,实现完全兼容OpenSSH。

最近Teleport 4.2版本中新增加ssh增强的回话记录功能用来接收非结构化的ssh会话,并将其通过结构化事件流来输出。该功能使用到了Linux内核中集成的一项新技术eBPF(简称为BPF)。用来完善Teleport审计功能的不足之处。本文虫虫就给大家介绍Teleport中是如何做的。

背景

Teleport的一个优势就是,可以对ssh会话全程记录。该功能可以捕获用户屏幕上显示的所有内容。之后,可以使用该记录回放还原所有操作,以便于审计。这些记录易于理解,并提供了有关用户在会话过程中所做操作和显示的信息

然而,和其他同类工具一样(堡垒机),Teleport也有不足之处,用户可以使用一些方法绕过会话记录。其中包括:

混淆:

比如通过加密或者其他方式对予以混淆。比如下面的语句,用base64编码对要执行的命令进行了混淆。

echo Y3VybCBodHRwOi8vd3d3LmV4YW1wbGUuY29tCg== | base64 -d | sh

这样实际的执行命令(curl example.com)不会直接被记录。

如果用户通过上传并执行的方式,也不能捕获脚本中运行的命令,只能捕获脚本的输出。

终端控制:

ssh终端可以支持多种控件,比如用户可以禁用终端回显的控件,在一些应用程序通常会使用。例如sudo命令当它们提示用户输入密码时。这是也不能在ssh记录中捕获它们。

此外,由于TTY流是非结构化性质,会话记录在某种程度上可能难以捕获和监视。

技术实现

为了解决安全审计的这些不足,Teleport需要一种能将非结构化ssh会话转换为结构化事件流的方法。这就是本文要说的增强回话记录功能,具体功能展示如下:

技术选型

通过多种方法对比,包括了内容从正则表达式模式匹配之类的临时方法到自己解析原始SSH会话之类的方法,还探索了Linux提供的各种API和系统,例如Audit,fanotify和BPF等,在走技术对比时候,要考虑的两个标准是准确性和性能问题:

减少误报,最好减少到零。监控系统(安全审计),首先要考虑是的准确性问题,如果报警很多,则对警报的关注度就会减少。可能会导致严重问题被忽略掉。

减少由监控引起的任何性能影响,最好为零。监控系统要尽量避免影响系统的性能。

多种方法中,误报问题都很严重。无法对构成SSH会话的字节流进行准确的解析和解释,不能防止警报疲劳。

还有一些方法,会有性能问题。比如Linux Audit。

通过查看文件系统访问,有一些替代方法。最突出的两个是inotify和fanotify。inotify不错,做为了初始备选项,但是其缺少递归目录监视功。fanotify更有希望,也存在两个问题。

布伦丹.格雷格在BPF性能工具书中提到,在重负载时,opensnoop比对fanotify,fanotify 占了67%的CPU,而opensnoop只用到1%。

Linux内核最近合并到一个补丁,以提高fanotify的性能,使其更适合于对整个文件系统监视,这样可以在Teleport中的使用更加紧密地契合。然而,补丁需要在Linux 5.1中才被合并,目前还没有开箱即用的主流发行版支持。

考虑到这些考虑因素,Teleport最终选择了基于BPF程序链构建的解决方案,该解决方案减少了误报并且对性能的影响最小。

BPF介绍

BPF,原本是Unix的一个包过滤器,伯克利包过滤器(Berkeley Packet Filter)。后来被移植到了Linux中。2013 年,Alexei Starovoitov 对 BPF 做完善和改进,新版本被命名为 eBPF (extended BPF),简写为BPF,而将老的BPF叫做cBPF(classic BPF)。eBPF在增加了映射和尾调用等新特性,并且还重写了JIT 编译器。新版语言比 cBPF 更接近原生机器语言。BPF允许用户空间程序以安全和高效的方式从内核中的某些位置挂接并发出事件。

安全意味着BPF程序不会陷入无限循环而导致系统瘫痪。BPF程序不太可能像内核模块一样可能使整个操作系统崩溃。

BPF程序也很有效,如果不能足够快地使用它们,则丢弃事件,而不是拖累整个系统的性能。

目前Linux中有大量的系统工具都是基于BPF进行了重构(比如iptables),布伦丹.格雷格的书《BPF高性能工具》中(blog中)介绍了大量的工具可以供大家学习。

Teleport对接BPF

Teleport中使用了三个BPF程序:execsnoop捕获程序执行,opensnoop捕获程序打开的文件,tcpconnect捕获程序建立的TCP连接。

为了更好地理解这些BPF程序的功能,可以运行时查看execsnoop的输出man ls。

看起来,简单地运行man二进制文件似乎是在幕后执行了许多其他程序。

Teleport 将这些程序嵌入其二进制文件中,并且在启用"增强的会话记录"功能后,它将生成并运行它们。

这些程序本身是调试和跟踪的出色工具,它能给出系统上正在执行什么操作,而不仅限于一个用户。

要将程序执行与特定的SSH会话相关联,还使用了cgroups(尤其是cgroupv2)。Teleport启动SSH会话时,它将首先重新启动自身并将其置于cgroup中。这不仅允许该进程,而且可以使用唯一ID跟踪Teleport启动的所有将来进程。Teleport运行的BPF程序已更新,还可以发出执行它们的程序的cgroup ID。这样就可以将事件与特定的SSH会话和身份相关联。

局限性

目前Teleport没有完成增强的会话记录。仍然存在一些差距,将以后版本解决。

值得指出的是,通过会话记录,Teleport可以捕获由于其特权位置而构成会话的字节流(字节流必须流过Teleport)。至关重要的是,会话记录的完整性不依赖于主机自己报告的任何信息。但是,增强的审核功能依赖于主机准确地向Teleport报告信息。如果主机的完整性受到损害,则增强审核的完整性也会收到影响。此外,Teleport仅监控系统中最关键的部分系统调用,而不是全部调用。

目前,增强的会话记录最适合非root用户,对有权访问root的用户可以通过多种方式禁用增强会话记录。

实践

在没有背景的情况下,可以使用下面的脚本进行增强的会话记录。

首先启动Ubuntu 19.04或RHEL/CentOS 8 VM,然后运行上面的脚本。该脚本会安装内核头文件和bcc-tools,这是运行增强会话记录的先决条件。此外,脚本还安装jq,一个命令的json解析工具(虫虫以前文章介绍过,可以参考),这有助于可视化结构化事件流。

按照说明输入终端后,屏幕上看到以下类似的信息:

由此可见,curl程序是由用户以两种方式执行的。首先是程序本身的执行。第二个是程序的行为,curl发出了网络请求,也可以看到它。你可以尝试执行其他操作,例如混淆的命令,或者脚本方式执行等,应该在日志中查看执行结果。

要求

Teleport增强会话记录的最低要求需要启动BPF支持的 Linux内核4.18 。目前有多个发行版本可直接使用它,包括Ubuntu 19.04,Debian 10和RHEL/CentOS 8。

还需要安装内核头文件和bcc-tools。对于上面列出的操作系统,发行版的包管理器中安装它们,比如对Centos 8只需运行

yum install -y kernel-headers bcc-tools

或者Ubuntu下执行

apt install -y linux-headers-$(uname -r) bpfcc-tools

如果尚未打包bcc-tools,则必须从源代码构建它们。

要在Teleport中启用增强的会话记录,只需在文件配置中将其启用即可,如下所示:

ssh_service:
enhanced_recording:
enabled: yes
结论

尽管没有任何监控系统是绝对可靠的,但采用具有多种防护措施的纵深防御策略可以帮助发现问题并采取适当的措施。Teleport的增强型会话记录功能可以为系统上运行的命令的安全审计,提供更强大的记录和操作可见性。

原文来自:

本文地址://lrxjmw.cn/bpf-teleport.html编辑:roc_guo,审核员:逄增宝

Linux命令大全:

Linux系统大全:

红帽认证RHCE考试心得: