网域极客做你身边的数字生活部署专家
Net-Geek: Your personal digital life deployment expert.
Hi,我是AFU
很多运维朋友经常跟我吐槽服务器变多之后查日志简直就是一场灾难,特别是遇到线上故障或者安全事件的时候需要一台台登录服务器去翻看历史命令
这就是缺乏统一的日志管理手段,今天我就带大家用最底层的原生工具搭建一套强大的日志收集系统。
讲真很多团队在管理多台服务器时根本没有考虑到日志归集的重要性,你看每次出现员工误操作或者系统崩溃的时候大家只能像无头苍蝇一样去登录每台机器查看

更糟糕的是如果黑客删除了本地日志你就彻底失去了追溯的证据,不是你的运维能力不行,而是你没有建立起一道让数据无法被篡改的坚固防线。
其实解决这个问题的底层逻辑非常简单就是把所有节点的权力收归,我们不需要买昂贵的堡垒机设备,利用Linux自带的主流日志处理引擎就能实现高性能的集中化管理
服务端扮演着无情的数据黑洞把所有客户端通过网络发送过来的各类日志全部吞噬并分类存储,同时配合自动化的切分工具保证磁盘永远不会被撑爆。
不是日志太乱难以追溯,而是你根本没有给真相留一个出口。
下面我们直接进入实操阶段,首先是服务端的配置,我们需要在充当中心的服务器上安装并启动服务。
yum install -y rsyslogsystemctl enable rsyslogsystemctl start rsyslog接下来修改服务端的中央配置文件,加载本地和内核模块,同时开启UDP和TCP端口来接收数据,并且定义好按客户端IP分类存储的模板。
vim /etc/rsyslog.conf# 加载本地系统日志模块(例如通过logger命令发送的日志)$ModLoad imuxsock# 加载内核日志模块(之前由rklogd处理)$ModLoad imklog# 加载UDP模块,支持通过UDP协议接收日志$ModLoad imudp# 配置 UDP 服务器在514端口接收日志$UDPServerRun 514# 加载TCP模块,支持通过TCP协议接收日志$ModLoad imtcp# 配置TCP服务器在514端口接收日志$InputTCPServerRun 514# 定义日志存储路径模板(按客户端IP分类)$template RemoteLogs, "/var/log/rsyslog/%fromhost-ip%/%fromhost-ip%.log"# 设置默认的文件格式为传统的rsyslog格式$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat# 加载/etc/rsyslog.d/目录下的所有配置文件$IncludeConfig /etc/rsyslog.d/*.conf# 将所有客户端的日志转发到指定目录,并按日期和客户端IP分类存储*.* ?RemoteLogs修改完配置文件之后一定要记得重启服务让它生效。
systemctl restart rsyslog为了让运维人员的操作无处遁形,我们还要在全局环境变量中加入历史命令的监控逻辑,采用追加的方式避免覆盖,使用工具记录每一个命令。
vim /etc/profile# 设置历史命令的最大记录数HISTFILESIZE=2000HISTSIZE=2000export HISTTIMEFORMAT="%F %T: "# 多个终端同时操作,避免覆盖,采用追加的方式shopt -s histappend# 使用 logger 记录执行过的命令export PROMPT_COMMAND='{ command=$(history 1 | { read x y; echo $y; }); logger -p local5.notice -t bash -i "user=$USER, ppid=$PPID, from=$SSH_CLIENT, pwd=$PWD, command: $command"; }'source /etc/profile搞定了中央服务端之后我们就要去配置那些需要被监控的客户端了,客户端同样需要安装服务。
yum install -y rsyslogsystemctl enable rsyslogsystemctl start rsyslog下面是客户端的配置文件调整,注意最后的转向地址要改成你自己的服务端IP。
vim /etc/rsyslog.conf# 加载本地系统日志模块(例如通过logger命令发送的日志)$ModLoad imuxsock# 加载内核日志模块(之前由rklogd处理)$ModLoad imklog# 加载UDP模块,支持通过UDP协议接收日志$ModLoad imudp# 加载TCP模块,支持通过TCP协议接收日志$ModLoad imtcp# 设置默认的文件格式为传统的rsyslog格式$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat# 加载/etc/rsyslog.d/目录下的所有配置文件$IncludeConfig /etc/rsyslog.d/*.conf# 将所有日志转发到服务端 (192.168.52.15) 端口514,使用UDP协议*.* @192.168.52.15:514客户端同样需要把历史命令审计的配置写进环境变量里,这样每一次敲击回车都会被实时捕捉。
vim /etc/profile# 设置历史命令的最大记录数HISTFILESIZE=2000HISTSIZE=2000export HISTTIMEFORMAT="%F %T: "# 多个终端同时操作,避免覆盖,采用追加的方式shopt -s histappend# 使用 logger 记录执行过的命令export PROMPT_COMMAND='{ command=$(history 1 | { read x y; echo $y; }); logger -p local5.notice -t bash -i "user=$USER, ppid=$PPID, from=$SSH_CLIENT, pwd=$PWD, command: $command"; }'source /etc/profile接着我们重启客户端的服务,并且可以用一条手动的测试信息来验证日志是否能够成功送达服务端。
systemctl restart rsysloglogger "This is a test log message from the client"最后由于所有日志都堆积在服务端,时间久了必然会挤爆磁盘,所以服务端必须配置自动轮转工具来定期清理和压缩。
yum install -y logrotate我们在服务端的轮转配置目录下创建一个专门针对该日志路径的规则,设置每天轮换一次且保留最近三十天的内容。
vim /etc/logrotate.d/rsyslog/var/log/rsyslog/*/*.log { missingok # 如果日志文件丢失,不报错 daily # 每天轮换一次 copytruncate # 在复制日志并截断当前日志文件时不需要停止服务 rotate 30 # 保留最近 30 天的日志文件 notifempty # 如果日志文件为空,则不轮换 dateext # 使用日期作为日志文件的扩展名}配置完成之后我们可以手动触发一次验证,确保整个自动清理和切分的逻辑完全正常。
logrotate /etc/logrotate.d/rsyslog心如统帅则调度有方,思如利剑则破局有力
今天分享的这套方案不仅帮你省下了买商业软件的巨额开销,更能让你在面对各种突发安全事件时气定神闲,关注我获取更多硬核运维实战技巧,让我们一起把被动变成主动。

别再为了跑exe折腾虚拟机了,Wine才是Linux上跑Windows软件的
网站挂了你还不知道?Docker一键部署,这款高颜值监控工具救了我
Nginx日志分析太痛苦?用Docker部署这款开源项目,帮你找回流量

求点赞

求分享

求喜欢
