2018-01-01 23:07:19 miner_k 阅读数 930

DenyHosts是Python语言写的一个程序软件,运行于Linux上预防SSH暴力破解的,它会分析sshd的日志文件(/var/log/secure),当发现重复的攻击时就会记录IP到/etc/hosts.deny文件,从而达到自动屏IP的功能。

安装

[root@miner—k ~]# tar zxvf DenyHosts-2.6.tar.gz      #解压源码包
[root@miner—k ~]# cd DenyHosts-2.6                   #进入安装解压目录
[root@miner—k ~]# python setup.py install            #安装DenyHosts
[root@miner—k ~]# cd /usr/share/denyhosts/           #默认安装路径
[root@miner—k ~]# cp denyhosts.cfg-dist denyhosts.cf #denyhosts.cfg为配置文件
[root@miner—k ~]# cp daemon-control-dist daemon-control                     #daemon-control为启动程序
[root@miner—k ~]# chown root daemon-control          #添加root权限
[root@miner—k ~]# chmod 700 daemon-control           #修改为可执行文件
[root@miner—k ~]# ln -s /usr/share/denyhosts/daemon-control /etc/init.d/denyhosts     #对daemon-control进行软连接,方便管理

安装到这一步就完成了。
[root@miner—k ~]# /etc/init.d/denyhosts start        #启动denyhosts
[root@miner—k ~]# chkconfig --add denyhosts
[root@miner—k ~]# chkconfig denyhosts on             #将denghosts设成开机启动

设置配置文件

[root@miner—k ~]#vim /usr/share/denyhosts/denyhosts.cfg        

       ############ THESE SETTINGS ARE REQUIRED ############

SECURE_LOG = /var/log/secure                  #ssh 日志文件 #redhat系列根据/var/log/secure文件来判断;
                                                           #Mandrake、FreeBSD根据 /var/log/auth.log来判断;
                                                           #SUSE则是用/var/log/messages来判断,这些在配置文件里面都有很详细的解释。
HOSTS_DENY = /etc/hosts.deny                  #控制用户登录的文件
PURGE_DENY = 30m                              #过多久后清除已经禁止的,设置为30分钟;
# ‘m’ = minutes
# ‘h’ = hours
# ‘d’ = days
# ‘w’ = weeks
# ‘y’ = years
BLOCK_SERVICE = sshd                         #禁止的服务名,当然DenyHost不仅仅用于SSH服务
DENY_THRESHOLD_INVALID = 1                   #允许无效用户失败的次数
DENY_THRESHOLD_VALID = 3                     #允许普通用户登陆失败的次数
DENY_THRESHOLD_ROOT = 3                      #允许root登陆失败的次数

DENY_THRESHOLD_RESTRICTED = 1                #设定 deny host 写入到该资料夹  
WORK_DIR = /usr/share/denyhosts/data     #将deny的host或ip记录到work_dir中  
SUSPICIOUS_LOGIN_REPORT_ALLOWED_HOSTS=YES  
HOSTNAME_LOOKUP=YES                         #是否做域名反解  
LOCK_FILE = /var/lock/subsys/denyhosts      #将DenyHost启动的pid记录到LOCK_FILE中,已确保服务正确启动,防止同时启动多个服务

       ############ THESE SETTINGS ARE OPTIONAL ############
ADMIN_EMAIL =                           #管理员邮箱
SMTP_HOST = 
SMTP_PORT = 
SMTP_FROM = 
SMTP_SUBJECT = DenyHosts Report         #邮件主题
AGE_RESET_VALID=5m                      #有效用户登录失败计数归零的时间
AGE_RESET_ROOT=10m                      #root用户登录失败计数归零的时间
AGE_RESET_RESTRICTED=10m                #用户的失败登录计数重置为0的时间(/usr/share/denyhosts/data/restricted-usernames)
AGE_RESET_INVALID=5m                    #无效用户登录失败计数归零的时间


   ######### THESE SETTINGS ARE SPECIFIC TO DAEMON MODE  ##########


DAEMON_LOG = /var/log/denyhosts              #DenyHosts日志文件存放的路径,默认
DAEMON_SLEEP = 30s                           #当以后台方式运行时,每读一次日志文件的时间间隔。
DAEMON_PURGE = 10m                           #当以后台方式运行时,清除机制在 HOSTS_DENY 中终止旧条目的时间间隔,这个会影响PURGE_DENY的间隔。
RESET_ON_SUCCESS = yes                      #如果一个ip登陆成功后,失败的登陆计数是否重置为0



