AgentSmith-HIDS 从技术角度来说,AgentSmith-HIDS严格意义上来说并不是一个传统的“基于主机的入侵检测系统”(HIDS),因为就该项目目前开源的部分来说,它还缺少了规则引擎以及相关的检测能力...而AgentSmit-HIDS的优秀特性(从内核态获取尽可能完整的数据)在跟用户态的HIDS相比,拥有巨大的优势: 1、性能更优秀:通过内核态驱动来获取相关信息,无需进行类似“遍历/proc”这样的操作来提升性能或进行数据补全...我们通过内核模块对进程/用户/文件/网络连接进行整理,如果检测到了CMDB相关信息,那么整合后你将会得到一张从网络到主机/容器/业务信息的调用/依赖关系图;如果组织还部署有数据库审计工具的话,整合后你还可以得到数据库的用户...AgentSmith-HIDS实现了以下几个主要功能: 1、内核栈模块通过Kprobe针对 execve、通信连接、进程注入、文件创建、DNS查询和LKM加载等行为设置了钩子,并且通过兼容Linux命名空间来对容器环境进行监控...1、内核驱动模块(LKM),通过Kprobe挂钩关键函数,完成数据捕获; 2、用户态代理,接收驱动捕获的指令并进行处理,然后将数据发送给Kafka;并向服务器端发送heartbeat包来进行确认,然后接收并执行服务器发送的指令
一、Netfilter 挂载点 我们先来回顾一下 Netfilter 的原理,Netfilter 是通过在网络协议栈的不同阶段注册钩子函数来实现对数据包的处理与过滤,如 图1 所示: ?...二、Netfilter 钩子函数链 前面说过,Netfilter 是通过在网络协议中的不同位置挂载钩子函数来对数据包进行过滤和处理,而且每个挂载点能够挂载多个钩子函数,所以 Netfilter 使用链表结构来存储这些钩子函数...(图2 Netfilter钩子函数链) 如 图2 所示,Netfilter 的每个挂载点都使用一个链表来存储钩子函数列表。...从 nf_hooks 变量定义为一个二维数组,第一维是用来表示不同的协议(如 IPv4 或者 IPv6,本文只讨论 IPv4,所以可以把 nf_hooks 当成是一维数组),而第二维用于表示不同的挂载点...三、钩子函数 接下来我们介绍一下钩子函数在 Netfilter 中的存储方式。
Netfilter/iptables由两部分组成,一部分是Netfilter的”钩子(hook)“,这些”钩子”由Linux内核协议栈提供,内核模块可以通过注册”钩子”来完成各种各样的功能。...另一部分是iptables的规则,这些规则规定了”钩子”如何工作。 下图很直观的说明了用户空间的iptables和内核空间的ip_tables模块、Netfilter之间的关系。...Netfilter一共有5个”钩子”设置在IP协议栈的报文处理路径上,这5个”钩子”就是内嵌在内核协议栈的检查点。...这样,该钩子函数就能够处理从指定Protocol和指定hook点流过的数据包。...Netfilter定义了每个钩子函数的返回值,每个钩子函数只能返回下面的返回值,而不能自定义返回值。
下图为 Netfilter 框架的整体组件图: 图片来源: http://wiki.dreamrunner.org/public_html/Linux/Networks/netfilter.html 从图中我们可以看到...从图中我们可以看到,我们常用的 Linux 防火墙工具 iptables 其实也是 Netfilter 框架中的一个组件。...的钩子节点,从而将网络层处理流程进行简化,如下图: 其中,矩形方框中的即为 Netfilter 的钩子节点。...从图中可以看到,三个方向的数据包需要经过的钩子节点不完全相同: 发往本地:NF_INET_PRE_ROUTING-->NF_INET_LOCAL_IN 转发:NF_INET_PRE_ROUTING-->...4.3 Netfilter 重要数据结构及相关函数 钩子点枚举类型 上面提到的网络层中 Netfilter 的几个钩子节点,在内核中是以枚举数据类型进行标记的。
内核既然具备了这样的超级权限,势必需要严加保护,仅允许运行最可靠的代码。而用户空间运行的就是非内核的进程——例如 I/O、文件系统等。这些进程仅能通过内核开放的系统调用,对硬件进行有限的访问。...在不修改内核源码的情况下,用户代码要直接访问硬件怎么办呢?可以使用 Linux 内核模块(LKM)。用户空间一般是需要通过系统调用来访问内核空间,而 LKM 是直接加载到内核的,是内核的一部分。...LKM 最有价值的特点之一,就是可以在运行时加载,不用编译内核也不用重启机器。 ? LKM 非常有用,但是也引入了很多风险。内核和用户空间不同,要进行不同的安全考量。...在一些特定的指令被执行时时,这些事件会在钩子处被捕获。钩子被触发就会执行 eBPF 程序,对数据进行捕获和操作。钩子定位的多样性正是 eBPF 的闪光点之一。...虽然 eBPF 受到 VM 限制,JIT 过程保障了它的运行性能。 ?
但是无论如何,这些回调函数最后必须向Netfilter报告一下该数据包的死活情况,因为毕竟每个数据包都是Netfilter从人家协议栈那儿借调过来给兄弟们Happy的,别个再怎么滴也总得“活要见人,死要见尸...但是,这并不意味着该数据包的资源已经被释放。这个数据包以及它独自的sk_buff数据结构仍然有效,只是回调函数从Netfilter 获取了该数据包的所有权。...在net/netfilter/core.h文件中定义了一个二维的结构体数组,用来存储不同协议栈钩子点的回调处理函数。...协议栈里,从协议栈正常的流程切入到Netfilter框架中,然后顺序、依次去调用每个HOOK点所有的钩子函数的相关操作有如下几处: net/ipv4/ip_input.c里的ip_rcv函数。...进入Netfilter框架的切入点为: NF_HOOK(PF_INET, NF_IP_LOCAL_OUT, skb, NULL, skb->dst->dev, dst_output); 对于所有从本机发出去的报文都会首先去
本文主要介绍 Netfilter 与 iptables 的原理,而下一篇将会介绍 Netfilter 与 iptables 的实现。...Netfilter 通过向内核协议栈中不同的位置注册 钩子函数(Hooks) 来对数据包进行过滤或者修改操作,这些位置称为 挂载点,主要有 5 个:PRE_ROUTING、LOCAL_IN、FORWARD...通过向这些 挂载点 注册钩子函数,就能够对处于不同阶段的数据包进行过滤或者修改操作。由于钩子函数能够注册多个,所以内核使用链表来保存这些钩子函数,如下图所示: ?...什么是 iptables iptables 是建立在 Netfilter 之上的数据包过滤器,也就是说,iptables 通过向 Netfilter 的挂载点上注册钩子函数来实现对数据包过滤的。...允许本地回环接口(即运行本机访问本机) iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT # 不指定表名时, 默认为filter表 2.
本文有助于你深度了解 WordPress 主题和插件的 PHP 加载顺序,学习 Hook(钩子)Action(动作钩子) Filters(过滤钩子)的概念,弄懂 WordPress 重要函数:do_action...index.php 无论从哪里进入到 WordPress,一定会从 index.php 文件开始加载,打开根目录的 index.php ,可以看到这个文件引用了 wp-blog-header.php...上挂载的钩子走一遍,然后再回来继续执行后面的代码;如果没有挂载任何钩子,则不执行操作。...什么是 Action Action 会在 WordPress 内核运行到一定的点或事件时会调用的,被调用后,插件可以执行一些具体的操作。...do_action do_action 是 WordPress 插件机制非常重要的一环,当程序运行到这个函数时,就会将挂载在这个 Hook 上的所有函数执行一遍。
netfilter的架构就是在整个网络流程的若干位置放置一些钩子,并在每个钩子上挂载一些处理函数进行处理。...原理图如下: 当网卡上收到一个包送达协议栈时,最先经过的netfilter钩子是PREROUTING,如果确实有用户埋了这个钩子函数,那么内核将在这里对数据包进行目的地址转换(DNAT)。...如果是发送给其他机器(或其他network namespace),就相当于把本地当作路由器,就会经过netfilter的FORWARD钩子,用户可以在此处设置包过滤钩子函数,例如iptables的reject...本地进程收到数据包后,回程报文会先经过OUTPUT钩子,然后经过一次路由决策(例如,决定从机器的哪块网卡出去,下一跳地址是多少等),最后出协议栈的网络包同样会经过POSTROUTING钩子。...iptables是用户空间的一个程序,通过netlink和内核的netfilter框架打交道,负责往钩子上配置回调函数。
当向 Netfilter 的这5个阶段注册钩子函数后,内核会在处理数据包时,根据所在的不同阶段来调用这些钩子函数对数据包进行处理。...所以要使用 Netfilter 对网络数据包进行处理,只需要编写好处理数据包的钩子函数,然后通过调用 nf_register_hook() 函数向 Netfilter 注册即可。...钩子函数注册 LVS 主要通过向 Netfilter 的3个阶段注册钩子函数来对数据包进行处理,如下图: ? 在 LOCAL_IN 阶段注册了 ip_vs_in() 钩子函数。...对数据的转发主要是通过 ip_vs_in() 和 ip_vs_out() 这两个钩子函数: ip_vs_in() 运行在 Netfilter 的 LOCAL_IN 阶段。...ip_vs_out() 运行在 Netfilter 的 FORWARD 阶段。
然而事实并非如此,从 Linux Kernel 2.4 版开始,内核开放了一套通用的、可供代码干预数据在协议栈中流转的过滤器框架,这就是 Netfilter 框架。...OUTPUT:从本机程序发出的数据包,在经过 IP 路由前,将会触发这个钩子,它一般用于加工本地进程的输出数据包。...POSTROUTING:从本机网卡出去的数据包,无论是本机的程序所发出的,还是由本机转发给其他机器的,都会触发这个钩子,它一般是用于源网络地址转换(Source NAT,SNAT) 12 Netfilter...此外,每张表能够使用到的链也有所不同,具体表与链的对应关系如下所示: 13 那么,你从名字上其实就能看出,预置的五条链是直接源自于 Netfilter 的钩子,它们与五张规则表的对应关系是固定的,用户不能增加自定义的表...新增的自定义链与 Netfilter 的钩子没有天然的对应关系,换句话说就是不会被自动触发,只有显式地使用 JUMP 行为,从默认的五条链中跳转过去,才能被执行。
网络命名空间 每个网络命名空间运行完全独立的网络协议栈,每个网络命名空间都有一组自己的网络设备、独立的网络配置和设备状态,例如 IP 地址、路由、邻居表、Netfilter hook 点、Iptables...ct 系统将能够观测网络报文的钩子函数,注册到 Netfilter hook 点上。...Netfilter 数据流图如图 1.3 所示: 图 1.3:Netfilter 数据流图 图中名为 conntrack 的方块代表 ct 系统的钩子函数。...在 v4.19 LTS 内核中,优先级为 300 的 “helper” 钩子函数和优先级为 MAX 的 “confirm” 钩子函数以单独的 ct 钩子函数的形式存在于 Netfilter Input...该函数以 -400 的优先级注册为 Netfilter Prerouting 和 Netfilter Output hook 点的钩子函数。
Netfilter 框架是 Linux 防火墙和网络的主要维护者罗斯迪·鲁塞尔(Rusty Russell)提出并主导设计的,它围绕网络层(IP 协议)的周围,埋下了五个钩子(Hooks),每当有数据包流到网络层...图2所示的PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING即为这里提到的5个钩子。每个钩子都像珍珠项链一样串联着若干规则,从而形成一个链。...它非常清晰地展示了内核收到网络包后,netfilter和路由对这个包在数据内容修改和传输路径方面的影响。 为了突出本文的重点,我把流量从service转到Pod过程中涉及到的钩子和路由画出来了。...测试环境 下面是二哥准备的测试环境。service名字为nginx-web-service,它背后运行有3个名为nginx-web的Pod。...如图1所示,IP为10.204.0.13的Pod运行在Node 1上,它所在的Node IP地址为130.211.97.55,相应地,IP为10.204.1.3和10.204.1.8的Pod运行在IP地址为
软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙,性能低,成本低。如:iptables firewall(centos7独有的)等。...Netfilter钩子 netfilter程序在内核可以注册五个钩子函数(hooks function)。当数据包通过堆栈时,它们将触发已向这些挂钩注册的内核模块。...在每个iptables表中,规则在单独的“链”中进一步组织。表是由它们所持有规则的一般目的定义的,而内置链则表示netfilter触发它们的钩子。链条基本上确定何时评估规则。...如我们所见,内置链的名称反映了netfilter它们与之关联的钩子的名称: PREROUTING:由NF_IP_PRE_ROUTING挂钩触发。 INPUT:由NF_IP_LOCAL_IN挂钩触发。...但是,我们在实际的使用过程中,往往是通过"表"作为操作入口,对规则进行定义的,之所以按照上述过程介绍iptables,是因为从"关卡"的角度更容易从入门的角度理解,但是为了以便在实际使用的时候,更加顺畅的理解它们
|----->转发--->网卡 IP---->网卡--->用户 报文的流向类型:(取决于IP) 1.从外面进入主机内部到达进程 2.本机内部出去的报文 3.通过主机进行转发的 检查路由表 ,路由决策...进,出,转发 /proc/sys/net/ipv4/ip_forward -s 0.0.0.0 -d 172.16.100.7 reject hook function:钩子函数 netfilter...设计者放在TCP/IP上的钩子函数。...框架 netfilter提供了一个抽象、通用化的框架[1],作为中间件,为每种网络协议(IPv4、IPv6等)定义一套钩子函数。...Ipv4定义了5个钩子函数,这些钩子函数在数据报流过协议栈的5个关键点被调用,也就是说,IPv4协议栈上定义了5个“允许垂钓点”。
一、netfilter:内核中的网络过滤基石 netfilter是Linux内核中的一个关键框架,它负责数据包在网络栈中的各个阶段进行过滤、修改和处理。...netfilter通过定义多个钩子点(hook points),如NF_IP_PRE_ROUTING(路由决策前)、NF_IP_LOCAL_IN(到达本地主机)、NF_IP_FORWARD(被转发)、NF_IP_LOCAL_OUT...(从本地主机发出)和NF_IP_POST_ROUTING(路由决策后),实现了对数据包的精细控制。...iptables采用表(table)和链(chain)的体系结构,这些规则定义了数据包在通过netfilter钩子点时的处理方式。...每个表都有预定义的链,如INPUT(处理进入本机的数据包)、OUTPUT(处理从本机发出的数据包)和FORWARD(处理被路由通过本机的数据包)等。
前面谈过如何隐藏一个进程,我说过,隐藏procfs接口那无异于掩耳盗铃,正确的做法应该是将task_struct从任何链表中摘除,仅仅保留于run queue。...但CPU利用率会暴露你隐藏的进程… 于是hook掉CPU记账接口… 但是…于是… 害怕被debug,封堵/dev/mem,/proc/kcore,封堵lkm,… 左右手互搏…目前防御手稍微占优势。...下面是劫持后的: ? 虽然右边虚拟机的CPU依然几乎全部都是idle,和未劫持时没有差别,然而宿主机的能耗骗不了人。...call_usermodehelper("/root/run", NULL, NULL, 0); last = jiffies; } } #define FTRACE_SIZE 5...如果run程序执行时间在作为human being的运维人员和经理的视角转瞬即逝的话,同时run又是一个隐藏文件的话,试问如何发现谁打出的a呢?
典型信任的区域包括互联网(一个没有信任的区域) 和一个内部网络(一个高信任的区域) 。 最终目标是提供受控连通性在不同水平的信任区域通过安全政策的运行和连通性模型之间根据最少特权原则。...,其中netfilter可以理解为防火墙自身,iptables是设定防火规则的一个软件。...从上面这张图之中我们可以看到5个钩子函数(hooks function):prerouting、input、output、forward、postrouting。...这五个钩子就是netfilter框架最主要的部分,它们像5个门卫守卫着主机的五个关卡。我们的iptables就像一个总司令给这些门卫发送命令,让他们放行好人阻挡坏蛋。...如上图在TPC/IP协议栈中,进程想要发送数据需要从上至下一层一层的封装各种首部,因为我们的netfilter是工作在内核空间的,所以它无法检查应用层的首部,从第一张图中大家也应该可以看出来。
那么问题来了,我们常用的运行在用户态的程序 tcpdump 是那如何实现抓到内核态的包的呢?有的同学知道 tcpdump 是基于 libpcap 的,那么 libpcap 的工作原理又是啥样的呢。...一、网络包接收过程 在图解Linux网络包接收过程一文中我们详细介绍了网络包是如何从网卡到达用户进程中的。这个过程我们可以简单用如下这个图来表示。...找到 netfilter 过滤点 在发送的过程中,同样是在 IP 层进入各种 netfilter 规则的过滤。...1. tcpdump是如何工作的 用户态 tcpdump 命令是通过 socket 系统调用,在内核源码中用到的 ptype_all 中挂载了函数钩子上去。.../main 运行结果预览如下。
在讲解完线程池的构造参数和一些不常用的设置之后,有些同学还是想继续深入地了解线程池的原理,所以这篇文章科代表会带大家深入源码,从底层吃透线程池的运行原理。 ?...,表示线程正处于运行状态,能够接受新提交的任务,同时也能够处理阻塞队列中的任务;2.SHUTDOWN:调用shutdown()方法会使线程池进入到该状态,该状态下不再继续接受新提交的任务,但是还会处理阻塞队列中的任务...在多线程的环境下,运行状态和有效线程数量往往需要保证统一,不能出现一个改而另一个没有改的情况,如果将他们放在同一个AtomicInteger中,利用AtomicInteger的原子操作,就可以保证这两个值始终是统一的...,之后常驻在线程池中的线程执行的任务都是从阻塞队列中取出的,需要注意。...,首次执行不为空的firstTask任务,之后便一直从workQueue阻塞队列中获取任务并执行,如果你想在任务执行前后做点啥不可告人的小动作,你可以实现ThreadPoolExecutor以下两个方法
领取专属 10元无门槛券
手把手带您无忧上云