阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Linux系统安全日志详解

33次阅读
没有评论

共计 8232 个字符,预计需要花费 21 分钟才能阅读完成。

导读 只要将我们的服务器在公网环境公开,提供服务。就避免不了来自全球互联网上的各种攻击。大部分的攻击都是一些泛攻击,利用程序自动扫描并发起攻击而已。

Linux 系统安全日志详解

1、介绍

Linux 系统提供了全方位的日志记录。我们登录 Linux 系统之后做的事情 Linux 都有相应的日志记录。整个日志系统比较多。这里只介绍和登录比较密切相关的三个日志。

secure,btmp 和 wtmp 这三个日志文件。

2、wtmp 日志

首先,介绍 wtmp 日志文件,该文件记录了所有的登录过系统的用户信息。(PS:只记录了正确登录的用户。密码错误等在 btmp 文件和 secure 文件中)

该文件的地址路径为:var/log/wtmp。wtmp 文件是一个二进制文件,无法通过 cat 或者 vim 进行阅读。需要通过命令 last 进行阅读。

示例如下:

[root@iZuf /]# last -F
root     pts/0        我的 IP 地址   Wed Nov 23 08:43:28 2022   still logged in
...
root     pts/0        我的 IP 地址   Wed Oct 19 16:00:28 2022 - Wed Oct 19 18:16:46 2022  (02:16)
root     pts/0        我的 IP 地址   Wed Oct 19 09:51:51 2022 - Wed Oct 19 10:42:08 2022  (00:50)
...

last 命名会默认从 wtmp 文件中读取数据。所以我们可以不用添加 wtmp 文件路径,但是如果使用 last -f 就需要我们主动添加 wtmp 路径了。

上面的数据分别是:

    登录名:root。
    打开的终端:pts/0
    访问者 IP:我的 ip 地址(PS:实际 ip 是显示 111,111,111,111 格式的)
    登录时间:Tue Nov 15 11:17:40 2022
    退出时间:Tue Nov 15 13:14:02 2022
    耗时:(01:56) 如果显示 still logged in。表示当前仍然属于登录状态。

如果我们觉得日期显示阅读不直观,可以通过命令 last –time-format 进行日期格式化。示例如下:

[root@iZuf /]# last --time-format iso
...
root     pts/0        我的 IP 地址     2020-08-07T17:05:19+08:00 - 2020-08-07T17:06:39+08:00  (00:01)

时间将会变成我们能够直接阅读的格式。(PS:+08:00 只是说明当前日期进行了时区添加,并不代表我们还需要在显示的时间中添加 8 小时哦)

–time-format 后面的可选参数为:

    notime:不显示时间。示例:(13:34)。只显示登录时长。不显示时间段
    short:短时间显示。示例:Fri Nov 4 17:53 – 18:03 (00:09)
    full:按照默认格式显示全部时间。示例:Tue Nov 22 13:48:22 2022 – Tue Nov 22 17:23:19 2022 (03:34)
    iso:按照 iso 时间格式显示全部时间。示例:2020-08-07T17:05:19+08:00 – 2020-08-07T17:06:39+08:00 (00:01)

这个文件将会记录全部的登录记录。如果中间出现了不属于我们熟悉的 ip 登录。那么说明账户密码有泄漏。或者其他非法登录产生。

PS:-F 命令不能和 --time-format 一起使用,因为它们两者都对输出的时间格式有影响。
3、btmp 日志

如果说 wtmp 是记录登录成功的日志。那么 btmp 就是记录所有尝试登录,但是登录失败的日志。它存储的路径和 wtmp 文件在同一目录下:/var/log/btmp

同样 btmp 也是属于二进制文件。无法通过 cat 或者 vim 进行阅读。需要通过命令 lastb 进行阅读。

last:阅读的 wtmp 文件
lastb:阅读的 btmp 文件
这两个指令是有一个字母的区别。千万不要弄混了 

这两个命令的 参数可以说是完全一样。可以用于 last 的也可以用于 lastb。

