Linux | 查看服务器登录用户的活动情况

为了安全,会经常性的查看服务器登录的用户的情况,下面列举常用命令的使用

1 utmp wtmp btmp 文件

这里做个前置说明,因为接下来的很多命令都与这些文件有着千丝万缕的关系。

1.1 文件说明

Linux 用户登录的信息一般放在了这三个文件中。

  • /var/run/utmp:记录当前正在登录系统的用户信息,whowuptime 命令默认使用此文件。
  • /var/log/wtmp:记录登录过此系统的用户信息,包括现在和过去(其实就是记录 utmp 文件的历史记录),默认由 last 命令查看。
  • /var/log/btmp:记录失败的尝试登录信息(这个也囊括了恶意的尝试暴力登录的尝试),默认由 lastb 命令查看。

这三个文件都是二进制文件,并且这三个文件结构完全相同,结构体的定义在 /usr/include/utmp.h 文件中。

1.2 logrotate

默认情况下,文件的日志信息会通过 logrotate 日志管理工具定期清理,logrotate 的配置文件(/etc/logrotate.conf),其是 logrotate 的缺省配置。

通常情况下不需要对它进行修改。日志文件的轮循压缩等配置存放在独立的配置文件中,它们位置是:/etc/logrotate.d/ 目录下,他会覆盖缺省配置。

如果不想记录相关信息,则可以直接删除相关的配置文件。如果系统不存在改文件,则新建一个配置文件即可。这里看下默认的系统日志配置

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@kycool-strict logrotate.d]# cat syslog
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
missingok
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}

1.3 注意细节

上面为什么说 /var/log/wtmp 其实是记录 /var/run/utmp 文件的历史记录呢,通过内容对下下

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
[root@kycool-strict bits]# utmpdump /var/run/utmp
Utmp dump of /var/run/utmp
[2] [00000] [~~ ] [reboot ] [~ ] [3.10.0-1160.66.1.el7.x86_64] [0.0.0.0 ] [三 6月 29 23:54:09 2018 ]
[1] [00051] [~~ ] [runlevel] [~ ] [3.10.0-1160.66.1.el7.x86_64] [0.0.0.0 ] [三 6月 29 15:54:19 2018 ]
[6] [01060] [tty1] [LOGIN ] [tty1 ] [ ] [0.0.0.0 ] [三 6月 29 15:54:19 2018 ]
[6] [01059] [tyS0] [LOGIN ] [ttyS0 ] [ ] [0.0.0.0 ] [三 6月 29 15:54:19 2018 ]
[7] [14985] [ts/0] [root ] [pts/0 ] [121.32.197.136 ] [121.32.197.136 ] [一 7月 18 10:59:15 2018 ]

[root@kycool-strict bits]# utmpdump /var/log/wtmp
Utmp dump of /var/log/wtmp
[8] [01088] [tyS0] [ ] [ttyS0 ] [ ] [0.0.0.0 ] [三 5月 25 10:46:00 2018 ]
[8] [01089] [tty1] [ ] [tty1 ] [ ] [0.0.0.0 ] [三 5月 25 10:46:00 2018 ]
[2] [00000] [~~ ] [reboot ] [~ ] [3.10.0-1160.66.1.el7.x86_64] [0.0.0.0 ] [三 6月 29 23:54:09 2018 ]
[1] [00051] [~~ ] [runlevel] [~ ] [3.10.0-1160.66.1.el7.x86_64] [0.0.0.0 ] [三 6月 29 15:54:19 2018 ]
[5] [01060] [tty1] [ ] [tty1 ] [ ] [0.0.0.0 ] [三 6月 29 15:54:19 2018 ]
[5] [01059] [tyS0] [ ] [ttyS0 ] [ ] [0.0.0.0 ] [三 6月 29 15:54:19 2018 ]
[6] [01060] [tty1] [LOGIN ] [tty1 ] [ ] [0.0.0.0 ] [三 6月 29 15:54:19 2018 ]
[6] [01059] [tyS0] [LOGIN ] [ttyS0 ] [ ] [0.0.0.0 ] [三 6月 29 15:54:19 2018 ]
[7] [01379] [ts/0] [root ] [pts/0 ] [113.65.29.194 ] [113.65.29.194 ] [三 6月 29 15:55:51 2018 ]
[8] [01377] [ ] [ ] [pts/0 ] [ ] [0.0.0.0 ] [三 6月 29 15:56:27 2018 ]
[7] [01404] [ts/0] [root ] [pts/0 ] [113.65.29.194 ] [113.65.29.194 ] [三 6月 29 15:56:29 2018 ]
[8] [01402] [ ] [ ] [pts/0 ] [ ] [0.0.0.0 ] [三 6月 29 16:03:01 2018 ]
[7] [01589] [ts/0] [root ] [pts/0 ] [113.65.29.194 ] [113.65.29.194 ] [三 6月 29 16:04:39 2018 ]
[8] [01587] [ ] [ ] [pts/0 ] [ ] [0.0.0.0 ] [三 6月 29 20:12:05 2018 ]
[7] [04064] [ts/0] [root ] [pts/0 ] [121.32.199.178 ] [121.32.199.178 ] [二 7月 12 15:03:05 2018 ]
[8] [04062] [ ] [ ] [pts/0 ] [ ] [0.0.0.0 ] [二 7月 12 17:26:21 2018 ]
[7] [14985] [ts/0] [root ] [pts/0 ] [121.32.197.136 ] [121.32.197.136 ] [一 7月 18 10:59:15 2018 ]

