《中华人民共和国网络安全法》第二十一条要求,网络运营者应按照规定留存相关的网络日志不少于六个月。
为了确保已备案的网站合法合规,我们还要定期备份网站的相关日志,并留存不少于六个月。
对于个人站长来说,网站搭建好,设置简单的防护后,因为用户量小、被关注度小,基本不会有什么大的故障,所以很多人不会去查看网站日志,更不会去保留日志。
其实除了合法合规,出于安全分析和故障排查的目的,我们也还是有必要定期留存相关网络日志。
本文主要分析哪些日志值得我们保存,以及运用logrotate
自动化管理要留存的日志。
哪些日志值得保存?
看过我之前文章的读者应该知道,我的网站:anjir.top,是在Debian系统上,用Docker搭建的WordPress网站。所以,我的服务器上主要有三大日志来源:Debian 系统、Docker 服务、以及 WordPress 应用。
不是所有日志都值得保存,接下来我们针对三大日志来源做具体分析。
Debian 系统产生的核心日志
这些日志记录了操作系统的底层活动,是排查系统级问题和进行安全审计的基石。它们通常都位于/var/log/
目录下。
1. auth.log (认证日志)
-
内容: 用户登录(包括 SSH 成功/失败)、sudo 命令执行、用户/组变更、cron 任务的用户会话等所有与系统安全和用户认证相关的事件。 -
重要性: 极其重要! 这是安全审计的第一手资料。任何一次入侵尝试或未授权的权限提升,都会在这里留下痕迹。 -
是否值得备份: 是,必须备份。 这相当于服务器的“黑匣子”。
2. syslog (系统主日志)
-
内容: 包罗万象,记录了从系统启动到关机的绝大多数非认证类事件。包括内核消息、服务启动/停止、网络接口变化、硬件驱动信息等。 -
重要性: 非常重要。当服务器出现“疑难杂症”(比如无故重启、某个服务无法启动)时,这里是寻找线索的首选之地。 -
是否值得备份: 是,强烈建议备份。
3. ufw.log (防火墙日志)
-
内容: UFW 防火墙所有拦截和放行的网络连接记录。 -
重要性: 重要。通过分析被拦截的请求,可以了解服务器正在遭受哪些类型的网络扫描和攻击,从而调整防火墙策略。 -
是否值得备份: 推荐备份。 它可以帮助我们构建更长期的攻击者画像。
4. dpkg.log 和 apt/history.log (软件包管理日志)
-
内容: dpkg.log 记录了所有软件包的安装、升级、删除操作。apt/history.log 记录了执行 apt 命令的历史。 -
重要性: 中等。主要用于追溯我们对服务器软件环境做过哪些变更。 -
是否值得备份: 可选。
5. fail2ban.log (Fail2ban 日志)
-
内容: Fail2ban 服务自身的启动/停止、规则加载、以及每一次封禁和解封IP 的详细记录。 -
重要性: 重要。它是主动防御系统的工作报告。 -
是否值得备份: 推荐备份。 通过长期分析,我们可以了解哪些 IP 是“惯犯”。
Docker 服务产生的日志
Docker 的日志比较特殊,它分为守护进程日志和容器日志。
1. Docker 守护进程日志 (Daemon Log)
-
内容: Docker 服务 (dockerd) 本身的运行情况,比如启动/停止、API 调用、网络创建、镜像拉取/删除等底层操作。 -
如何查看: 通常由 systemd 管理,通过 journalctl -u docker.service 查看。它一般不会以独立文件形式长期存储,除非单独配置。 -
重要性: 中等。主要用于排查 Docker 服务自身的问题。 -
是否值得备份: 通常不需要。 它的信息时效性很强,对于长期审计价值不大。
2. 容器日志 (Container Logs)
-
这是最重要的部分! 它记录了每个容器内部应用程序的标准输出 (stdout) 和标准错误输出 (stderr)。 -
我们关心的是: nginx 容器和 wordpress 容器的日志。 -
我们是如何处理的? -
Nginx 容器: 我们已经非常明智地通过 volumes 挂载,将 Nginx 的访问日志 (access.log) 和 错误日志 (error.log) ,从容器内部的 /var/log/nginx 目录,永久地保存到了宿主机的 /root/my_website/nginx/logs/ 目录下。 -
WordPress (PHP-FPM) 容器: PHP 的错误和 echo/print 输出,会直接输出到容器的标准输出。我们可以通过 docker compose logs wordpress 来查看。默认情况下,这些日志是以 JSON 格式存储在 Docker 的内部目录中 (/var/lib/docker/containers/…)。 -
重要性: -
nginx/access.log: 极其重要,记录了所有对我们网站的访问请求。 -
nginx/error.log: 非常重要,记录了所有 Web 服务的错误。 -
WordPress 容器日志: 重要,记录了 PHP 脚本执行过程中的错误和警告。 -
是否值得备份: -
/root/my_website/nginx/logs/access.log: 是,必须备份。 这是网站的生命线。 -
/root/my_website/nginx/logs/error.log: 是,必须备份。 -
WordPress 容器日志: 可选。 对于长期备份,价值相对较低。更重要的是在出现问题时实时查看。
WordPress 应用产生的日志
WordPress 自身默认情况下不产生独立的日志文件。它会将 PHP 错误和警告,通过我们上面说的方式,输出到 Docker 容器日志中。
但是,一些安全插件或调试插件可能会创建自己的日志文件,通常位于 /wp-content/ 或 /wp-content/uploads/ 的某个子目录中。
-
内容: 取决于插件。可能是安全事件日志、性能监控日志等。
-
是否值得备份: 取决于具体插件的重要性。 就我们目前的纯净架构而言,不存在这类日志。
综上分析,我决定备份下面这些日志
-
/var/log/auth.log: 谁在尝试登录我的服务器?(必备) -
/root/my_website/nginx/logs/access.log: 谁在访问我的网站?(必备) -
/root/my_website/nginx/logs/error.log: 我的网站出了什么错?(必备) -
/var/log/syslog: 我的服务器最近健康吗? (推荐) -
/var/log/ufw.log: 防火墙最近都拦了些什么? (推荐) -
/var/log/fail2ban.log: Fail2ban 最近都封了谁?(推荐) -
/var/log/dpkg.log: 我最近装了/删了什么软件? (可选) -
/var/log/apt/history.log: 我最近执行了什么 apt 命令?(可选)
运用logrotate
自动化管理日志
logrotate
是一个Linux系统默认安装了的日志文件管理工具,用于自动轮转、压缩、删除日志文件。我们可以用它根据日志文件的大小、天数等来转储,便于对日志文件管理。
为了确保要备份的日志留存不少于6个月,我们可以通过logrotate
配置文件让日志月度轮转,并保留8个月,这样即使我们没有及时去服务器备份日志,也可以确保有不少于6个月的日志数据。
操作步骤
1. 创建全局配置文件:
nano /etc/logrotate.d/zz-my-final-log-rules
2. 粘贴配置内容:
# =================================================================
# 服务器全局日志轮转策略 (月度轮转, 保留8个月)
# =================================================================
# -----------------------------------------------------------------
# 1. Nginx 应用日志 (我们的网站日志)
# 路径: /root/my_website/nginx/logs/
# -----------------------------------------------------------------
/root/my_website/nginx/logs/*.log {
# 每月执行一次轮转
monthly
# 保留最近的 8 份轮转后的日志文件 (8个月)
rotate 8
# 如果日志文件为空,则不执行轮转
notifempty
# 如果指定的日志文件不存在,不报错
missingok
# 对轮转后的旧日志文件进行 gzip 压缩
compress
# 不立即压缩最新的那份轮转日志,等到下一次再压缩
delaycompress
# 先复制内容再清空原文件,对 Docker 环境最友好
copytruncate
# 设置创建新日志文件的权限
create 0644 root root
}
# -----------------------------------------------------------------
# 2. 系统核心日志 (安全审计与系统健康)
# 包括: auth.log, syslog, ufw.log, fail2ban.log
# -----------------------------------------------------------------
/var/log/auth.log
/var/log/syslog
/var/log/ufw.log
/var/log/fail2ban.log {
# 每月执行一次轮转
monthly
# 保留最近的 8 份轮转后的日志文件 (8个月)
rotate 8
notifempty
missingok
compress
delaycompress
# 确保 postrotate 脚本只对所有匹配文件执行一次
sharedscripts
# 在轮转操作完成后执行的命令
postrotate
# 向 rsyslog 服务发送 HUP 信号,通知它重新加载日志文件句柄
if [ -f /var/run/rsyslogd.pid ]; then
kill -HUP `cat /var/run/rsyslogd.pid`
fi
# 向 fail2ban 服务发送 HUP 信号 (某些版本需要)
if [ -f /var/run/fail2ban/fail2ban.pid ]; then
kill -HUP `cat /var/run/fail2ban/fail2ban.pid`
fi
endscript
}
# -----------------------------------------------------------------
# 3. (可选) 软件包管理日志
# 包括: dpkg.log, apt/history.log
# -----------------------------------------------------------------
/var/log/dpkg.log
/var/log/apt/history.log {
monthly
rotate 8
notifempty
missingok
compress
delaycompress
}
3. 保存并退出。
到这自动化日志管理系统就配置完毕了,它会每月自动地将这些关键日志打包压缩,并只保留最近 8 个月的历史记录。
将相关日志备份到本地
我们已经通过logrotate
每个月将要备份的日志分别打包成了.gz文件,所以只需要定期(建议每隔6个月)登录服务器,将.gz文件下载下来,保存到本地,再多硬盘备份,就可以确保“留存相关的网络日志不少于六个月”,而且可实现网站日志的永久保存。
我习惯用FileZilla连接远程服务器进行资源下载,连接过程参考我之前写的这篇文章:《WordPress网站速度优化(三):上传favicon.ico图标,处理非必要301重定向》,连接上后,再下载我们需要的相关日志文件。
下载 Nginx 日志:
-
在右侧(服务器)窗口中,导航到 /root/my_website/nginx/logs/ 目录。
-
在左侧(本地)窗口中,导航到你想保存日志的文件夹。
-
在右侧窗口中,选中所有以 .gz 结尾的文件,然后直接拖拽到左侧窗口中。
下载系统日志:
-
在右侧窗口中,导航到 /var/log/ 目录。
-
重复上面的拖拽操作,将所有需要的 .gz 文件下载下来。
未经允许不得转载:无花果 » 留存网站日志不少于六个月,确保合法合规