安利一个超强的linux脚本
想像一个场景,你突然接手管理一个系统,之前对接的人没有留下任何材料,主机上也没有历史命令能够看到之前做了哪些操作。
怎么办?今天介绍一个简单的脚本记录linux历史执行记录的方法,可以在现有主机上配置,然后后面主机初始化都配置上。
Linux命令审计跟踪脚本分析
这是一个用于实现Linux系统命令审计功能的安装脚本,让我们详细分析其实现原理和功能特点。
一、脚本主要功能
该脚本主要实现了以下功能:
- 记录用户执行的所有命令
- 记录命令执行的详细信息(包括用户、IP、时间、路径等)
- 将审计日志保存到专门的日志文件中
二、实现原理分析
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
,这个文件会在用户登录时自动加载。主要实现包括:
- 用户信息获取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'`
- 获取当前登录用户信息
- 获取真实登录名
- 获取用户的来源IP地址
- 命令跟踪机制LAST_HISTORY="$(history 1)"
__LAST_COMMAND="${LAST_HISTORY/*:[0-9][0-9] /}"通过
history
命令获取最近执行的命令。 - DEBUG陷阱trap "$h2l" DEBUG使用
trap
命令设置 DEBUG 陷阱,每次执行命令时都会触发记录。
3. 日志配置
在 /etc/rsyslog.d/
创建 10-cmd_track.conf
配置文件:
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
四、使用场景
- 安全审计
- 追踪可疑操作
- 定位系统故障原因
- 用户行为分析
- 运维管理
- 记录系统维护操作
- 复现问题解决步骤
- 团队协作参考
- 合规要求
- 满足等级保护要求
- 符合审计规范
- 提供操作追溯能力
五、注意事项
- 安装脚本需要root权限
- 确保系统有足够的磁盘空间存储日志
- 建议配置日志轮转,避免日志文件过大
- 注意保护日志文件的安全性
- 考虑日志备份策略
这个脚本是一个实用的运维工具,可以帮助管理员更好地管理和监控系统操作,对于系统的安全管理和问题排查都很有帮助。
完整脚本:
代码语言: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
发布者:admin,转转请注明出处:http://www.yc00.com/web/1747547917a4651310.html
评论列表(0条)