微信扫码,获取更多

留存网站日志不少于六个月,确保合法合规

《中华人民共和国网络安全法》第二十一条要求,网络运营者应按照规定留存相关的网络日志不少于六个月

为了确保已备案的网站合法合规,我们还要定期备份网站的相关日志,并留存不少于六个月。

对于个人站长来说,网站搭建好,设置简单的防护后,因为用户量小、被关注度小,基本不会有什么大的故障,所以很多人不会去查看网站日志,更不会去保留日志。

其实除了合法合规,出于安全分析和故障排查的目的,我们也还是有必要定期留存相关网络日志。

本文主要分析哪些日志值得我们保存,以及运用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/ 的某个子目录中。

  • 内容: 取决于插件。可能是安全事件日志、性能监控日志等。

  • 是否值得备份取决于具体插件的重要性。 就我们目前的纯净架构而言,不存在这类日志。

综上分析,我决定备份下面这些日志

  1. /var/log/auth.log: 谁在尝试登录我的服务器?(必备)
  2. /root/my_website/nginx/logs/access.log: 谁在访问我的网站?(必备)
  3. /root/my_website/nginx/logs/error.log: 我的网站出了什么错?(必备)
  4. /var/log/syslog: 我的服务器最近健康吗?  (推荐) 
  5. /var/log/ufw.log: 防火墙最近都拦了些什么?  (推荐)
  6. /var/log/fail2ban.log: Fail2ban 最近都封了谁?(推荐) 
  7. /var/log/dpkg.log: 我最近装了/删了什么软件?  (可选) 
  8. /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 文件下载下来。


未经允许不得转载:无花果 » 留存网站日志不少于六个月,确保合法合规

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