遇到两次,一次是公司服务器搭建好后,有人尝试ssh暴力破解,auth.log不停出现错误提示
还有买的米国vps,很荣幸地遭到来自波兰的ssh破解尝试
不得不重视ssh的安全
方法:
- 修改sshd_config的默认配置。
- 禁用root远程登录# vi /etc/ssh/sshd_config
PermitRootLogin no- 仅使用ssh 协议2
Protocol 2
- 禁用基于主机的身份认证
HostbasedAuthentication no
- 禁用用户的rhost文件
IgnoreRhosts yes
- 将SSH监听绑定到特定端口
- 禁用空密码
PermitEmptyPasswords no
- 增加日志的详细粒度
- LogLevel DEBUG - 使用iptables控制
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --name DEFAULT --rsource -j DROP
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -m state --state NEW -m recent --set --name DEFAULT --rsource
60s内输错四次密码的ip禁止登录
注:关于iptables中的模块,查看:
root@silee:/proc/net/xt_recent# cat /proc/net/ip_tables_matches
state recent udplite udp tcp icmp其中tcp/udp/icmp这些模块在指定-p(protocol) 时候就默认使用了。
比较新鲜但又很有用的是state和recent模块
state模块:
参数有一下几种:INVALID,ESTABLISHED,RELATED,NEW
INVALID:对于不能识别的包,为INVALID,其中包括ICMP errors,running out of memory
ESTABLISHED:指已建立的连建并且已经有了双向发包
NEW:指新发起的一个连接,或者新建立的连接但两个方向都没有发包
RELATED,指新发起的一个链接,但它与已经存在的一个连接有关,比如FTP 数据传输,或者ICMP error、
recent模块包含的参数
--name 指定生成的列表文件使用的名称,不指定用DEFAULT
--set 添加源地址到列表文件,如果列表文件中已经存在了该ip,它会更新已存的条目
--rsource匹配recent列表文件中的源地址,这是默认选项
--rdest匹配recent列表中的目的地址
--rcheck 检查源地址是不是在地址列表中
--update如果匹配上地址,则更新“最新出现”的时间戳
--remove检查源地址是不是在当前的列表文件中,如果是,删除并返回true,否则,返回false
--seconds 与--rcheck或--update配合使用,增加匹配限制条件,表明仅匹配在列表中,且给定时间出现的地址
--hitcount 必须与--rcheck 或--update匹配使用,表明在列表中,且命中数大于等于给定值,也可与--seconds一起使用。
写SSH路由策略的思路
1.控制INPUT chain
2.对于INPUT链默认为ACCEPT的情况:A检查recent文件列表看最近给定1分钟内尝试次数是不是达到了4次,如果是丢弃,如果不是,匹配下一条规则,将该ip信息记录到DEFAULT文件中
iptables -A INPUT -p tcp --dport 22 -i eth0 -m state --state NEW -m recent --seconds 60 --hitcount 4 -j DROP
iptables -A INPUT -p tcp --dport 22 -i eth0 -m state --state NEW -m recent --set