免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4081 | 回复: 6
打印 上一主题 下一主题

[已解决]SSH 登录统计 开启fingerprint [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-13 02:07 |只看该作者 |倒序浏览
本帖最后由 可可火山 于 2011-12-13 15:43 编辑

update:20111213 15:42 一个awk脚本就搞定了,nice。
{ if( $0 ~ /Found matching/ ) { fingerprint[$5]=$13 } else if ( $0 ~ /Accepted publickey/ && $12 != "root" ) { print fingerprint[$5],$12,$14;delete fingerprint[$5] } }



服务器都是用公钥验证的,最近要做个统计,需要把用户从哪里登录,使用那个公钥统计出来。
开启LogLevel从INFO到VERBOSE后在log里就有足够的信息的。

也写了个脚本用来分析log,一般一次登录会有一条 Found matching的ssh key fingerprint记录,随后就有一条Accepted publickey记录提示某个帐号从哪个IP登录,我需要把这两条记录找出来并生成一条记录。

这是我目前的脚本伪代码思路,根据 sshd[xxxxxx]来判断一次登录的,跑了几次发现有问题,检查log文件发现 sshd[xxxxx]的记录是有重复的,我以为至少一天的登录记录里这个id是唯一的。
1) grep Found matching 并得到文件 file1_fingerprint
sshd[23207]: 55:f9:98:93:ff:ff:ff:ff:00:63:bf:7c:19:88:f4:a9
2) grep "Accepted publickey"并得到文件 file1_user_ip
sshd[23207]: user1  10.140.1.107
3) join 一下 file1_fingerprint 和file1_user_ip
55:f9:98:93:ff:ff:ff:ff:00:63:bf:7c:19:88:f4:a9 user1  10.140.1.107
正常情况下到了第三步我就已经把ssh用公钥的一次登录提取出来了,用户,登录IP,和使用的公钥。


但是如果那个sshd[xxxxx] id重复的话就会排列组合下导致错误记录

sshd log片段,其中 sshd[23207] 重复,其实是两次登录。但我的代码会有4个结果。
  1. Dec 12 03:38:19 server sshd[23207]: [ID 800047 auth.notice] Failed none for user1 from 10.140.1.107 port 37702 ssh2
  2. Dec 12 03:38:19 server sshd[23207]: [ID 800047 auth.info] Found matching DSA key: 55:f9:98:93:ff:ff:ff:ff:00:63:bf:7c:19:88:f4:a9
  3. Dec 12 03:38:19 server last message repeated 1 time
  4. Dec 12 03:38:19 server sshd[23207]: [ID 800047 auth.info] Accepted publickey for user1 from 10.140.1.107 port 37702 ssh2
  5. Dec 12 03:39:46 server sshd[23207]: [ID 800047 auth.info] Connection closed by 10.140.1.107
  6. Dec 12 03:39:46 server sshd[23207]: [ID 800047 auth.info] Closing connection to 10.140.1.107

  7. Dec 12 10:29:03 server sshd[23207]: [ID 800047 auth.notice] Failed none for user2 from 10.228.1.95 port 62189 ssh2
  8. Dec 12 10:29:03 server sshd[23207]: [ID 800047 auth.info] Found matching DSA key: e3:b1:14:e4:b5:ff:ff:ff:ac:68:65:fa:cc:9e:d6:a4
  9. Dec 12 10:29:03 server last message repeated 1 time
  10. Dec 12 10:29:03 server sshd[23207]: [ID 800047 auth.info] Accepted publickey for user2 from 10.228.1.95 port 62189 ssh2
  11. Dec 12 10:29:03 server sshd[23207]: [ID 800047 auth.info] Connection closed by 10.228.1.95
  12. Dec 12 10:29:03 server sshd[23207]: [ID 800047 auth.info] Closing connection to 10.228.1.95

  13. //step1和step2根据上面log产生的文件
  14. user@server:~/workspace/sshkey$ cat file1_fingerprint
  15. sshd[23207]: 55:f9:98:93:ff:ff:ff:ff:00:63:bf:7c:19:88:f4:a9
  16. sshd[23207]: e3:b1:14:e4:b5:ff:ff:ff:ac:68:65:fa:cc:9e:d6:a4
  17. You have new mail in /opt/apps/mail/user/mailbox
  18. user@server:~/workspace/sshkey$ cat file2_user_ip
  19. sshd[23207]: user1  10.140.1.107
  20. sshd[23207]: user2  10.228.1.95
  21. user@server:~/workspace/sshkey$ join file1_fingerprint  file2_user_ip
  22. sshd[23207]: 55:f9:98:93:ff:ff:ff:ff:00:63:bf:7c:19:88:f4:a9 user1 10.140.1.107
  23. sshd[23207]: 55:f9:98:93:ff:ff:ff:ff:00:63:bf:7c:19:88:f4:a9 user2 10.228.1.95
  24. sshd[23207]: e3:b1:14:e4:b5:ff:ff:ff:ac:68:65:fa:cc:9e:d6:a4 user1 10.140.1.107
  25. sshd[23207]: e3:b1:14:e4:b5:ff:ff:ff:ac:68:65:fa:cc:9e:d6:a4 user2 10.228.1.95
