#日常工作中服务器很多,也会出现很多问题,但是出现问题怎么查询原因呢?history,last可以查看到一些记录,但是并不完整,也无法准确追溯到谁,在什么时间,执行了什么,这个时候如果服务器被黑,或者被恶作剧,就无法快速准确判断,并定位问题,如果开启了操作日志审计就可以很好的判断问题,同时集中管理归档,增加系统的安全性.
#环境
系统:CentOS Linux release 7.4.1708 (Core)
客户端:172.16.10.25
服务端:172.16.10.181
#工具
1,logger
logger是一个shell接口,可以通过该接口使用rsyslog的日志模块。
Usage: logger [options] [message] Options: -T, --tcp use TCP only -d, --udp use UDP only -i, --id log the process ID too -f, --file <file> log the contents of this file -h, --help display this help text and exit -S, --size <num> maximum size for a single message (default 1024) -n, --server <name> write to this remote syslog server -P, --port <port> use this port for UDP or TCP connection -p, --priority <prio> mark given message with this priority -s, --stderr output message to standard error as well -t, --tag <tag> mark every line with this tag -u, --socket <socket> write to this Unix socket -V, --version output version information and exit
2,rsyslog
rsyslog是syslog的加强版,可以用作客户端及服务器,我们可以使用local0~local7来自定义设备传输至rsyslog。
3,prompt_command
Linux系统的环境变量PROMPTCOMMAND的内容会在bash提示符显示之前被执行。该环境变量的默认值是 history -a 功能是将目前新增的history追加到histfiles 中,默认写入隐藏文件~/.bashhistory中
#部署
1,部署rsyslog日志服务器server端
vim /etc/rsyslog.conf $ModLoad imudp $UDPServerRun 514 $AllowedSender UDP, 172.16.0.0/16 $template IpTemplate,"/var/log/remote/%FROMHOST-IP%/%$YEAR%-%$MONTH%-%$DAY%.log" :fromhost-ip, !isequal, "127.0.0.1" ?IpTemplate & ~ $ModLoad imudp #配置服务开启udp协议 $UDPServerRun 514 #配置udp 514为服务运行端口 $AllowedSender UDP #配置udp的白名单 $template IpTemplate #配置模板,以客户端ip为目录,以日期命名文件 :fromhost-ip, !isequal, "127.0.0.1" ?IpTemplate #把非本地传输的日志按照指定的模板存放 & ~ #& 表示已经匹配处理的内容,~ 表示不再进行其他处理 #重启服务 systemctl restart rsyslog
2,部署客户端rsyslog配置
1,配置prompt_command
vim /etc/bashrc readonly PROMPT_COMMAND='logger -p local3.notice -t bash "$(ifconfig | grep -E "eth|em" -A 1 | grep "10.10" | grep -oP "(?<=addr:)[\d\.]+") $(who am i |awk "{print \$1\" \"\$2\" \"\$3\" \"\$4\" \"\$5}") [`pwd`] currentuser=$(whoami) command=$(history 1 | { read x cmd; echo "$cmd"; })"' #load环境变量,!!!这步贼重要,如果不执行恐无法记录当前操作 source /etc/bashrc local3.notice 使我们自定义的设备,用于rsyslog调用; bash 是我们为每行打印的信息打印的tag; ifconfig | grep -E “eth|em” -A 1 | grep “10.10” | grep -oP “(?<=addr:)[\d.]+用于获取我们服务器的ip; who am i |awk “{print $1\” \”$2\” \”$3\” \”$4\” \”$5}”用于获取我们当前用户的登录信息; pwd用于列出我们当前所在的目录; whoami用于获取我们当前切换的执行命令的用户,例如我们从test 用户 sudo -i,执行命令的用户为root,但是登录的用户test,方便我们区分; command 是我们当前用户执行的命令。 注意: 1.我们需要在/etc/bashrc或/etc/profile中添加环境变量,用于所有用户。 2.export PROMPT_COMMAND 如果将PROMPT_COMMAND导出到用户工作区,那么对于有经验的用户就可以做赋值操作 export PROMPT_COMMAND =“” ,简单的语法就会导致记录功能当前session端不可用,所以PROMPT_COMMAND必须设置成只读的属性,readonly PROMPT_COMMAND
2,配置rsyslog客户端
vim /etc/rsyslog.conf *.info;mail.none;authpriv.none;cron.none;local3.none /var/log/messages local3.notice /var/log/audit.log local3.notice @172.16.10.181 #重启服务 systemctl restart rsyslog *.info;mail.none;authpriv.none;cron.none;local3.none #设置local3不写入message local3.notice /var/log/audit.log #保存到本地的文件 local3.notice @172.16.10.181 #发给远程日志服务器 local3.notice 是在logger中定义的设备,notice是打印日志的级别,用于rsyslog调用并将打印信息输出至指定文件。
3,配置轮转日志
vim /etc/logrotate.d/rsyslog /var/log/audit.log{ daily rotate 4 missingok notifempty nocompress create dateext sharedscripts postrotate /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true endscript } #手动强制轮转 logrotate -vf /etc/logrotate.d/rsyslog
#测试
1,客户端
[root@manage-dns25-ctos7 ~]# tail /var/log/audit.log Jan 26 17:26:25 manage-dns25-ctos7 bash: admin pts/0 2018-01-26 10:34 (172.16.1.12) [/root] currentuser=root command=tail -F xferin.log Jan 26 17:26:28 manage-dns25-ctos7 bash: admin pts/0 2018-01-26 10:34 (172.16.1.12) [/root] currentuser=root command=cat /etc/redhat-release
2,服务端
[root@test-yumwei10_181-ctos ~]# tail /var/log/remote/172.16.1 172.16.10.21/ 172.16.10.25/ 172.16.10.80/ 172.16.12.1/ 172.16.12.2/ [root@test-yumwei10_181-ctos ~]# tail /var/log/remote/172.16.10.25/2018-01-26.log Jan 26 17:26:25 manage-dns25-ctos7 bash: admin pts/0 2018-01-26 10:34 (172.16.1.12) [/root] currentuser=root command=tail -F xferin.log Jan 26 17:26:28 manage-dns25-ctos7 bash: admin pts/0 2018-01-26 10:34 (172.16.1.12) [/root] currentuser=root command=cat /etc/redhat-release Jan 26 17:28:00 manage-dns25-ctos7 bash: admin pts/0 2018-01-26 10:34 (172.16.1.12) [/root] currentuser=root command=tail /var/log/audit.log