陌陌操作审计体系分享之 Linux

无风不起浪味仙

落地能占半边天

L0siNcerE  && zilos

没错,今天不再是 沃·兹基硕德小贴士 ,而是带来此次分享的两位同 学L0siNcerE && zilos的小贴士

0x00 前言

随着公司业务不断发展,员工和IDC服务器数量逐渐增多,不规范操作的问题也日益突出。这使得我们不得不思考如何能够及时发现不规范操作避免引发事故以及如何在遇到事故时可以快速定位原因。 陌陌安全经过充分调研分析后落地了一套操作审计系统 目前涵盖系统和网络两个大方向:系统包括有操作系统(Linux、Windows)、虚拟化(Docker)、带外管理、数据库;网络方面则是不同厂商的交换机、路由器等设备。本次分享的主要内容是Linux操作系统审计部分。

0x01 需求分析

现在来整理下需求,整体功能上我们期望操作审计系统能够:

  • 实时跟踪记录用户在系统中执行的所有命令

  • 非特权用户无法跳出审计,且至少能感知特权用户绕过或篡改审计机制

  • 具备对敏感数据脱敏的能力

  • 具备危险命令报警的能力

而能够实时跟踪记录用户在系统中执行的所有命令的前提就是选取一个合适的“采集器”,对这个“采集器”,我们又提出一些要求

  • 灵活,容易部署

  • 轻量,占用系统资源少

  • 兼容性上,由于当前系统单一,如果未来引入新系统能够快速修改出兼容版本即可

  • 不修改内核

0x02 采集器选型

经过一段时间的调研,对比总结了几种常见的方案:

1)命令记录转发

通过修改shell源码或配置文件的方式将history中的记录转到syslog服务器来进行命令审计。

2)旁路系统调用/钩子

还有一种办法是通过sys_call_table来旁路execve系统调用,或是利用底层调用里预先埋设的钩子函数对即将执行的命令进行监控或操作,此类操作通常处于内核层。

3)录像

直接录屏,所有操作一目了然。

录像作为审计手段来讲比较直观,但由于产生的审计信息是一些协议/视频数据,不利于后期的分析处理,因此作为最后的选项。

从效果来讲,思路2)无疑是最好的:覆盖全面、控制性强。但由于其深处内核层,其研发成本明显高于其他方法,且一旦出现问题,对业务的影响可能是致命的。从更新维护的角度来说,这种方法也并不便利。

几种思路与history功能效果的对比如下:

综合对以上三种思路的分析,最终选择了通过修改shell配置文件的方式(命令记录转发)来收集命令。该方案(参考原文:http://www.pointsoftware.ch/de/howto-bash-audit-command-logger )利用了bash的trap DEBUG和PROMPT_COMMAND特性,做到对命令的实时记录,且可以通过声明只读环境变量的方式增加被绕过的成本。

0x03 采集器功能

为满足当前的审计需求,我们对采集器做了一些优化,使其能够具备以下功能来应对各种命令记录的场景。

1)用户身份识别
who -mu命令可以记录下当前登录的用户,不会因su命令而改变;而环境变量$USER存有当前执行命令的用户身份。两者的结合可以很好地对当前命令的执行人与执行身份进行辨别。

2)记录非交互式shell命令

ssh远程执行、vim内执行的命令等,都是调用了非交互式shell来读取输入执行的。因此需要在配置文件中添加两段脚本代码,第一段是:

#for non-interactive shell
if [[ -n $BASH_ENV ]]
then
  declare -x BASH_ENV="$BASH_ENV:$AUDIT_FILE"
else
  declare -x BASH_ENV=$AUDIT_FILE
fi

在非交互式shell中,默认是不会加载配置文件的。但最后会去搜索BASH_ENV变量,如果这个变量存在,则会加载其指定的文件。第二段是:

#audit non-interactive shell
if [[ ! $- =~ "i" ]];
then    #non-interactive shell then do
  AUDIT_CMD=" 0000  $(/bin/date +%F\ %H:%M:%S) :: $CMDLINE"
  LOGGER
fi

这一段其实是针对非交互式shell进行的命令记录。通过读取/proc/pid/cmdline文件,获取当前shell所执行的命令。

3)实时记录

通过trap DEBUG可以很好的及时记录准备执行的命令,因为它会在命令执行前被调用。但有个小插曲,如果直接使用trap 'AUDIT_DEBUG' DEBUG来调用,会使环境变量$(记录上一条命令的最后一个参数)失效,因此需要加入"$"。

