1 日志分析

Linux系统拥有非常灵活和强大的日志功能,可以保存几乎所有的操作记录,并可以从中检索出我们需要的信息。

日志对于系统安全来说非常重要,它记录每天发生的各种各样的事情,用户可以通过它来检查错误发生的原因,或者寻找收到攻击时攻击者留下的痕迹。日志主要的功能是审计和检测。它还可以实时检测系统状态,监测和追踪侵入者

1.1 日志简介

日志默认位置:/var/log

查看日志配置情况:more /etc/rsyslog.conf

1.2 日志消息级别

数值 英文名称 中文名称 描述 典型场景示例
0 EMERG 紧急 系统不可用,必须立即处理 内核崩溃、文件系统损坏导致系统无法启动
1 ALERT 警戒 必须立即采取行动(如不处理将导致严重问题) 磁盘空间 100% 耗尽、关键服务端口被占用
2 CRIT 严重 严重错误,服务可能中断但系统仍可运行 数据库连接失败、认证服务崩溃
3 ERR 错误 非紧急错误,服务功能部分受限 应用程序某模块调用失败、配置文件语法错误
4 WARNING 警告 潜在问题,不影响当前功能但可能预示未来故障 磁盘空间低于 10%、服务响应时间过长
5 NOTICE 通知 正常但值得注意的事件(非错误) 管理员登录、服务重启、配置文件重载
6 INFO 信息 常规运行信息,用于跟踪服务状态 用户请求处理完成、定时任务执行成功
7 DEBUG 调试 详细调试信息,仅用于开发或故障排查 函数调用参数、变量值、内部流程日志

2 日志文件

在 Linux 环境下,日志系统同样是数字取证、入侵检测和系统排错的生命线。与 Windows 高度结构化的事件查看器不同,Linux 的传统日志大多是纯文本文件,并且通常集中存放在 /var/log/ 目录下。

不过,随着 Linux 发行版的演进,现在的日志管理呈现出传统纯文本日志现代 systemd 二进制日志并存的局面。

以下是 Linux 核心日志文件的详细解析,重点突出取证和安全分析的实战价值。

2.1.1 核心安全与认证日志

这些日志是排查 SSH 爆破、未授权提权以及恶意登录的首要目标。

日志文件路径 (Debian/Ubuntu) 日志文件路径 (RHEL/CentOS) 作用说明与取证价值
/var/log/auth.log /var/log/secure 身份验证日志。记录了所有的 SSH 登录尝试(成功与失败)、su 切换用户、sudo 提权操作。在排查暴力破解或异常提权时,这是必看的第一个文件。
/var/log/wtmp /var/log/wtmp 成功登录记录。这是一个二进制文件,不能直接用 cat 看。必须使用 last 命令读取。它记录了所有用户的成功登录、注销时间、以及系统的启动/重启时间。
/var/log/btmp /var/log/btmp 失败登录记录。同样是二进制文件,使用 lastb 命令读取。如果系统遭遇了 SSH 密码爆破,这里会留下海量的记录和攻击者的 IP。
/var/run/utmp /var/run/utmp 当前在线用户。记录当前登录系统的用户信息。通常使用 wwho 命令查看。在应急响应时用于快速确认是否有黑客正挂在服务器上。

2.1.2 系统基础与服务日志

用于排查硬件故障、内核报错以及后台服务异常。

  • /var/log/syslog (Debian系) 或 /var/log/messages (RedHat系)
    • 说明:这是 Linux 的全局系统消息日志。绝大多数没有自己独立日志文件的后台服务,都会将普通信息、警告和错误输出到这里。
  • /var/log/dmesg
    • 说明:内核环形缓冲区日志(Kernel Ring Buffer)。记录了系统在启动时硬件自检、驱动加载以及内核模块的信息。通常直接使用 dmesg 命令查看(例如:dmesg | grep -i usb 可以查看 USB 设备插拔记录)。
  • /var/log/cron
    • 说明:计划任务(Cron)日志。记录了哪些计划任务在什么时间被执行。在后渗透排查中极其重要,因为攻击者非常喜欢利用 Cron 来建立持久化后门(定时反弹 Shell)。
  • /var/log/daemon.log
    • 说明:专门记录各种后台守护进程(Daemons)产生的日志信息。

2.1.3 应用与中间件日志

各种安装在 Linux 上的第三方应用通常会在 /var/log/ 下建立自己的子目录。

  • Web 服务器日志 (建站排查必备)
    • Nginx: /var/log/nginx/access.log/var/log/nginx/error.log
    • Apache: /var/log/apache2/access.log (Debian) 或 /var/log/httpd/access_log (CentOS)
  • 数据库日志
    • MySQL/MariaDB: 通常在 /var/log/mysql//var/log/mysqld.log
  • APT / YUM 日志
    • /var/log/dpkg.log (Debian/Ubuntu) 或 /var/log/yum.log (CentOS):记录了软件包的安装、更新和卸载历史。

2.1.4 其他日志文件

  • /var/log/cron
    • 记录了系统定时任务相关的日志
  • ~/.bash_history
    • 历史记录

3 相关命令

3.1.1 核心文本日志查看与过滤

