HVV应急溯源基础——Linux 系统安全加固配置指南(二)

在护网攻防演练与Web安全运维工作中,Linux系统日志是异常行为监测、入侵溯源的关键手段,Apache、Nginx、Tomcat等Web中间件作为业务通信核心组件,一旦出现配置疏漏极易被攻击者利用实施漏洞入侵、恶意请求攻击。

  • 本文结合系统日志运维机制,围绕三类主流Web中间件及PHP程序开展不安全配置隐患排查,梳理配置漏洞成因与针对性安全加固方案,可作为护网巡检、日常安全基线核查、Web入侵应急处置的技术参考依据。

文章目录


文章介绍

在护网行动、日常安全基线巡检与蓝队应急响应场景中,Windows、Linux服务器及Nginx、Apache、Tomcat等Web中间件是攻防对抗的核心防护对象。系统日志作为入侵行为溯源、异常事件分析的关键依据,能够完整留存主机操作、程序访问与网络交互记录;主机不合理的账号权限、远程访问策略、敏感文件配置,以及中间件、PHP的不规范部署配置,极易被攻击者利用,成为漏洞入侵、权限提升、内网横向渗透的突破口。

本文围绕系统日志审计、Windows与Linux主机安全核查、主流Web中间件不安全配置排查三大方向,梳理各类常见安全风险并给出标准化加固措施,可作为安全运维巡检、攻防应急处置的实操参考文档。

大家也可以先看看之前的文章:


Linux系统日志安全配置

系统日志简介

Linux日志主要分为系统日志、用户日志、程序日志 三类。不同发行版的日志存储路径存在差异,CentOSUbuntu系统默认将各类日志统一存放于/var/log目录下。其中通过RPM方式部署的系统服务产生的日志虽同样保存在该目录,但并不受rsyslogd服务管控,由对应服务自身的日志机制独立完成记录。

Linux系统的默认日志及其功能如下:

  • wtmp日志文件:主要记录所有用户的登录、注销行为,同时留存系统开机、关机相关事件,可通过对应命令查询历史用户登录审计记录。

  • btmp日志文件:专门记录远程登录失败行为,会详细留存SSH远程登录时的访问IP、访问用户名、通信协议、登录失败时间等关键信息,常用于暴力破解溯源排查。

  • cron日志文件: 用于记录定时计划任务的运行事件,包含定时任务的起止执行时间、运行周期、执行账号权限等内容,可用来排查恶意定时后门类攻击行为。

  • secure/auth认证日志:该日志会完整记录SSH登录成功、失败的时间、操作用户名、用户UID等认证详情,是账号暴力破解、异常登录溯源的核心审计日志。

    • RedHatCentOS系列系统中,认证日志默认路径为/var/log/secure
    • UbuntuDebian系列系统则存放于/var/log/auth.log

上述日志对应的命令:

bash 复制代码
last -f /var/log/wtmp
last -f /var/log/btmp
cat /var/log/cron
cat /var/log/secure

系统日志备份

日志作为记录系统各类关键事件的核心文件,若长期放任日志不断累积,会占用大量磁盘空间,严重时造成服务器磁盘占满、系统宕机。日常日志维护主要包含旧日志清理、新日志备份两项工作。

Linux系统内置logrotate工具实现日志轮替,能够自动分割日志、生成全新日志文件记录后续事件,对超出保留期限的历史日志进行删除,避免日志无限膨胀。

  1. 工具的全局配置文件为logrotate.conf,依托cron定时任务周期性触发执行。
  2. logrotate.conflogrotate.d都存储着logrotate的配置文件
  3. logrotate.d目录里的所有文件被包含到logrotate.conf文件中执行。

(1)日志名称设置

通过修改logrotate.conf配置文件相关参数,可以对日志轮询存储方式进行修改和配置。默认情况下,logrotate切割的日志是按递增的数字进行命名的,如xxx.log-1 。在配置文件中增加dateext参数,可以使切割后的日志文件以当前日期为结尾:

