如何通过Fail2ban捕获SSH成功连接并将用户昵称写入auth.log
如何通过Fail2ban捕获SSH成功连接并将用户昵称写入auth.log
没问题,这个需求完全可以实现!咱们通过自定义Fail2ban过滤器、动作和规则来搞定,一步步来:
1. 创建自定义过滤器,匹配SSH成功连接日志并提取昵称
首先,我们需要一个过滤器来识别SSH成功连接的日志行,同时提取你在authorized_keys里写的昵称。
在/etc/fail2ban/filter.d/目录下新建一个文件ssh-accept.conf,内容如下:
[Definition] # 匹配SSH成功连接的日志行,捕获末尾的昵称(假设昵称无空格) failregex = Accepted publickey for root from <HOST> port \d+ ssh2: .* (\S+)$ ignoreregex =
小贴士:如果你的昵称包含空格,可以把正则里的
(\S+)改成(.*)$,不过这样可能会捕获到日志行末尾的其他内容,建议优先用无空格的昵称。
2. 创建自定义动作,执行日志写入命令
接下来,定义一个Fail2ban动作,用来调用logger命令把昵称写入/var/log/auth.log。
在/etc/fail2ban/action.d/目录下新建ssh-log-nickname.conf,内容:
[Definition] # 不需要启动/停止/检查动作,只需要在"封禁"时执行日志写入(这里的封禁只是触发动作,不是真的拉黑) actionstart = actionstop = actioncheck = # 用logger写入日志,%(matches[1])是过滤器捕获的昵称,%(time)s是时间戳 actionban = logger -p auth.info "%(time)s Accepted SSH connection from %(matches[1])s" actionunban =
3. 配置Fail2ban规则(Jail)
现在把上面的过滤器和动作组合成一个可用的规则,编辑/etc/fail2ban/jail.local(如果没有就新建这个文件,不要直接改默认的jail.conf),添加以下内容:
[ssh-accept] enabled = true # 启用这个规则 filter = ssh-accept # 使用我们刚才创建的过滤器 logpath = /var/log/auth.log # 监控的日志文件 maxretry = 1 # 每一次成功连接都触发动作 bantime = 1 # 封禁时间设为1秒(只是走个流程,不会真的限制用户) findtime = 1 # 匹配时间窗口设为1秒 action = ssh-log-nickname # 使用我们定义的日志写入动作
4. 重启Fail2ban生效
配置完成后,重启Fail2ban服务让设置生效:
sudo systemctl restart fail2ban
测试验证
用某个用户的SSH密钥登录服务器,然后查看/var/log/auth.log,你应该能看到类似这样的日志行:
2024-05-20T14:30:00+08:00 Accepted SSH connection from johndoe
如果没看到,先检查auth.log里的成功连接日志是否符合我们过滤器的正则,调整failregex直到匹配成功即可。
备注:内容来源于stack exchange,提问作者meldirlobor
相关产品推荐
相关产品推荐

