HTTP SLI 调研 (1)

黎 浩然/ 27 6 月, 2022/ 扩展的伯克利数据包过滤器/EXTENDEDBERKELLEYPACKETFILTER/EBPF, 计算机/COMPUTER/ 0 comments

eCapture

https://github.com/ehids/ecapture

功能描述

  • SSL/TLS 文本内容捕获,支持 openssl、libressl、boringssl、gnutls、nspr(nss)库
  • bash 审计,捕获 bash 命令用于主机安全审计
  • mysql查询SQL审计,支持mysqld 5.6\5.7\8.0,和mariadDB

工作原理

例如对于openssl,通过在SSL_write函数插入probe,截取SSL/TLS加密前的信息。优点是不需要考虑解密SSL/TLS数据包的问题,缺点是不能计算TCP层的处理时间。

运行要求

  • 需要 Linux 内核版本 >= 4.15
  • 启用 BTF BPF 类型格式 (BTF)

Kernel TLS/DTLS

https://github.com/ktls/af_ktls

功能描述

这个内核模块引入了一个AF_KTLS套接字。AF_KTLS套接字用于通过使用TCP的TLS 1.2或使用UDP的DTLS 1.2传输数据。目前,仅支持AES GCM加密。

AF_KTLS套接字进行数据传输,握手、重新握手和其他控制消息。这些工作本该必须由用户空间使用适当的库(如OpenSSL或GNU TLS)提供服务。AF_KTLS 套接字似乎更快,尤其是在没有用户空间(缓冲复制)交互(通过使用零拷贝函数sendfile或splice)的情况下传输文件。

零拷贝技术

#include <sys/sendfile.h>

ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);

sendfile()在一个文件描述符和另一个文件描述符之间复制数据。因为这个复制是在内核中完成的,所以sendfile()是比read(2)和write(2)的组合更有效,因为sendfile不需要在用户空间之间传输数据。

如果offset不为NULL,则它指向一个保存文件偏移量的变量,sendfile()将从该文件偏移量开始从 in_fd读取数据。当sendfile()返回时,此变量将设置为读取的最后一个字节之后的字节偏移量,并且sendfile()不会修改in_fd的文件偏移量; 否则(如果offset为空)调整文件偏移量以反映从in_fd读取的字节数。

#define _GNU_SOURCE         /* See feature_test_macros(7) */
#include <fcntl.h>

ssize_t splice(int fd_in, off64_t *off_in, int fd_out, off64_t *off_out, size_t len, unsigned int flags);

有类似于sendfile的用法,见man。值得注意的是,splice要求fd_in和fd_out至少有一个是管道,并且常用与socket之间的数据转移。

工作原理

参见功能描述。代码太复杂,且缺少文档和注释难以看懂!

NGINX Prometheus Exporter

https://github.com/nginxinc/nginx-prometheus-exporter

功能描述

NGINX Prometheus Exporter从单个NGINX或NGINX Plus获取指标,将指标转换为适当的Prometheus指标类型,最后通过HTTP服务器公开它们以由Prometheus收集。

前提条件

我们假设您已经安装了Prometheus和NGINX或NGINX Plus。 此外,您还需要:

公开NGINX/NGINX Plus 中的内置指标:

  • 对于 NGINX,在端口 8080 上的 /stub_status 处公开 stub_status 页面。
  • 对于 NGINX Plus,在端口 8080 上的 /api 处公开 API。

配置 Prometheus 以使用导出器从服务器中抓取指标。

不足之处

以服务器为nginx为例,能采集到的metrics相对有限,难以得到数据采集表中要求的数据指标。

Apache Exporter

https://github.com/Lusitaniae/apache_exporter

同样是能采集的指标有限,能以覆盖数据采集表中要求的指标数据。并且无论是Nginx Exporter还是Apache Exporter都只能采集特定应用程序的HTTP服务。

Tcp Flow

https://github.com/simsong/tcpflow

功能描述

TcpFlow是一个用于捕获作为TCP连接中的一部分传输的数据,并以便于协议分析和调试的方式存储数据。每个TCP流都存储在自己的文件中。因此,典型的TCP流将存储在两个文件中,每个方向一个文件。 Tcpflow还可以处理存储的“tcpdump”数据包流。

不足之处

TcpFlow不能解密TLS数据包,并且测试发现对于明文的HTTP数据包也不能100%识别。

Share this Post

Leave a Comment

您的邮箱地址不会被公开。 必填项已用 * 标注

*
*