2 常用命令

2.1 w

查看当前登入系统的用户信息及用户当前的线程。

1
2
3
4
5
[root@kycool-strict ~]# w

11:09:28 up 18 days, 19:15, 1 user, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 121.32.197.136 10:59 0.00s 0.00s 0.00s w

输出解释:
上半部分
11:09:28 up 18 days, 19:15, 1 user, load average: 0.00, 0.01, 0.05
这里其实类似于 top 的第一行,显示了当前的系统时间,开机运行多久(up),有多少用户登录(users),
以及 1 分钟,5 分钟,15 分钟前的平均负载(load average)。

下半部分
下班部分类似于表格,这就就简述下表头的含义

  • USER:登录的用户名
  • TTY:登录的终端
  • FROM:用户从哪个 IP 地址进行登录
  • LOGIN@:登录时间
  • IDLE:用户闲置时间
  • JCPU:处于该终端连接下的所有进程占用的 CPU 运算时间。这个时间不包含过去的后台作业时间,但是
    包括当前正在运行的后台作业时间
  • PCPU:当前进程所占用的 CPU 运算时间
  • WHAT:当前正在运行的命令

2.2 who

查看当前登录用户的情况

当不指定任何参数时,将按照以下顺序打印信息:
登录用户名称,终端信息,登录时间,用户登录 IP 地址

1
2
[root@kycool-strict ~]# who
root pts/0 2018-07-18 10:59 (112.22.194.16)

通过 man who 时,发现了一句话:

If FILE is not specified, use /var/run/utmp. /var/log/wtmp as FILE is common.

即如果不指定文件,默认使用 /var/run/utmp 文件,当前也可以指定文件,进行查看

下面使用 wtmp 文件进行查看

1
2
3
4
5
6
7
[root@kycool-strict ~]# who /var/log/wtmp
root pts/0 2018-06-29 15:55 (113.65.29.194)
root pts/0 2018-06-29 15:56 (113.65.29.194)
root pts/0 2018-06-29 16:04 (113.65.29.194)
root pts/0 2018-07-12 15:03 (121.32.199.178)
root pts/0 2018-07-18 10:59 (121.32.197.136)

这里看到了过去,现在登录用户的情况

2.3 users

查看当前服务器所有登录用户的情况,更详细的可以查看手册。

1
2
[root@kycool-strict ~]# users
root

2.4 lastlog

列出所有用户最近登录的信息,或者指定用户的最近登录信息。其引用的文件是:/var/log/lastlog

1
2
3
4
5
6
7
8
9
10
11
12
[root@kycool-strict log]# lastlog
用户名 端口 来自 最后登陆时间
future pts/0 121.32.197.136 一 7月 18 10:59:15 +0800 2022
bin **从未登录过**
daemon **从未登录过**
adm **从未登录过**
lp **从未登录过**
sync **从未登录过**
shutdown **从未登录过**
halt **从未登录过**
mail **从未登录过**
operator **从未登录过**

3.5 last

列出当前和曾经登录系统的用户信息。默认读取 /var/log/wtmp

1
2
3
4
5
6
7
[root@kycool-strict log]# last
root pts/0 121.32.197.136 Mon Jul 18 10:59 still logged in
root pts/0 121.32.199.178 Tue Jul 12 15:03 - 17:26 (02:23)
root pts/0 113.65.29.194 Wed Jun 29 16:04 - 20:12 (04:07)
root pts/0 113.65.29.194 Wed Jun 29 15:56 - 16:03 (00:06)
root pts/0 113.65.29.194 Wed Jun 29 15:55 - 15:56 (00:00)
reboot system boot 3.10.0-1160.66.1 Wed Jun 29 23:54 - 13:54 (18+14:00)

当然,也可以通过 last -f 参数指定读取文件,可以是 /var/log/btmp/var/run/utmp

