IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> eBPF在网络安全进程审计以及外连检测方面的应用 -> 正文阅读

[网络协议]eBPF在网络安全进程审计以及外连检测方面的应用

作为hids功能的一部分,进程审计以及外连检测,我了解的有

三种实现方式:

1,通过 kprobe 编写内核代码,加载 ko 模块,检测内核运行中的网络外连代码

2,使用 netlink 协议与内核通信,获取 链接跟踪 以及 connector 模块的信息

3,使用 eBPF 跟踪 _do_fork / exit 函数,对外连跟踪?tcp_connect 函数

优缺点比较:

方案

运行位置

优点

缺点

基于kprobe 内核模块

linux内核

数据准确

可能宕机+版本维护

基于netlink协议

应用层

数据可能丢失

稳定

基于eBPF

内核eBPF虚拟机

数据准确

低版本不友好

????????目前业界比较常用的是基于 netlink 协议做进程审计,主要的是基于易于维护,稳定性以及对内核无侵入性的考虑。

eBPF有哪些优点:

首先看看通过netlink获取进程审计为什么可能会丢失数据?

看上面的connector模块的内核代码,问题出在应用层仅能拿到pid的信息,应用层做进程关联时,系统的 /proc/pid 文件可能已经消失了。而eBPF能克服信息不足的缺点。

使用eBPF做网络外连检测:

????????通过跟踪 tcp_connect 函数,我能直接拿到外连进程的pid信息,五元组信息,以及task名称。明天国庆我就直接贴代码了:

#include "ebpf_agent.h"
#include <net/inet_sock.h>

#define F_OUTBOUND 0x1
#define F_CONNECTED 0x10

struct tcp_connect_event_t {
? ? u32 pid;
? ? u32 laddr;
? ? u16 lport;
? ? u32 raddr;
? ? u16 rport;
? ? char task[TASK_COMM_LEN];
? ? u16 family;
} __attribute__((packed));

struct bpf_map_def SEC("maps") tcp_connect_counts = {
?? ?.type = BPF_MAP_TYPE_HASH,
?? ?.key_size = sizeof(u64),
?? ?.value_size = sizeof(u64),
?? ?.max_entries = 10,
};

// struct {
// ? ? __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY);
// } events SEC("maps");
struct bpf_map_def SEC("maps") tcp_connect_events = {
? ? .type = BPF_MAP_TYPE_PERF_EVENT_ARRAY,
? ? .key_size = sizeof(int),
? ? .value_size = sizeof(int),
};

SEC("kprobe/tcp_connect")
int kprobe__tcp_connect(struct pt_regs *ctx) {
? ? struct sock *sk = (struct sock *)PT_REGS_PARM1(ctx);

? ? if (!sk) return 0;

? ? u64 *val, one = 1, key = 1;
? ? struct inet_sock *inet = (struct inet_sock *)(sk);

? ? struct tcp_connect_event_t data = {};
? ? bpf_probe_read(&data.family, sizeof(data.family), &sk->__sk_common.skc_family);
? ? if (data.family != AF_INET){
? ? ? ? return 0;
? ? }
? ? bpf_probe_read(&data.laddr, sizeof(data.laddr), &inet->inet_saddr);
? ? bpf_probe_read(&data.raddr, sizeof(data.raddr), &inet->inet_daddr);

? ? // 忽略本机通信
? ? if ((data.laddr & 0xff) == 0x7f && (data.raddr & 0xff) == 0x7f){
? ? ? ? return 0;
? ? }

? ? bpf_probe_read(&data.lport, sizeof(data.lport), &inet->inet_sport);
? ? bpf_probe_read(&data.rport, sizeof(data.rport), &inet->inet_dport);

? ? bpf_get_current_comm(&data.task, sizeof(data.task));
? ? data.pid = bpf_get_current_pid_tgid() >> 32;

? ? val = bpf_map_lookup_elem(&tcp_connect_counts, &key);? //仅在性能调试使用
?? ?if (val){
? ? ? ? (*val)++;
? ? ? ? if ((*val) % 1000 == 0){
? ? ? ? ? ? my_bpf_printk("tcp state send count:%llu\n", (*val));
? ? ? ? }
? ? } else{
? ? ? ? bpf_map_update_elem(&tcp_connect_counts, &key, &one, BPF_NOEXIST);
? ? }

? ? my_bpf_printk("tcp_connect %s dport:%d\n", data.task, data.rport);

? ? bpf_perf_event_output(ctx, &tcp_connect_events, BPF_F_CURRENT_CPU, &data, sizeof(data));

? ? return 0;
}

实现效果


?

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-10-08 21:14:47  更:2022-10-08 21:15:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/6 11:12:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码