我们有一个每 12 小时运行一次的备份应用程序。
多台服务器、台式机和笔记本电脑连接到 EC2 实例并使用自己的登录凭据通过 SFTP 推送备份。
如果他们需要恢复文件,他们可以通过简单的 SFTP 客户端浏览文件并恢复文件。过去 8 个月,这项服务运行良好。
我想知道每个用户每月通过 SSH 传输了多少数据。我不需要过去 8 个月的日志,但如果能从现在开始记录就好了。
有什么可以让我做到这一点?
操作系统:Ubuntu 10.10
答案1
这需要一些魔法,这就是我和我的同事能够拼凑起来的。
#!/bin/bash
main() {
if [ -e $1 ] ; then
MONTH=$(date | awk '{ print $2 }')
elif [ $1 -ge 1 -a $1 -le 12 ] ; then
month $1
else
exit 1
fi
echo
echo "Usage statistics for month $MONTH"
echo
USERS=(`awk '/^'$MONTH'.*session opened for local user.*$/ { print $(NF-2) } ' /var/log/auth.log* | sort | uniq`)
for i in "${USERS[@]}"
do :
echo "################################"
echo "Usage for user: $i"
READ=0
WRITTEN=0
#processes for this user
PROCS=(`awk '/^'$MONTH'.*session opened for local user '$i'.*$/ { gsub("\\[|]|sftp-server|:","", $(NF-8)); print $(NF-8) } ' /var/log/auth.log* | sort | uniq`)
for j in "${PROCS[@]}"
do :
TEMP_READ=$(awk '/^'$MONTH'.*\['$j'\].*\ read\ [0-9]+\ written\ [0-9]+$/ { sum+=$(NF-2)}END{ print sum}' /var/log/auth.log*)
READ=$(($TEMP_READ+$READ))
TEMP_WRITTEN=$(awk '/^'$MONTH'.*\['$j'\].*\ read\ [0-9]+\ written\ [0-9]+$/ { sum+=$(NF)}END{ print sum}' /var/log/auth.log*)
WRITTEN=$(($TEMP_WRITTEN+$WRITTEN))
done
echo "Read $(($READ/(1024*1024))) MiB"
echo "Written $(($WRITTEN/(1024*1024))) MiB"
echo "################################"
echo
done
}
month() {
case "$1" in
1) MONTH='Jan'
;;
2) MONTH='Feb'
;;
3) MONTH='Mar'
;;
4) MONTH='Apr'
;;
5) MONTH='May'
;;
6) MONTH='Jun'
;;
7) MONTH='Jul'
;;
8) MONTH='Aug'
;;
9) MONTH='Sep'
;;
10) MONTH='Oct'
;;
11) MONTH='Nov'
;;
12) MONTH='Dec'
;;
*) echo 'Crash and Burn!'
exit 1
;;
esac
}
main $1
exit 0
在 sshd_config 中我输入了以下内容:
Subsystem sftp /usr/lib/openssh/sftp-server -l VERBOSE
警告:此脚本占用大量内存!如果您有大型日志文件,则脚本可能需要长达 10 分钟才能完成(在 EC2 Micro 上测试)。
答案2
您可以通过 IP 跟踪用户登录(可在日志文件中找到),然后使用几乎任何流量监控解决方案(想到了 Netflow 和 IPtraf)来跟踪该 IP 的端口 22 流量。
不幸的是,除非您已经进行相关设置,否则无法获得前几个月的历史使用情况。
答案3
你可能想看看这篇关于 sftp 日志的帖子。我认为它会给你你想要的东西,只需做一些额外的工作来解析日志。
答案4
auditd 是一款很好的实用程序,可以了解对每个文件做了什么。但它可能不是你需要的。