有一个任务来检测来自linux C ++应用程序的成功和失败的login尝试。 什么是最好的办法呢?
我只find了两种方法:1)通过超时检查/ var / logs / secure 2)在/ var / logs / secure上使用inotify
但是有一个问题,在/ var / logs / secure中两次或多次不成功的login尝试看起来像是“PAM 2多个身份validation失败”,并且此string在login失败的时刻不会出现。
在一个体面的系统上, /var/log/wtmp
和/var/log/btmp
是检查的最佳位置。 Glibc提供的功能,使其访问更容易: getutxent
, getutxid
, getutxline
等…
还要检查utmpdump -f /var/log/wtmp
,它非常接近你想要的(解码wtmp并跟随新的事件)。
以上都不是。 它实际上更简单:
1)打开文件
2)一次又一次地以非阻塞模式调用read()
来读取数据。
3)如果你得到了-EWOULDBLOCK
,那么做一个select()
。 如果数据准备好读取,请返回到步骤2。
4)如果选择超时(比如说1秒超时),检查文件是否被旋转。 (简单的方法:检查新文件上的ctime
,但可能有更好的方法,看一下tail -F
源代码。)如果创建了一个新文件,调用close()
并转到1.否则,到3。
另外,看看fail2ban 。