官方网站:http://denyhosts.sourceforge.net/
作用:
防止非法用户试探登陆和暴力破解服务器密码
工作原理:
检查/var/log/secure日志文件,自动识别非法IP并添加到/etc/hosts.deny中。
安装步骤:
[root@localhost ~]# wget http://cdnetworks-kr-1.dl.sourceforge.net/project/denyhosts/denyhosts/2.6/DenyHosts-2.6.tar.gz
[root@localhost ~]# tar zxvf DenyHosts-2.6.tar.gz
[root@localhost ~]# cd DenyHosts-2.6
[root@localhost DenyHosts-2.6]# python setup.py install
[root@localhost DenyHosts-2.6]# cd /usr/share/denyhosts/
[root@localhost denyhosts]# cp daemon-control-dist daemon-control
[root@localhost denyhosts]# cp denyhosts.cfg-dist denyhosts.cfg
[root@localhost denyhosts]# chmod 700 daemon-control*
根据需要更改配置文件 /usr/share/denyhosts/denyhosts.cfg
PURGE_DENY = 不周期清除/etc/hosts.deny中已经阻止的IP记录
DENY_THRESHOLD_INVALID = 1
DENY_THRESHOLD_VALID = 1
DENY_THRESHOLD_ROOT = 1
DENY_THRESHOLD_RESTRICTED = 1 WORK_DIR/restricted-usernames(需要自己创建,此项可不使用)
(注: 上面的1为denyhosts允许的SSH完整会话密码试探次数,如:把SSH设置为每个会话最多能输入3次密码,那么这里的阀值为3次密码试探。即使当 用户只输入一次密码错误后终止会话,denyhosts也只记录一次,等3次试探后,才达到阀值1;restricted-usernames:启用限制用户文件,如:编辑用户名:php(占一行),当用户试探php登陆时,上面为1,用户3次就被禁掉。因为本次全部设置了1个会话,所以使用这一项有点多余了)。
SUSPICIOUS_LOGIN_REPORT_ALLOWED_HOSTS=YES WORK_DIR/allowed-hosts(需要自己创建,此项可不使用)
注:定义自己所允许远程登陆的主机,试探无效用户时是不是也报告……
RESET_ON_SUCCESS = yes 让此行生效,当用户没有达到错误登陆次数前如果登陆成功,则denyhosts清除之前错误登陆的次数,如果不开启此功能,则如果合法IP没有添加在 /etc/hosts.allow中,则会累加登陆错误的次数,最终被denyhosts禁止。此项为YES,如果ssh里允许root登陆,则用户如果 在阀值前登陆成功,即清除错误记录,可以一直使用root 登陆。
DAEMON_SLEEP = 30s denyhosts进程检查/var/log/secure日志的周期时间,如果想更快阻止非法主机,可以把此时间改小。
如果改为1s时,可能无法正常工作,3s即可。
开机自动启动设置:
[root@localhost denyhosts]# ln -s /usr/share/denyhosts/daemon-control /etc/init.d/denyhosts
[root@localhost denyhosts]# chkconfig --add denyhosts (添加后默认345级别启动)
[root@localhost denyhosts]# service denyhosts start
starting DenyHosts: /usr/bin/env python /usr/bin/denyhosts.py --daemon --config=/usr/share/denyhosts/denyhosts.cfg
或
[root@localhost ~]# echo "/usr/share/denyhosts/daemon-control start" >> /etc/rc.local
数据文件 data 目录在服务启动时自动生成:
[root@localhost ~]# ll /usr/share/denyhosts/data/
total 56
-rw-r--r-- 1 root root 41 Mar 12 21:46 hosts 每个主机试探的无效用户的总次数
-rw-r--r-- 1 root root 41 Mar 12 21:46 hosts-restricted
-rw-r--r-- 1 root root 41 Mar 12 21:46 hosts-root 每个远程主机试探本地root用户的次数
-rw-r--r-- 1 root root 41 Mar 12 21:46 hosts-valid每个远程主机试探本地有效用户的次数
-rw-r--r-- 1 root root 80 Mar 12 21:46 offset
-rw-r--r-- 1 root root 0 Mar 12 21:46 suspicious-logins
-rw-r--r-- 1 root root 0 Mar 12 21:46 users-hosts 被试探的用户及试探该用户的主机各试探的次数
-rw-r--r-- 1 root root 0 Mar 12 21:46 users-invalid 远程主机试探的本地无效的用户的总次数
-rw-r--r-- 1 root root 0 Mar 12 21:46 users-valid 本地有效用户被远程试探密码的总次数
补充:上述配置配置合 etc 下的 hosts.allow hosts.deny使用,假设本公司出口公网IP为1.1.1.1则在hosts.allow中添加:
sshd: 1.1.1.1 -----允许1.1.1.1使用本地sshd服务。添加允许后,即使1.1.1.1登陆试探次数超过阀值,hosts.deny中添加了sshd: 1.1.1.1也不会生效,hosts.allow优先级大于hosts.deny。
2013-03-08补充:
运行半年多后,已经拒绝了上千IP,现在需要重置一下(为重置也无所谓,反正是只拒绝的SSHD服务,但是这其中可能有拨号获得的IP,万一以后在家想管理服务器,拨号获得同样的IP,可能就麻烦了),直接删除data下的文件然后删除hosts.deny中的IP是不行的
因为进程会再次分析/var/log/secure中的日志,把符合规则的重新写入到自己的data下,并加入hosts.deny
解决:备份一下secure再创建一个新的secure文件,然后删除data下的文件;或手动logrotate