function AUDIT_DEBUG() {
  ...
  local AUDIT_CMD="$(history 1)"                            #current history command
  AUDIT_HISTLINE=$(/bin/echo $AUDIT_CMD |/bin/awk '{print $1}')
  if ...  #avoid logging unexecuted commands after 'ctrl-c', 'empty+enter', or after 'ctrl-d'
    LOGGER
  fi
}
...
declare -rx PROMPT_COMMAND="[ -z \"\$AUDIT_INCLUDED\" ] && source $AUDIT_FILE;"
trap 'AUDIT_DEBUG "$_"' DEBUG

LOGGER是最终记录命令的代码,使用的logger命令,具体级别配置等信息可以自行参考相关文章,按需使用。

/bin/logger -p local6.notice "$AUDIT_STR $PWD ${AUDIT_CMD}"

4) 记录未分配伪终端情况下的命令

上述依赖于history 1来记录的方式有一个弊端:在未分配伪终端(分辨方法:输入tty,如果回显not a tty,则是未分配伪终端的情况)的情况下,history不会有记录。因此,需要在配置文件中加入如下语句:

if [[ ! "$(tty)" =~ "/dev" ]]
then
  set -o history
fi

set -o history就是开启当前环境的history功能。通过适当的条件判断后,也可以在shell脚本执行的环境下开启history来记录在脚本内执行的命令。但这么做会改变脚本执行时的环境,可能会造成一些意料之外的影响。

5)其他

还有一些其他场景,如在命令行下直接调用sh。sh是bash符合POSIX标准的一种特殊模式,通常不会调用bashrc等文件。但是除了非交互且非登录式的sh以外,sh会加载$ENV所指向的文件。因此需要声明ENV变量指向我们的配置文件。

declare -rx ENV="/etc/secaudit_bash"

无论是bash还是sh,调用时均可以通过--norc来指定不加载配置文件。因此需要在PROMPT_COMMAND中“手动”加载配置文件。

declare -rx PROMPT_COMMAND="[ -z \"\$AUDIT_INCLUDED\" ] && source $AUDIT_FILE;

0x04 数据处理

由于很多开发人员习惯在命令中直接输入认证用的凭据,如使用mysql连接数据库或是调试api中用到的密码、token等等,需要在采集后进行统一的脱敏处理。

脱敏后会对收集到的命令数据按如下方式进行分类:

分类的基本原则是风险程度。通过入库前的分类,可以快速发现审计过程中关注的风险点。对于高风险的行为,可以通过消息工具发出报警,及时感知并作出应对。

其中“数据库相关”涉及对数据库的连接、数据导出及违规使用客户端等行为。由于审计系统处于用户层,无法避免root用户对审计的绕过行为,因此“审计绕过相关”包含了这部分的行为,如对配置文件的更改/删除、对所依赖的syslog服务的操作、对审计日志的更改等等。其余各项也从对线上服务的影响、数据泄露风险及简单的入侵行为发现等方面对收集到的命令数据进行了分类。

通过对Linux操作审计数据的分类处理,还可以对其他层面的审计起到辅助作用。在实际使用过程中发现,每天会产生大量的数据库连接与导出操作,除dba同学的日常运维外,也有相当一部分是业务同学的。因此对于这部分可以设置特定条件后筛选出来,检索使用时可以根据实际情况快速定位,提高工作效率。同时该采集器稍加修改后,即可适配Docker环境。产生的审计数据与Linux系统层面的格式一致,可在数据处理阶段一并操作,达到了事半功倍的效果。最终结合其他层面的审计工作,有了以下成果。

0x05 可视化

为了增强可阅读性并提高检索效率,选取了陌陌安全soc和kibana作为审计数据的可视化平台。soc可以根据需要自定义展示,提供更良好的阅读性,在日常工作中可以快速发现问题。而kibana提供了强大而友好的检索能力,可以在发现问题后进行精准定位。

以kibana为例,效果如下。这里为了方便,只展示了部分字段,实际使用中可按需设置。

0x06 结语

综上所述,操作审计的整体流程如下:

除上文已提到的各部分外,以kafka和es作为整体流程中的分发和存储模块,将各部分流程衔接,形成完整的审计系统。采集部分涉及到的配置代码及使用方式可参见github链接:https://github.com/momosecurity/cornerstone/blob/master/momosec_bashrc或点击阅读原文,欢迎大家参与讨论,共同完善。

陌陌安全

陌陌安全致力于以务实的工作保障陌陌旗下所有产品及亿万用户的信息安全,以开放的心态拥抱信息安全机构、团队与个人之间的共赢协作,以自由的氛围和丰富的资源支撑优秀同学的个人发展与职业成长。

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章