mirror of
https://github.com/eunomia-bpf/bpf-developer-tutorial.git
synced 2026-02-12 06:35:16 +08:00
add translatefor sslsniff (#69)
This commit is contained in:
@@ -1,12 +1,10 @@
|
||||
# eBPF 实践教程:使用 eBPF 用户态捕获多种库的 SSL/TLS 明文数据
|
||||
# eBPF 实践教程:使用 uprobe 捕获多种库的 SSL/TLS 明文数据
|
||||
|
||||
随着TLS在现代网络环境中的广泛应用,跟踪微服务RPC消息已经变得愈加棘手。传统的流量嗅探技术常常受限于只能获取到加密后的数据,导致无法真正观察到通信的原始内容。这种限制为系统的调试和分析带来了不小的障碍。
|
||||
|
||||
但现在,我们有了新的解决方案。
|
||||
但现在,我们有了新的解决方案。使用 eBPF 技术,通过其能力在用户空间进行探测,提供了一种方法重新获得明文数据,使得我们可以直观地查看加密前的通信内容。然而,每个应用可能使用不同的库,每个库都有多个版本,这种多样性给跟踪带来了复杂性。
|
||||
|
||||
eBPF技术,通过其能力在用户空间进行探测,提供了一种方法重新获得明文数据,使得我们可以直观地查看加密前的通信内容。然而,每个应用可能使用不同的库,每个库都有多个版本,这种多样性给跟踪带来了复杂性。
|
||||
|
||||
在本教程中,我们将带您了解一种跨多种条件的技术,它不仅可以同时跟踪 GnuTLS 和 OpenSSL 等用户态库,而且相比以往,大大降低了对新版本库的维护工作。
|
||||
在本教程中,我们将带您了解一种跨多种用户态 SSL/TLS 库的 eBPF 追踪技术,它不仅可以同时跟踪 GnuTLS 和 OpenSSL 等用户态库,而且相比以往,大大降低了对新版本库的维护工作。
|
||||
|
||||
## 背景知识
|
||||
|
||||
@@ -24,7 +22,7 @@ Transport Layer Security (TLS) 是一个密码学协议,旨在为计算机网
|
||||
|
||||
#### 握手过程
|
||||
|
||||
当客户端与启用了TLS的服务器连接并请求建立安全连接时,握手过程开始。握手允许客户端和服务器通过不对称密码来建立连接的安全性参数:
|
||||
当客户端与启用了TLS的服务器连接并请求建立安全连接时,握手过程开始。握手允许客户端和服务器通过不对称密码来建立连接的安全性参数,完整流程如下:
|
||||
|
||||
1. **初始握手**:客户端连接到启用了TLS的服务器,请求安全连接,并提供它支持的密码套件列表(加密算法和哈希函数)。
|
||||
2. **选择密码套件**:从提供的列表中,服务器选择它也支持的密码套件和哈希函数,并通知客户端已做出的决定。
|
||||
@@ -32,19 +30,19 @@ Transport Layer Security (TLS) 是一个密码学协议,旨在为计算机网
|
||||
4. **验证证书**:客户端在继续之前确认证书的有效性。
|
||||
5. **生成会话密钥**:为了生成用于安全连接的会话密钥,客户端有以下两种方法:
|
||||
- 使用服务器的公钥加密一个随机数(PreMasterSecret)并将结果发送到服务器(只有服务器才能使用其私钥解密);双方然后使用该随机数生成一个独特的会话密钥,用于会话期间的数据加密和解密。
|
||||
- 使用Diffie-Hellman 密钥交换(或其变体椭圆曲线DH)来安全地生成一个随机且独特的会话密钥,用于加密和解密,该密钥具有前向保密的额外属性:即使在未来公开了服务器的私钥,也不能用它来解密当前的会话,即使第三方拦截并记录了会话。
|
||||
- 使用 Diffie-Hellman 密钥交换(或其变体椭圆曲线DH)来安全地生成一个随机且独特的会话密钥,用于加密和解密,该密钥具有前向保密的额外属性:即使在未来公开了服务器的私钥,也不能用它来解密当前的会话,即使第三方拦截并记录了会话。
|
||||
|
||||
一旦上述步骤成功完成,握手过程便结束,加密的连接开始。此连接使用会话密钥进行加密和解密,直到连接关闭。如果上述任何步骤失败,则TLS握手失败,连接将不会建立。
|
||||
|
||||
#### OSI模型中的TLS
|
||||
|
||||
TLS和SSL不完全适合OSI模型或TCP/IP模型的任何单一层次。TLS在“某些可靠的传输协议(例如,TCP)之上运行”,这意味着它位于传输层之上。它为更高的层提供加密,这通常是表示层的功能。但是,使用TLS的应用程序通常视其为传输层,即使使用TLS的应用程序必须积极控制启动TLS握手和交换的认证证书的处理。
|
||||
TLS 和 SSL 不完全适合 OSI 模型或 TCP/IP 模型的任何单一层次。TLS 在“某些可靠的传输协议(例如,TCP)之上运行”,这意味着它位于传输层之上。它为更高的层提供加密,这通常是表示层的功能。但是,使用TLS 的应用程序通常视其为传输层,即使使用TLS的应用程序必须积极控制启动 TLS 握手和交换的认证证书的处理。
|
||||
|
||||
### eBPF 和 uprobe
|
||||
|
||||
eBPF (Extended Berkeley Packet Filter): 是一种内核技术,允许用户在内核空间中运行预定义的程序,不需要修改内核源代码或重新加载模块。它创建了一个桥梁,使得用户空间和内核空间可以交互,从而为系统监控、性能分析和网络流量分析等任务提供了无前例的能力。
|
||||
|
||||
uprobes: 是eBPF的一个重要特性,允许我们在用户空间应用程序中动态地插入探测点,特别适用于跟踪SSL/TLS库中的函数调用。
|
||||
uprobes 是eBPF的一个重要特性,允许我们在用户空间应用程序中动态地插入探测点,特别适用于跟踪SSL/TLS库中的函数调用。
|
||||
|
||||
### 用户态库
|
||||
|
||||
@@ -60,9 +58,7 @@ OpenSSL 是一个广泛应用的开源库,提供了 SSL 和 TLS 协议的完
|
||||
|
||||
### 1. SSL_read 函数
|
||||
|
||||
当我们想从一个已建立的 SSL 连接中读取数据时,可以使用 `SSL_read` 或 `SSL_read_ex` 函数。
|
||||
|
||||
#### 函数原型
|
||||
当我们想从一个已建立的 SSL 连接中读取数据时,可以使用 `SSL_read` 或 `SSL_read_ex` 函数。函数原型如下:
|
||||
|
||||
```c
|
||||
int SSL_read_ex(SSL *ssl, void *buf, size_t num, size_t *readbytes);
|
||||
@@ -86,7 +82,7 @@ int SSL_write(SSL *ssl, const void *buf, int num);
|
||||
|
||||
## eBPF 内核态代码编写
|
||||
|
||||
eBPF (扩展伯克利数据包过滤器) 是 Linux 内核中的一个功能强大的编程框架,它允许开发者在不修改内核源代码的情况下,为 Linux 内核动态插入自定义的程序。在我们的例子中,我们使用 eBPF 来 hook ssl_read 和 ssl_write 函数,从而在数据读取或写入 SSL 连接时执行自定义操作。
|
||||
在我们的例子中,我们使用 eBPF 来 hook ssl_read 和 ssl_write 函数,从而在数据读取或写入 SSL 连接时执行自定义操作。
|
||||
|
||||
### 数据结构
|
||||
|
||||
@@ -305,8 +301,6 @@ int BPF_URETPROBE(probe_SSL_do_handshake_exit) {
|
||||
|
||||
通过这些 hook 函数,我们可以获得关于握手成功与否、握手所需的时间以及相关的进程信息的数据。这为我们提供了关于系统 SSL/TLS 行为的深入见解,可以帮助我们在需要时进行更深入的分析和优化。
|
||||
|
||||
## 用户态辅助代码分析
|
||||
|
||||
## 用户态辅助代码分析与解读
|
||||
|
||||
在 eBPF 的生态系统中,用户态和内核态代码经常协同工作。内核态代码负责数据的采集,而用户态代码则负责设置、管理和处理这些数据。在本节中,我们将解读上述用户态代码如何配合 eBPF 追踪 SSL/TLS 交互。
|
||||
|
||||
Reference in New Issue
Block a user