日志存放位置

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

img

指定时间段日志

1
2
3
sed -n '/2021-05-10 00:01:28/,/2021-05-16 00:05:50/p' log_file_catalina.out
sudo sed -n '/May 09 20:48:54/,/May 15 23:45:54/p' yum.log
sed -n '/Sep 1 14:52:01/','/Sep 1 15:40:01/p' cron

img

1
sudo grep "May 15 23:*:*" yum.log

img

定位多少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反向排序

-uuniq相同的数据仅出现一行

-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
2
systemctl start auditd
systemctl enable auditd #开机自动启动

Ubuntu下开启audit

1
sudo apt-get install auditd

查看audit服务状态

1
2
3
4
5
6
7
8
9
10
11
12
[root@localhost wiki]# service auditd start
Redirecting to /bin/systemctl start auditd.service
[root@localhost wiki]# auditctl -s
enabled 1
failure 1
pid 1072
rate_limit 0
backlog_limit 8192
lost 0
backlog 0
backlog_wait_time 60000
loginuid_immutable 0 unlocked

enabled值为1代表开启,0为关闭,2表示规则锁定状态 ,可通过 -e参数进行设置。

文件系统监控

命令行执行-临时生效

1
auditctl -w /tmp/filename -p wa -k test

-w指定所要监控的文件或命令

-p指定监控属性,如:

  • r — 读取文件或者目录。
  • w — 写入文件或者目录。
  • x — 运行文件或者目录。
  • a — 改变在文件或者目录中的属性

-k是可选字符串,可帮助您判定哪个规则或者哪组规则生成特定的日志项。设置一个关键词用于查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//设置规则所有对passwd文件的写、属性修改操作都会被记录审计日志

auditctl -w /etc/passwd -p wa -k passwd_change

//设置规则,监控/etc/selinux目录

auditctl -w /etc/selinux/ -p wa -k selinux_change

//设置规则,监控fdisk程序

auditctl -w /usr/sbin/fdisk -p x -k disk_partition

//设置规则,监控sshd_con:f文件

auditctl -w /etc/ssh/sshd_config -p warx -k sshd_config

编辑配置文件-永久生效

/etc/audit/auditd.conf 守护程序的默认配置文件

/etc/audit/audit.rules 记录审计规则文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
local_events = yes
write_logs = yes
log_file = /var/log/audit/audit.log #审计日志文件的完整路径。如果您配置守护进程向除默认/var/log/audit/外的目录中写日志文件时,一定要修改它上面的文件权限,使得只有根用户有读、写和执行权限。所有其他用户都不能访问这个目录或这个目录中的日志文件。
log_group = root
log_format = ENRICHED
flush = INCREMENTAL_ASYNC #多长时间向日志文件中写一次数据
freq = 50
max_log_file = 8 #设置日志文件大小,单位是MB
num_logs = 5
priority_boost = 4 #审计应采用多少优先级推进守护进程。必须是非负数。0表示没有变化。
name_format = NONE
##name = mydomain
max_log_file_action = ROTATE
space_left = 75
space_left_action = SYSLOG
verify_email = yes
action_mail_acct = root
admin_space_left = 50
admin_space_left_action = SUSPEND
disk_full_action = SUSPEND
disk_error_action = SUSPEND
use_libwrap = yes
##tcp_listen_port = 60
tcp_listen_queue = 5
tcp_max_per_addr = 1
##tcp_client_ports = 1024-65535
tcp_client_max_idle = 0
transport = TCP
krb5_principal = auditd
##krb5_key_file = /etc/audit/audit.key
distribute_network = no
q_depth = 400
overflow_action = SYSLOG
max_restarts = 10
plugin_dir = /etc/audit/plugins.d
1
2
3
4
5
6
[root@localhost audit]# cat audit.rules
## This file is automatically generated from /etc/audit/rules.d
-D #删除所有当前装载的审核规则
-b 8192 #在内核中设定最大数量的已存在的审核缓冲区为 8Mb
-f 1 #当追踪重要错误时设定所要完成的行动
--backlog_wait_time 60000

写入完重启服务,auditctl -l查看规则,auditctl -D删除规则。

image-20210903102807860

image-20210903102935696

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进制)

syscallsystem call的类型。详见

successsystem call是成功或者失败。

exitsystem call的返回值。

a0 to a3系统调用的前四个参数的数字化,可以通过ausearch解码查看。

items传递到应用程序的字符串数量。

ppid父进程的PID pid该进程的PID

auid audit ID针对某一用户一个进程会被分配一个audit ID, 该audit ID会被传递给子进程,尽管在系统中用户切换,该audit ID将始终保持一致。可以追踪su前的账户。

uiduser ID gidgroup 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
2
ausearch [options]
ausearch -if /var/log/audit/audit.log

-a number #只显示事件ID为指定数字的日志信息,如只显示926事件:ausearch -a 926

-c commond #只显示和指定命令有关的事件,如只显示rm命令产生的事件:auserach -c rm

-i #显示出的信息更清晰,如事件时间、相关用户名都会直接显示出来,而不再是数字形式

-k #显示出和之前auditctl -k所定义的关键词相匹配的事件信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ausearch -m    #按消息类型查找
ausearch -ul #按登陆ID查找
ausearch -ua #按uid和euid查找
ausearch -ui #按uid查找
ausearch -ue #按euid查找
ausearch -ga #按gid和egid查找
ausearch -gi #按gid查找
ausearch -ge #按egid查找
ausearch -c #按cmd查找
ausearch -x #按exe查找
ausearch -sc #按syscall查找
ausearch -p #按pid查找
ausearch -sv #按syscall的返回值查找(yes/no)
ausearch -f #按文件名查找
ausearch -tm #按连接终端查找(term/ssh/tty)
ausearch -hn #按主机名查找
ausearch -k #按特定的key值查找
ausearch -w #按在audit rule设定的字符串查找
1
2
3
4
5
6
7
8
# 因登录失败而搜索 /var/log/audit/audit.log 文件
ausearch --message USER_LOGIN --success no --interpret -if audit.log
#搜索所有的账户,群组,角色变更
ausearch -m ADD_USER -m DEL_USER -m ADD_GROUP -m USER_CHAUTHTOK -m DEL_GROUP -m CHGRP_ID -m ROLE_ASSIGN -m ROLE_REMOVE -i
# 所有的由特定用户所执行的记录操作,使用用户的登录 ID(auid)
ausearch -au 500 -i
# 搜寻从昨天至今所有的失败的系统调用
ausearch --start yesterday --end now -m SYSCALL -sv no -i

系统调用监控

监视由任何进程或特定用户进行的系统调用

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
2
3
4
5
6
7
8
To see all syscalls made by a specific program:
auditctl -a always,exit -S all -F pid=1005

To see files opened by a specific user:
auditctl -a always,exit -S openat -F auid=510

To see unsuccessful openat calls:
auditctl -a always,exit -S openat -F success=0

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

image-20210903143114321

生成所有用户失败事件的总结报告

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
2
3
4
5
6
7
auditctl -D
autrace /usr/bin/less

Waiting to execute: /usr/bin/less
Missing filename ("less --help" for help)
Cleaning up...
Trace complete. You can locate the records with 'ausearch -i -p 4006'

避免autrace与之前audit rule生成的日志冲突,使用auditctl -D去停止所有的audit log, 当autrace结束后,使用systemctl restart auditd重启audit服务。

参考链接

理解审核日志文件

Linux audit详解

linux audit审计系统

【系统运维】使用audit实现Linux系统安全审计

利用Linux audit分析安全威胁