最后防线:osquery功能与实现
2023-2-4 15:27:26 Author: 奶牛安全(查看原文) 阅读量:11 收藏

开源HIDS osquery的主机监控功能和实现原理。
osquery代码链接:osquery
osquery表结构:表结构
本文是在安装它之后,从osqueryi中的表再调研代码来获取它的实现

设备基线

对系统使用的设备建立基线,从而发现故障的设备,用于IDC机房。
不足之处:这些功能用于传统机房。对于云时代并不适用

功能实现原理
acpi设备读取/sys/firmware/acpi/tables目录
块设备通过调用udev库API读取
设备信息(设备文件,指纹,分区)通过sleuthkit第三方库读取
硬件事件通过读取udev事件
intel mei信息通过读取/dev/mei0
RAID信息(设备,特性,驱动)读取/proc/mdstat
固件信息(内存阵列和地址映射,内存设备和地址映射,故障信息,OEM特征,SMBIOS),设备平台信息读取/sys/firmware/dmi/tables/DMI/sys/firmware/efi/systab
PCI设备读取/usr/share/misc/pci.ids/usr/share/hwdata/pci.ids/usr/share/pci.ids
智能卡信息通过smartmontools库获取
USB信息通过udev库读取
IO设备的内存映射读取/proc/iomem

系统基线

建立系统基线,获取系统基本信息,如CPU,内存,磁盘,分区,内核版本,加载的模块,系统运行时长,内存控制参数,系统限制,属于哪个发行版
不足之处

  1. 获取cpu寄存器列表和MSR没多少意义。除非环境需要用到一些高能计算
  2. 共享内存信息意义不大
  3. 内核信息获取不够,还需要读取/boot
  4. 内核模块获取不够,还需要读取/lib/modules的内容,确保哪些是系统加载,哪些是手动加载
  5. 自启动项,不应该读取/etc/init.d,而是读取/etc/rc.d/, 或者支持systemd
  6. 加载分区,还得读取一下/etc/fstab,确保哪些分区是系统默认加载,哪些是其它操作加载的
功能实现原理
cpu运行状态读取/proc/stat
cpu寄存器列表通过内联汇编读取cpu信息
cpu msr信息读取/dev/cpu/<id>/msr
内存信息读取/proc/meminfo
共享内存信息通过shmctl等API获取
磁盘加密使用cryptsetupy库来获取磁盘加密情况
加载的分区读取/proc/mounts
内核信息通过读取/proc/cmdline, /proc/version
内核模块通过读取/proc/modules
系统时间获取当前时间
系统启动时长调用sysinfo
系统信息(cpu个数,机器名,配置)读取/proc/cpuinfo, /etc/hostname和调用sysconf等API
系统控制配置读取/etc/sysctl.conf, /run/sysctl.d, /etc/sysctl.d,/usr/local/lib/sysctl.d, /usr/lib/sysctl.d, /lib/sysctl.d
系统限制调用getrlimit获取
发行版及版本读取/etc/os-release, /etc/redhat-release, /etc/gentoo-release
自启动项读取/etc/xdg/autostart/, /etc/init.d/
系统负载通过调用getloadavage的接口来获取

供应链基线

目前很多Linux系统安装更新软件都是通过网络安装,如果是从恶意源安装软件,就会导致安装问题
不足之处

  1. 没有把主流的Linux发行版的源包括在里面,如arch, gentoo之类,只是有centos和debian/ubuntu
  2. 没有对pip, npm之类的源建立基线
  3. 对于编辑器的一些源也没有建立基线
功能实现原理
apt源读取/etc/apt/sources.list文件, /etc/apt/sources.list.d目录,/var/lib/apt/lists/缓存目录
yum源通过读取/etc/yum.repos.d下的repo文件

软件基线

获取所有安装的软件名称,版本,建立软件包管理的基线,检测恶意软件和漏洞
不足之处

  1. 包管理软件可能由于发行版不同,版本不同,需要有不同的信息采集方式
  2. 没有arch的软件包管理
  3. python包管理没有包括通过virtualenv方式安装的包
