WEBKT

用eBPF监控SSH登录行为,揪出恶意IP!系统管理员的安全审计利器

247 0 0 0

作为一名系统管理员,服务器的安全是头等大事。每天面对海量的日志,如何快速、准确地发现潜在的安全威胁?传统的日志分析方法效率低下,而且容易遗漏关键信息。今天,我将分享如何利用eBPF技术,实时监控SSH登录行为,并与恶意IP地址库进行比对,从而及时发现可疑的登录尝试。这不仅能提高安全审计的效率,还能在攻击发生前及时预警。

为什么选择eBPF?

在深入探讨具体实现之前,我们先来了解一下为什么eBPF是服务器安全监控的理想选择?

  • 高性能: eBPF程序运行在内核态,能够直接访问内核数据,避免了用户态和内核态之间频繁的切换,从而大大提高了性能。这意味着我们可以在不影响服务器性能的前提下,进行实时的安全监控。
  • 灵活性: eBPF允许我们编写自定义的监控逻辑,可以根据实际需求监控各种系统事件。这使得我们可以针对特定的安全威胁,定制专属的监控方案。
  • 安全性: eBPF程序在运行前会经过严格的验证,确保程序的安全性,防止恶意代码对系统造成损害。同时,eBPF程序运行在沙箱环境中,即使程序出现问题,也不会影响整个系统的稳定。

eBPF监控SSH登录的原理

SSH登录过程涉及到多个系统调用,例如connect()accept()read()write()等。我们可以通过eBPF程序,hook这些系统调用,从而获取SSH登录的相关信息。具体来说,我们可以:

  1. Hook accept() 系统调用: 当有新的SSH连接请求到达时,accept()系统调用会被触发。我们可以在accept()调用返回时,获取客户端的IP地址和端口号。
  2. Hook read() 系统调用: 在SSH登录过程中,客户端需要输入用户名和密码。我们可以hook read()系统调用,获取用户输入的用户名。注意,我们不应该记录密码,因为这涉及到用户的隐私。
  3. Hook close() 系统调用: 当SSH连接关闭时,close()系统调用会被触发。我们可以在close()调用返回时,记录SSH会话的结束时间。
  4. 与恶意IP地址库比对: 获取到客户端IP地址后,我们可以将其与已知的恶意IP地址库进行比对,如果发现匹配,则可以立即发出警报。

具体实现步骤

下面,我们将通过一个简单的示例,演示如何使用eBPF监控SSH登录行为。我们将使用bpftrace工具,它是一个高级的eBPF跟踪语言,可以让我们更方便地编写eBPF程序。当然,你也可以使用其他的eBPF工具,例如bcc

1. 安装 bpftrace

首先,你需要安装bpftrace。具体的安装方法可以参考bpftrace的官方文档。在Ubuntu系统上,你可以使用以下命令安装:

sudo apt-get update
sudo apt-get install bpftrace

2. 编写 eBPF 脚本

创建一个名为ssh_monitor.bt的文件,并将以下代码复制到文件中:

#!/usr/bin/bpftrace

// 定义恶意IP地址库
$bad_ips = {
    "192.168.1.100",
    "10.0.0.5",
    // 可以添加更多的恶意IP地址
};

// Hook accept() 系统调用
kretprobe:inet_csk_accept {
    // 获取客户端IP地址
    $sock = (struct sock *)arg1;
    $inet_connection_sock = (struct inet_connection_sock *)$sock;
    $saddr = $inet_connection_sock->icsk_inet.inet_saddr;
    $daddr = $inet_connection_sock->icsk_inet.inet_daddr;
    $sport = $inet_connection_sock->icsk_inet.inet_sport;
    $dport = $inet_connection_sock->icsk_inet.inet_dport;

    $ip = ntop($saddr);

    // 打印登录信息
    printf("[%s] New SSH connection from %s:%d to %s:%d\n", strftime("%Y-%m-%d %H:%M:%S", timestamp), $ip, ntohs($sport), ntop($daddr), ntohs($dport));

    // 检查是否是恶意IP地址
    if ($bad_ips[$ip]) {
        printf("[%s] ALERT: Malicious IP address detected: %s\n", strftime("%Y-%m-%d %H:%M:%S", timestamp), $ip);
    }
}

