1. 发现问题

只要服务器暴露在外网,就总有恶意人员试图暴力破解你的ssh登录密码。

查看机器是否被尝试暴力破解登录的方式:
centos查看 /var/log/secure 日志文件
ubuntu查看 /var/log/auth.log 日志文件

2. 寻找解决方案

在网上推荐最多的古典资料是使用file2ban,一种使用python实现,通过监控日志文件,写入iptables规则来禁止超过失败登录次数的IP登录。还有零星的通过/etc/hosts.deny配置文件的方案。

自己不想应用python和iptables方案。于是决定用go语言自写一个基于/etc/hosts.deny的程序实现。但自己在写到一半的时候,在github上发现有人已经写好类似的了,简单阅读源码后发现思路基本一模一样,所以干脆自己就不写了,用现成的得了。

在网上发现的现成工具之一的地址:https://github.com/caryxiao/ssh-hosts-deny
我做了一点点优化,也可以参考本问最后一节,用我的版本:https://github.com/yarnto/ssh-hosts-deny

原理阐述:
通过 github.com/hpcloud/tail 来监控日志文件
当发现非法(错误)登录日志时,解析并记录ip,统计登录错误次数,超过阈值(默认5)则写入/etc/hosts.deny

3. 应用方式

3.1 编译程序包

首先 clone https://github.com/caryxiao/ssh-hosts-deny
然后编译对应平台的程序包。如我在windows powershell平台下编译linux, amd63 arm64 arm的命令如下

$env:GOOS="linux"

$env:GOARCH="amd64"
go build -o ssh-hosts-deny-amd64 .\cmd\main.go

$env:GOARCH="arm64"
go build -o ssh-hosts-deny-arm64 .\cmd\main.go

$env:GOARCH="arm"
go build -o ssh-hosts-deny-arm .\cmd\main.go

3.2 写一个启动文件 start.sh

centos平台

#!/bin/bash

nohup ./ssh-hosts-deny-amd64 \
  -log-level=4 \
  -log-path=ssh-hosts-deny.log \
  -sf=/var/log/secure 2>&1 &

ubuntu平台

#!/bin/bash

nohup ./ssh-hosts-deny-amd64 \
  -log-level=4 \
  -log-path=ssh-hosts-deny.log \
  -sf=/var/log/auth.log 2>&1 &

最后把编译好的程序包和启动文件上传到自己的服务器启动就可以了。

4. 应用我自己的改进版本

改进版本主要时增加了当误操作登录失败后,再登录成功,软件记录失败次数清零的操作。防止因为自己误操作导致把自己给屏蔽了。

编译和使用方式相同。地址在:https://github.com/yarnto/ssh-hosts-deny

启动脚本参考:

#!/bin/bash

# -check-style=pam 表示用原有策略,如果是-check-style=password,则使用我添加的基于错误密码日志的新策略判断非法登录来源
nohup ./ssh-hosts-deny-amd64 \
  -check-style=pam \
  -log-level=4 \
  -log-path=ssh-hosts-deny.log \
  -sf=/var/log/secure 2>&1 &