复制代码
我期望的结果应该是就两条
sshd[23207]: 55:f9:98:93:ff:ff:ff:ff:00:63:bf:7c:19:88:f4:a9 user1 10.140.1.107
sshd[23207]: e3:b1:14:e4:b5:ff:ff:ff:ac:68:65:fa:cc:9e:d6:a4 user2 10.228.1.95

很明显我在step1和step2 提取的信息不足,或者说处理的方法不对。
昨晚忙了一天头晕脑花,最后查到问题但还没想到方法,今天醒来清醒些。想到个2L提供的方案类似,也是用awk来做。不过逻辑有点不同,但是awk功力不够,还请论坛同志们帮忙,谢先。

代码逻辑
1)awk一行行读入,当碰到“ Found matching”时,保存 Log时间,sshd[id](或者直接存ID),和fingerprint。
2)awk读到“Accepted publickey”时,稍微做个判断,上次同样sshd[id]的记录的Log时间是否和这次相近,然后把 fingerprint,user,ip打印到文件
3)最后做一次sort 和uniq,这样就得到sshd登录log的 user,fingerprint和IP了

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
2 [报告]
发表于 2011-12-13 03:18 |只看该作者
本帖最后由 yinyuemi 于 2011-12-13 03:19 编辑

回复 1# 可可火山
  1. awk -v id='23207'  '$0~"sshd\\["id"\\]:"{if(/Found matching/)printf ("sshd["id"]:" FS $NF FS);if(/Accepted publickey/)print $(NF-5) FS $(NF-3)}' LOG
复制代码

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
3 [报告]
发表于 2011-12-13 09:20 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
4 [报告]
发表于 2011-12-13 11:16 |只看该作者
写了一大堆没看懂。

楼主把想要的结果贴出来。
zooyo 发表于 2011-12-13 09:20



    shell版白混了呀,猜是本版必备滴基本功。

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
5 [报告]
发表于 2011-12-13 12:11 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
6 [报告]
发表于 2011-12-13 13:43 |只看该作者
谢谢大家都热情 :wink:

目前觉得用awk来时间比较方便些,不过要加些逻辑,已经把问题又整理了下,

代码逻辑
1)awk一行行读入,当碰到“ Found matching”时,保存 Log时间,sshd[id](或者直接存ID),和fingerprint。
2)awk读到“Accepted publickey”时,稍微做个判断,上次同样sshd[id]的记录的Log时间是否和这次相近(时间差距大可能是个重复sshd[xxx]记录),然后把 fingerprint,user,ip打印到文件
3)最后做一次sort 和uniq,这样就得到sshd登录log的 user,fingerprint和IP了

