方案一:使用acct工具记录
步骤 1 通过设置日志文件可以对每个用户的每一条命令进行纪录,这一功能默认是不开放的,为了打开它,我们要确认已经安装了acct工具:
# Debian、Ubuntu、SUSE下叫acct
apt-get install acct
zypper install acct
# CentOS、RHEL、Fedora上叫psacct
yum -y install psacct
步骤 2 需要执行accton命令打开或关闭进程记帐,如:
#/usr/lib/acct/accton /var/adm/pact
或
#systemctl start acct 或
#systemctl start psacct
步骤 3 acct服务开机自启动:
#chkconfig acct on
或
#systemctl enable acct 或
#systemctl enable psacct
步骤 4 执行读取命令
#lastcomm [user name]
方案二:通过PROMPT_COMMAND环境变量设置(推荐)
1、配置PROMPT_COMMAND到/etc/profile
export PROMPT_COMMAND='user=$(whoami);user_id=$(id -ur $user);login=$(who -m | awk "{print $ 2\" \"$ NF}");msg=$(history 1 | { read x y; echo "$y"; });result_str="return code=[$?]";logger -t "[${SHELL}]" "[${msg}]" "${result_str}" "by [${user}(uid=$user_id)] from [$login]"'
readonly PROMPT_COMMAND
2、source /etc/profile令其生效
(上述会有一个问题,空行回车会一直记录最后一次执行的命令到日志中)
方案三:创建/etc/profile.d/zzz-history.sh 并将以下内容拷贝进去,然后重新登录系统或source /etc/profile.d/zzz-history.sh
vi /etc/profile.d/zzz-history.sh
function OpLog_history{
typeset result=$?
typeset result_str=""
if [ ${result} -eq 0 ];then
result_str="return code=[0], execute success"
else
result_str="return code=[${result}], execute failed"
fi
history -a
typeset user=$(whoami)
typeset user_id=$(id -ur $user)
typeset login=$(who -m | awk '{print $2" "$NF}')
typeset msg=$(history 1 | { read x y; echo "$y"; })
typeset num=$(history 1 | { read x y; echo "$x"; })
if [ "${num}" != "${LastComandNum_for_history}" ] && [ "${LastComandNum_for_history}" != "" -o "${num}" == "1" ];then
logger -t "[${SHELL}]" "[${msg}]" "${result_str}" "by [${user}(uid=$user_id)] from [$login]"
fi
LastComandNum_for_history=${num}
}
function OpLog_variable_readonly{
typeset var="$1"
typeset val="$2"
typeset ret=$(readonly -p | grep -w "${var}" | awk -F "${var}=" '{print $NF}')
if [ "${ret}" = "\"${val}\"" ]
then
return
else
export "${var}"="${val}"
readonly "${var}"
fi
}
export HISTCONTROL=''
#OpLog_variable_readonly HISTTIMEFORMAT ""
OpLog_variable_readonly PROMPT_COMMAND OpLog_history
扩展信息-EulerOS上的实现
华为EulerOS上就是通过方案三进行实现的,该系统上安装了一个叫security-tool的RPM包。
- 在bash环境下主要是通过/etc/profile.d/zzz_euleros_history.sh进行的设置
- 在csh/tcsh环境下通过/etc/profile.d/zzz_euleros_history.csh 进行设置
/etc/csh.precmd
/etc/euleros_security
/etc/euleros_security/security
/etc/euleros_security/security.conf
/etc/euleros_security/usr-security.conf
/etc/pam.d/password-auth-crond
/etc/pam.d/password-auth-local
/etc/pam.d/su-local
/etc/pam.d/system-auth-local
/etc/profile.d/zzz_euleros_history.csh
/etc/profile.d/zzz_euleros_history.sh
/usr/lib/systemd/system/euleros-security.service
/usr/sbin/security-tool.sh
扩展信息-关于acct记账工具包
# Debian、Ubuntu、SUSE下叫acct
apt-get install acct
zypper install acct# CentOS、RHEL、Fedora上叫psacct
yum -y install psacct描述:psacct package包含几个用于监控进程活动的实用程序,包括ac, lastcomm, accton和sa。ac命令显示用户登录时间的统计信息。lastcomm命令用来显示以前执行过的命令的信息。accton命令打开或关闭进程记帐。sa命令用来汇总以前执行过的命令的信息。
#讲真,记录的并不详细
ac #显示登录账号的简要信息
accton #打开或关闭进程记录功能
last #显示曾经登录过的用户
lastcomm #显示已执行过的命令
sa #进程用户记录信息的摘要
dump-utmp #输出utmp文件内容
dump-acct #输出acct或pacct文件内容
扩展信息-关于 logger命令
logger -t
-t, --tag <tag> 向每一行添加指定标记
-p, --priority priority_level
指定输入消息的优先级,优先级可以是数字或者指定为 "facility.level" 的格式。比如:"-p local3.info " local3 这个设备的消息级别为info。默认级别是 "user.notice"logger输出日志发送给哪个文件是通过/etc/rsyslog.conf中*.开头的行决定的,默认情况下是任何日志日志发送给/var/log/messages里,也可以指定发送给其他文件里。
表面上,上述说法并无问题,其实质是有-p 参数决定的,默认输出级别为"user.notice",由于rsyslog.conf中默认并没有配置此级别的日志输出,故,只能输出到*.开头的日志文件中;假如在rsyslog.conf做如下配置:
# operation log
user.notice /var/log/operation.log
& stop
……
*.info;mail.none;authpriv.none;cron.none /var/log/messages则logger的输出只会记录到 /var/log/operation.log。