admin管理员组

文章数量:1438065

安利一个超强的linux脚本

想像一个场景,你突然接手管理一个系统,之前对接的人没有留下任何材料,主机上也没有历史命令能够看到之前做了哪些操作。

怎么办?今天介绍一个简单的脚本记录linux历史执行记录的方法,可以在现有主机上配置,然后后面主机初始化都配置上。

Linux命令审计跟踪脚本分析

这是一个用于实现Linux系统命令审计功能的安装脚本,让我们详细分析其实现原理和功能特点。

一、脚本主要功能

该脚本主要实现了以下功能:

  1. 记录用户执行的所有命令
  2. 记录命令执行的详细信息(包括用户、IP、时间、路径等)
  3. 将审计日志保存到专门的日志文件中

二、实现原理分析

1. 权限检查
代码语言:bash复制
if [ $(id -u) -ne "0" ]; then
    echo "Error: You must be root to run this script..."
    exit 1
fi

首先检查执行用户是否为root,确保有足够的权限进行安装。

2. 核心实现

脚本会在 /etc/profile.d/ 目录下创建 cmd.sh,这个文件会在用户登录时自动加载。主要实现包括:

  1. 用户信息获取WHOAMI=`who -u am i | awk '{print $NF}'` REAL_LOGNAME=`who am i | cut -d" " -f1` REAL_IP=`who -u | egrep $WHOAMI | head -1 | awk '{print $NF}' | sed -e 's/[()]//g'`
  2. 获取当前登录用户信息
  3. 获取真实登录名
  4. 获取用户的来源IP地址
  5. 命令跟踪机制LAST_HISTORY="$(history 1)" __LAST_COMMAND="${LAST_HISTORY/*:[0-9][0-9] /}"通过 history 命令获取最近执行的命令。
  6. DEBUG陷阱trap "$h2l" DEBUG使用 trap 命令设置 DEBUG 陷阱,每次执行命令时都会触发记录。
3. 日志配置

/etc/rsyslog.d/ 创建 10-cmd_track.conf 配置文件:

代码语言:bash复制
local4.notice /var/log/cmd_track.log
& ~

将命令记录保存到 /var/log/cmd_track.log 文件中。

三、日志记录格式

记录的日志包含以下信息:

  • 用户名
  • 来源IP
  • 当前用户(root/普通用户)
  • 主机名
  • 当前工作目录
  • 执行的命令

格式示例:

代码语言:bash复制
username 192.168.1.1 [user@hostname /current/path]$ command

四、使用场景

  1. 安全审计
    • 追踪可疑操作
    • 定位系统故障原因
    • 用户行为分析
  2. 运维管理
    • 记录系统维护操作
    • 复现问题解决步骤
    • 团队协作参考
  3. 合规要求
    • 满足等级保护要求
    • 符合审计规范
    • 提供操作追溯能力

五、注意事项

  1. 安装脚本需要root权限
  2. 确保系统有足够的磁盘空间存储日志
  3. 建议配置日志轮转,避免日志文件过大
  4. 注意保护日志文件的安全性
  5. 考虑日志备份策略

这个脚本是一个实用的运维工具,可以帮助管理员更好地管理和监控系统操作,对于系统的安全管理和问题排查都很有帮助。

完整脚本:

代码语言:bash复制
#!/bin/bash
########################################
# Functions:install cmd_track scripts
# Changelog: 2018-08-01
# Auther: gzc
########################################
# Debug:set -x

# Check if user is root
   if [ $(id -u) -ne "0" ]; then
       echo "Error: You must be root to run this script, please use root to install."
       exit 1
   fi
# define variables
cmd_path=/etc/profile.d
log_path=/etc/rsyslog.d

cat > $cmd_path/cmd.sh << 'EOF'
#!/bin/bash

# get realip
WHOAMI=`who -u am i | awk '{print $NF}'`
DATE=`date +%F_%T`

if [ -n "$WHOAMI" ];then
    declare -x REAL_LOGNAME=`who am i | cut -d" " -f1`
    declare -x REAL_IP=`who -u | egrep $WHOAMI | head -1 | awk '{print $NF}' | sed -e 's/[()]//g'`
  else
    echo "$DATE ssh execute." >> /dev/null
fi 

if [ $USER == root ]; then
        declare -x PROMT="#"
  else
        declare -x PROMT="$"
fi

LAST_HISTORY="$(history 1)"
__LAST_COMMAND="${LAST_HISTORY/*:[0-9][0-9] /}"

declare -x h2l='
    THIS_HISTORY="$(history 1)"
    __THIS_COMMAND="${THIS_HISTORY/*:[0-9][0-9] /}"
    if [ "$LAST_HISTORY" != "$THIS_HISTORY" ];then
        __LAST_COMMAND="$__THIS_COMMAND"
        LAST_HISTORY="$THIS_HISTORY"
        logger -p local4.notice -i -t $REAL_LOGNAME $REAL_IP "[$USER@$HOSTNAME $PWD]$PROMT $__LAST_COMMAND"
    fi'
trap "$h2l" DEBUG
EOF
#####
if [ -d $log_path ];then
    echo "$log_path does exist"
  else
    mkdir -p $log_path
fi

# record cmd log
cat > $log_path/10-cmd_track.conf << 'EOF'
# Log nc_profile generated CMD log messages to file
local4.notice /var/log/cmd_track.log
#:msg, contains, "REM" /var/log/cmd_track.log

# Uncomment the following to stop logging anything that matches the last rule.
# Doing this will stop logging kernel generated UFW log messages to the file
# normally containing kern.* messages (eg, /var/log/kern.log)
& ~
EOF

本文标签: 安利一个超强的linux脚本