博客

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

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

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

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

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

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

    本文主要分析哪些日志值得我们保存,以及运用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 文件下载下来。


  • 世界,您好!

    欢迎使用 WordPress。这是您的第一篇文章。编辑或删除它,然后开始写作吧!