更改DenyHosts的默认配置之后,重启DenyHosts服务即可生效:
[root@miner-k denyhosts]# pwd
/usr/share/denyhosts
[root@miner-k denyhosts]# ./daemon-control start        #重启denyhosts

控制用户登录

hosts.deny和hosts.allow

  • 如果在hosts.allow中的条目能匹配上,访问将被允许。
  • 如果在hosts.deny中的条目能匹配上,访问将被拒绝。
  • 其他的都允许通过。

文件中的书写规则

以 “/” 和“#”开头的或者是空行都会被过滤掉。

 daemon_list : client_list [ : shell_command ]
名称 简介
daemo 要监控的服务,如telent、ftpd、sshd
client 主机名、IP地址/IP范围、或域名
选项名称 简介
allow 对客户端的访问
deny 对客户端的访问
except 会匹配第一个列表中所有项,除非匹配第二个列表。例如,允许 domainA 中所有项,除了 hostX.domainA 和 hostY.domanA。
  • 当一行有多个守护进程或客户端时,用逗号分隔开来。
  • 可以用 ALL 关键字来表示所有守护进程或所有客户端。
  • LOCAL 关键字表示匹配所有不包含点号(“.”)的主机;这表示所有与域不相关的主机。

实例

hosts.deny 可以拒绝所有客户端访问所有守护进程

ALL:ALL

hosts.allow 为了能让所有守护进程从本地主机(即,与域名不相关的主机)访问

ALL:LOCAL : allow

假设仅仅允许属于 mydomain.com 域的主机使用 telnet 或 ssh

以下的 hosts.allow 条目能完成此任务:

telnetd,sshd:.mydomain.com :allow

注意:本例中 mydomain.com 之前的点号(“.”)。这是个通配符,表示所有主机以 mydomain.com 结尾。我们还在规则结尾指定这是一条允许规则。尽管这不是严格限制,但如前所述,这样做是一种好的做法。

允许指定的IP地址或者网段登录服务器

现在进一步假设我们允许使用以下 IP 地址远程登录 ssh 和 telnet:192.168.4.10 和所有以 192.168.6 开头的 IP 地址

telnetd,sshd:192.168.4.10 , 192.168.6.: allow

注意:在部分 IP 地址后使用点号”.”这相当于 192.168.6.*.,或者更精确一点,以 192.168.6 开头的所有 IP 地址。另一种看待 192.168.6. 范围内 IP 地址的方法是等于 192.168.6.0/24 或所有 192.168.6.1 与 192.168.6.254 之间的 IP 地址

一个域中除了某一个主机名之外的其他主机都允许访问

允许从 mydomain.com 域中的所有主机上进行 ftp 访问,除了 mydomain.com 中的两个主机:uktrip1 和 uktrip2 。

ftpd:.mydomain.com except uktrip1.mydomain.com, uktrip2.mydomain.com : allow

被denyhost服务禁止的现象

这里写图片描述

telnet 检查sshd服务,被denyhost服务禁止没有显示版本号
这里写图片描述

telnet 检查sshd服务,正常情况下的显示:
这里写图片描述

清除一个禁止的IP

删除一个已经禁止的主机IP,并加入到允许主机例表,只在 /etc/hosts.deny 删除是没用的。需要进入工作 目录(WORK_DIR),进入以下操作:

1、停止DenyHosts服务:

[root@miner-k denyhosts]# service denyhosts stop

2、在 /etc/hosts.deny 中删除你想取消的主机IP
3、编辑 DenyHosts 工作目录的所有文件,通过

[root@miner-k data]# pwd
/usr/share/denyhosts/data

[root@miner-k data]# grep 117.78.49.95  *
hosts:117.78.49.95:12:Tue Jan  2 23:25:32 2018
hosts-restricted:117.78.49.95:0:Tue Jan  2 22:48:20 2018
hosts-root:117.78.49.95:1:Tue Jan  2 23:25:02 2018
hosts-valid:117.78.49.95:0:Tue Jan  2 22:54:30 2018
users-hosts:qq - 117.78.49.95:3:Tue Jan  2 22:54:30 2018
users-hosts:root - 117.78.49.95:11:Tue Jan  2 23:25:02 2018

4、 添加你想允许的主机IP地址到 allowed-hosts(如果有)

5、启动DenyHosts服务:

[root@miner-k data]# /etc/init.d/denyhosts start
或者
[root@miner-k denyhosts]# pwd
/usr/share/denyhosts
[root@miner-k denyhosts]# ./daemon-control start

或者简单粗暴的直接允许访问

[root@miner-k denyhosts]# cat /etc/hosts.allow
sshd: 117.78.49.95

参考链接

denyhosts的github地址
denyhosts简介
denyhosts常见的FAQ
IBM 中对tcp wrapper的简介

2016-04-29 14:48:46 baidu_20729113 阅读数 380
将一键安装包放在服务器上,解压后。


进入denyhosts目录

cd denyhosts

赋予install.sh可执行权限

chmod 700 install.sh

执行脚本

./install.sh

输入y,按enter

管理员邮箱地址:y

最好输入服务器ip,按enter

日志邮件标题(DenyHosts Report ):

输入y,按enter

是否将denyhosts设置为开机启动(y/n)y:y

输入y,按enter

是否现在启动denyhosts(y/n)y:y


如果看到下面这些,并且没有报错,就说明安装完成了。

启动denyhosts

starting DenyHosts:    /usr/bin/env python /usr/bin/denyhosts.py --daemon --config=/usr/local/denyhosts-2.6/denyhosts.cfg

denyhosts安装完成


查询服务是否已经启动。

ps -ef|grep deny

如果显示面的2条类似的,说明服务启动成功

root     14350     1  0 14:53 ?        00:00:00 python /usr/bin/denyhosts.py --daemon --config=/usr/local/denyhosts-2.6/denyhosts.cfg

root     14371 14059  0 14:55 pts/0    00:00:00 grep deny

2010-12-21 15:12:00 pengyouchuan 阅读数 664

DenyHosts是Python语言写的一个程序,它会分析sshd的日志文件(/var/log/secure),当发现重复的攻击时就会记录IP到/etc/hosts.deny文件,从而达到自动屏IP的功能。如果是手动添加的话不把人累死才怪。

DenyHosts官方网站为:http://denyhosts.sourceforge.net

本文已附上附件,是从该网站下载的,版本为较新的2.6版。

一:检查安装要求

首选检查Sshd是否支持 Tcpwrap,只有支持Tcpwrap才可以安装Denyhost

# ldd /usr/sbin/sshd |grep wrap

libwrap.so.0 => /usr/lib/libwrap.so.0 (0x00864000) //出现此信息时表示支持

再检查 Python的版本,Python2.3以上版本可以直接安装

# python -V

Python 2.4.3

均达到要求

二:安装Denyhosts

先下载该软件,然后解压安装

进行解压再进入到源目录

# tar -xzvf DenyHosts-2.6.tar.gz

# cd DenyHosts-2.6

执行Python脚本进行安装,

# python setup.py install

程序脚本自动安装到/usr/share /denyhosts

库文件自动安装到/usr/lib/python2.4/site-packages /DenyHosts

denyhosts.py安装到/usr/bin

三: 设置启动脚本

# cd /usr/share/denyhosts/

拷贝模板文件

# cp daemon-control-dist daemon-control

设置好启动脚本的所属用户和权限

# chown root daemon-control

# chmod 700 daemon-control

