免费注册 查看新帖 |

Chinaunix

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

[已解决]SSH 登录类型ssh/sftp统计 开启fingerprint [复制链接]

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

上次统计 登录用户,IP和 fingerprint 用一句 awk 语句就搞定了
http://bbs.chinaunix.net/thread-3629504-1-1.html

现在需要多统计些东西,我需要区分登录的是交互式ssh还是 sftp/scp。
  1. Dec 13 03:30:57 server sshd[27238]: [ID 800047 auth.info] Accepted publickey for user1 from 192.168.1.2 port 61880 ssh2
  2. Dec 13 03:30:57 server sshd[27238]: [ID 800047 auth.info] subsystem request for sftp  
复制代码

  1. { if( $0 ~ /Found matching/ ) { fingerprint[$5]=$13 } else if ( $0 ~ /Accepted publickey/ && $12 != "root" ) { print fingerprint[$5],$12,$14;delete fingerprint[$5] } }
复制代码
对我上次awk脚本多做些逻辑,一般情况下如果"Accepted publickey"下一行是“subsystem request for sftp”的话就是 sftp。这个用 awk 的 getline读入下一行并做判断就可以了。
  1. {
  2.     if( $0 ~ /Found matching/ )
  3.     { FINGERPRINT[$5]=$13;OK="false" }
  4.     else if ( $0 ~ /Accepted publickey/ && $12 != "root" )
  5.     { USER[$5]=$12;IP[$5]=$14;TYPE[$5]="ssh"
  6.        getline
  7.        if ( $0 ~ /subsystem request for sftp/ )
  8.            TYPE[$5]="sftp"
  9.        OK="true"
  10.     }
  11.     if ( OK == "true" )
  12.     { print USER[$5],TYPE[$5],IP[$5],FINGERPRINT[$5];OK="false" }
  13. }
复制代码
不过如果当某一时刻有很多连接时,脚本工作就不正常了,因为不是每条"Accepted publickey"对应的session下一行是“subsystem request for sftp”
在awk中如何灵活的判断下面几行的内容来加些逻辑?

  1. [user@srever (1)]$cat messages_part
  2. Dec 13 03:30:56 server sshd[27212]: [ID 800047 auth.info] Connection from 192.168.1.2 port 61878
  3. Dec 13 03:30:56 server sshd[27214]: [ID 800047 auth.info] Connection from 192.168.1.2 port 61879
  4. Dec 13 03:30:57 server sshd[27237]: [ID 800047 auth.info] Connection from 192.168.1.2 port 61880
  5. Dec 13 03:30:57 server sshd[27218]: [ID 800047 auth.notice] Failed none for user1 from 192.168.1.2 port 61879 ssh2
  6. Dec 13 03:30:57 server sshd[27213]: [ID 800047 auth.notice] Failed none for user1 from 192.168.1.2 port 61878 ssh2
  7. Dec 13 03:30:57 server sshd[27213]: [ID 800047 auth.info] Found matching DSA key: 44:8f:08:ff:ff:ff:ff:be:e3:de:62:32:8d:b4:6d:c1
  8. Dec 13 03:30:57 server sshd[27218]: [ID 800047 auth.info] Found matching DSA key: 44:8f:08:ff:ff:ff:ff:be:e3:de:62:32:8d:b4:6d:c1
  9. Dec 13 03:30:57 server sshd[27213]: [ID 800047 auth.info] Found matching DSA key: 44:8f:08:ff:ff:ff:ff:be:e3:de:62:32:8d:b4:6d:c1
  10. Dec 13 03:30:57 server sshd[27218]: [ID 800047 auth.info] Found matching DSA key: 44:8f:08:ff:ff:ff:ff:be:e3:de:62:32:8d:b4:6d:c1
  11. Dec 13 03:30:57 server sshd[27218]: [ID 800047 auth.info] Accepted publickey for user1 from 192.168.1.2 port 61879 ssh2
  12. Dec 13 03:30:57 server sshd[27213]: [ID 800047 auth.info] Accepted publickey for user1 from 192.168.1.2 port 61878 ssh2
  13. Dec 13 03:30:57 server sshd[27218]: [ID 800047 auth.info] subsystem request for sftp
  14. Dec 13 03:30:57 server sshd[27213]: [ID 800047 auth.info] subsystem request for sftp
  15. Dec 13 03:30:57 server sshd[27213]: [ID 800047 auth.info] Connection closed by 192.168.1.2
  16. Dec 13 03:30:57 server sshd[27213]: [ID 800047 auth.info] Closing connection to 192.168.1.2
  17. Dec 13 03:30:57 server sshd[27218]: [ID 800047 auth.info] Connection closed by 192.168.1.2
  18. Dec 13 03:30:57 server sshd[27218]: [ID 800047 auth.info] Closing connection to 192.168.1.2
  19. Dec 13 03:30:57 server sshd[27238]: [ID 800047 auth.notice] Failed none for user1 from 192.168.1.2 port 61880 ssh2
  20. Dec 13 03:30:57 server sshd[27238]: [ID 800047 auth.info] Found matching DSA key: 44:8f:08:ff:ff:ff:ff:be:e3:de:62:32:8d:b4:6d:c1
  21. Dec 13 03:30:57 server last message repeated 1 time
  22. Dec 13 03:30:57 server sshd[27238]: [ID 800047 auth.info] Accepted publickey for user1 from 192.168.1.2 port 61880 ssh2
  23. Dec 13 03:30:57 server sshd[27238]: [ID 800047 auth.info] subsystem request for sftp
  24. Dec 13 03:30:58 server sshd[27238]: [ID 800047 auth.info] Connection closed by 192.168.1.2
  25. Dec 13 03:30:58 server sshd[27238]: [ID 800047 auth.info] Closing connection to 192.168.1.2
  26. Dec 13 03:31:02 server sshd[27436]: [ID 800047 auth.info] Connection from 192.168.1.2 port 61918
  27. Dec 13 03:31:03 server sshd[27437]: [ID 800047 auth.notice] Failed none for user1 from 192.168.1.2 port 61918 ssh2
  28. Dec 13 03:31:03 server sshd[27437]: [ID 800047 auth.info] Found matching DSA key: 44:8f:08:ff:ff:ff:ff:be:e3:de:62:32:8d:b4:6d:c1
  29. Dec 13 03:31:03 server last message repeated 1 time
  30. Dec 13 03:31:03 server sshd[27437]: [ID 800047 auth.info] Accepted publickey for user1 from 192.168.1.2 port 61918 ssh2
  31. Dec 13 03:31:03 server sshd[27437]: [ID 800047 auth.info] subsystem request for sftp
  32. Dec 13 03:31:03 server sshd[27437]: [ID 800047 auth.info] Connection closed by 192.168.1.2
  33. Dec 13 03:31:03 server sshd[27437]: [ID 800047 auth.info] Closing connection to 192.168.1.2
  34. Dec 13 03:31:50 server sshd[29329]: [ID 800047 auth.info] Connection from 192.168.1.2 port 61996
  35. [user@srever (1)]$awk -f extract.awk messages_part
  36.    44:8f:08:ff:ff:ff:ff:be:e3:de:62:32:8d:b4:6d:c1
  37. user1 sftp 192.168.1.2 44:8f:08:ff:ff:ff:ff:be:e3:de:62:32:8d:b4:6d:c1
  38. user1 sftp 192.168.1.2 44:8f:08:ff:ff:ff:ff:be:e3:de:62:32:8d:b4:6d:c1
