应急响应
应急响应概述
Windows入侵排查
Windows日志分析
Linux入侵排查
Linux日志分析
Windows入侵排查【详细版】
Linux入侵排查【详细版】
蚁剑流量分析
冰蝎流量分析
中国菜刀流量分析
Webshell管理工具流量特征
-
+
首页
Linux日志分析
## 历史命令 查看自己的命令历史文件:~/.bash_history 查看历史命令工具:history | 对比维度 | history 命令 | .bash_history 文件 | | ----------- | ---------------------------------------------- | ------------------------------------------------------------ | | 本质 / 作用 | 终端工具,用于读取、展示、操作命令历史 | 磁盘文件,用于持久化存储当前用户的命令历史 | | 存储位置 | 仅存在于当前终端的内存中 | 固定在用户家目录:~/.bash_history(如 /home/user/.bash_history) | | 生命周期 | 随终端会话存在,关闭终端后内存释放 | 长期保存在磁盘,除非手动删除或覆盖 | | 内容时效性 | 实时包含当前终端执行的所有命令(包括未保存的) | 仅包含上一次关闭终端前的命令(默认不实时更新) | history命令的常用参数 | 参数 | 作用核心 | 典型场景 | | --------------- | ------------------------------------ | -------------------------------------------------------- | | history N | 显示最近 N 条命令 | 快速定位刚执行的操作 | | history -c | 清空内存历史 | 清理敏感命令 | | history -a | 追加内存命令到文件 | 多终端同步命令 | | history -r | 从文件加载命令到内存 | 读取其他终端的新命令 | | history -d 序号 | 删除指定序号命令 | 删除单条敏感记录 | | !! | 执行上一条命令 | 补全 sudo 权限(sudo !!) | | w | 强制将内存命令写入文件,覆盖原有内容 | 终端未正常关闭(如崩溃)时,手动保存内存中的命令到文件。 | 全局历史命令配置文件位于:/etc/bash.bashrc,对系统中所有用户生效(包括新创建的用户),适合统一配置服务器的历史命令规则。 用户历史命令配置文件位于:~/.bashrc,仅对当前登录用户生效,是自定义历史命令规则的首选文件,若用户定义了相同的变量,会覆盖系统级的设置。 常见配置信息: ```txt # 内存中保留的历史命令最大条数(默认1000条) HISTSIZE=1000 # .bash_history 文件中保存的历史命令最大条数(默认1000条) HISTFILESIZE=2000 # 忽略连续重复的命令(如连续两次执行 ls,只记录一次) HISTCONTROL=ignoredups ``` ## 日志存放位置 Linux 系统日志默认集中在 /var/log/ 目录下,不同文件负责记录不同类型的事件。  系统不同日志文件略有差异,当前以Ubuntu为例。 | 文件名(含后缀) | 核心用途 | | ----------------------------- | ------------------------------------------------------------ | | alternatives.log | 记录系统 update-alternatives 工具的操作(如切换默认编辑器、Java 版本等)。 | | alternatives.log.1 | alternatives.log 的历史轮转日志(旧日志,默认保留 1 个周期,非实时)。 | | auth.log | 系统认证日志(核心!记录 SSH 登录、sudo 操作、用户密码验证等安全相关事件)。 | | auth.log.1 | auth.log 的历史轮转日志(旧认证记录,如之前的登录失败 / 成功记录)。 | | boot.log | 记录系统启动过程中服务的启动状态(如 nginx、mysql 启动成功 / 失败)。 | | boot.log.1/2/3 | boot.log 的历史轮转日志(保留最近 3 次启动的服务状态记录)。 | | bootstrap.log | 记录系统初始化(如安装 / 升级过程中)的基础服务启动日志(多在系统首次启动时生成)。 | | btmp | 记录所有用户的登录失败记录(需用 lastb 命令查看,直接打开是乱码)。 | | btmp.1 | btmp 的历史轮转日志(旧的登录失败记录)。 | | cloud-init.log | Ubuntu 云实例特有的日志(记录云初始化过程,如网络配置、用户创建、脚本执行)。 | | cloud-init-output.log | cloud-init 的详细输出日志(含初始化过程中的报错信息,排查云实例启动问题)。 | | cups | CUPS 打印机服务的日志目录(子文件记录打印机连接、打印任务成功 / 失败)。 | | cups-browsed | 记录 CUPS 打印机浏览服务的运行日志(如发现网络打印机、打印机状态更新)。 | | dmesg | 记录系统内核消息(如硬件驱动加载、磁盘 / 网卡识别、内存分配,可直接 cat 查看)。 | | dmesg.0/1.gz/2.gz/3.gz/4.gz | dmesg 的历史轮转日志(.gz 为压缩格式,节省空间,用 zcat dmesg.1.gz 查看)。 | | dpkg.log | 记录 dpkg 包管理工具的操作(如安装 / 卸载 / 升级软件,如 sudo dpkg -i xxx.deb)。 | | dpkg.log.1 | dpkg.log 的历史轮转日志(旧的软件包操作记录)。 | | faillog | 记录用户认证失败的详细信息(如密码错误次数、失败时间,需用 faillog 命令查看)。 | | fontconfig.log | 记录字体配置服务 fontconfig 的运行日志(如字体缓存生成、字体文件加载问题)。 | | gdm3 | GNOME 桌面管理器(GDM3)的日志目录(子文件记录桌面登录、界面渲染报错)。 | | gpu-manager.log | 记录 GPU 管理器的运行日志(如显卡驱动检测、GPU 资源分配,排查桌面显卡问题)。 | | kern.log | 系统内核日志(专注于内核相关事件,如硬件错误、进程调度、内核模块加载)。 | | kern.log.1 | kern.log 的历史轮转日志(旧的内核事件记录)。 | | lastlog | 记录所有用户的最近一次登录信息(如登录时间、IP、终端,需用 lastlog 命令查看)。 | | openvpn | OpenVPN 服务的日志目录(子文件记录 VPN 连接建立 / 断开、认证失败等)。 | | README | /var/log 目录的说明文件(提示日志文件用途、轮转规则等基础信息,纯文本)。 | | sssd | 系统安全服务守护进程(SSSD)的日志目录(记录用户身份认证、LDAP 连接等,多在企业环境使用)。 | | syslog | Ubuntu 系统综合日志(核心!记录大部分系统服务、进程的运行信息,与 auth.log 互补)。 | | syslog.1 | syslog 的历史轮转日志(旧的系统综合事件记录)。 | | ubuntu-advantage-apt-hook.log | 记录 Ubuntu Advantage 服务(如安全更新、扩展支持)的 APT 钩子操作日志。 | | unattended-upgrades | 记录系统自动更新服务(Unattended Upgrades)的日志(如自动下载 / 安装安全更新)。 | | wtmp | 记录所有用户的登录 / 注销历史(需用 last 命令查看,直接打开是乱码)。 | > 重点关注的目录或文件 /var/log/auth.log(Debian/Ubuntu)或 /var/log/secure(CentOS/RHEL):认证日志,记录用户登录(ssh、su、sudo)、权限变更等安全相关件。 | 文件名 | 核心用途(为什么重点) | 典型场景 | | -------- | ------------------------------------------------- | ----------------------------------------------------- | | syslog | 系统综合日志,记录 90% 非认证类系统事件 | 服务启动失败(如 nginx 启动报错)、进程崩溃、系统警告 | | auth.log | 安全认证日志,所有登录 / 权限操作的 “唯一记录源” | SSH 暴力破解、sudo 权限滥用、用户登录失败 / 成功 | | kern.log | 内核专属日志,硬件 / 内核级故障的 “唯一突破口” | 网卡识别失败、磁盘 IO 错误、内核 panic(崩溃) | | dmesg | 系统启动时的内核日志,硬件初始化问题 “必看” | 开机识别不到内存 / 磁盘、驱动加载失败 | | boot.log | 系统启动服务日志,开机服务故障 “直接定位” | 开机后 mysql/nginx 未启动、服务依赖缺失 | | dpkg.log | APT/dpkg 包管理日志,软件安装 / 升级故障 “关键” | apt install 失败、依赖冲突、软件卸载异常 | | wtmp | 登录 / 注销历史记录,用户操作轨迹 “溯源依据” | 查谁登录过系统、登录时长、登录终端 | | lastlog | 所有用户 “最近一次登录” 记录,账号安全 “快速核查” | 确认普通用户是否被非法登录、登录 IP 是否异常 | ## 登录信息分析 ### 登录认证日志 /var/log/auth.log 统计攻击者爆破了SSH多少次,统计所有IP登录失败的次数。 ```bash root@ubuntu:/var/log# cat ./auth.log | grep Failed | awk -F " " '{print $9}' | sort | uniq -c 6 192.168.181.1 124 192.168.181.129 2 192.168.186.130 5 'org.bluez': ``` 登陆成功的IP地址次数: ```bash root@ubuntu:/var/log# cat ./auth.log | grep Accepted | awk -F " " '{print $9}' | uniq -c ``` 登录成功和登录失败都看呢? ```bash root@ubuntu:/var/log# cat ./auth.log | grep -e "Accepted" -e "Failed" #grep -i 不区分大小写 #想要查询二进制文件内容 grep -a #-A n 看后N条日志 #-C n 看中间N条日志 #-B n 看前N条日志 #-E 正则表达式 例如:cat ./auth.log | grep -E "Accepted.*" root@ubuntu:/var/log# cat ./auth.log | grep -E "Accepted.*3953" 2025-10-16T12:06:06.311264+08:00 test-VMware-Virtual-Platform sshd[2099]: Accepted password for test from 192.168.181.1 port 3953 ssh2 ``` ### 用户登录状态 | 文件名 | 记录内容 | 生命周期 | 场景 | | ---------------- | ----------------------------------- | ---------------------------------- | -------------------------- | | /var/log/lastlog | 每个用户最近一次登录的详细信息 | 永久保留 | 快速核查用户是否被非法登录 | | /var/log/wtmp | 所用用户的登录/注销历史(成功登录) | 按日志轮转保留(默认几周、几个月) | 追溯用户登录轨迹 | | /var/run/utmp | 当前正在登录的用户信息 | 系统重启后自动清空 | 查看当前是谁在线 | | /var/log/btmp | 所有用户的登录失败记录 | 按日志轮转保留(默认几周、几个月) | 排查暴力破解 | > /var/log/lastlog 记录用户最近一次的登录信息。 lastlog是二进制文件,命令为lastlog ```bash root@ubuntu:/var/log# lastlog 用户名 端口 从最近的 root pts/2 192.168.181.1 三 10月 15 18:40:09 +0800 2025 daemon **从未登录过** bin **从未登录过** hplip **从未登录过** gnome-remote-desktop pts/0 192.168.186.1 三 10月 15 17:38:32 +0800 2025 polkitd **从未登录过** rtkit **从未登录过** colord **从未登录过** gnome-initial-setup **从未登录过** gdm **从未登录过** nm-openvpn **从未登录过** test pts/0 192.168.181.1 四 10月 16 12:08:55 +0800 2025 sshd **从未登录过** news **从未登录过** uucp **从未登录过** proxy **从未登录过** ``` 特点:文件大小固定(每个用户占用固定字节),不会随时间无限增长,只会更新用户的 “最近一次” 记录。 > /var/log/wtmp 记录所有用户的成功登录、注销、系统重启事件,包含登录时间、注销时间、登录 IP、终端、持续时长等。 wtmp二进制文件,命令为last ```bash root@ubuntu:/var/log# last test pts/0 192.168.181.1 Thu Oct 16 12:08 still logged in reboot system boot 6.14.0-33-generi Thu Oct 16 12:08 still running test pts/0 192.168.181.1 Thu Oct 16 12:06 - 12:08 (00:02) reboot system boot 6.14.0-33-generi Thu Oct 16 12:05 - 12:08 (00:02) test pts/0 192.168.181.1 Thu Oct 16 12:05 - 12:05 (00:00) reboot system boot 6.14.0-33-generi Thu Oct 16 09:11 - 12:05 (02:53) ``` ```bash # 显示最近10条登录记录 last -n 10 root@ubuntu:/var/log# last -n 3 test pts/0 192.168.181.1 Thu Oct 16 12:08 still logged in reboot system boot 6.14.0-33-generi Thu Oct 16 12:08 still running test pts/0 192.168.181.1 Thu Oct 16 12:06 - 12:08 (00:02) # 只显示root用户的登录历史 root@ubuntu:/var/log# last test test pts/0 192.168.181.1 Thu Oct 16 12:08 still logged in test pts/0 192.168.181.1 Thu Oct 16 12:06 - 12:08 (00:02) test pts/0 192.168.181.1 Thu Oct 16 12:05 - 12:05 (00:00) test pts/0 192.168.181.1 Wed Oct 15 19:35 - 21:03 (01:27) test pts/2 192.168.181.1 Wed Oct 15 18:31 - 18:31 (00:00) test pts/2 192.168.181.1 Wed Oct 15 18:30 - 18:30 (00:00) test pts/1 192.168.181.1 Wed Oct 15 18:16 - 19:35 (01:18) test tty2 tty2 Wed Oct 15 18:15 - down (01:19) test seat0 login screen Wed Oct 15 18:15 - down (01:19) # 显示系统重启记录 root@ubuntu:/var/log# last reboot reboot system boot 6.14.0-33-generi Thu Oct 16 12:08 still running reboot system boot 6.14.0-33-generi Thu Oct 16 12:05 - 12:08 (00:02) reboot system boot 6.14.0-33-generi Thu Oct 16 09:11 - 12:05 (02:53) reboot system boot 6.14.0-33-generi Wed Oct 15 19:35 - 21:03 (01:27) reboot system boot 6.14.0-33-generi Wed Oct 15 18:15 - 19:35 (01:20) reboot system boot 6.14.0-33-generi Wed Oct 15 10:21 - 19:35 (09:13) ``` 特点:文件会随时间增长,系统通过 logrotate 定期轮转(生成 wtmp.1 wtmp.2.gz 等旧文件),默认保留几周的记录。 > /var/run/utmp 当前正在登录系统的用户信息,包括用户名、登录终端(如 pts/0)、登录 IP、登录时间。 用户注销或终端关闭后,记录会被删除。 who、w、users(均读取 utmp,输出格式略有不同)。 ```bash root@ubuntu:/var/log# who test pts/0 2025-10-16 12:08 (192.168.181.1) root@ubuntu:/var/log# w 14:16:41 up 2:08, 2 users, load average: 0.00, 0.00, 0.00 USER TTY 来自 LOGIN@ IDLE JCPU PCPU WHAT test 192.168.181.1 12:08 2:07m 0.00s 0.01s sshd: test [priv] gdm tty1 - 12:08 2:07m 15.75s 0.01s /usr/libexec/gsd-printer root@ubuntu:/var/log# users test ``` > /var/log/btmp 所有登录失败的尝试,包括错误用户名、失败时间、来源 IP、失败原因(如密码错误、用户名不存在)。 所用命令为lastb。 ```bash root@ubuntu:/var/log# lastb root root ssh:notty 192.168.181.1 Thu Oct 16 13:40 - 13:40 (00:00) root ssh:notty 192.168.181.1 Thu Oct 16 13:40 - 13:40 (00:00) root ssh:notty 192.168.181.1 Thu Oct 16 13:40 - 13:40 (00:00) root ssh:notty 192.168.181.129 Thu Oct 16 13:37 - 13:37 (00:00) root@ubuntu:/var/log# lastb -n 3 root ssh:notty 192.168.181.1 Thu Oct 16 13:40 - 13:40 (00:00) root ssh:notty 192.168.181.1 Thu Oct 16 13:40 - 13:40 (00:00) root ssh:notty 192.168.181.1 Thu Oct 16 13:40 - 13:40 (00:00) ``` ## 日志查看技巧 ### Grep命令 " | "管道符:连接多条命令时,前一个命令执行成功后,将结果交给后一个命令继续执行。 " grep "命令:查找文件里符合条件的字符串。  " \| " 如果不使用grep命令的任何选项,可以通过使用 '|' 来分割多个pattern,以此实现OR的操作。 ```bash [root@localhost ~]# cat /var/log/secure | grep "Accepted\|Failed" Nov 2 11:26:22 localhost sshd[1718]: Accepted password for root from 192.168.222.1 port 9116 ssh2 Nov 2 13:21:47 localhost sshd[3046]: Failed password for invalid user deepmountains from 192.168.222.1 port 10326 ssh2 Nov 2 13:53:56 localhost sshd[1490]: Accepted password for root from 192.168.222.1 port 9613 ssh2 ``` " -E " 通过指定参数大E的方式,以正则表达式的方式来检索内容 ```bash # 检索来自192.168.222.1:9952的连接信息 [root@localhost ~]# cat /var/log/secure | grep -E '192.168.222.1.*9952 ssh2' Nov 2 14:10:02 localhost sshd[1506]: Accepted password for root from 192.168.222.1 port 9952 ssh2 # egrep命令可以不加-E参数,便直接是正则表达式。 [root@localhost ~]# cat /var/log/secure | egrep -E '192.168.222.1.*9952 ssh2' ``` " -e " 通过指定参数小e的方式,可以传入多个检索的条件,但是是" 或 "的关系。 ```bash [root@localhost ~]# cat /var/log/secure | grep -e "Accepted" -e "Failed" Nov 2 11:26:22 localhost sshd[1718]: Accepted password for root from 192.168.222.1 port 9116 ssh2 Nov 2 13:21:47 localhost sshd[3046]: Failed password for invalid user deepmountains from 192.168.222.1 port 10326 ssh2 Nov 2 13:53:56 localhost sshd[1490]: Accepted password for root from 192.168.222.1 port 9613 ssh2 ``` 多个" grep "以及管道符的串联即可以实现" 与 "的操作;" -v " 通过指定参数小v的方式,可以实现" not "的操作。 ```bash # 第一次grep筛选掉了Accepted关键字,后续egrep的筛选Accepted以及Failed关键字的内容中,就不会含有Accepted。 [root@localhost ~]# cat /var/log/secure | grep -v -E 'Accepted' | egrep "Accepted|Failed" Nov 2 13:21:47 localhost sshd[3046]: Failed password for invalid user deepmountains from 192.168.222.1 port 10326 ssh2 ``` ### Uniq命令 uniq命令:检查以删除文本文件重复出现的行/列;当重复的两行不相邻时不起作用,需要结合排序命令sort。 sort命令:将内容以行为单位加以排序,默认规则以字符的ASCII次序进行排序。 ```bash # 参数 -n 依照数值的大小排序 # 参数 -r 以相反的顺序来排序 # 参数 -t 设置排序时所用的分隔字符 # 参数 -k 指定需要排序的列 $ sort -t : -nrk 3 /etc/passwd test:x:1000:1000::/home/test:/bin/bash polkitd:x:999:997:User for polkitd:/:/sbin/nologin chrony:x:998:996::/var/lib/chrony:/sbin/nologin systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin # 对分割后第三列的数据进行倒叙排序 ``` ```bash [root@localhost ~]# lastb | sort | uniq root ssh:notty 192.168.222.1 Mon Nov 2 13:21 - 13:21 (00:00) ``` ### Cut命令 cut命令:从文件中的每一行中截取一部分,并输出到标准输出中 。 ```bash # 参数 –d/自定义分隔符,默认为制表符 # 参数 –f/指定显示哪个区域,如果是“-f 2-”则表示第二个区域之后的所有字符串都输出 # 参数 –c/以字符为单位进行分割 # 检索ssh连接中的源IP地址 [root@localhost ~]# cut -d " " -f 11 /var/log/secure | egrep "^[1-9].*[1-9]$" 192.168.222.1 192.168.222.203 ``` ### Sed命令 sed是一种流编辑器,它一次处理一行内容。 处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。 ```bash # sed [选项参数] ‘command’ filename # 参数 -e 多条件操作 # 参数 -a 对文件的内容新增,a后面接字符串,在下一行出现 # 参数 -d 删除 # 参数 -s 查找 $ sed '2a tou shang lv you you' sed.txt chun nuan hua kai beng ni er lai tou shang lv you you ..... $ cat sed.txt chun nuan hua kai beng ni er lai ..... # 注意文件的内容并没有发生改变 $ sed '/ni/d' sed.txt chun nuan hua kai ..... # 删除所有包含ni的行 $ sed 's/a//' file # 删除置顶的字符串,并非删除行 $ sed 's/ni/wo/g' sed.txt chun nuan hua kai beng wo er lai ..... # 将所有的ni替换成wo,s为固定字符 $ sed -e '2d' -e 's/ni/wo/g' sed.txt chun nuan hua kai ..... # 使用-e进行多条件操作 ``` ### Awk命令 Awk是一种处理文本文件的语言,是一个强大的文本分析工具。 ```bash # "-F"指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式 [root@localhost ~]# awk -F" " '$6=="Accepted"{print $11}' /var/log/secure 192.168.222.1 192.168.222.203 # 在分割数据之后,可以通过表达式来完成内容的筛选。在单引号的内容中传入表达式: # $6 == "Accepted" :分割后的第6块内容的数据若等于"Accepted" # {print $11} :则输出第11块的数据内容 ``` ```bash ## 知识拓展 # "-v"赋予一个用户定义的变量 $ awk -F: '/^root/{print $1","$7}' /etc/passwd root,/bin/sh # ":"为分割,以root开头的关键字行,输出$1和$7的组合。 $ awk -F: 'BEGIN{print "user,shell"} {print $1","$7} END{print "----------------------"}' /etc/passwd user,shell root,/bin/bash bin,/sbin/nologin ftp,/sbin/nologin nobody,/sbin/nologin systemd-network,/sbin test,/bin/bash ---------------------- # 在输出的开头增加字段,在输出的结尾增加字段 $ awk -F: -v i=1 '{print $3+i}' /etc/passwd 1 2 999 1001 # 输出每个用户的uid值+1 ## awk内置变量 # FILENAME 文件名 # NR 已读的记录数,说白了切到拿一行了 # NF 浏览记录的域的个数(切割后列的个数) $ awk -F: '{print "filename:" FILENAME " linenumber:" NR " columns:" NF}' /etc/passwd filename:/etc/passwd linenumber:1 columns:7 filename:/etc/passwd linenumber:2 columns:7 filename:/etc/passwd linenumber:3 columns:7 $ cat sed.txt chun nuan hua kai beng ni er lai ..... $ awk '/^$/{print NR}' sed.txt 3 # 查询sed.txt文件中空行所在的行号 ``` ## 中间件日志分析 核心思路一致:**定位日志源→提取关键字段→关联异常现象→定位根因**。 ### Nginx | 日志类型 | 默认位置 | 描述 | | -------- | ------------------------- | -------------------------------------------- | | 访问日志 | /var/log/nginx/access.log | 记录所有客户端请求,含 URL、状态码、IP | | 错误日志 | /var/log/nginx/errot.log | 记录服务器内部错误,如连接超时、上游服务异常 | > log中默认体现的日志格式 ```txt 192.168.222.1 - - [23/Nov/2020:11:19:44 +0800] "GET /resource/default/static/assets/css/index.css HTTP/1.1" 404 208 "http://192.168.222.238:81/small" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ``` 字段含义分别是: ```txt 客户端IP地址 用户标识[-] 认证用户[-] 时间 请求行 状态码 响应大小 Referer User-Agent ``` > 场景 ```txt 统计状态码分布(看是否有大量 4xx/5xx 错误): awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -nr 查找 502 错误的请求(上游服务异常): grep " 502 " /var/log/nginx/access.log # 结合error.log看具体原因(如"connect() failed") 定位访问量最高的 URL(排查性能瓶颈): awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10 实时跟踪访问日志(观察请求动态): tail -f /var/log/nginx/access.log | grep -v "200" # 过滤正常200请求,只看异常 ``` > 示例-nginx_access.log ```txt # 查看访问最频繁的前10个IP root@ubuntu:/var/log/nginx# awk '{print $1}' access.log | sort -n |uniq -c | sort -rn | head -n 10 6788 192.168.222.200 106 192.168.222.1 # 查看访问100次以上的IP root@ubuntu:/var/log/nginx# awk '{print $1}' access.log | sort -n |uniq -c |awk '{if($1 >100) print $0}'|sort -rn # 查询某个IP的详细访问情况,按访问频率排序 root@ubuntu:/var/log/nginx# grep '192.168.222.200' access.log |awk '{print $7}'|sort |uniq -c |sort -rn |head -n 100 301 / 190 /page.html 187 /manager/status 39 /manager/ 33 /examples/ # 统计每秒的请求数,top100的时间点(精确到秒) root@ubuntu:/var/log/nginx# awk '{print $4}' access.log |cut -c 14-21|sort|uniq -c|sort -nr|head -n 100 619 15:28:19 523 15:28:20 475 15:28:21 431 15:28:14 # 统计每分钟的请求数,top100的时间点(精确到分钟) root@ubuntu:/var/log/nginx# awk '{print $4}' access.log |cut -c 14-18|sort|uniq -c|sort -nr|head -n 100 5507 15:28 765 15:31 # 统计每小时的请求数,top100的时间点(精确到小时) root@ubuntu:/var/log/nginx# awk '{print $4}' access.log |cut -c 14-15|sort|uniq -c|sort -nr|head -n 100 # 查看访问最频的页面(TOP100) root@ubuntu:/var/log/nginx# awk '{print $7}' access.log | sort |uniq -c | sort -rn | head -n 100 ``` > Nginx日志分析工具——goaccess 在ubuntu中直接通过apt-get install goaccess即可安装,安装完毕后通过goaccess -f access.log -c命令执行。  goaccess提供多种日志格式的分析,只要是遵循NCSA以及W3C等格式的日志都可以进行分析,包括IIS、Apache、Tomcat以及Nginx。选择完毕后通过回车进入分析页面。  ### Tomcat Tomcat 日志默认存储在 $CATALINA_HOME/logs 目录($CATALINA_HOME 为 Tomcat 安装目录,如 /usr/local/tomcat 或 /opt/tomcat) | 日志文件名格式 | 类型 | 核心作用 | | ----------------------------------- | ------------ | ------------------------------------------------------------ | | catalina.out | 容器核心日志 | 记录 Tomcat 启动 / 关闭过程、JVM 日志、应用部署信息、未捕获的异常堆栈(最关键的日志) | | catalina.YYYY-MM-DD.log | 容器核心日志 | 与 catalina.out 内容类似,但按日期分割(需在 logging.properties 中配置) | | access_log.YYYY-MM-DD | 访问日志 | 记录 HTTP 请求明细(客户端 IP、URL、状态码、响应时间等,默认不开启) | | localhost.YYYY-MM-DD.log | 本地主机日志 | 记录 Tomcat 内部组件(如 Servlet 容器)的初始化、部署日志(不含应用业务日志) | | localhost_access_log.YYYY-MM-DD.txt | 访问日志 | 部分版本的访问日志默认文件名(与 access_log 功能一致) | | manager.YYYY-MM-DD.log | 管理日志 | 记录通过 Tomcat Manager 界面执行的操作(如部署 / 卸载应用、重启服务) | | host-manager.YYYY-MM-DD.log | 主机管理日志 | 记录虚拟主机配置相关的操作日志(较少用到) | > 访问日志 记录所有 HTTP 请求的明细,需手动开启(默认关闭),开启方式:编辑 $CATALINA_HOME/conf/server.xml ```xml # 把以下的注释(<!-- -->)去掉即可。 root@ubuntu:/home/ctf/apache-tomcat-7.0.91/conf# vim server.xml <!-- <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> --> root@ubuntu:~# systemctl restart tomcat ``` 字段含义: ```txt pattern="%h %l %u %t "%r" %s %b" 192.168.43.101 - - [15/Nov/2018:02:49:57 +0000] "GET /upload/image/cast01.png HTTP/1.1" 404 - ``` | 参数 | 描述 | | ---- | ------------------------------------------------------------ | | %a | 记录访问者的 IP | | %A | 本地服务器的 IP | | %b | 发送信息的字节数,不涵括 http 头,如果字节数为 0 的话,显示为 - | | %h | 访问的用户 IP 地址 | | %H | 访问者使用的协议 | | %r | 请求的第一行,包含了请求的方法和 URI | | %p | 本地接收访问的端口 | | %q | querystring | | %s | 访问返回的 http 状态 | | %S | 用户的 session ID | | %t | 访问日时 | | %u | 访问验证用户名,通常返回 '-' | | %l | 访问逻辑用户名,通常返回 '-' | | %U | 访问的 URL 地址 | | %v | 服务器名称 | | %D | 应该是访问发生的时间 | | %T | 访问所使用的时间 | > 示例-tomcat_localhost_access_log.2018-11-15.log ```txt # 分析日志文件中源IP的列表 root@ubuntu:/home/ctf/apache-tomcat-7.0.91/logs# awk -F" " '{print $1}' localhost_access_log.2018-11-16.txt | sort | uniq 192.168.43.101 # 被访问次数最多的几个文件 root@ubuntu:/home/ctf/apache-tomcat-7.0.91/logs# awk -F" " '{print $7}' localhost_access_log.2018-11-15.txt | sort | uniq -c | sort -nr | head -n 5 31 /favicon.ico 14 /JspWar/index.jsp 8 /upload/image/cast01.png 4 /ofcms-admin/upload/image/banner04.png 4 /ofcms-admin/upload/image/banner03.png ``` ### Apache | 类型 | 默认位置 | 内容 | | -------- | --------------------------------------------------------- | -------------------------------------- | | 访问日志 | var/log/apache2/access.log<br />/var/log/httpd/access_log | 记录所有对apache服务器进行请求的访问 | | 错误日志 | /var/log/apache2/error.log<br />/var/log/httpd/error_log | 记录服务器运行时的错误、警告和调试信息 | > 访问日志格式 ```txt 192.168.1.1 - - [15/Nov/2025:10:30:00 +0800] "GET /index.php HTTP/1.1" 200 1234 "https://example.com" "Mozilla/5.0" ``` ```txt 客户端IP地址 远程用户标识 远程认证用户 时间 请求行 状态码 Referer User-Agent ``` > 示例日志-apache_access.log ```txt # 定位日志中访问次数最多的IP root@ubuntu:/var/log/apache2# awk -F" " '{print $1}' access.log|sort|uniq -c |sort -nr|head -n 5 3299 192.168.112.236 49 192.168.112.147 48 192.168.222.1 42 192.168.112.50 39 192.168.37.133 # 输出访问次数大于100次的IP,$0指的是输出所有项 root@ubuntu:/var/log/apache2# cat access.log |cut -d ' ' -f 1 |sort |uniq -c | awk '{if ($1 > 100) print $0}' | sort -nr 3299 192.168.112.236 ``` > 图形化分析工具:ApacheLogsViewer 添加本地日志文件:本质上使用apache的日志语法都可以导入,包括Tomcat日志。  使用语法进行筛选  ## 数据库日志分析 ### MySQL | **日志类型** | **核心作用** | **关键配置参数** | | --------------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | | 错误日志(Error Log) | 记录 MySQL 启动、运行、停止过程中的错误、警告和关键事件(如崩溃、权限问题、表损坏) | log_error = /var/log/mysql/error.log<br />log_error_verbosity = 3(日志详细程度) | | 慢查询日志(Slow Query Log) | 记录执行时间超过阈值(默认 10 秒)的低效 SQL 语句,用于性能调优 | slow_query_log = ONslow_query_log_file = /var/log/mysql/slow.log<br />long_query_time = 2(单位:秒) | | 二进制日志(Binary Log) | 记录所有数据变更操作(DDL/DML),用于主从复制、数据恢复(如误删数据找回) | log_bin = /var/log/mysql/mysql-bin.log<br />binlog_format = ROW(推荐行模式) | | 通用查询日志(General Query Log) | 记录所有客户端连接和 SQL 请求,仅用于临时调试(生产环境禁用,性能影响大) | general_log = ONgeneral_log_file = /var/log/mysql/general.log | | InnoDB Redo/Undo Log | 保障事务持久性(Redo)和回滚(Undo),属于存储引擎层日志(无需手动分析,系统自动管理) | innodb_log_file_size = 4Ginnodb_log_files_in_group = 2 | > 错误日志 它记录了MariaDB/MySQL服务启动和停止正确和错误的信息,还记录了mysqld实例运行过程中发生的错误事件信息。 在默认情况下已经被开启。 ```bash root@ubuntu:~# vim /etc/mysql/my.cnf log_error = /var/log/mysql/error.log ``` 在数据库中可以通过命令行验证error日志的位置。 ```sql mysql> show variables like 'log_error'; +---------------+--------------------------+ | Variable_name | Value | +---------------+--------------------------+ | log_error | /var/log/mysql/error.log | +---------------+--------------------------+ ``` > 查询日志 查询日志分为一般查询日志和慢查询日志,它们是通过查询是否超出变量 long_query_time 指定时间的值来判定的。 在超时时间内完成的查询是一般查询,可以将其记录到一般查询日志中,但是建议关闭这种日志(默认是关闭的),超出时间的查询是慢查询,可以将其记录到慢查询日志中。 Mysql一般日志查询功能需要在配置文件中开启 ```bash # General为一般查询日志 # General_log_file用来指定一般查询日志存放路径,General_log表示指定是否查询日志功能。 root@ubuntu:~# vim /etc/mysql/my.cnf general_log_file = /var/log/mysql/mysql.log general_log = 1 ``` > 二进制日志 进制日志主要用来记录操作MySQL数据库中的写入性操作(增删改,但不包括查询)。 二进制日志的作用: - 用于复制,配置了主从复制的时候,主服务器会将其产生的二进制日志发送到slave端,slave端会利用这个二进制日志的信息在本地重做,实现主从同步。 - 用户恢复,MySQL可以在全备和差异备份的基础上,利用二进制日志进行基于时间点或者事物Id的恢复操作。原理雷同于主从复制的日志重做。 ```bash root@ubuntu:~# vim /etc/mysql/my.cnf log_bin = /var/log/mysql/mysql-bin.log # 二进制日志文件存放的位置 expire_logs_days = 10 # 二进制日志存放的最长时间,超过时间为过期。每次进行"LOG flush"的时会自动删除过期的日志。 max_binlog_size = 100M # 二进制日志存放的最大大小 #binlog_do_db = include_database_name # 记录某一个数据库增删改的二进制文件 #binlog_ignore_db = include_database_name # 不记录某一个数据库增删改的二进制文件 ``` > 示例-mysql.log ```bash # 很明显就可以看出来192.168.222.200在进行爆破,但是是否有爆破成功不得而知 root@ubuntu:~# awk -F "Connect" '{print $2}' /var/log/mysql/mysql.log | sort | uniq -c 3 Access denied for user 'root'@'192.168.222.200' (using password: NO) 1871 Access denied for user 'root'@'192.168.222.200' (using password: YES) 1 Access denied for user 'root'@'localhost' (using password: YES) 1878 root@192.168.222.200 on 2 root@localhost as on 3 root@localhost on # 我们可以看到ID 3816对应的连接,并没有返回Access denied,表示攻击者登录成功。 root@ubuntu:~# cat /var/log/mysql/mysql.log 3814 Connect root@192.168.222.200 on 3814 Connect Access denied for user 'root'@'192.168.222.200' (using password: YES) 3815 Connect root@192.168.222.200 on 3815 Connect Access denied for user 'root'@'192.168.222.200' (using password: YES) 3816 Connect root@192.168.222.200 on ```
毛林
2025年10月16日 20:05
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码