论坛徽章:
0
7 [报告]
发表于 2011-12-13 15:38 |只看该作者
本帖最后由 可可火山 于 2011-12-13 15:41 编辑

看了会《sed与awk》,初步确定逻辑,把判断时间部分去掉了,觉得没什么他用处。
root的登录不判断,所以就忽略掉了。
我原来3个step现在只要一步就可以了, script编程真是好玩。 谢谢大家关注

{ if( $0 ~ /Found matching/ ) { fingerprint[$5]=$13 } else if ( $0 ~ /Accepted publickey/ && $12 != "root" ) { print fingerprint[$5],$12,$14;delete fingerprint[$5] } }
  1. [user@fingerprint (0)]$cat messages
  2. Dec 12 03:38:19 server sshd[23207]: [ID 800047 auth.notice] Failed none for user1 from 10.140.1.107 port 37702 ssh2
  3. Dec 12 03:38:19 server sshd[23207]: [ID 800047 auth.info] Found matching DSA key: 55:f9:98:93:ff:ff:ff:ff:00:63:bf:7c:19:88:f4:a9
  4. Dec 12 03:38:19 server last message repeated 1 time
  5. Dec 12 03:38:19 server sshd[23207]: [ID 800047 auth.info] Accepted publickey for user1 from 10.140.1.107 port 37702 ssh2
  6. Dec 12 03:39:46 server sshd[23207]: [ID 800047 auth.info] Connection closed by 10.140.1.107
  7. Dec 12 03:39:46 server sshd[23207]: [ID 800047 auth.info] Closing connection to 10.140.1.107
  8. Dec 12 03:38:19 server sshd[23207]: [ID 800047 auth.notice] Failed none for root from 10.140.1.107 port 37702 ssh2
  9. Dec 12 03:38:19 server sshd[23207]: [ID 800047 auth.info] Found matching DSA key: rr:f9:98:93:ff:ff:ff:ff:00:63:bf:7c:19:88:f4:a9
  10. Dec 12 03:38:19 server last message repeated 1 time
  11. Dec 12 03:38:19 server sshd[23207]: [ID 800047 auth.info] Accepted publickey for root from rr.140.1.107 port 37702 ssh2
  12. Dec 12 03:39:46 server sshd[23207]: [ID 800047 auth.info] Connection closed by 10.140.1.107
  13. Dec 12 03:39:46 server sshd[23207]: [ID 800047 auth.info] Closing connection to 10.140.1.107
  14. Dec 12 10:29:03 server sshd[23207]: [ID 800047 auth.notice] Failed none for user2 from 10.228.1.95 port 62189 ssh2
  15. Dec 12 10:29:03 server sshd[23207]: [ID 800047 auth.info] Found matching DSA key: e3:b1:14:e4:b5:ff:ff:ff:ac:68:65:fa:cc:9e:d6:a4
  16. Dec 12 10:29:03 server last message repeated 1 time
  17. Dec 12 10:29:03 server sshd[23207]: [ID 800047 auth.info] Accepted publickey for user2 from 10.228.1.95 port 62189 ssh2
  18. Dec 12 10:29:03 server sshd[23207]: [ID 800047 auth.info] Connection closed by 10.228.1.95
  19. Dec 12 10:29:03 server sshd[23207]: [ID 800047 auth.info] Closing connection to 10.228.1.95
  20. [user@fingerprint (0)]$cat extractlogon.awk
  21. { if( $0 ~ /Found matching/ ) { fingerprint[$5]=$13 } else if ( $0 ~ /Accepted publickey/ && $12 != "root" ) { print fingerprint[$5],$12,$14;delete fingerprint[$5] } }
  22. [user@fingerprint (0)]$awk -f extractlogon.awk  messages
  23. 55:f9:98:93:ff:ff:ff:ff:00:63:bf:7c:19:88:f4:a9 user1 10.140.1.107
  24. e3:b1:14:e4:b5:ff:ff:ff:ac:68:65:fa:cc:9e:d6:a4 user2 10.228.1.95
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP