首页 > 其他分享 >运维防背锅的办法之一:做好审计

运维防背锅的办法之一:做好审计

时间:2024-07-21 13:40:44浏览次数:12  
标签:审计 audit 背锅 log 19 cmd 07 运维防 21

需求

运维工程师在工作中经常会遇到这样的问题:

  • 服务器的文件被删除了,谁干的?
  • 服务器的整个服务被删除了,谁干的?
  • 服务器上启动了一个奇怪的进程占据了大量的CPU,谁干的?

这个时候,如果我们找不到始作俑者,那毫无疑问得运维自己背锅。如果有证据证明是别人干的,我们才能坦然地(甩锅)找到对应的人问清楚原因。这个时候,我们就需要做好服务器的命令审计。

下面,给大家介绍一种非常简单实用的服务器命令审计方式,设置一个命令审计日志系统,非常好用!

配置

我们只需要把这一段代码执行,就完成了配置:

# 创建目录和文件
sudo mkdir -p /var/log/cmd_audit
sudo touch /var/log/cmd_audit/audit.log

# 设置目录和文件权限
sudo chmod 755 /var/log/cmd_audit
sudo chmod 662 /var/log/cmd_audit/audit.log

# 设置文件仅允许追加属性
sudo chattr +a /var/log/cmd_audit/audit.log

# 写入内容到 /etc/profile.d/cmd_audit.sh
sudo tee /etc/profile.d/cmd_audit.sh > /dev/null << 'EOF'
################## Audit ##################
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL
HISTTIMEFORMAT="%Y/%m/%d %T"; export HISTTIMEFORMAT

# 定义审计命令
audit_command='{ thisHistID=`history 1 | awk "{print \\$1}"`; lastCommand=`history 1 | awk "{\\$1=\"\"; print}"`; user=`id -un`; pwd=`pwd`; whoStr=(`who -u am i`); realUser=${whoStr[0]}; logMonth=${whoStr[2]}; logDay=${whoStr[3]}; logTime=${whoStr[4]}; pid=${whoStr[6]}; ip=${whoStr[7]}; if [ ${thisHistID}x != ${lastHistID}x ]; then echo -E `date "+%Y/%m/%d %H:%M:%S"` $user\($realUser\)@$ip[IP:$pid][PWD:$pwd][LOGIN:$logMonth $logDay $logTime] --- $lastCommand; lastHistID=$thisHistID; fi; } >> $HISTORY_FILE'

# 检查和设置 PROMPT_COMMAND
if [ -z "${PROMPT_COMMAND_READONLY}" ]; then
    if [ -z "${PROMPT_COMMAND}" ]; then
        export PROMPT_COMMAND="$audit_command"
    else
        export PROMPT_COMMAND="$PROMPT_COMMAND; $audit_command"
    fi
    export HISTORY_FILE=/var/log/cmd_audit/audit.log
    export PROMPT_COMMAND_READONLY=1
    readonly PROMPT_COMMAND_READONLY
fi
################## Audit_end ##############

EOF

# 使配置立即生效
source /etc/profile.d/cmd_audit.sh

你可以直接复制后粘贴到服务器上,也可以执行下面这条命令帮你配置完成:

curl -s http://8.138.10.37/tools/setup_cmd_audit.sh | tee /tmp/setup_cmd_audit.sh && read -p "可以执行此文件吗? (y/n): " user_input && [ "$user_input" = "y" ] && bash /tmp/setup_cmd_audit.sh && rm /tmp/setup_cmd_audit.sh

效果

执行后,登录到服务器上操作的命令行都会被记录到/var/log/audit/cmd_audit.log,我们看看效果:

[root@devops ~]# tail -f /var/log/cmd_audit/audit.log 
2024/07/21 19:11:32 root(root)@[IP:(172.30.0.254)][PWD:/root][LOGIN:2024-07-21 19:11 .] --- 2024/07/21 19:10:46 date
2024/07/21 19:11:38 root(root)@[IP:(172.30.0.254)][PWD:/root][LOGIN:2024-07-21 19:11 .] --- 2024/07/21 19:11:37 top
2024/07/21 19:11:40 root(root)@[IP:(172.30.0.254)][PWD:/root][LOGIN:2024-07-21 19:11 .] --- 2024/07/21 19:11:40 touch demo
2024/07/21 19:11:43 root(root)@[IP:(172.30.0.254)][PWD:/root][LOGIN:2024-07-21 19:11 .] --- 2024/07/21 19:11:43 rm -rf demo
# 这是root切换到jaywin用户
2024/07/21 19:11:59 jaywin(root)@[IP:(172.30.0.254)][PWD:/home/jaywin][LOGIN:2024-07-21 19:11 .] --- 2024/07/21 19:08:17 touch
2024/07/21 19:12:05 jaywin(root)@[IP:(172.30.0.254)][PWD:/home/jaywin][LOGIN:2024-07-21 19:11 .] --- 2024/07/21 19:12:05 touch somefile