生成Denyhost的主配置文件,(将模板文件中开头是#的过滤后再导入到Denyhost.cfg)

# grep -v "^#" denyhosts.cfg-dist > denyhosts.cfg

编辑Denyhost.cfg文件,根据自己需要进行相应的修改

----------------denyhosts.cfg--------------------------------------

SECURE_LOG = /var/log/secure  #ssh 日志文件,它是根据这个文件来判断的,如还有其他的只要更改名字即可,例如将secure改为secure.1等

HOSTS_DENY = /etc/hosts.deny

#控制用户登陆的文件,将多次连接失败的IP添加到此文件,达到屏蔽的作用

PURGE_DENY =

#过多久后清除已经禁止的,我这里为空表示永远不解禁

BLOCK_SERVICE = sshd

#禁止的服务名,如还要添加其他服务,只需添加逗号跟上相应的服务即可

DENY_THRESHOLD_INVALID = 1

#允许无效用户失败的次数

DENY_THRESHOLD_VALID = 2

#允许有效用户登录失败的次数

DENY_THRESHOLD_ROOT = 3

#允许root登录失败的次数

HOSTNAME_LOOKUP = NO

# 是否做域名反解,这里表示不做

ADMIN_EMAIL =

#管理员邮件地址,它会给管理员发邮件

DAEMON_LOG = /var/log/denyhosts

#自己的日志文件

其他:

AGE_RESET_VALID=5d   #(h表示小时,d表示天,m表示月,w表示周,y表示年)

AGE_RESET_ROOT=25d

AGE_RESET_RESTRICTED=25d

AGE_RESET_INVALID=10d

#用户的登陆失败计数会在多长时间后重置为0

RESET_ON_SUCCESS = yes

#如果一个ip登陆成功后,失败的登陆计数是否重置为0

DAEMON_SLEEP = 30s

#当以后台方式运行时,每读一次日志文件的时间间隔。

DAEMON_PURGE = 1h

#当以后台方式运行时,清除机制在 HOSTS_DENY 中终止旧条目的时间间隔,这个会影响PURGE_DENY的间隔。

将 Denyhost启动脚本添加到自动启动中

# echo '/usr/share/denyhosts/daemon-control start' >> /etc/rc.d/rc.local

启动Denyhost的进程

# /usr/share/denyhosts/daemon-control start

可以查看到Denyhost在运行中

# ps -ef | grep deny

在另外一台机器上使用ssh进行连接,当在连续几次输入错误的密码后,会被自动阻止掉,在一定时内不可以再连接ssh连接记录的日志文件。

查看我的/etc/hosts.deny文件发现里面已经有135条记录。

# cat /etc/hosts.deny | wc -l

2018-07-17 15:41:00 qq_34461514 阅读数 100

DenyHosts 是一个使用 Python2.3 编写的程序,它会分析 /var/log/secure 等日志文件。当发现同一 IP 在进行多次 SSH 密码尝试时就会记录 IP 到 /etc/hosts.deny 文件,从而达到自动屏蔽该 IP 的目的。

检查安装条件

  1. 先检查系统是否支持 tcp_wrappers

    ldd /usr/sbin/sshd | grep libwrap.so
    libwrap.so.0 => /lib64/libwrap.so.0 (0x00002ba28edcc000)
    

    如果没有任何显示,使用以下命令来解决

    yum install -y tcp_wrappers tcp_wrappers-libs
    
  2. 判断安装的 Python 版本

    python -V
    Python 2.7.4
    

    如果低于2.4,建议升级下

    yum update -y python
    

安装和配置 DenyHosts

  1. 安装 DenyHosts

    wget http://nchc.dl.sourceforge.net/project/denyhosts/denyhosts/2.6/DenyHosts-2.6.tar.gz
    tar xf DenyHosts-2.6.tar.gz
    cd DenyHosts-2.6
    python setup.py install
    

    以上命令的作用是:

    • 程序脚本自动安装到/usr/share/denyhosts
    • 库文件自动安装到/usr/lib/python2.3/site-packages/DenyHosts
    • denyhosts.py自动安装到/usr/bin
  2. 设置启动脚本

    cd /usr/share/denyhosts/
    grep -v "^#" denyhosts.cfg-dist > denyhosts.cfg
    cp daemon-control-dist denyhost
    chown root denyhost
    chmod 700 denyhost
    

    注意,上面第 3-5 句后的 denyhost 是自定义的文件名,不同的教程使用名字可能不同(笔者在此掉过坑)

    执行完以上命令后,修改 denyhosts.cfg 配置文件

    —————-denyhosts.cfg————————
    SECURE_LOG = /var/log/secure
    #ssh日志文件
    
    HOSTS_DENY = /etc/hosts.deny
    #将阻止IP写入到hosts.deny
    
    PURGE_DENY = 5m
    #过多久后清除已经禁止的,其中w代表周,d代表天,h代表小时,s代表秒,m代表分钟
    
    BLOCK_SERVICE = sshd
    #阻止服务名
    
    DENY_THRESHOLD_INVALID = 5
    #允许无效用户(在/etc/passwd未列出)登录失败次数,允许无效用户登录失败的次数.
    
    DENY_THRESHOLD_VALID = 5
    #允许普通用户登录失败的次数
    
    DENY_THRESHOLD_ROOT = 5
    #允许root登录失败的次数
    
    DENY_THRESHOLD_RESTRICTED = 1
    #设定 deny host 写入到该资料夹
    
    WORK_DIR = /usr/share/denyhosts/data
    #将deny的host或ip纪录到Work_dir中
    SUSPICIOUS_LOGIN_REPORT_ALLOWED_HOSTS = YES
    
    HOSTNAME_LOOKUP=YES
    #是否做域名反解
    
    LOCK_FILE = /var/lock/subsys/denyhosts
    #将DenyHOts启动的pid纪录到LOCK_FILE中,已确保服务正确启动,防止同时启动多个服务。
    
    ADMIN_EMAIL = denyhosts@163.com
    #设置管理员邮件地址
    
    SMTP_HOST = localhost
    SMTP_PORT = 25
    SMTP_FROM = DenyHosts <nobody@jishuyiliu.com>
    SMTP_SUBJECT = DenyHosts Report
    
    AGE_RESET_VALID=1d
    #有效用户登录失败计数归零的时间
    
    AGE_RESET_ROOT=1d
    #root用户登录失败计数归零的时间
    
    AGE_RESET_RESTRICTED=5d
    #用户的失败登录计数重置为0的时间(/usr/share/denyhosts/data/restricted-usernames)
    
    AGE_RESET_INVALID=10d
    #无效用户登录失败计数归零的时间
    
    DAEMON_LOG = /var/log/denyhosts
    #自己的日志文件
    —————-denyhosts.cfg————————
    
  3. 设置开机启动

    cd /etc/init.d
    ln -s /usr/share/denyhosts/denyhost dh
    chkconfig --add dh
    chkconfig dh on
    

    第 2 句的 denyhost 就是上面提到的自定义名字。 2-5 句中的 dh 也是自定义名字,千万不要同时看多个教程,否则可能会写岔了

启动

service dh start

再次提示: dh 服务名是自定义的。

启动的时间可能有点长。

2014-12-30 15:21:23 canlynet 阅读数 22

使用linux做服务器的你,有没有想过,对于暴露在互联网上的linux系统,其实每天都有很多ip地址过来的尝试登录。

找一台运行着linux服务器的暴露在外网上的服务器,运行如下命令:

sudo grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' /var/log/secure | sort | uniq -c

可能得到如下结果:

结果: 写道
26 103.41.124.101
2 103.41.124.13
2 103.41.124.41
32 103.41.124.47
26 103.41.124.64
20 103.41.124.66
120 111.74.238.237
60 118.112.144.132
22 122.225.103.124
48 122.225.109.100
32 122.225.109.198
22 122.225.109.210
16 122.225.109.213
8 122.225.109.220
36 122.225.97.71
14 122.225.97.84
40 122.225.97.86
22 122.225.97.87
3 200.182.126.150
18 202.117.45.207
17 203.100.83.32
14 218.2.0.128
18 218.2.0.130
45 218.2.197.240
102 218.26.11.118
1 27.187.47.225
20 41.214.4.59
1 42.120.142.220
142 58.255.37.236
2 61.128.110.40
128 61.147.103.185
147 61.174.171.198
6 61.174.50.208
6 61.174.50.251
22 61.174.51.198
22 61.174.51.201
6 61.174.51.212
26 61.174.51.214
32 62.210.140.193

 第一个数字是链接过来的次数,第二个字符串就是ip地址。

在没有部署denyhosts的时候,第一个数字可能上千或者上万。

 

那么我们可以通过在linux上部署denyhosts,使这些ip地址尝试登录错误次数超过上限后,拒绝掉他们的ssh连接。

 

denyhosts安装方法百度搜索一大堆,我就不再叙述了。

denyhosts下载地址:

wget http://jaist.dl.sourceforge.net/sourceforge/denyhosts/DenyHosts-2.6.tar.gz

 

这里补充一下:可以把denyhosts增加一个守护进程初始化动作:

def daemon_init():
    try:
        pid = os.fork()
        if pid > 0:
            sys.exit(0)
        #os.chdir("%s" % os.path.abspath(os.getcwd()))
        os.setsid()
        os.umask(0)
        pid = os.fork()
        if pid > 0:
            sys.exit(0)
    except OSError, e:
        sys.exit(1)

 当然这里需要一定的python基础,懂得python的缩进有严格要求。然后再把daemon_init()放到相应位置。

我在附件提供这个脚本下载,大家可以下载后替换/usr/bin/denyhosts.py

另外附件还带有启动脚本,大家下载后可替换/usr/share/denyhosts/daemon-control,脚本中我增加了对/var/lock/subsys/denyhosts的删除操作。

替换后执行如下操作(root权限):

 

写道

 

ln -s /usr/share/denyhosts/daemon-control /etc/init.d/denyhosts
chkconfig --add denyhosts
chkconfig --list denyhosts

 最后一条命令能看到(可能是中文开启、关闭):

denyhosts       0:off   1:off   2:on    3:on    4:on    5:on    6:off

就算成功了。

以后执行service denyhosts start/stop/restart可以手动开关denyhosts,另外,chkconfig已经将其添加至自动启动服务。

 

这里要提到的是,我在安装了denyhosts以后,发现使用命令启动,是在前台,就是说,denyhosts没有使用守护进程方式启动。

这里建议可以加nohup命令来启动它。

当然,如果把启动命令卸载/etc/init.d/rc.local里,是随系统启动的,也是后台进程。

 

没有更多推荐了,返回首页