零、前言
DenyHosts是一個Python腳本程序,它會監控並分析服務器(Linux系統)sshd的日志文件(/var/log/secure), 當發現重復的攻擊時就會記錄IP到指定的/etc/hosts.deny文件中,從而達到自動屏蔽IP的功能,阻止該IP繼續攻擊我們的服務器。
比如我們在使用雲服務器的時候,一開始登陸后就會提示有多少次嘗試登陸你服務器的統計,往往這個數很大的時候就說明你的服務器被人關注了:
我們可以使用下面命令(centos7.6):
登陸成功的ip及登陸次數列表
grep "Accepted" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more
登陸失敗的ip及登陸次數列表
grep "Failed password for invalid user" /var/log/secure | awk '{print $13}' | sort | uniq -c | sort -nr | more
一、下載、安裝DenyHosts
[DenyHosts官網](
http://denyhosts.sourceforge.net/)
[DenyHosts GitHub頁面](
https://github.com/denyhosts/denyhosts)
使用DenyHosts可以參考GitHub頁面的README.md文件進行安裝,當前時間最新的穩定版本是3.0,下載denyhosts-3.0.tar.gz文件,並復制到Linux系統中(比如我將它放在/home目錄下)
=>解壓:
tar zxvf denyhosts-3.0.tar.gz
=>進入源文件目錄:
cd denyhosts-3.0
=>使用root用戶權限安裝:
=>This will install the DenyHosts modules into python's site-packages directory.
python setup.py install


因為網上很多教程都是安裝的2.6版本的,所以安裝完這一步之后會在/usr/share/下面找到deny-hosts目錄,可是我安裝3.0版本后卻沒有,不過沒關系,denyhosts用到的文件在/usr/bin下面都有我們切到usr/bin下操作就可以了(cd /usr/bin)
在此我們需要配置denyhosts.conf文件,進行個性化配置:
還是在一開始的目錄下(cd /home/denyhosts-3.0)
=> 將denyhosts.conf文件復制到/etc下(上面的install就會將該文件復制過去,這里如果提示是否覆蓋的話就說明已經存在,輸入no就可以了)
cp denyhosts.conf /etc
=> 使用vim編輯denyhosts.conf文件(官網里面使用的是nano編輯器)
vim /etc/denyhosts.conf
以下是需要配置的地方:本人服務器環境:centos7.6
############ THESE SETTINGS ARE REQUIRED ############
SECURE_LOG = /var/log/secure # 監控的sshd日志文件,系統不同位置不同
HOSTS_DENY = /etc/hosts.deny # 屏蔽IP的記錄文件
PURGE_DENY = 7d # IP被屏蔽后,多久清除屏蔽記錄(m-minutes,h-hours,d-days,w-weeks,y-years)
# PURGE_DENY = 設置為空代表永遠不清除
PURGE_THRESHOLD = 3 # 某個host最多被清除的次數,如果清除次數超過這個值就不會再被清理了
BLOCK_SERVICE = sshd # 阻止的服務名,默認是sshd,也可以設置FTP、SMTP等
DENY_THRESHOLD_INVALID = 3 # 允許無效用戶嘗試失敗次數(過了這個次數還是失敗就加入屏蔽)
DENY_THRESHOLD_VALID = 3 # 有效用戶(普通用戶)嘗試失敗次數
DENY_THRESHOLD_ROOT = 3 # root用戶嘗試失敗次數
DENY_THRESHOLD_RESTRICTED = 1 # 設定denyhosts將屏蔽host寫入到/etc/hsots.deny文件中
WORK_DIR = /var/lib/denyhosts # denyhosts工作數據目錄
HOSTNAME_LOOKUP=YES # 是否做域名反解
LOCK_FILE = /var/lock/subsys/denyhosts # 將DenyHost啟動的pid記錄到LOCK_FILE中,已確保服務正確啟動,防止同時啟動多個服務
############ THESE SETTINGS ARE OPTIONAL ############
AGE_RESET_VALID=6h # 普通有效用戶登陸失敗計數清零時間
AGE_RESET_ROOT=6h # root用戶登陸失敗計數清零時間
AGE_RESET_RESTRICTED=25d # /etc/hosts.deny文件清除數據時間
AGE_RESET_INVALID=1d # 無效用戶登陸失敗計數清零時間
######### THESE SETTINGS ARE SPECIFIC TO DAEMON MODE ##########
DAEMON_LOG = /var/log/denyhosts # denyhosts日志默認存放路徑
DAEMON_SLEEP = 30s # 當以后台方式運行時,每讀一次日志文件的時間間隔
DAEMON_PURGE = 1h # 當以后台方式運行時,清除機制在hosts.deny中終止就條目的時間間隔,這個會影響PURGE_DENY參數
=> 查看與配置IP白名單、黑名單(當hosts.allow和 host.deny相沖突時,以hosts.allow設置為准)
vim /etc/hosts.deny # 黑名單無需手動配置,denyhosts會自動檢測添加
vim /etc/hosts.allow # 配置規則:sshd:171.113.244.96:allow, 配置多個:171.113.244.96,158.51.96.58:allow
=> 配置、啟動、停止、查看denyhosts服務
cd /usr/bin # 切換到/usr/bin目錄下(因為該目錄下有daemon-control,^-)
cp daemon-control-dist daemon-control
=> 編輯適合自己系統環境的daemon-control文件,以下是我個人環境的相關denyhosts文件目錄,這里需要自己去核對
vim daemon-control
###############################################
#### Edit these to suit your configuration ####
###############################################
DENYHOSTS_BIN = "/usr/bin/denyhosts.py"
DENYHOSTS_LOCK = "/var/lock/subsys/denyhosts"
DENYHOSTS_CFG = "/etc/denyhosts.conf"
PYTHON_BIN = "/usr/bin/env python"
注意一點:一般centos默認有python2,這里啟動denyhosts會報錯,我們需要修改下安裝的/DenyHosts/report.py包
vim /usr/lib/python2.7/site-packages/DenyHosts/report.py
將# from types import ListType, TupleType 取消注釋:from types import ListType, TupleType
=> 修改權限:
chown root daemon-control
chmod 700 daemon-control
啟動denyhosts
daemon-control start
查看denyhosts是否運行
方法一:daemon-control status
方法二:ps -ef | grep deny
停止denyhosts
daemon-control stop