并且,这个审计文件只能追加,任何用户都无法修改,删除!只有超级管理员才能查看,其他普通用户都无法查看!

解释

这个设置的原理是通过配置特殊变量PROMPT_COMMAND ,在每次显示提示符之前执行指定的命令。简而言之,它允许你在每次命令提示符出现之前运行一段代码。这在审计、日志记录和其他自动化任务中非常有用。

接下来说明下具体原理,这里涉及到几个知识点,我们根据脚本的内容一一来讲:

# 下面的配置保证了审计文件只有管理员才有权限操作!
# 设置目录和文件权限
sudo chmod 755 /var/log/cmd_audit    # 755表示目录权限是rwxr-xr-x,允许所有用户执行,以便在这个目录下的文件,能写入用户的命令
sudo chmod 662 /var/log/cmd_audit/audit.log # 622表示文件权限是-rw-rw--w-,不允许其他用户查看文件内容

# 设置文件仅允许追加属性
sudo chattr +a /var/log/cmd_audit/audit.log # chattr+a表示此文件仅允许追加操作,任何用户都无法修改文件内容或删除文件!

以下是命令审计日志系统的重点解释:

export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL
  • export 命令将指定的环境变量导出到当前环境,使它们在当前会话及其子进程中都可用。

  • PATH:指定可执行文件的搜索路径。

  • USER:当前用户的用户名。

  • LOGNAME:当前用户的登录名。

  • MAIL:当前用户的邮件目录。

  • HOSTNAME:当前主机的名称。

  • HISTSIZE:命令历史记录的最大条数。

  • HISTCONTROL:控制历史记录的行为。

HISTTIMEFORMAT="%Y/%m/%d %T"; export HISTTIMEFORMAT
  • HISTTIMEFORMAT:设置历史记录中的时间格式。在这种情况下,时间格式为 YYYY/MM/DD HH:MM:SS

  • export HISTTIMEFORMAT:将 HISTTIMEFORMAT 变量导出到当前环境,使其在所有子进程中也可用。

audit_command='{ thisHistID=`history 1 | awk "{print \\$1}"`; lastCommand=`history 1 | awk "{\\$1=\"\"; print}"`; user=`id -un`; pwd=`pwd`; whoStr=(`who -u am i`); realUser=${whoStr[0]}; logMonth=${whoStr[2]}; logDay=${whoStr[3]}; logTime=${whoStr[4]}; pid=${whoStr[6]}; ip=${whoStr[7]}; if [ ${thisHistID}x != ${lastHistID}x ]; then echo -E `date "+%Y/%m/%d %H:%M:%S"` $user\($realUser\)@$ip[IP:$pid][PWD:$pwd][LOGIN:$logMonth $logDay $logTime] --- $lastCommand; lastHistID=$thisHistID; fi; } >> $HISTORY_FILE'

thisHistID=`history 1 | awk "{print \\$1}"` # 获取当前历史ID
lastCommand=`history 1 | awk "{\\$1=\"\"; print}"` # 获取最后一条命令
user=`id -un`;pwd=`pwd` # 获取当前用户和当前路径
# 获取用户登录信息
whoStr=(`who -u am i`) # 用户登录信息
realUser=${whoStr[0]} #  用户名
logMonth=${whoStr[2]} # 登录时间
logDay=${whoStr[3]}
logTime=${whoStr[4]}
pid=${whoStr[6]} # 登录会话ID
ip=${whoStr[7]}   # 登录的客户端IP


if [ ${thisHistID}x != ${lastHistID}x ]; then 
    echo -E `date "+%Y/%m/%d %H:%M:%S"` $user\($realUser\)@$ip[IP:$pid][PWD:$pwd][LOGIN:$logMonth $logDay $logTime] --- $lastCommand
    lastHistID=$thisHistID
fi

  • 检查历史记录 ID 是否变化并记录审计信息
if [ -z "${PROMPT_COMMAND_READONLY}" ]; then
    if [ -z "${PROMPT_COMMAND}" ]; then
        export PROMPT_COMMAND="$audit_command"
    else
        export PROMPT_COMMAND="$PROMPT_COMMAND; $audit_command"
    fi
    export HISTORY_FILE=/var/log/cmd_audit/audit.log
    export PROMPT_COMMAND_READONLY=1
    readonly PROMPT_COMMAND_READONLY
fi
  • 配置PROMPT_COMMAND环境变量,并设置为只读,放置其他用户私自修改导致命令审计失败