// Hook tcp_close() 系统调用,用于记录会话结束时间
fentry:tcp_close {
    // 获取socket信息
    $sock = (struct sock *)arg0;
    $inet_connection_sock = (struct inet_connection_sock *)$sock;
    $saddr = $inet_connection_sock->icsk_inet.inet_saddr;
    $daddr = $inet_connection_sock->icsk_inet.inet_daddr;
    $sport = $inet_connection_sock->icsk_inet.inet_sport;
    $dport = $inet_connection_sock->icsk_inet.inet_dport;

    $ip = ntop($saddr);

    // 打印会话结束信息
    printf("[%s] SSH connection from %s:%d closed\n", strftime("%Y-%m-%d %H:%M:%S", timestamp), $ip, ntohs($sport));
}

代码解释:

  • $bad_ips: 定义了一个恶意IP地址的集合,你可以根据实际情况修改这个集合。
  • kretprobe:inet_csk_accept: Hook inet_csk_accept 函数的返回,这个函数在accept()系统调用中被调用。我们在这个probe中获取客户端的IP地址和端口号,并打印登录信息。同时,我们检查客户端IP地址是否在恶意IP地址库中,如果是,则发出警报。
  • fentry:tcp_close: Hook tcp_close 函数的进入,用于记录TCP连接关闭事件,也就是SSH会话的结束时间。
  • ntop(): 将网络字节序的IP地址转换为字符串格式。
  • ntohs(): 将网络字节序的端口号转换为主机字节序。
  • strftime(): 格式化时间戳。

3. 运行 eBPF 脚本

使用以下命令运行ssh_monitor.bt脚本:

sudo bpftrace ssh_monitor.bt

4. 测试

现在,你可以尝试使用SSH客户端连接到服务器。如果客户端IP地址在恶意IP地址库中,你将会看到警报信息。例如:

[2023-10-27 10:00:00] New SSH connection from 192.168.1.100:12345 to 192.168.1.1:22
[2023-10-27 10:00:00] ALERT: Malicious IP address detected: 192.168.1.100
[2023-10-27 10:00:05] SSH connection from 192.168.1.100:12345 closed

进阶应用

上面的示例只是一个简单的演示,你可以根据实际需求进行扩展。例如,你可以:

  • 记录登录用户名: Hook read() 系统调用,获取用户输入的用户名。请注意,不要记录密码!
  • 记录登录失败次数: 统计每个IP地址的登录失败次数,如果超过一定阈值,则将其加入恶意IP地址库。
  • 与外部安全平台集成: 将监控数据发送到外部安全平台,例如SIEM系统,进行统一的安全分析和管理。
  • 动态更新恶意IP地址库: 从外部来源(例如威胁情报平台)动态更新恶意IP地址库。
  • 使用更复杂的eBPF程序: 使用bcc等更底层的eBPF工具,编写更复杂的监控逻辑。

注意事项

  • 性能影响: eBPF程序虽然性能很高,但仍然会对系统性能产生一定的影响。在生产环境中,需要仔细评估性能影响,并进行优化。
  • 安全风险: 虽然eBPF程序在运行前会经过验证,但仍然存在一定的安全风险。需要仔细审查eBPF程序的代码,确保其安全性。
  • 内核版本兼容性: 不同的内核版本可能存在差异,需要根据实际情况调整eBPF程序的代码。
  • 权限问题: 运行eBPF程序需要root权限。

总结

eBPF为服务器安全监控提供了强大的能力。通过hook系统调用,我们可以实时监控SSH登录行为,并与恶意IP地址库进行比对,从而及时发现可疑的登录尝试。这不仅能提高安全审计的效率,还能在攻击发生前及时预警。希望本文能帮助你更好地利用eBPF技术,保护你的服务器安全。当然,eBPF的应用场景远不止于此,你可以探索更多eBPF的应用,例如网络性能分析、容器安全等。 掌握eBPF,就等于掌握了一把开启Linux内核强大功能的钥匙, 运维安全从此更加高效便捷!

Linux运维老司机 eBPF安全审计SSH监控

评论点评