lastb 的命令参数如下:

    –:要显示多少行
    -a, –hostlast:在最后一列中显示主机名
    -d, –dns:将 IP 地址转换回主机名
    -f:使用特定文件而不是 /var/log/btmp
    -F, –fulltimes:打印完整的登录和注销时间和日期
    -i, –ip:以数字和点表示法显示 IP 号码
    -n, –limit:要显示多少行
    -R, –nohostname:不显示主机名字段
    -s, –since《time》:显示指定时间之后的行(查询指定时间之后的记录)
    -t, –until《time》:显示指定时间之前的行(查询指定时间之前的记录)
    -p, –present《time》:显示在指定时间内在场的账户
    -w, –fullnames:显示完整的用户名和域名
    -x, –system:显示系统关闭条目和运行级别更改
    –time-format:显示指定格式的时间戳 : notime|short|full|iso
PS:-F 命令不能和 --time-format 一起使用,因为它们两者都对输出的时间格式有影响。

具体使用示例:(PS:由于内容比较多,就先显示 10 条记录了)

[root@iZuf /]# lastb -10
liu      ssh:notty    170.64.132.128   Wed Nov 23 07:40 - 07:40  (00:00)
sine     ssh:notty    170.64.132.128   Wed Nov 23 07:40 - 07:40  (00:00)
ftpUser  ssh:notty    170.64.132.128   Wed Nov 23 07:40 - 07:40  (00:00)
sine     ssh:notty    170.64.132.128   Wed Nov 23 07:40 - 07:40  (00:00)
liu      ssh:notty    170.64.132.128   Wed Nov 23 07:40 - 07:40  (00:00)
chenms   ssh:notty    170.64.132.128   Wed Nov 23 07:40 - 07:40  (00:00)
mingjian ssh:notty    170.64.132.128   Wed Nov 23 07:40 - 07:40  (00:00)
liu      ssh:notty    170.64.132.128   Wed Nov 23 07:40 - 07:40  (00:00)
sine     ssh:notty    170.64.132.128   Wed Nov 23 07:40 - 07:40  (00:00)
ftpUser  ssh:notty    170.64.132.128   Wed Nov 23 07:40 - 07:40  (00:00)

格式表现为:

第一列显示登录名,第二列显示登录 ssh 方式很明显 ssh:notty 是在使用暴力破解 ssh 密码。(这也是为什么 Linux 建议一段时间内跟换密码的原因,当然使用秘钥的安全性要比密码高不少。),第三列显示的就是访问者 IP 地址了。之后的就是时间和耗费时长了。

示例, 将时间戳进行序列化后显示如下:

[root@iZuf /]# lastb -10 --time-format iso
liu      ssh:notty    170.64.132.128   2022-11-23T07:40:24+08:00 - 2022-11-23T07:40:24+08:00  (00:00)
sine     ssh:notty    170.64.132.128   2022-11-23T07:40:24+08:00 - 2022-11-23T07:40:24+08:00  (00:00)
ftpUser  ssh:notty    170.64.132.128   2022-11-23T07:40:23+08:00 - 2022-11-23T07:40:23+08:00  (00:00)
sine     ssh:notty    170.64.132.128   2022-11-23T07:40:23+08:00 - 2022-11-23T07:40:23+08:00  (00:00)
liu      ssh:notty    170.64.132.128   2022-11-23T07:40:22+08:00 - 2022-11-23T07:40:22+08:00  (00:00)
chenms   ssh:notty    170.64.132.128   2022-11-23T07:40:22+08:00 - 2022-11-23T07:40:22+08:00  (00:00)
mingjian ssh:notty    170.64.132.128   2022-11-23T07:40:22+08:00 - 2022-11-23T07:40:22+08:00  (00:00)
liu      ssh:notty    170.64.132.128   2022-11-23T07:40:21+08:00 - 2022-11-23T07:40:21+08:00  (00:00)
sine     ssh:notty    170.64.132.128   2022-11-23T07:40:21+08:00 - 2022-11-23T07:40:21+08:00  (00:00)
ftpUser  ssh:notty    170.64.132.128   2022-11-23T07:40:21+08:00 - 2022-11-23T07:40:21+08:00  (00:00)
(1)日志时长

btmp 日志由于内容过多。它会按 30 天进行备份一次数据。只会备份一个月的数据。

备份文件和 btmp 文件存储在同一目录下,只是命名后面追加上备份创建日期而已。示例:

小技巧:在 Linux 系统中填写路径时按 Tab 将会补全,如果无法补全说明有多个候选项,我们双击 Tab 将会列出全部候选项。

[root@iZuf /]# ls var/log/btmp
btmp           btmp-20221101

例如上面的结果,我们如果要看 btmp-20221101 里面的数据,就需要使用:lastb -f /var/log/btmp-20221101

示例如下,查询上个月的非法登录的前 10 条记录:

[root@iZuf /]# lastb -f /var/log/btmp-20221101 -10
sine     ssh:notty    143.244.141.68   Sat Oct 29 22:02 - 22:02  (00:00)
liu      ssh:notty    143.244.141.68   Sat Oct 29 22:02 - 22:02  (00:00)
sine     ssh:notty    143.244.141.68   Sat Oct 29 22:02 - 22:02  (00:00)
sine     ssh:notty    143.244.141.68   Sat Oct 29 22:02 - 22:02  (00:00)
wjquan   ssh:notty    143.244.141.68   Sat Oct 29 22:02 - 22:02  (00:00)
liu      ssh:notty    143.244.141.68   Sat Oct 29 22:02 - 22:02  (00:00)
zkkj     ssh:notty    143.244.141.68   Sat Oct 29 22:02 - 22:02  (00:00)
chenms   ssh:notty    143.244.141.68   Sat Oct 29 22:02 - 22:02  (00:00)
mingjian ssh:notty    143.244.141.68   Sat Oct 29 22:02 - 22:02  (00:00)
mingjian ssh:notty    143.244.141.68   Sat Oct 29 22:02 - 22:02  (00:00)

如果非法登录的数据文件比较大,我们怎么进行查询呢?Linux 可以针对数据进行筛选

(2)统计 ip 登录次数

恶意访问数据过多的时候,我们通过 lastb 直接阅读比较困难因为数据较大。这个时候我们就可以通过对查询结果进行筛选。

例如:

[root@iZuf /]# lastb | awk '{print $3}' | sort | uniq -c | sort -n
      5 98.143.158.42
   5368 143.244.137.83
   5402 170.64.132.120
   5522 170.64.132.128
   6212 193.47.61.21

上述显示结果,第一列 ip 地址的登录次数,第二列为 ip 地址。我们可以对登录过大的 ip 进行封禁操作。

下面进行命令拆分介绍。在 Linux 中通过 | 符号对命令进行拆分。

上述的命令其实就是:

    lastb:通过 lastb 命令会拉取全部的非法登录日志。
    awk ‘{print $3}’:截取 lastb 输出的数据中的第三列也就是 ip 地址。
    sort:将 ip 地址进行分类。
    uniq -c:将分类好的 ip 数据进行去重并计数。
    sort -n:将分类去重并计数的数据,进行分类并且按照数值进行从小到大排序。

例如我们如果要查上一个月的非法登录次数统计:

[root@iZuf /]# lastb -f /var/log/btmp-20221101 | awk '{print $3}' | sort | uniq -c | sort -n
     51 157.230.21.85
   4861 167.71.234.209
   5038 143.244.141.68
   5202 143.244.129.121
   5262 167.71.226.83

PS: 如果想高效控制和防范,那么使用防火墙可以说是最佳选择了。可以使用阿里云提供的云防火墙,包括结合情报的实时入侵防护、全流量可视化分析、智能化访问控制、日志溯源分析等能力。

4、secure 日志

相较于 wtmp 文件和 btmp 文件,secure 日志就是一个文本。可以通过 vim 或者 cat 阅读。也可以导出到 windows 环境下使用 VSCode 或者文本文档等阅读。

secure 日志和 wtmp 和 btmp 文件一样,存储在 var/log 目录下。示例如下:

[root@iZuf /]# ls /var/log/secure
secure           secure-20221030  secure-20221106  secure-20221113  secure-20221120

secure 文件是按照每 7 天备份一次的频率,进行备份的。文档打开后的内容如下所示:

