Linux系统拥有非常灵活和强大的日志功能,可以保存几乎所有的操作记录,并可以从中检索出我们需要的信息。 本文简介一下Linux系统日志及日志分析技巧。

Linux日志简介

linux日志配置

Linux 系统中的日志一般存放在目录“/var/log/”下,具体的日志功能如下:

  • 日志默认存放位置:
/var/log/
  • 查看日志配置情况:
more /etc/rsyslog.conf

常见linux日志文件说明

日志文件 说明
/var/log/message 1. 系统启动后的信息和错误日志,是Red Hat Linux中最常用的日志之一
2. message 是记录系统重要信息的日志。这个日志文件中会记录 Linux 系统的绝大多数重要信息,如果系统出现问题时,首先要检查的就应该是这个日志文件(也记录了某个用户切换到 root 权限的日志)
/var/log/secure 1. 与安全相关的日志信息
2. 记录验证和授权方面的信息,只要涉及账号和密码的程序都会记录,比如SSH 登录,su 切换用户,sudo 授权,甚至添加用户和修改用户密码都会记录在这个日志文件中
/var/log/auth.log 包含系统授权信息,包括用户登录和使用的权限机制等
/var/log/user.log 记录所有等级用户信息的日志
/var/log/wtmp 1. linux登录日志
2. 永久记录所有用户的登录、注销信息,同时记录系统的启动、重启、关机事件。同样这个文件也是一个二进制文件,不能直接 vi,而需要使用 last 命令来查看
/var/log/btmp 1. 记录错误登录日志,也就是登录失败的日志
2. 这个文件是二进制文件,不能直接vi查看,而要使用lastb命令查看
/var/log/lastlog 1. 最后一次登录的日志
2. 记录系统中所有用户最后一次登录时间的日志,这个文件是二进制文件,不能直接vi,而要使用lastlog命令查看
/var/log/utmp 1. 记录当前已经登录的用户信息
2. 这个文件会随着用户的登录和注销不断变化,只记录当前登录用户的信息。同样这个文件不能直接vi,而要使用w,who,users等命令来查询
/var/log/cron 记录了系统定时任务相关的日志
/var/log/cups 记录打印信息的日志
/var/log/spooler 与UUCP和news设备相关的日志信息
/var/log/mailog 记录邮件信息
/var/log/syslog 它和/etc/log/messages日志文件不同,它只记录警告信息,常常是系统出问题的信息。
/var/log/dmesg 记录了系统在开机时内核自检的信息,也可以使用dmesg命令直接查看内核自检信息
/var/log/kern.log 包含内核产生的日志,有助于在定制内核时解决问题
/var/log/boot.log 守护进程启动和停止相关的日志消息
/var/log/daemon.log 包含各种系统后台守护进程日志信息

注:

  • 比较重要的日志:
  • 登录失败记录:/var/log/btmp //lastb

  • 最后一次登录:/var/log/lastlog //lastlog

  • 登录成功记录: /var/log/wtmp //last

  • 登录日志记录:/var/log/secure

  • 目前登录用户信息:/var/run/utmp //w、who、users

  • 历史命令记录:history

  • 仅清理当前用户: history -c

  • 上述表格从上往下重要性递减
  • 补充:查看邮件相关日志:
ls -al /var/spool/mail
cat /var/spool/mail/root

可发现针对 80 端口的攻击行为(当 web 访问异常时,及时向当前系统配置的邮箱地址发送报警邮件)

ubuntu日志说明

Ubuntu 系统的日志信息保存路径为: /var/log/,如:

auth - 安全验证日志
boot - 启动日志
kern - 内核日志
syslog - 系统日志
wtmp - 与/var/run/utmp 一起记录了连接时间日志
Xorg - 显示服务日志

/var/log/ 目录日志文件说明

[1] - alternatives.log - 记录更新替代信息.

[2] - apport.log - 记录应用程序崩溃信息.

[3] - apt/ - 记录 apt-get 安装卸载软件的信息.

[4] - auth.log - 记录用户登录及身份认证信息.

[5] - boot.log - 记录系统启动时的日志信息.