功能实现原理
atom编辑器插件列表读取每个用户主目录.atom/packages下的所有package.json
deb包列表读取/var/lib/dpkg
npm包信息读取/usr/lib/,用户主目录node_modules下面package.json
gentoo包管理portage(关键字,列表,编译配置)读取/etc/portage/package.keywords,/etc/portage/package.mask/etc/portage/package.unmask,/var/db/pkg/var/lib/portage/world
python包管理读取/usr/local/lib/python/dist-package, /usr/local/lib/python/site-packages, /usr/lib/python/dist-packages, /usr/lib/python/site-packages, /Library/Python/*/site-packages
rpm包管理调用rpmlib库获取信息

配置基线

对系统配置建立基线,从而发现恶意篡改或不当配置的风险
不足之处

  1. /etc/ld.so.conf, /etc/ld.so.conf.d/没有监控,无法发现恶意软件注入的风险
  2. /etc/default没有监控,无法发现软件默认配置的缺陷
  3. /etc/sysconfig没有监控,无法发现网络,路由,防火墙和一些基本服务的配置缺陷
  4. /etc/security, /etc/login.defs没有监控,对用户管理,登录管理的默认限制进行采集
  5. /etc/fstab没有采集,无法发现是否默认加载NFS或分区加载选项错误
  6. /etc/shells没有监控,无法发现系统配置多少shell给用户登录
  7. 监控了一些小众的软件配置,对web服务,DB服务,MQ服务的配置却没有监控
功能实现原理
augeas(某配置平台)读取/usr/share/osquery/lenses目录
主机列表读取/etc/hosts
协议列表读取/etc/protocol
服务端口映射表读取/etc/services
prometheus(另一个监控软件)配置读取genPrometheus的配置文件

用户基线

建立用户基线,获取用户列表,组列表,权限列表,登录记录和操作记录,登录软件的配置
不足之处

  1. 使用audit,可能会带来性能影响
功能实现原理
authorized  keys读取用户主目录.ssh/authorized_keys.ssh/authorized_keys2文件
ssh配置读取/etc/ssh/ssh_config,用户主目录.ssh/config
已知主机通过读取用户主目录的.ssh/known_hosts
用户ssh密钥读取用户主目录下的.ssh
用户列表通过调用getpwnam等API获取
shadow列表通过getspnam等API获取
组信息通过getgrent等API获取组信息
用户组通过getpwent等API获取
sudo权限读取/etc/sudoers
当前登录用户通过getutxent接口获取
用户登录记录通过调用getutxent之类API获取
命令历史通过读取用户主目录的.bash_history, .zsh_history, .zhistory, .history, .sh_history, .bash_sessions下的\*.history
用户事件通过audit事件获取

网络基线

收集各种网络信息,建立网络基线,可用于发现高危端口,外连行为,arp污染,DNS劫持,资产发现

功能实现原理
网卡详细信息(列表,ipv4地址,ipv6地址)通过getifaddrs API获取网卡信息
arp缓存读取/proc/net/arp
路由信息通过netlink获得路由信息
iptables规则通过libiptc库来获取iptables规则
dns信息使用resolv API获取dns信息
socket监控通过读取audit事件
端口监听通过查看每个进程的/proc/<pid>/fd, /proc/<pid>/net/tcp,/proc/<pid>/net/tcp6, /proc/<pid>/net/unix
BPF socket监控通过第三方库tob:ebpfpub来获取
链路发现协议(LLDP)邻居通过调用lldpctl的库来实现主机发现
curl证书通过curl证书来确定证书有效期
curl信息通过curl进行服务发现

服务基线

对系统服务建立基线,以期发现恶意服务
不足之处

  1. 不支持systemd
  2. 不支持/etc/init.d
功能实现原理
crontab定时任务读取/etc/crontab, /etc/crontab.d, /var/spool/cron, /var/spool/cron/crontabs下的内容

浏览器基线

建立浏览器插件基线,防止信息被窃取
不足之处

  1. 兼容性问题,不同版本,插件信息目录可能不一样
功能实现原理
chrome插件,chrome插件内容脚本通过用户目录chrome数据插件
firefox插件读取用户主目录mozilla/firefox/extensions.json
opera插件检测用户主目录下config/opera/Extensions

云基线

对云服务建立基线,在现在混合云的环境,可以更好地监控云环境。
不足之处

  1. 对腾讯云,阿里云,华为云,天翼云之类没有支持
  2. 对AWS, Azure云的实例支持也不多
功能实现原理
azure实例(元数据,标签)连接到azure服务读取
carbon black云原生读取/var/lib/cb/sensor.id/var/lib/cb/sensorsettings.ini
AWS EC2服务(元数据,标签)连接AWS服务获取

进程基线

对进程建立基线,检测恶意进程和恶意执行文件
不足之处

  1. 对于docker启动的进程,没有建立docker<->process的从属关系
  2. 对于系统服务启动的里程,也没有建立service<--->process的从属关系
  3. 对于进程执行文件和库文件,都没有取md5,无法检测恶意篡改的风险
  4. 读取/proc/<pid>的方式,无法检测隐藏进程
  5. 没有采集进程的线程数目
  6. 没有采集进程本身的资源限制
  7. 使用eBPF和audit会对生产环境有性能影响
功能实现原理
进程列表读取/proc/<pid>
进程环境变量读取/proc/<pid>/environ
进程命名空间读取/proc/<pid>/ns目录
进程内存映射读取/proc/<pid>/maps
进程的句柄(打开文件,socket,管道)读取/proc/<pid>/fd目录
进程事件读取audit日志
BPF进程监控通过第三方库tob:ebpfpub来获取

文件基线

建立文件基线,获取文件指纹,文件类型,执行文件和库的结构及文件变动,以期发现恶意文件,恶意文件伪装,恶意篡改
不足之处

  1. 这些操作非常耗时,对IO消耗很大,会对系统性能有影响。
  2. 文件capabilities的信息非常鸡肋,应用场景非常有限
功能实现原理
文件元数据通过stat读取宿主机和容器的文件元数据
文件capabilities信息读取文件的capabilities属性
文件类型(magic)使用libmagic
文件指纹对文件进行hash, 取md5,sha256, sha512
ELF文件(执行和库)使用libelfin库读取elf文件,读取elf头部,segment, section, dynamic segment
文件变动通过inotify监控文件变动

容器基线

建立容器的基线,避免出现容器打开高危端口,或者容器成为横向移动跳板,或者“超级docker“导致逃避控制宿主机的情况。
Docker的采集方式都是通过restful接口。
不足之处

  1. 获取docker各种信息都通过连接dockerd的unix socket,从而会自动启动dockerd服务,这个服务会启动那些自启动的docker容器,从而抢占系统资源
功能实现原理
docker信息使用/info
docker镜像(列表,层,标签)使用/images/json
docker卷(列表,标签)使用/volumes
docker网络(列表,标签)使用/networks
docker容器(列表,标签,网络,端口,加载分区)使用/containers/json
docker容器状态使用/containers/<id>/stats
docker容器进程列表使用/containers/<id>/top
docker容器文件变动使用/containers/<id>/changes
lxd(linux containers,另一种容器)也是通过restful接口来取各种数据,由于用得少,忽略

安全基线

对一些系统安全类的监控服务的配置和事件建立基线,以期发现异常事件
不足之处

  1. 会对系统性能会有冲击
功能实现原理
apparmor配置读取/sys/kernel/security/apparmor/policy/profiles目录
apparmor事件通过netlink读取audit事件
selinux配置读取加载的selinuxfs文件系统,根据里面的路径来获取配置
selinux事件读取audit事件
yara规则通过调用yara的API获取配置
yara事件通过调用audit的事件,对事件涉及的文件通过yara规则检测
suid执行文件权限读取/bin, /sbin/, /usr/bin,/usr/sbin, /usr/local/bin, /usr/local/sbin/, /tmp

系统日志

获取系统日志。上面的基线和监控都是基于程序行为,但对程序内部产生的事件,往往是没有的,需要加上对系统日志的采集,从而获得各种服务或程序运行时出现的事件
不足之处

  1. syslog实现方式有问题,应该是通过读取/dev/log
功能实现原理
syslog通过/var/osquery/syslog_pipe来获取syslog事件

暗号:f3645

转发,点赞,点“在看”,一键三连,谢谢!


文章来源: http://mp.weixin.qq.com/s?__biz=MzU4NjY0NTExNA==&mid=2247488164&idx=1&sn=17fad9b3d5578456128c0ef0f42f2d8f&chksm=fdf979b1ca8ef0a77278533ed0857d394bcd99120b2b9b1b32703a41a067d5de0b4620c464f5#rd
如有侵权请联系:admin#unsafe.sh