1
2
3
4
5
[root@kycool-strict log]# last -f /var/run/utmp
root pts/0 121.32.197.136 Mon Jul 18 10:59 still logged in
reboot system boot 3.10.0-1160.66.1 Wed Jun 29 23:54 - 13:55 (18+14:01)

utmp begins Wed Jun 29 23:54:09 2022

3.6 lastb

列出失败的尝试登陆信息,和 last 命令功能相同,不过默认读取的文件是:/var/log/btmp
当然也可以通过 -f 参数指定其他的读取文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@kycool-strict log]# lastb -n 20
avorion ssh:notty 150.185.5.6 Mon Jul 18 13:25 - 13:25 (00:00)
admin ssh:notty 109.197.194.157 Mon Jul 18 13:18 - 13:18 (00:00)
admin ssh:notty 150.185.10.122 Mon Jul 18 13:18 - 13:18 (00:00)
lucas ssh:notty 103.169.34.130 Mon Jul 18 12:57 - 12:57 (00:00)
abby ssh:notty 193.122.108.42 Mon Jul 18 12:55 - 12:55 (00:00)
nick ssh:notty 195.218.137.42 Mon Jul 18 12:53 - 12:53 (00:00)
anurag ssh:notty 43.128.104.254 Mon Jul 18 12:40 - 12:40 (00:00)
admin ssh:notty 206.189.87.108 Mon Jul 18 12:32 - 12:32 (00:00)
testuser ssh:notty 192.3.211.39 Mon Jul 18 12:31 - 12:31 (00:00)
quagga ssh:notty 118.27.36.26 Mon Jul 18 12:30 - 12:30 (00:00)
ismael ssh:notty 175.47.205.72 Mon Jul 18 12:28 - 12:28 (00:00)
tanya ssh:notty 62.64.86.44 Mon Jul 18 12:26 - 12:26 (00:00)
weixin ssh:notty 218.111.88.185 Mon Jul 18 12:25 - 12:25 (00:00)
bob ssh:notty 121.26.142.238 Mon Jul 18 11:29 - 11:29 (00:00)
test03 ssh:notty 190.147.165.61 Mon Jul 18 11:25 - 11:25 (00:00)
ubuntu ssh:notty 107.184.205.109 Mon Jul 18 10:33 - 10:33 (00:00)
cafe24 ssh:notty 190.246.155.29 Mon Jul 18 10:11 - 10:11 (00:00)
upload ssh:notty 196.20.68.81 Mon Jul 18 10:09 - 10:09 (00:00)
postgres ssh:notty 202.29.13.51 Mon Jul 18 10:07 - 10:07 (00:00)
scanner ssh:notty 111.67.197.134 Mon Jul 18 08:18 - 08:18 (00:00)

通过日志,可以看到存在 ssh 暴力破解的情况。

3.7 utmpdump

用于转储二进制日志文件到文本格式的的文件以便查看,同时也可以修改二进制文件。包括

  • /var/run/utmp
  • /var/log/wtmp
  • /var/log/btmp

修改文件可以篡改记录,所以权限一定要严格限定,防止非法操作,例如篡改 wtmp 文件中的登录地址,祸水东引。

查看 wtmp 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@kycool-strict log]# utmpdump wtmp
Utmp dump of wtmp
[8] [01088] [tyS0] [ ] [ttyS0 ] [ ] [0.0.0.0 ] [三 5月 25 10:46:00 2022 ]
[8] [01089] [tty1] [ ] [tty1 ] [ ] [0.0.0.0 ] [三 5月 25 10:46:00 2022 ]
[2] [00000] [~~ ] [reboot ] [~ ] [3.10.0-1160.66.1.el7.x86_64] [0.0.0.0 ] [三 6月 29 23:54:09 2022 ]
[1] [00051] [~~ ] [runlevel] [~ ] [3.10.0-1160.66.1.el7.x86_64] [0.0.0.0 ] [三 6月 29 15:54:19 2022 ]
[5] [01060] [tty1] [ ] [tty1 ] [ ] [0.0.0.0 ] [三 6月 29 15:54:19 2022 ]
[5] [01059] [tyS0] [ ] [ttyS0 ] [ ] [0.0.0.0 ] [三 6月 29 15:54:19 2022 ]
[6] [01060] [tty1] [LOGIN ] [tty1 ] [ ] [0.0.0.0 ] [三 6月 29 15:54:19 2022 ]
[6] [01059] [tyS0] [LOGIN ] [ttyS0 ] [ ] [0.0.0.0 ] [三 6月 29 15:54:19 2022 ]
[7] [01379] [ts/0] [root ] [pts/0 ] [113.65.29.194 ] [113.65.29.194 ] [三 6月 29 15:55:51 2022 ]
[8] [01377] [ ] [ ] [pts/0 ] [ ] [0.0.0.0 ] [三 6月 29 15:56:27 2022 ]
[7] [01404] [ts/0] [root ] [pts/0 ] [113.65.29.194 ] [113.65.29.194 ] [三 6月 29 15:56:29 2022 ]
[8] [01402] [ ] [ ] [pts/0 ] [ ] [0.0.0.0 ] [三 6月 29 16:03:01 2022 ]
[7] [01589] [ts/0] [root ] [pts/0 ] [113.65.29.194 ] [113.65.29.194 ] [三 6月 29 16:04:39 2022 ]
[8] [01587] [ ] [ ] [pts/0 ] [ ] [0.0.0.0 ] [三 6月 29 20:12:05 2022 ]
[7] [04064] [ts/0] [root ] [pts/0 ] [121.32.199.178 ] [121.32.199.178 ] [二 7月 12 15:03:05 2022 ]
[8] [04062] [ ] [ ] [pts/0 ] [ ] [0.0.0.0 ] [二 7月 12 17:26:21 2022 ]
[7] [14985] [ts/0] [root ] [pts/0 ] [121.32.197.136 ] [121.32.197.136 ] [一 7月 18 10:59:15 2022 ]

模拟修改最后一行的 IP 地址,把 121.32.197.136 修改为 121.32.197.122

第一步:导出文本信息

1
2
[root@kycool-strict log]# utmpdump wtmp > tmp_wtmp
Utmp dump of wtmp

第二步:修改 tmp_wtmp 文件

121.32.197.136 修改为 121.32.197.122

第三步:覆盖源文件

1
2
[root@kycool-strict log]# utmpdump -r tmp_wtmp > wtmp
Utmp undump of tmp_wtmp

第四步:再次查看,进行确认

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@kycool-strict log]# utmpdump wtmp
Utmp dump of wtmp
[8] [01088] [tyS0] [ ] [ttyS0 ] [ ] [0.0.0.0 ] [三 5月 25 10:46:00 2022 ]
[8] [01089] [tty1] [ ] [tty1 ] [ ] [0.0.0.0 ] [三 5月 25 10:46:00 2022 ]
[2] [00000] [~~ ] [reboot ] [~ ] [3.10.0-1160.66.1.el7.x86_64] [0.0.0.0 ] [三 6月 29 23:54:09 2022 ]
[1] [00051] [~~ ] [runlevel] [~ ] [3.10.0-1160.66.1.el7.x86_64] [0.0.0.0 ] [三 6月 29 15:54:19 2022 ]
[5] [01060] [tty1] [ ] [tty1 ] [ ] [0.0.0.0 ] [三 6月 29 15:54:19 2022 ]
[5] [01059] [tyS0] [ ] [ttyS0 ] [ ] [0.0.0.0 ] [三 6月 29 15:54:19 2022 ]
[6] [01060] [tty1] [LOGIN ] [tty1 ] [ ] [0.0.0.0 ] [三 6月 29 15:54:19 2022 ]
[6] [01059] [tyS0] [LOGIN ] [ttyS0 ] [ ] [0.0.0.0 ] [三 6月 29 15:54:19 2022 ]
[7] [01379] [ts/0] [root ] [pts/0 ] [113.65.29.194 ] [113.65.29.194 ] [三 6月 29 15:55:51 2022 ]
[8] [01377] [ ] [ ] [pts/0 ] [ ] [0.0.0.0 ] [三 6月 29 15:56:27 2022 ]
[7] [01404] [ts/0] [root ] [pts/0 ] [113.65.29.194 ] [113.65.29.194 ] [三 6月 29 15:56:29 2022 ]
[8] [01402] [ ] [ ] [pts/0 ] [ ] [0.0.0.0 ] [三 6月 29 16:03:01 2022 ]
[7] [01589] [ts/0] [root ] [pts/0 ] [113.65.29.194 ] [113.65.29.194 ] [三 6月 29 16:04:39 2022 ]
[8] [01587] [ ] [ ] [pts/0 ] [ ] [0.0.0.0 ] [三 6月 29 20:12:05 2022 ]
[7] [04064] [ts/0] [root ] [pts/0 ] [121.32.199.178 ] [121.32.199.178 ] [二 7月 12 15:03:05 2022 ]
[8] [04062] [ ] [ ] [pts/0 ] [ ] [0.0.0.0 ] [二 7月 12 17:26:21 2022 ]
[7] [14985] [ts/0] [root ] [pts/0 ] [121.32.197.122 ] [121.32.197.122 ] [一 7月 18 10:59:15 2022 ]

最后一行中的 IP 地址已经变成了 121.32.197.122