注意

  1. 你最好在服务器初始化时做好此项配置;
  2. 你最好结合用户权限管理系统来使用,才能真正发挥这个配置的功能;

下一期,我们会简单谈谈如何实现一个用户权限管理系统,敬请期待~

标签:审计,audit,背锅,log,19,cmd,07,运维防,21
From: https://www.cnblogs.com/zhaojw1213/p/18314393

相关文章

  • 论如何直接用EF Core实现创建更新时间、用户审计,自动化乐观并发、软删除和树形查询(下)
    前言数据库并发,数据审计和软删除一直是数据持久化方面的经典问题。早些时候,这些工作需要手写复杂的SQL或者通过存储过程和触发器实现。手写复杂SQL对软件可维护性构成了相当大的挑战,随着SQL字数的变多,用到的嵌套和复杂语法增加,可读性和可维护性的难度是几何级暴涨。因此如何在实......
  • 论如何直接用EF Core实现创建更新时间、用户审计,自动化乐观并发、软删除和树形查询(中)
    前言数据库并发,数据审计和软删除一直是数据持久化方面的经典问题。早些时候,这些工作需要手写复杂的SQL或者通过存储过程和触发器实现。手写复杂SQL对软件可维护性构成了相当大的挑战,随着SQL字数的变多,用到的嵌套和复杂语法增加,可读性和可维护性的难度是几何级暴涨。因此如何在实......
  • 论如何直接用EF Core实现创建更新时间、用户审计,自动化乐观并发、软删除和树形查询(上)
    前言数据库并发,数据审计和软删除一直是数据持久化方面的经典问题。早些时候,这些工作需要手写复杂的SQL或者通过存储过程和触发器实现。手写复杂SQL对软件可维护性构成了相当大的挑战,随着SQL字数的变多,用到的嵌套和复杂语法增加,可读性和可维护性的难度是几何级暴涨。因此如何在实......
  • IT审计随想
    1、 IT 审计是什么。, IT 审计相当于董事长和科技之间的缓冲带,将极端的技术和极端的管理,融合翻译成董事长更容易理解的、更容易操作的问题和建议。在这个过程中, IT 审计既不能抛弃 IT 专业性,也不能缺失服务行领导意识,难点也在于此,行领导更懂管理,但又听过技术,怎样在巩固服......
  • 微信小程序代码审计小记
    本文参考文章地址:https://zhuanlan.zhihu.com/p/694193212准备工具1.反编译后的小程序文件夹详情请参考《日拱一卒之微信小程序自动化辅助渗透工具》https://www.cnblogs.com/--l-/p/182455582.审阅工具vscode2.1下载VsCode。点击图示位置的“下载”即可。下载地址:htt......
  • K8s 开启审计日志
    一、背景应安全规范,对apiserver核心组件,需要记录,"谁在什么时候操作了什么"方便故障排查二、操作步骤apiserver开启审计日志在所有master节点执行备份配置文件mkdir-p/home/clay/bak$(date+%F)cp/etc/kubernetes/manifests/kube-apiserver.yaml/home/clay/......
  • 上网行为审计软件有哪些|好用的上网行为审计软件推荐
    上网行为审计成为了企业保障信息安全、提升工作效率的重要手段。一款优秀的上网行为审计软件,不仅能帮助企业监控员工的网络活动,预防数据泄露和不当行为,还能通过数据分析优化网络资源配置,提升整体运营效率。 今天,就为大家推荐几款好用且高效的上网行为审计软件,让您的企业管......
  • Jspxcms v9.0.0代码审计
    复现了jspxcmsv9.0.0的文件上传、SSRF、Shiro反序列化漏洞,记录了其中发生的问题及解决方法环境搭建这部分就不讲了,主要在tomcat上部署会遇到一些问题,文中也会给出解决方法任意文件上传登录后台(账号admin密码空)在文件上传处,可以上传zip压缩包,且上传的压缩包会自动解压抓包查......
  • 代码审计连载-工具介绍及简单思路
    相信很多刚入门的朋友来讲,php代码审计很陌生,很多网友喜欢直接扔seay等自动化工具,这方法也算是一种最快的一种审计方式。之前看w师傅的一篇文章,开始部分说了一段话”对于面向过程写法的程序来说,最快的审计方法可能时直接丢seay审计系统里,但对于基于mvc模式的程序来......
  • mysql审计日志-ProxySQL
    MySQL审计概述:出于对数据安全的考虑,很多公司要求对MySQL的操作进行审计,这就要求我们对所有MySQL的操作都进行记录,并且相关信息要齐全(账号,时间,语句等)。 1、general_log:这样虽然可以记录所有的操作日志,但很遗憾,缺少账号等必要信息,而且IO消耗非常大。2、init-connect:这个其实就......