bash 复制代码
beta@beta:~$ ls
boot.log                btmp            cron-20220424   maillog         messages-20220417   secure-20220424
boot.log-20220207       btmp-20220501   cron-20220501   maillog-20220417  messages-20220424   secure-20220501
boot.log-20220208       chrony          cron-20220508   maillog-20220424  messages-20220501   secure-20220508
boot.log-20220210       cloud-init.log  dmesg           maillog-20220501  messages-20220508   supervisord.log
boot.log-20220222       cron            dmesg.old       maillog-20220508  secure              tuned

(2)定时日志清理

随着日志文件的不断增多,如果不定时清理,系统硬盘就会存满。通过修改日志轮询次数,可以达到周期清理日志的效果,即在logrotate.conf配置文件中修改rotate参数:

bash 复制代码
# see "man logrotate" for details
# rotate log files weekly
weekly
# use the adm group by default, since this is the owning group
# of /var/log/syslog.
su root adm
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# use date as a suffix of the rotated file
dateext
# uncomment this if you want your log files compressed
#compress
# packages drop log rotation information into this directory
include /etc/logrotate.d
# system-specific logs may be also be configured here.

作用:logrotate全局配置实现日志每周轮转,采用root用户adm组权限执行,仅保留4份 带日期后缀的历史日志,轮转后自动生成新空白日志文件,同时加载/etc/logrotate.d目录下的子配置,默认未开启日志压缩。


(3)本地日志备份

《中华人民共和国网络安全法》 明确规定,网络系统日志的留存时间应不少于6个月。为了后续日志审计的需要,系统管理者需要定期对Linux系统的日志进行有效备份。根据备份日志的存储位置不同,可以分为本地日志备份和异地日志备份。

本地日志备份 就是将Linux系统的日志存储在系统的本地,通过cron定时任务的方式,实现日志的周期备份。如下所示为执行本地日志备份操作的bash脚本文件,存放在/var/backup目录下,命名为backup.sh,以90天为周期存储系统日志,保存的备份日志以"backup_+日期"方式进行命名,并将生成的日志存储在/var/backup目录下。

bash 复制代码
#!/bin/bash
# 预留日志的份数
number=90
# 保存日志的路径
backup_dir=/var/backup/
# 每天进行更新日志备份
dd=`date -d "yesterday" +%Y-%m-%d`
# 源文件日志路径
bean_dir=/var/log
cp -r $bean_dir/ $backup_dir/backup-$dd
# 写创建备份日志
echo "create $backup_dir/backup_log-$dd.log" >> $backup_dir/log.txt
# 找出需要删除的备份
delfile=`ls -l -crt $backup_dir/*.log | awk '{print $9}' | head -1`
# 判断现在的备份数量是否大于$number
count=`ls -l -crt $backup_dir/*.log | awk '{print $9}' | wc -l`
if [ $count -gt $number ]
then
  # 删除最早生成的备份,只保留number数量的备份
  rm $delfile
  # 写删除文件日志
  echo "delete $delfile" >> $backup_dir/log.txt
fi

一句话解释 :该脚本将/var/log下的系统日志按昨日日期备份至/var/backup目录,仅保留90份本地备份,超出数量则自动删除最早的备份文件,并记录每次备份与删除操作日志。

复制代码
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed
59 19  *  *  * root  cd /var/backup && ./backup.sh >/dev/null 2>&1

一句话解释 :在系统级定时任务文件中配置root用户每日19时59分执行日志备份脚本,同时屏蔽脚本标准输出与错误输出,可通过cron.log校验任务执行状态。

总结

本文梳理了Linux系统主流日志文件的用途与存放路径,明确了各类日志在暴力破解、恶意定时任务、异常登录等安全事件中的溯源使用方式,可直接用于护网阶段的入侵行为排查。

通过logrotate实现日志自动轮转避免磁盘占满,再结合Shell脚本与Cron定时任务做本地周期备份,既解决了日志存储溢出问题,也满足法规要求的日志留存时长,为后续安全审计、攻击溯源留存完整的原始数据。