导语:这篇文章的目的是解释使用OpenBSM库对macOS进行实时审核,以检测哪些文件是打开的。每天我们在计算机上安装一些程序或应用程序,它们基本上可以访问大多数文件。
介绍
这篇文章的目的是解释使用OpenBSM库对macOS进行实时审核,以检测哪些文件是打开的。每天我们在计算机上安装一些程序或应用程序,它们基本上可以访问大多数文件。由于很多原因,实时审核可能很有用:也许您只是想知道某些应用程序打开哪些文件,或者某些恶意进程正在读取您的个人文档,或者打开您的照片。也许你不好奇,但你只是想检测可能的ransomware活动来阻止他们。
情景是无限的
另一个常见的情况是,您可以通过检查对敏感文件的修改和访问来使用实时审核来构建和运行您的个人基于主机的IDS。
在这篇博文中,我将仅仅说明OpenBSM如何进行这种审计,为读者提供一些其他资源进一步的“调查”,并发布一个基本实现的小型概念验证。
OpenBSM
根据Trusted BSD项目,OpenBSM是由McAfee Research为Apple Computer创建的Sun的BSM(基本安全模块)事件审计文件格式和API的开源实现。
该实现提供了一组用于管理审计记录的系统调用和库接口,还包括一些命令行工具。
从/etc/security中的配置文件可以看出,默认情况下,macOS使用两个标志,lo和aa来记录/var/audit/目录下的Login/Logout(lo)和Authorization/Authentication(aa)事件。
$ cat /etc/security/audit_control # # $P4: //depot/projects/trustedbsd/openbsm/etc/audit_control#8 $ # dir:/var/audit flags:lo,aa minfree:5 naflags:lo,aa policy:cnt,argv filesz:2M expire-after:10M superuser-set-sflags-mask:has_authenticated,has_console_access superuser-clear-sflags-mask:has_authenticated,has_console_access member-set-sflags-mask: member-clear-sflags-mask:has_authenticated
我们可以从位于同一目录的另一个文件中获取有关这些标志的一些信息以及关于所有可用的标志:
$ cat /etc/security/audit_class # # $P4: //depot/projects/trustedbsd/openbsm/etc/audit_class#6 $ # 0x00000000:no:invalid class 0x00000001:fr:file read 0x00000002:fw:file write 0x00000004:fa:file attribute access 0x00000008:fm:file attribute modify 0x00000010:fc:file create 0x00000020:fd:file delete 0x00000040:cl:file close 0x00000080:pc:process 0x00000100:nt:network 0x00000200:ip:ipc 0x00000400:na:non attributable 0x00000800:ad:administrative 0x00001000:lo:login_logout 0x00002000:aa:authentication and authorization 0x00004000:ap:application 0x20000000:io:ioctl 0x40000000:ex:exec 0x80000000:ot:miscellaneous 0xffffffff:all:all flags set
由于我们要监视进程访问哪些文件,所以我们可以使用OpenBSM提供的功能和日志来构建我们自己的审计程序,或只显示相关信息。为了仅审计一些信息,我们可以指定上面的一个或多个标志,例如,如果我们 要记录要打开哪个文件被读取,我们可以使用由值0x00000001标识的标志“fr”。
基本安全模块库提供了一些功能来读取这些事件并自动解析它们。详细来说,我们有4个功能来操纵和交互事件:
au_read_rec() int au_read_rec(FILE *fp, u_char **buf);
这个函数让我们从文件描述符中读取一个事件记录,并将内容放在缓冲区buf作为参数传递(必须在使用后被释放)。该函数返回读取的字节数。
au_fetch_tok() int au_fetch_tok(tokenstr_t *tok, u_char *buf, int len)
从au_read_rec获取的缓冲区包含令牌,每个令牌都是具有不同信息的结构,根据令牌id。缓冲区的第一个令牌始终是AUT_HEADER *令牌:它包含一个字段,指示缓冲区中的哪种事件。下一个令牌包含有关引发事件的进程的路径,事件感兴趣的文件的路径以及其他信息(如用户,时间戳)的信息…要使用记录读取缓冲区,我们必须获取每个令牌它依次使用au_fetch_tok
au_print_tok() void au_print_tok(FILE *outfp, tokenstr_t *tok, char *del, char raw, char sfrm)
现在我们有一个令牌,我们可以在文件描述符上打印。
au_print_flags_tok() void au_print_flags_tok(FILE *outfp, tokenstr_t *tok, char *del, int oflags)
打印令牌的另一个功能是使用au_print_flags_tok来接受另外一个参数来指定不同的输出格式(XML,raw,short ..)。
这些功能的典型用途可以是:
1. 通过fopen()打开文件(通常是审计管道),并通过调用au_read_rec()从文件的缓冲区打印记录。 2. 通过调用缓冲区上的au_fetch_tok(),为每个记录读取每个令牌 3. 调用au_print_flags_tok()将每个令牌打印到输出流,如stdout。 4. 释放缓冲区 5. 关闭打开的文件
只有一个问题,我发现在分析这些事件提供的功能:au_print_tok()和au_print_flags_tok()的输入是从令牌au_fetch_tok() ,有没有办法解析或过滤它,有一个更好的,更描述输出令牌。我的解决方案是绕过两个函数,并手动解析令牌,以获得最有趣的属性。但是如何做这个令牌?如前所述,每个事件都是由一些令牌组成的。令牌只是一个C结构,它包含一些根据令牌ID的信息。例如,读取事件具有 3个主令牌:AUT_HEADER,AUT_SUBJECT和AUT_PATH。
AUT_HEADER包含有关事件的信息。在一个读取事件中,它显示事件实际上是一个文件读取(fr)。
AUT_SUBJECT定义哪些过程引发此事件而AUT_PATH指定路线由读AUT_SUBJECT。
我们可以手动解析结构以仅打印有用的信息。
审计员
现在我们知道如何阅读我们需要知道的事件,我们可以从哪里获取实时事件。解决方案是使用名为auditpipe的特定设备,位于/dev/auditpipe中。
auditpipe是用于实时审核事件跟踪的伪设备,可以作为文件打开,并与上述4个函数一起使用以读取和解析我们的实时事件。
为了使用auditpipe,我们需要使用ioctl系统调用来配置它,以设置我们想要从管道获取哪些事件。filewatcher – 一个用于macOS的简单审核实用程序
我写了一个小实用程序来监视文件或进程活动,使用审核和我解释的功能。
您可以直接在GitHub上找到
要配置审核管道,我使用了一个这里找到的例子。
要解析令牌的结构,我使用OpenBSM的开源代码。
代码仍然很杂乱,目前的选择不是那么大,但我的目标是改进它,以便有一个全面的审计工具。目前可以指定要监视哪个进程或哪个文件。默认情况下,只显示一些事件,如打开/读/写/关闭。无论如何,可以通过选项显示所有的事件。检查帮助信息
目前,只有内部代码行的Makefile编译工具,所以你可以做,它会编译内箱文件夹。
如果要手动编译它:
gcc -lbsm filewatcher.c lib/*.c -o bin/filewatche
用法
$ sudo ./bin/filewatcher -h filewatcher - a simple auditing utility for macOS Usage: ./bin/filewatcher [OPTIONS] -f, --file Set a file to filter -h, --process Set a process name to filter -a, --all Display all events (By default only basic events like open/read/write are displayed) -d, --debug Enable debugging messages to be saved into a file -h, --help Print this help and exit