[6] - btmp - 记录所有系统失败启动信息,如登录系统失败的用户、时间、IP 等信息.

[7] - cpus/ - 记录所有打印信息的日志.

[8] - dist-upgrade/ - 记录更新方式为dist-upgrade的信息.

[9] - dmesg - 内核缓冲信息(kernel ringbuffer). 如,系统启动时,显示屏幕上的与硬件有关的信息.

[10] - dpkg.log - 记录安装或dpkg命令清除软件包的日志.

[11] - debug - 调试日志信息.

[12] - faillog - 记录用户登录失败信息以及错误登录命令.

[13] - fontconfig.log - 与字体配置有关的信息.

[14] - fsck - 文件系统日志.

[15] - kern.log - 记录内核产生的日志,有助于在定制内核时解决问题.

[16] - lastlog - 记录所有用户的最近信息,如最后一次用户成功登录的时间、登录 IP 等信息. 需要用 lastlog 命令查看内容.

[17] - syslog - 记录的是系统日志服务.

[18] - wtmp - 记录用户登录系统的信息,以及使用命令查看该文件的用户信息等.

[19] - Xorg.*.log - 记录 Xorg 显示服务的日志信息.

其他

1. /var/log/yum.log

软件安装升级卸载日志:

install gcc
yum install gcc

[root@bogon ~]# more /var/log/yum.log

Jul 10 00:18:23 Updated: cpp-4.8.5-28.el7_5.1.x86_64
Jul 10 00:18:24 Updated: libgcc-4.8.5-28.el7_5.1.x86_64
Jul 10 00:18:24 Updated: libgomp-4.8.5-28.el7_5.1.x86_64
Jul 10 00:18:28 Updated: gcc-4.8.5-28.el7_5.1.x86_64
Jul 10 00:18:28 Updated: libgcc-4.8.5-28.el7_5.1.i686

Linux日志分析工具和命令

Linux下常用的shell命令如:find、grep 、egrep、awk、sed

tail

这个是我最常用的一种查看方式

#命令格式: tail[必要参数][选择参数][文件]
-f 循环读取
-q 不显示处理信息
-v 显示详细的处理信息
-c<数目> 显示的字节数
-n<行数> 显示行数
-q, --quiet, --silent 从不输出给出文件名的首部
-s, --sleep-interval=S 与-f合用,表示在每次反复的间隔休眠S秒

用法如下:

tail  -n  10   test.log   	#查询日志尾部最后10行的日志;
tail -n +10 test.log #查询10行之后的所有日志;
tail -fn 10 test.log #循环实时查看最后10行记录(最常用的)
tail -fn 1000 test.log | grep '关键字'

tail -f xxx.log #实时刷新最新日志
tail -100f xxx.log #实时刷新最新的100行日志
tail -100f xxx.log | grep [关键字] #查找最新的一百行中与关键字匹配的行
tail -100f xxx.log | grep '2019-10-29 16:4[0-9]' #查找最新的100行中时间范围在2019-10-29 16:40-2019-10-29 16:49范围中的行
tail -1000f xxx.log | grep -A 5 [关键字] #查看最新的1000行中与关键字匹配的行加上匹配行后的5行

如果一次性查询的数据量太大,可以进行翻页查看,例如:

tail -n 4700  aa.log |more -1000 
#可以进行多屏显示(ctrl + f 或者 空格键可以快捷键)

grep

grep 是 Linux 中一个常用的命令行工具,用于在文本文件中搜索匹配指定模式的行。

grep "error" logfile.txt

基本语法

  1. 基本搜索:grep pattern file,在文件中搜索包含指定模式的行。例如,grep "error" logfile.txt 将在 logfile.txt 文件中搜索包含 “error” 的行。

  2. 忽略大小写:使用 -i 选项可以忽略模式的大小写。例如,grep -i "error" logfile.txt 将在不区分大小写的情况下搜索 “error”。

  3. 正则表达式搜索:grep 支持使用正则表达式进行高级搜索。例如,grep "^[A-Za-z]+$" file.txt 将搜索只包含字母的行。

  4. 反向搜索:使用 -v 选项可以反向搜索,即只输出不匹配模式的行。例如,grep -v "debug" logfile.txt 将输出不包含 “debug” 的行。

  5. 统计匹配行数:使用 -c 选项可以统计匹配到的行数而不输出具体内容。例如,grep -c "error" logfile.txt 将输出匹配到 “error” 的行数。

1. grep显示前后几行信息:

标准unix/linux下的grep通过下面參数控制上下文:

  • grep -C 5 foo file :显示file文件里匹配foo字串那行以及上下5行
  • grep -B 5 foo file :显示foo及前5行
  • grep -A 5 foo file :显示foo及后5行
  • 查看grep版本号的方法是:grep -V

2. grep 查找含有某字符串的所有文件

grep -rn "hello,world!" 
* : 表示当前目录所有文件,也可以是某个文件名
-r 是递归查找
-n 是显示行号
-R 查找所有文件包含子目录
-i 忽略大小写

跟tail是相反的head是看前多少行日志

head -n  10  test.log   #查询日志文件中的头10行日志;
head -n -10 test.log #查询日志文件除了最后10行的其他所有日志;

cat

#cat 是由第一行到最后一行连续显示在屏幕上。一次显示整个文件 :
cat filename
#从键盘创建一个文件 :
cat > filename
#将几个文件合并为一个文件:
cat file1 file2 > file #只能创建新文件,不能编辑已有文件.
#将一个日志文件的内容追加到另外一个 :
cat -n textfile1 >> textfile2
#清空一个日志文件:
cat : >textfile2

注意:> 意思是创建,>>是追加。千万不要弄混了。

cat其他参数参考tail

tac

在 Linux 中,tac 命令是一个文本处理工具,它的功能是将文件的内容从最后一行开始反向输出到第一行。简而言之,tac 就是 cat 命令的反向版本,因为 “tac” 是 “cat” 倒过来拼写。

以下是一些基本的 tac 命令用法:

  1. 反向输出文件内容:

    tac filename
  2. 从第 N 行开始反向输出:

    tac -n filename
  3. 使用前后文模式输出(类似于 less -R):

    tac -r filename
  4. 输出文件的最后 N 行(类似于 tail -n):

    tac -n +N filename
  5. 输出文件的最后 N 个字符:

    tac -c N filename
  6. 结合管道使用:

    tac filename | grep "pattern"
  7. 反向输出多个文件:

    tac file1 file2 file3

tac 命令在处理日志文件或者需要查看文件末尾内容时非常有用。例如,查看日志文件的最后几行,可以使用 tac 结合 head 命令来实现:

tac filename | head -n 10

这将输出文件的最后 10 行。

tac 命令在日志审计方面的应用主要体现在其能够快速地反向输出文件内容,这对于查看日志文件尤其有用。由于日志文件通常是按照时间顺序记录信息,使用 tac 可以方便地查看最新的日志条目,而不需要滚动到文件的末尾 。

more

more命令是一个基于vi编辑器文本过滤器,它以全屏幕的方式按页显示文本文件的内容,支持vi中的关键字定位操作。more名单中内置了若干快捷键,常用的有H(获得帮助信息),Enter(向下翻滚一行),空格(向下滚动一屏),Q(退出命令)。more命令从前向后读取文件,因此在启动时就加载整个文件。

该命令一次显示一屏文本,满屏后停下来,并且在屏幕的底部出现一个提示信息,给出至今己显示的该文件的百分比:–More–(XX%)

more的语法:more 文件名

Enter 向下n行,需要定义,默认为1行
Ctrl f 向下滚动一屏
空格键 向下滚动一屏
Ctrl b 返回上一屏
= 输出当前行的行号
:f 输出文件名和当前行的行号
v 调用vi编辑器
!命令 调用Shell,并执行命令
q退出more

sed

这个命令可以查找日志文件特定的一段 , 根据时间的一个范围查询,可以按照行号和时间范围查询

  • 按照行号
sed -n '5,10p' filename #这样你就可以只查看文件的第5行到第10行。
  • 按照时间段
sed -n '/2014-12-17 16:17:20/,/2014-12-17 16:17:36/p'  test.log

less

less命令在查询日志时,一般流程是这样的

less log.log
#shift + G 命令到文件尾部 然后输入 ?加上你要搜索的关键字例如 ?1213
#按 n 向上查找关键字
#shift+n 反向查找关键字
#less与more类似,使用less可以随意浏览文件,而more仅能向前移动,不能向后移动,而且 less 在查看之前不会加载整个文件。
less log2013.log #查看文件
ps -ef | less ps #查看进程信息并通过less分页显示
history | less #查看命令历史使用记录并通过less分页显示
less log2013.log log2014.log #浏览多个文件

常用命令参数

-b <缓冲区大小> 设置缓冲区的大小
-g 只标志最后搜索的关键词
-i 忽略搜索时的大小写
-m 显示类似more命令的百分比
-N 显示每行的行号
-o <文件名> 将less 输出的内容在指定文件中保存起来
-Q 不使用警告音
-s 显示连续空行为一行
/字符串:向下搜索"字符串"的功能
?字符串:向上搜索"字符串"的功能
n:重复前一个搜索(与 / 或 ? 有关)
N:反向重复前一个搜索(与 / 或 ? 有关)
b 向后翻一页
h 显示帮助界面
q 退出less 命令

tee

tee 命令是一个常用的 Unix 和类 Unix 系统(如 Linux 和 macOS)中的命令行工具。它用于读取标准输入(stdin)的数据,并同时将数据写入到标准输出(stdout)和一个或多个文件中。tee 命令的名字来源于它的功能类似于“T”形管,可以同时向多个方向传输数据。

基本语法

tee [选项]... [文件]...

选项

  • -a, --append:追加模式。默认情况下,tee 会覆盖文件内容。使用 -a 选项,tee 会将数据追加到文件末尾,而不是覆盖。
  • -b:不处理换行符(用于二进制模式)。
  • -i:忽略中断信号(即使收到中断信号,tee 也会继续执行)。
  • -p:与 -i 相同,忽略中断信号。

示例

  1. 这个命令会将字符串 “Hello, World!” 写入到 output.txt 文件中,并且同时在终端显示。
echo "Hello, World!" | tee output.txt
  1. 追加内容到文件:
echo "Additional line" | tee -a output.txt
  1. 从文件读取并同时写入到另一个文件:
cat input.txt | tee copy.txt
  1. 同时写入多个文件:
echo "Multiple files" | tee file1.txt file2.txt

注意事项

  • 当使用 tee 命令写入文件时,如果没有指定文件,tee 只会将数据输出到标准输出(通常是终端)。
  • tee 命令在默认情况下不会追加内容,除非你显式使用 -a 选项。
  • 在某些系统中,tee 命令可能不是标准工具,需要手动安装。
    tee 命令在处理命令行输出和日志记录时非常有用,因为它可以轻松地将数据既显示在终端又保存到文件中。

find

find 是 Linux 中一个强大的命令行工具,用于在指定目录及其子目录中搜索符合条件的文件。

1. 基本用法

  1. 基本搜索:find path -name pattern,在指定路径 path 及其子目录中搜索文件名匹配指定模式 pattern 的文件。例如
find /var/log -name "*.log"		#  将在 `/var/log` 目录中搜索所有以 `.log` 结尾的文件。
  1. 根据类型搜索:使用 -type 选项可以根据文件类型进行搜索。例如,find /var/log -type f 将仅搜索普通文件,而不包括目录和符号链接。

  2. 根据大小搜索:使用 -size 选项可以按文件大小进行搜索。例如,find /var/log -size +1M 将搜索大小大于 1MB 的文件。

  3. 根据时间搜索:使用 -mtime、-atime 或 -ctime 选项可以按文件的修改时间、访问时间或元数据改变时间进行搜索。例如,find /var/log -mtime -7 将搜索最近 7 天内修改过的文件。

  4. 执行操作:find 命令还可以与其他命令结合使用,对搜索到的文件执行操作。例如,find /var/log -name "*.log" -exec rm {} \; 将删除所有以 .log 结尾的文件。

2. 在日志审计中,find 命令常用于以下方面的应用举例:

  1. 搜索特定类型的日志文件:例如,find /var/log -name "*.log" 可以搜索系统日志、应用程序日志等特定类型的日志文件。

  2. 按时间范围搜索:例如,find /var/log -name "*.log" -mtime -7 可以搜索最近 7 天内修改过的日志文件,用于查找最新的日志记录。

  3. 查找包含关键字的日志文件:例如,find /var/log -name "*.log" -exec grep "error" {} \; 可以搜索包含 “error” 关键字的日志文件,并输出匹配的行。

  4. 删除过期的日志文件:例如,find /var/log -name "*.log" -mtime +30 -exec rm {} \; 可以删除超过 30 天的日志文件,以便进行日志轮转和管理。

3. 在目录/etc中查找文件init

find /etc -name init

习惯常用命令记录

history # 所有的历史记录
history | grep XXX # 历史记录中包含某些指令的记录
history | more # 分页查看记录
history -c # 清空所有的历史记录
!! 重复执行上一个命令
查询出来记录后选中 : !323
tail -f /var/log/apache2/access.log #查看实时日志
tail -f -n 50 auth.log
last -f /var/log/wtmp #Linux查看/var/log/wtmp文件查看可疑IP登陆
cat /var/log/secure |grep 自定IP #查看/var/log/secure文件寻找可疑IP登陆次数
grep -C 5 foo file # 显示`file`文件里匹配`foo`字串那行以及上下5行

Linux日志分析技巧

1. 如何显示一个文件的某几行:

cat input_file | tail -n +1000 | head -n 2000
#从第1000行开始,显示2000行。即显示1000~2999行

2. 只是显示/etc/passwd的账户

`cat /etc/passwd |awk  -F ':'  '{print $1}'`  
//awk -F指定域分隔符为':',将记录按指定的域分隔符划分域,填充域,​$0则表示所有域,$1表示第一个域,​$n表示第n个域。

3. 删除历史操作记录,只保留前153行

sed -i '153,$d' .bash_history

4. 对/var/log/secure的分析

1、定位有多少IP在爆破主机的root帐号:

grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more

# 定位有哪些IP在爆破:
grep "Failed password" /var/log/secure|grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"|uniq -c

# 爆破用户名字典是什么?
grep "Failed password" /var/log/secure|perl -e 'while($_=<>){ /for(.*?) from/; print "$1\n";}'|uniq -c|sort -nr

2、登录成功的IP有哪些:

grep "Accepted " /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more

# 登录成功的日期、用户名、IP:
grep "Accepted " /var/log/secure | awk '{print $1,$2,$3,$9,$11}'

3、增加一个用户kali日志:

grep "useradd" /var/log/secure 
Jul 10 00:12:15 localhost useradd[2382]: new group: name=kali, GID=1001
Jul 10 00:12:15 localhost useradd[2382]: new user: name=kali, UID=1001, GID=1001, home=/home/kali, shell=/bin/bash
Jul 10 00:12:58 localhost passwd: pam_unix(passwd:chauthtok): password changed for kali

4、删除用户kali日志:

grep "userdel" /var/log/secure
Jul 10 00:14:17 localhost userdel[2393]: delete user 'kali'
Jul 10 00:14:17 localhost userdel[2393]: removed group 'kali' owned by 'kali'
Jul 10 00:14:17 localhost userdel[2393]: removed shadow group 'kali' owned by 'kali'

5、su切换用户:

Jul 10 00:38:13 localhost su: pam_unix(su-l:session): session opened for user good by root(uid=0)

sudo授权执行:
sudo -l
Jul 10 00:43:09 localhost sudo: good : TTY=pts/4 ; PWD=/home/good ; USER=root ; COMMAND=/sbin/shutdown -r now

refer

-

声明:

  1. 若文章存在错误,望诸君不吝指正^

  2. blog仅供个人记录学习所用

  3. 部分笔记由于年代久远,做的笔记找不到最初是引用谁的,若是不允许引用转载,请联系我