复制代码

论坛徽章:
0
2 [报告]
发表于 2011-12-16 18:23 |只看该作者
  1. {
  2.     if( $0 ~ /Found matching/ )
  3.     { FINGERPRINT[$5]=$13 }
  4.     else if ( $0 ~ /Accepted publickey/ && $12 != "root" )
  5.     { USER[$5]=$12;IP[$5]=$14;TYPE[$5]="ssh"}
  6.     else if ( $0 ~ /subsystem request for sftp/ )
  7.     {  TYPE[$5]="sftp" }
  8. }
  9. END {
  10.     for ( SSHDSESSION in USER )
  11.         print USER[SSHDSESSION],TYPE[SSHDSESSION],IP[SSHDSESSION],FINGERPRINT[SSHDSESSION]
  12. }
复制代码
上面的awk脚本可以把每次的ssh session 记录到 数组中,并且在END部分都打印出来。代码逻辑基本OK,但是我以前碰到过 sshd[xxxxxx] 部分在一天的log可能重复,而我目前的脚本还没考虑到这个情况。
这个问题参见
http://bbs.chinaunix.net/thread-3629504-1-1.html
代码还需要在考虑全面些

  1. [user@server (0)]$awk -f extract.awk messages_part
  2. user1 sftp 192.168.1.2 44:8f:08:28:ff:ff:ff:ff:e3:de:62:32:8d:b4:6d:c1
  3. user1 sftp 192.168.1.2 44:8f:08:28:ff:ff:ff:ff:e3:de:62:32:8d:b4:6d:c1
  4. user1 sftp 192.168.1.2 44:8f:08:28:ff:ff:ff:ff:e3:de:62:32:8d:b4:6d:c1
  5. user1 sftp 192.168.1.2 44:8f:08:28:ff:ff:ff:ff:e3:de:62:32:8d:b4:6d:c1

  6. [user@server (0)]$grep sftp messages_part
  7. Dec 13 03:30:57 server sshd[27218]: [ID 800047 auth.info] subsystem request for sftp
  8. Dec 13 03:30:57 server sshd[27213]: [ID 800047 auth.info] subsystem request for sftp
  9. Dec 13 03:30:57 server sshd[27238]: [ID 800047 auth.info] subsystem request for sftp
  10. Dec 13 03:31:03 server sshd[27437]: [ID 800047 auth.info] subsystem request for sftp
复制代码

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
3 [报告]
发表于 2011-12-16 19:44 |只看该作者
看不到scp 的例子,缺省认为和sftp 格式一样。 subsystem request for scp

