一些异常用户试图移去系统上的所有活动记录(比如 ~/.bash_history), 不过我们可以使用专门的工具来监视所有用户执行的命令. 推荐你使用进程记帐来记录用户的活动, 你可以通过进程记帐查看每一个用户执行的命令, 包括CPU时间和内存占用.
psacct程序提供了几个进程活动监视工具: ac, lastcomm, accton和sa.
.ac命令显示用户连接时间的统计.
.lastcomm命令显示系统执行的命令.
.accton命令用于打开或关闭进程记帐功能.
.sa命令统计系统进程记帐的情况.
1). 安装psacct或acct软件包
如果你使用RHEL, 使用up2date命令:
# up2date psacct
如果你使用CentOS/Fedora Core Linux, 使用yum命令:
$ sudo apt-get install acct
或
# apt-get install acct
2). 启动psacct/acct服务
在Ubuntu/Debian Linux系统上, pacct可以自动启动.(安装包会在系统上创建一个/var/account/pacct文件). 但是在Red Hat/Fedora Core/Cent OS, 你需要手动启动psacct服务. 敲入下面两个命令创建/var/account/pacct文件和启动pacct服务:
# chkconfig psacct on
# /etc/init.d/psacct start
如果你使用Suse Linux, 服务的名称为acct, 敲入下面的命令:
# chkconfig acct on
# /etc/init.d/acct start
现在我们可以了解如何利用这些工具来监视用户的命令和时间.
3). 显示用户连线时间的统计信息
命令可以根据登陆数/退出数在屏幕上打印出用户的连线时间(单位为小时). 总计时间也可以打印出来. 如果你执行没有任何参数的ac命令, 屏幕将会显示总计的连线时间:
$ ac
输出:
total 95.08
显示每一天的连线统计时间:
$ ac -d
输出:
Nov 1 total 8.65
Nov 2 total 5.70
Nov 3 total 13.43
Nov 4 total 6.24
Nov 5 total 10.70
Nov 6 total 6.70
Nov 7 total 10.30
.....
..
...
Nov 12 total 3.42
Nov 13 total 4.55
Today total 0.52
显示每一个用户的总计连线时间和所有用户总计连线时间:
$ ac -p
输出:
vivek 87.49
root 7.63
total 95.11
4). 查找用户过去执行的命令
你可以使用lastcomm命令打印出用户过去执行的命令. 你也可以通过用户名, tty名或命令名来搜索以往执行的命令.
比如显示vivek用户过去执行的命令:
$ lastcomm vivek
输出:
userhelper S X vivek pts/0 0.00 secs Mon Nov 13 23:58
userhelper S vivek pts/0 0.00 secs Mon Nov 13 23:45
rpmq vivek pts/0 0.01 secs Mon Nov 13 23:45
rpmq vivek pts/0 0.00 secs Mon Nov 13 23:45
rpmq vivek pts/0 0.01 secs Mon Nov 13 23:45
gcc vivek pts/0 0.00 secs Mon Nov 13 23:45
which vivek pts/0 0.00 secs Mon Nov 13 23:44
bash F vivek pts/0 0.00 secs Mon Nov 13 23:44
ls vivek pts/0 0.00 secs Mon Nov 13 23:43
rm vivek pts/0 0.00 secs Mon Nov 13 23:43
vi vivek pts/0 0.00 secs Mon Nov 13 23:43
ping S vivek pts/0 0.00 secs Mon Nov 13 23:42
ping S vivek pts/0 0.00 secs Mon Nov 13 23:42
ping S vivek pts/0 0.00 secs Mon Nov 13 23:42
cat vivek pts/0 0.00 secs Mon Nov 13 23:42
netstat vivek pts/0 0.07 secs Mon Nov 13 23:42
su S vivek pts/0 0.00 secs Mon Nov 13 23:38
每一行信息都在屏幕上打印出来, 我们以第一行输出项为例:
userhelper S X vivek pts/0 0.00 secs Mon Nov 13 23:58
分析:
. userhelper 是进程的命令名
. S和X是标志信息, 由系统记帐程序管理. 每一个标志的含义是:
.. S -- 命令由超级用户执行
.. F -- 命令由fork产生, 但是没有exec(执行)
.. D -- 命令终止并创建一个core文件.
.. X -- 命令被SIGTERM信号终止.
. vivek是执行命令的用户名
. prts/0 终端名
. 0.00 secs -- 进程退出时间
你可以通过执行下面的命令来搜索进程记帐日志:
$ lastcomm rm
$ lastcomm passwd
输出:
rm S root pts/0 0.00 secs Tue Nov 14 00:39
rm S root pts/0 0.00 secs Tue Nov 14 00:39
rm S root pts/0 0.00 secs Tue Nov 14 00:38
rm S root pts/0 0.00 secs Tue Nov 14 00:38
rm S root pts/0 0.00 secs Tue Nov 14 00:36
rm S root pts/0 0.00 secs Tue Nov 14 00:36
rm S root pts/0 0.00 secs Tue Nov 14 00:35
rm S root pts/0 0.00 secs Tue Nov 14 00:35
rm vivek pts/0 0.00 secs Tue Nov 14 00:30
rm vivek pts/1 0.00 secs Tue Nov 14 00:30
rm vivek pts/1 0.00 secs Tue Nov 14 00:29
rm vivek pts/1 0.00 secs Tue Nov 14 00:29
你可以通过终端名pts/1作为关键字来搜索进程记帐日志: $ lastcomm pts/1
5). 统计记帐信息
你可以使用sa命令打印过去执行命令的统计信息. 另外, sa命令保存了一个叫做savacct文件, 文件包含了命令被调用的次数和资源使用的次数. 而且sa还提供每一个用户的统计信息, 这些信息保存在一个叫做usracct的文件当中. # sa
输出:
579 222.81re 0.16cp 7220k
4 0.36re 0.12cp 31156k up2date
8 0.02re 0.02cp 16976k rpmq
8 0.01re 0.01cp 2148k netstat
11 0.04re 0.00cp 8463k grep
18 100.71re 0.00cp 11111k ***other*
8 0.00re 0.00cp 14500k troff
5 12.32re 0.00cp 10696k smtpd
2 8.46re 0.00cp 13510k bash
8 9.52re 0.00cp 1018k less
以结果输出的第一行为例: 4 0.36re 0.12cp 31156k up2date
分析:
. 0.36re "实际时间" 单位为分钟.
. 0.12cp 系统和用户时间总数(CPU时间, 单位为分钟)
. 31156K 核心使用所占的平均CPU时间, 一个单元的大小为1K
. up2date 命令名
显示每一个用户: # sa -u
输出:
root 0.00 cpu 595k mem accton
root 0.00 cpu 12488k mem initlog
root 0.00 cpu 12488k mem initlog
root 0.00 cpu 12482k mem touch
root 0.00 cpu 13226k mem psacct
root 0.00 cpu 595k mem consoletype
root 0.00 cpu 13192k mem psacct *
root 0.00 cpu 13226k mem psacct
root 0.00 cpu 12492k mem chkconfig
postfix 0.02 cpu 10696k mem smtpd
vivek 0.00 cpu 19328k mem userhelper
vivek 0.00 cpu 13018k mem id
vivek 0.00 cpu 13460k mem bash *
lighttpd 0.00 cpu 48240k mem php *
上面了显示了每一个用户的进程数量和CPU时间数 # sa -m
输出:
667 231.96re 0.17cp 7471k
root 544 51.61re 0.16cp 7174k
vivek 103 17.43re 0.01cp 8228k
postfix 18 162.92re 0.00cp 7529k
lighttpd 2 0.00re 0.00cp 48536k
6). 找出谁在占用CPU
你可以通过查看re, k, cp/cpu(见上面输出解释)时间来找出可疑的活动, 或某个用户/命令占用了所有的CPU时间. 如果CPU/Memeory使用数(命令)在不断增加, 可以说明命令存在问题.
另外上面的所有命令和软件包也可以在其它的Unix类操作系统平台上运行, 比如Solaris和*BSD操作系统.
参考
How to keep a detailed audit trail of what’s being done on your Linux systems