Nov 20 09:25:19 iZuf sshd[2322424]: error: kex_exchange_identification: banner line contains invalid characters
Nov 20 12:55:16 iZuf sshd[2323018]: error: kex_exchange_identification: Connection closed by remote host
Nov 20 12:58:27 iZuf sshd[2323024]: Invalid user amax from 170.64.132.120 port 47146
Nov 20 12:58:28 iZuf sshd[2323026]: Invalid user amax from 170.64.132.120 port 47158
Nov 20 12:58:28 iZuf sshd[2323024]: pam_unix(sshd:auth): check pass; user unknown
Nov 20 12:58:28 iZuf sshd[2323024]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=170.64.132.120
Nov 20 12:58:28 iZuf sshd[2323026]: pam_unix(sshd:auth): check pass; user unknown
Nov 20 12:58:28 iZuf sshd[2323026]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=170.64.132.120
Nov 20 12:58:28 iZuf sshd[2323028]: Invalid user amax from 170.64.132.120 port 47164
Nov 20 12:58:28 iZuf sshd[2323030]: Invalid user amax from 170.64.132.120 port 47178
Nov 20 12:58:28 iZuf sshd[2323028]: pam_unix(sshd:auth): check pass; user unknown
Nov 20 12:58:28 iZuf sshd[2323028]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=170.64.132.120
Nov 20 12:58:28 iZuf sshd[2323032]: Invalid user amax from 170.64.132.120 port 47188
Nov 20 12:58:29 iZuf sshd[2323030]: pam_unix(sshd:auth): check pass; user unknown
Nov 20 12:58:29 iZuf sshd[2323030]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=170.64.132.120
Nov 20 12:58:29 iZuf sshd[2323032]: pam_unix(sshd:auth): check pass; user unknown

相较于 wtmp 和 btmp 一个记录成功的,一个记录失败的。secure 日志记录整个登录过程的所有数据,不管成功还是失败都会进行记录。

PS:由于 secure 日志属于文档类型的,那么登录成功后的非法登录它是可以比较方便的对 secure 文件进行篡改的。

下面简单列一些出现的各种错误和成功日志:

访问成功后的日志:Accepted password for root from 我的真实 IP port 端口号 ssh2
指令与端口不匹配: 修改了默认的 SSH 端口(22)改为其他端口了。攻击者访问该端口时,命令和端口服务不匹配就会出现下面的错误日志记录。
error: kex_exchange_identification: banner line contains invalid characters。
ip 地址为 170.64.132.120 的主机尝试破解 sshd 登录:它使用了新的账户和密码进行验证。
pam_unix(sshd:auth): check pass; user unknown
pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=170.64.132.120。
提示来自于 170.64.132.120 主机的端口 47146 的请求,用户名无效。不允许操作:Invalid user amax from 170.64.132.120 port 47146。
为正确用户开启 root 会话,也就是远程登录的命令输入界面:pam_unix(sshd:session): session opened for user root by (uid=0)。
为用户关闭 root 会话 也就是命令行输入界面:pam_unix(sshd:session): session closed for user root。
来自用户名 jason 的登录,密码和用户验证失败:Failed password for invalid user jason from 170.64.132.128 port 59676 ssh2。
等等还有很多的命令日志。

只要我们的服务器开启了 SSH,那么这种攻击就会再所难免。我们需要

修改默认的 ssh 的端口 22 改为其他的端口,可以提高安全性。
root 密码设置比较复杂的密码,并且保持更新。
使用秘钥验证比密码验证安全性更高。
使用防火墙屏蔽大量访问的 ip。
使用脚本,对攻击访问进行自动拉黑添加到屏蔽访问的文件中。

5、总结

只要将我们的服务器在公网环境公开,提供服务。就避免不了来自全球互联网上的各种攻击。大部分的攻击都是一些泛攻击,利用程序自动扫描并发起攻击而已。

更多的针对的都是一些弱密码例如 123456,admin 等的自动攻击脚本。

我们只需要给自己的服务器创建复杂程度高的密码,并保持一段时间的密码跟换。同时如果必须使用 SSH 登录就将默认端口 22 更换为其他端口。​​​​

然后一段时间后,针对大量重复的 ip 地址进行封禁就可以了。

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-24发表,共计8232字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中