Bootstrap

自定义Linux操作日志配置

方案一:使用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。

;