这些命令主要用于处理传统的文本型日志文件(如 /var/log/messages, /var/log/nginx/access.log 等)。

  • tail:实时或查看文件尾部。
    • tail -f /var/log/syslog最常用的日志命令,实时滚动查看日志更新。
    • tail -n 100 error.log:查看最后 100 行。
  • less:分页查看大文件(强烈推荐,比 catmore 安全高效)。
    • 打开后可使用 /关键字 向下搜索,?关键字 向上搜索,按 G 直接跳到文件末尾。
  • head:查看文件头部。
    • head -n 50 install.log:查看文件开头的 50 行,通常用于看服务启动时的初始化信息。
  • cat / tac:输出整个文件内容。
    • cat 是正向输出,适合小日志文件。
    • tac 是反向输出(从最后一行开始往前显示),在排查最新报错时非常有用。
  • grep:强大的文本搜索工具,日志过滤神器。
    • grep "ERROR" app.log:筛选包含 ERROR 的行。
    • grep -i "failed" auth.log:忽略大小写搜索。
    • grep -C 5 "Exception" app.log:查看包含异常信息的行及其前后各 5 行(排查上下文极好用)。
  • awk / sed:高阶日志处理。
    • 常用于从 Nginx 等格式化日志中提取特定的列(如 IP 地址、响应时间)进行统计。

3.1.2 用户活动与安全审计

这些命令专门用于读取系统的二进制日志文件(普通的 catless 无法直接读取这些文件)。它们是系统安全审计和入侵排查的核心。

  • w:显示当前登录系统的用户及其正在执行的进程。
    • 日志关联:它读取的是 /var/run/utmp 日志文件。
  • who:类似于 w,但输出信息更精简,主要显示当前登录的用户名、终端、登录时间及 IP。
    • 日志关联:同样读取 /var/run/utmp
  • last:显示系统历史登录成功的用户记录、系统重启记录。
    • 日志关联:它解析的是 /var/log/wtmp 二进制日志文件。
    • _用法_:last -n 10(查看最近 10 次登录记录)。
  • lastb:显示登录失败的用户记录。
    • 日志关联:它解析的是 /var/log/btmp 文件。如果系统正遭受 SSH 暴力破解,这个命令会列出大量的失败尝试和攻击者 IP。
  • lastlog:报告系统中所有用户最近一次的登录时间。
    • 日志关联:它解析的是 /var/log/lastlog 文件。可以用来检查是否有未授权的僵尸账号突然登录。
  • users:最精简的命令,仅打印出当前登录的用户的用户名。
  • history:显示历史记录

3.1.3 现代 Linux 系统级与内核日志

随着 Systemd 的普及,很多服务的日志不再直接写入文本,而是由专门的守护进程管理。

  • journalctl:Systemd 日志管理器的查询工具。这是现代 Linux 排错最核心的命令
    • journalctl -xe:查看最近的系统报错信息(排查服务启动失败时必用)。
    • journalctl -u nginx.service:专门查看 Nginx 服务的日志。
    • journalctl -f:类似于 tail -f,实时追踪系统日志。
    • journalctl --since "1 hour ago":查看过去一小时内的日志。
  • dmesg:显示内核环形缓冲区(Kernel Ring Buffer)的信息。
    • 主要用途:排查硬件故障、驱动加载问题、内存 OOM(Out of Memory)被杀进程等。
    • _用法_:dmesg -T(将时间戳转换为人类可读的时间格式)。

常用 journalctl 取证/排查命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 查看所有日志 (按空格翻页)
journalctl

# 查看最近 50 条日志
journalctl -n 50

# 逆序查看日志 (最新的在最上面,类似 tail -f)
journalctl -r

# 实时追踪日志输出 (类似 tail -f /var/log/messages)
journalctl -f

# 精准过滤:只查看特定服务 (如 SSH) 的日志
journalctl -u sshd.service

# 精准过滤:按时间范围查询 (应急溯源极常用)
journalctl --since "2026-04-01 10:00:00" --until "2026-04-02 12:00:00"

# 查看特定优先级的日志 (例如只看 Error 级别及以上)
journalctl -p err

3.1.4 辅助排查与监控命令

当你仅仅看日志无法定位问题时,需要结合以下命令查看系统状态:

  • lsof (List Open Files):列出当前系统打开的文件。
    • 日志关联:有时候你发现磁盘满了,但是找不到大文件,可能是因为某个日志文件被删除了,但进程还在向里面写(文件句柄未释放)。使用 lsof | grep deleted 可以揪出这个“幽灵”日志。
    • lsof /var/log/messages:查看是哪个进程正在占用该日志文件。
  • watch:周期性执行命令并全屏显示结果。
    • _用法_:watch -n 1 "tail -n 20 /var/log/syslog" (每秒刷新一次日志的最后20行,比 tail -f 更适合某些特定监控场景)。
  • strace:跟踪系统调用和信号。
    • 日志关联:当一个程序没有日志输出,或者日志报错极其模糊时,使用 strace -p <PID> 可以直接监控该进程底层的系统交互,相当于给进程做“X光透视”。

4 隐藏操作

4.1 历史记录清除

4.1.1 操作历史记录

1
2
3
4
删除全部历史记录:history -w && history -c && > .bash_history
删除指定行的历史记录:history -d 111
备份还原历史记录:cp .bash_history his.txt
删除100行以后的历史记录:sed -i "100,$d" .bash_history

4.1.2 隐藏历史命令

1
2
3
4
开启无痕模式,禁用历史记录功能,注意有空格
set +o history
恢复
set -o history

4.2 SSH隐身登录

使用隐身登录,不会被lastwhow等指令检测到

1
2
3
ssh -T username@target_IP /bin/bash -i

ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -T username@target_IP /bin/bash -i