以下代码会自动给出ssh,sftp 或scp类型。
  1. awk '/Found matching/ {FINGERPRINT[$5]=$13}
  2.      /Accepted publickey/ && $12 != "root"{ USER[$5]=$12;IP[$5]=$14;TYPE[$5]=$NF}
  3.      /subsystem request/ {TYPE[$5]=$NF}
  4.      END { for ( SSHDSESSION in USER )
  5.                print USER[SSHDSESSION],TYPE[SSHDSESSION],IP[SSHDSESSION],FINGERPRINT[SSHDSESSION]
  6.          }' messages_part
复制代码

论坛徽章:
0
4 [报告]
发表于 2011-12-16 21:25 |只看该作者
看不到scp 的例子,缺省认为和sftp 格式一样。 subsystem request for scp

以下代码会自动给出ssh,sftp  ...
rdcwayx 发表于 2011-12-16 19:44


谢谢你的回复,我觉得奇怪的是scp是不产生 subsystem log的,以下是一次scp localhost的log。

Dec 16 21:21:57 server sshd[1219]: [ID 800047 auth.info] Failed none for user from ::1 port 55486 ssh2
Dec 16 21:21:57 server sshd[1219]: [ID 800047 auth.info] Found matching DSA key: b6:ff:ff:ff:ff:72:f5:18:1b:f6:d0:f8:6f:1c:40:6f
Dec 16 21:21:57 server last message repeated 1 time
Dec 16 21:21:57 server sshd[1219]: [ID 800047 auth.info] Accepted publickey for user from ::1 port 55486 ssh2
Dec 16 21:21:57 server sshd[1219]: [ID 800047 auth.info] Connection closed by ::1
Dec 16 21:21:57 server sshd[1219]: [ID 800047 auth.info] Closing connection to ::1

论坛徽章:
0
5 [报告]
发表于 2011-12-16 21:34 |只看该作者
目前下面的awk脚本基本满足了我的需求
ssh登录log里可能会存在同时登录导致日志是相互叠加的。
还有就是 sshd[xxxxx]的session id (我自己叫的)在一天的log里可能会重复。
  1. {
  2.     if( $0 ~ /Found matching/ ) {
  3.         if ( FINGERPRINT[$5] != $13 && USER[$5]!="" && USER[$5]!="root" )
  4.         { print USER[$5],IP[$5],FINGERPRINT[$5],TYPE[$5] }
  5.         FINGERPRINT[$5]=$13
  6.     }
  7.     else if ( $0 ~ /Accepted publickey/ )
  8.     { USER[$5]=$12;IP[$5]=$14;TYPE[$5]="ssh" }
  9.     else if ( $0 ~ /subsystem request for sftp/ && USER[$5] !="" )
  10.     { TYPE[$5]="sftp" }
  11. }
  12. END {
  13.     for ( SSHDSESSION in USER ){
  14.         if ( USER[SSHDSESSION]!="" && USER[SSHDSESSION] !="root" )
  15.             print USER[SSHDSESSION],IP[SSHDSESSION],FINGERPRINT[SSHDSESSION],TYPE[SSHDSESSION]
  16.     }
  17. }
复制代码
不过我对awk内的数组使用还有些疑问:(awk没法调试,所以都是打print来看的)
如果我在END外对 USER[sshd[xxxx]]做了判断,这里原来sshd[xxxx]为下标的元素是没有的,这样会导致加个下标为 sshd[xxxx]的元素到USER数组么?
虽然自觉告诉我不会,但是我调试一个问题时表现好像这样的。

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
6 [报告]
发表于 2011-12-19 07:23 |只看该作者
虽说你自己标了“已解决”, 但其实你没有明白我改了你的代码的目的。 尤其是对TYPE 数组进行直接赋值的部分。

论坛徽章:
0
7 [报告]
发表于 2011-12-19 11:28 |只看该作者
回复 6# rdcwayx

我加了不少自己的判断实现了逻辑。
确实忽略了TYPE部分,其实sshd的log已经包含了type信息!! 谢谢。我的这些判断现在看起来是多余。


我开始也想深入了解下sshd log每个域的对应信息,稍微看了下openssh的log未果,等下再仔细看看。

关于scp,我想不会生成 ubsystem request for scp的log,因为和sftp不同, sftp是sshd的subsystem。
//// file /etc/ssh/sshd_config
# sftp subsystem
Subsystem       sftp    /usr/lib/ssh/sftp-server

目前我们的sshd LogLevel是verbose,不能再往DEBUG这样输出大量log的level改了,如果能在这个级别的LogLevel分辨 scp和一般的ssh登录,也是非常有意义的!

论坛徽章:
0
8 [报告]
发表于 2011-12-19 13:58 |只看该作者
确实可以直接那sshd log最后一个域来做 type。简化了很多,我也曾尝试了解下日志中每个域的意义,没理解到这一层。谢谢。

我期望能分辨用户登录的用途,能分开ssh/sftp/scp就最好,但是scp应该不会生成类似subsystem request for scp的日志,因为只有sftp是sshd的subsystem。

# sftp subsystem
Subsystem       sftp    /usr/lib/ssh/sftp-server

在目前的LogLevel下看起来不能区分。也不能再调高level了,DEBUG生成的日志太多,生产系统上这个修改不能接受。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP