linux日志
日志存放位置
linux下日志文件一般存放在/var/log/
/var/log/wtmp
记录登录进入 退出 数据交换 关机 重启。即last
命令
/var/log/cron
记录与定时任务相关的日志信息
/var/log/messages
记录系统重启后的日志信息和错误日志(mail,cron,daemon,kern,auth等内容也记录在此)
/var/log/apache2/access.log
记录Apache访问日志
/var/log/auth.log
记录系统授权信息,包括用户登录和使用的权限机制
/var/log/userlog
等级用户信息
/var/log/xferlog(vsftpd.log)
ftp日志
/var/log/lastlog
记录登录的用户===lastlog
命令
/var/log/secure
记录大多数应用输入的账号和密码,以及是否成功登录
/var/log/faillog
登录系统不成功的账号信息
ls -alt /var/spool/mail/
查看邮件相关日志记录文件
cat /var/spool/mail/root
邮件提醒
/var/log/sssd
用于守护进程安全服务
开启Ubuntu下cron日志
1 | vim /etc/rsyslog.d/50-default.conf |
文件中找到cron.*
,把前面的#去掉,保存退出
1 | sudo service rsyslog restart |
实时查看日志:less /var/log/cron.log
日志分析
在*.log
日志文件中独立IP地址个数
1 | awk '{print$1}' test.log | sort | uniq | wc -l |
指定时间段日志
1 | sed -n '/2021-05-10 00:01:28/,/2021-05-16 00:05:50/p' log_file_catalina.out |
1 | sudo grep "May 15 23:*:*" yum.log |
定位多少ip暴力破解root
1 | cat secure | awk '/Failed password/{print $(NF-3)}'|sort|uniq -c |sort -k 1 -rn |
NF
表示一条记录的字段的数目,$(NF-3)
表示从后往前取第四列。
查看通过密码登录成功的IP地址总次数
1 | sudo cat /var/log/secure | awk '/Accepted password/{print $(NF-3)}'|sort|uniq -c |awk '{print $2"="$1;}' |
免密登录成功总次数
1 | sudo cat /var/log/secure | awk '/Accepted publickey/{print $(NF-3)}'|sort|uniq -c |awk '{print $2"="$1;}' |
查看登录成功日期、用户名、IP地址
1 | grep "Accepted" /var/log/secure |awk '{print $1,$2,$3,$9,$11}' |
分析涉及命令
管道符 |
管道符命令仅会处理标准输出,对于标准错误会给予忽略。
管道命令必须要能够接受来自前一个命令的数据成为标准输入继续处理才行。
让标准错误可以被管道符使用:使用
2>&1
,让2>
变成1>
head&tail
tail -n 10 test.log
最后10行
tail -n +10 test.log
10行之后
head -n 10 test.log
头10行
head -n -10 test.log
除了最后10行
sed
1 | sed -n '/起始时间/','/结束时间/p' [日志文件] |
-n
读取下一个输入行,用下一个命令处理新的行而不是第一个命令
p
打印输出
cut 分隔
存在特定分隔字符
1 | cut -d'分隔字符' -f fields |
用于整齐排列信息
1 | cut -c 12-15 |
grep 查找
1 | grep [-acinv] [--color=auto] '查找字符' filename |
-a
将二进制文件以文本文件的方式查找数据
-c
查找字符的次数
-i
忽略大小写
-n
输出行号
-v
反向选择
--color=auto
关键字部分会用特殊颜色显示
sort 排序
1 | sort [-fbMnrtuk] [file or stdin] |
-f
忽略大小写差异
-b
忽略最前面空格字符部分
-M
以月份的名字来排序
-n
使用纯数字来排序
-r
反向排序
-u
通uniq
相同的数据仅出现一行
-t
分隔符号,默认是[Tab]
#sort -t ':'
-k
以哪个分区(第几列)进行排序
uniq 去重
1 | uniq [-ic] |
-i
忽略大小写字符
-c
进行计数
wc 计数
1 | wc [-lwm] |
-l
行数
-w
字数(英文字母)
-m
字符数
awk 数据处理
1 | awk '条件类型1{操作1} 条件类型2{操作2}....' filename |
NF
每一行($0
)拥有的字段总数
NR
目前awk所处理的是第几行数据
FS
目前的分隔字符,默认是空格键
audit安全审计
系统组成
- auditctl : 即时控制审计守护进程的行为的工具,如添加规则等。
- auditd :audit 守护进程负责把内核产生的信息写入到硬盘上,这些信息由应用程序和系统活动触发产生。用户空间审计系统通过 auditd 后台进程接收内核审计系统传送来的审计信息,将信息写入到 /var/log/audit/audit.log。
- aureport : 查看和生成审计报告的工具。
- ausearch : 查找审计事件的工具
- auditspd : 转发事件通知给其他应用程序,而不是写入到审计日志文件中。
- autrace : 一个用于跟踪进程的命令。类似于 strace,跟踪某一个进程,并将跟踪的结果写入日志文件之中。
启用服务
1 | systemctl start auditd |
Ubuntu下开启audit
1 | sudo apt-get install auditd |
查看audit服务状态
1 | [root@localhost wiki]# service auditd start |
enabled值为1代表开启,0为关闭,2表示规则锁定状态 ,可通过 -e参数进行设置。
文件系统监控
命令行执行-临时生效
1 | auditctl -w /tmp/filename -p wa -k test |
-w
指定所要监控的文件或命令
-p
指定监控属性,如:
- r — 读取文件或者目录。
- w — 写入文件或者目录。
- x — 运行文件或者目录。
- a — 改变在文件或者目录中的属性
-k
是可选字符串,可帮助您判定哪个规则或者哪组规则生成特定的日志项。设置一个关键词用于查询
1 | //设置规则所有对passwd文件的写、属性修改操作都会被记录审计日志 |
编辑配置文件-永久生效
/etc/audit/auditd.conf
守护程序的默认配置文件
/etc/audit/audit.rules
记录审计规则文件
1 | local_events = yes |
1 | [root@localhost audit]# cat audit.rules |
写入完重启服务,
auditctl -l
查看规则,auditctl -D
删除规则。
auditctl日志分析
tail /var/log/audit/audit.log
1 | type=SYSCALL msg=audit(1630636108.992:216): arch=c000003e syscall=257 success=yes exit=3 a0=ffffff9c a1=7f0c8b3157a8 a2=541 a3=1b6 items=2 ppid=2070 pid=2071 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=10 comm="zsh" exe="/usr/bin/zsh" subj==unconfined key="testinfo"ARCH=x86_64 SYSCALL=openat AUID="kali" UID="root" GID="root" EUID="root" SUID="root" FSUID="root" EGID="root" SGID="root" FSGID="root" |
type
消息类型,详见审计记录类型
msg
消息ID 两个部分组成,分号之前的是Unix的时间戳,分号之后的是真正的event ID,time_stamp:ID
,时间是date +%s
(1970-1-1至今的秒数)
arch
调用system call的CPU构架,arch=c000003e,代表x86_64(16进制)
syscall
system call的类型。详见
success
system call是成功或者失败。
exit
system call的返回值。
a0 to a3
系统调用的前四个参数的数字化,可以通过ausearch解码查看。
items
传递到应用程序的字符串数量。
ppid
父进程的PIDpid
该进程的PID
auid
audit ID
针对某一用户一个进程会被分配一个audit ID, 该audit ID会被传递给子进程,尽管在系统中用户切换,该audit ID将始终保持一致。可以追踪su前的账户。
uid
user IDgid
group ID
tty
应用程序开启的终端。
ses
用户登录的session ID.
comm
在命令行执行的指令
exe
二进制程序的解析路径。
subj
进程执行时selinux上下文
key
如果audit了很多的目录文件,分配一个key string方便后面我们通过ausearch去过滤这类log。
cwd
进程的执行目录.
ouid
**(**owner’s user id) 对象所有者id
guid
(owner’s groupid) 对象所属组id
ausearch
1 | ausearch [options] |
-a number
#只显示事件ID为指定数字的日志信息,如只显示926事件:ausearch -a 926
-c commond
#只显示和指定命令有关的事件,如只显示rm命令产生的事件:auserach -c rm
-i
#显示出的信息更清晰,如事件时间、相关用户名都会直接显示出来,而不再是数字形式
-k
#显示出和之前auditctl -k所定义的关键词相匹配的事件信息
1 | ausearch -m #按消息类型查找 |
1 | # 因登录失败而搜索 /var/log/audit/audit.log 文件 |
系统调用监控
监视由任何进程或特定用户进行的系统调用
1 | auditctl [option] filter,action -S syscall -F condition -k label |
option 参数比较多,具体的可以man auditctl
项目 | 可选参数 | 说明 |
---|---|---|
filter | user,exit,task,exclude | filter 详细说明哪个内核规则匹配过滤器应用在事件中。以下是其中之一的与规则匹配的过滤器: task、exit、user 以及 exclude |
action | always, never | 是否审核事件(always 表示是)(never 表示否) |
syscall | all, 2, open 等 | 所有的系统调用都可以在/usr/include/asm/unistd_64.h 文件中找到。许多系统调用都能形成一个规则 |
condition | euid=0, arch=b64 | 详细说明其他选项,进一步修改规则来与以特定架构、组 ID、进程 ID 和其他内容为基础的事件相匹配 |
label | 任意文字 | 标记审核事件并检索日志 |
- -S 表示系统调用号或名字
- -F 表示规则域
- -k 表示设置审计规则上的过滤关键
官方也写了几个expamples
1 | To see all syscalls made by a specific program: |
aureport 创建审核报告
生成有关过去三天内不包括示例日在内的记录的事件
1 | aureport --start 04/08/2013 00:00:00 --end 04/11/2013 00:00:00 |
生成所有可执行文件事件的一份报告
1 | aureport -x -if audit.log |
生成以上可执行文件事件的总结
1 | aureport -x --summary |
生成所有用户失败事件的总结报告
1 | aureport -u --failed --summary -i |
生成每个系统用户登录失败的总结报告
1 | aureport --login --summary -i |
通过 ausearch
查询搜索 用户 500
所有的文件访问事件生成一份报告
1 | ausearch --start today --loginuid 500 --raw | aureport -f --summary |
生成一份报告有关所有被查询的审核文件以及所包含事件的事件范围
1 | aureport -t |
autrace 追踪指定进程
1 | auditctl -D |
避免autrace与之前audit rule生成的日志冲突,使用auditctl -D去停止所有的audit log, 当autrace结束后,使用systemctl restart auditd重启audit服务。