Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> 電腦軟體教學 >> 伺服器技術 >> 關於伺服器

Linux 防止 SSH 暴力破解實戰:部署 DenyHosts 自動封禁攻擊 IP

編輯:關於伺服器

SSH 服務 (埠 22) 長期暴露在公網,極易遭受自動化暴力破解攻擊 (字典撞庫、撞庫)。DenyHosts 是一款經典的 Python 守護程式,監控 /var/log/secure (或 auth.log),偵測失敗登入嘗試超過閾值的 IP,自動將其寫入 /etc/hosts.deny 封禁。本文提供 CentOS 7/8、Ubuntu 20.04/22.04 的標準化部署與調優流程。

為什麼選 DenyHosts?

  • 輕量、純 Python、無外部依賴 (除標準庫)
  • 支援多種日誌格式 (RedHat/Debian 系列自動適配)
  • 可配置不同使用者類型 (root、一般用戶、無效用戶) 的封禁閾值
  • 支援郵件通知、自動解封 (PURGE)、白名單
  • 配合 fail2ban (更強大、支援 iptables/nftables) 可構建多層防護

安裝部署 (推薦使用套件管理器)

CentOS/RHEL 7/8 (EPEL 源)

yum -y install epel-release
yum -y install denyhosts
systemctl enable denyhosts
systemctl start denyhosts

Ubuntu/Debian

apt-get update
apt-get -y install denyhosts
systemctl enable denyhosts
systemctl start denyhosts

核心配置檔 /etc/denyhosts.conf 詳細調優

# ========== 日誌來源 ==========
SECURE_LOG = /var/log/secure          # RedHat/CentOS
# SECURE_LOG = /var/log/auth.log      # Ubuntu/Debian

# ========== 封禁目標與機制 ==========
HOSTS_DENY = /etc/hosts.deny          # 封禁寫入檔案 (TCP Wrappers)
BLOCK_SERVICE = sshd                  # 封禁服務名 (對應 /etc/hosts.deny 格式)
# 也可設為 ALL 封禁所有 TCP Wrappers 保護的服務

# ========== 封禁閾值 (核心調優) ==========
# 無效用戶 (不存在的用戶名) - 最嚴格
DENY_THRESHOLD_INVALID = 3
# 一般用戶
DENY_THRESHOLD_VALID = 5
# root 用戶 - 最嚴格,建議 1-3
DENY_THRESHOLD_ROOT = 1
# 受限用戶 (如 /etc/hosts.deny 已有記錄)
DENY_THRESHOLD_RESTRICTED = 1

# ========== 工作目錄與鎖檔 ==========
WORK_DIR = /var/lib/denyhosts         # 資料庫、快取目錄
LOCK_FILE = /var/lock/subsys/denyhosts

# ========== 郵件通知 ==========
ADMIN_EMAIL = admin@example.com
SMTP_HOST = localhost
SMTP_PORT = 25
SMTP_USERNAME = 
SMTP_PASSWORD = 
SMTP_FROM = DenyHosts 

# ========== 自動解封 (PURGE) ==========
# 封禁多久後自動移除 (防止誤封永久生效)
PURGE_DENY = 7d                       # 7 天
# 清理間隔
DAEMON_PURGE = 1h

# ========== 日誌與除錯 ==========
DAEMON_LOG = /var/log/denyhosts.log
DAEMON_LOG_LEVEL = INFO
# DAEMON_LOG_LEVEL = DEBUG  # 除錯時開啟

# ========== 其他 ==========
HOSTNAME_LOOKUP = NO                  # 不做反向 DNS 解析,加速
AGE_RESET_VALID = 5d                  # 成功登入後重置失敗計數
AGE_RESET_ROOT = 25d
AGE_RESET_INVALID = 10d
RESET_ON_SUCCESS = YES

白名單配置 (防止自己被封)

# 編輯 /var/lib/denyhosts/allowed-hosts (或 WORK_DIR 下)
echo "1.2.3.4" >> /var/lib/denyhosts/allowed-hosts      # 公司固定 IP
echo "192.168.1.0/24" >> /var/lib/denyhosts/allowed-hosts # 內網段
echo "my-vpn.example.com" >> /var/lib/denyhosts/allowed-hosts # 域名 (需 HOSTNAME_LOOKUP=YES)

# 重新載入
systemctl restart denyhosts

驗證與測試

  1. 檢查服務狀態: systemctl status denyhosts
  2. 查看封禁記錄: cat /etc/hosts.denay (應看到 sshd: 1.2.3.4 格式)
  3. 模擬攻擊測試: 從非白名單機器連續錯誤密碼 SSH 登入超過閾值,觀察是否被寫入 hosts.deny 並拒絕連線。
  4. 查看 DenyHosts 日誌: tail -f /var/log/denyhosts.log

進階:配合 fail2ban 構建多層防護 (強烈推薦)

DenyHosts 僅操作 TCP Wrappers (hosts.deny),**不支援 iptables/nftables**,且對無 TCP Wrappers 支援的服務 (如純 systemd socket 激活的服務) 無效。fail2ban 直接操作防火牆規則,功能更強:

# CentOS
yum -y install fail2ban
# Ubuntu
apt-get -y install fail2ban

# 配置 /etc/fail2ban/jail.local
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/secure
maxretry = 3
bantime = 3600
findtime = 600
action = iptables-multiport[name=sshd, port="ssh", protocol=tcp]
         sendmail-whois[name=sshd, dest=admin@example.com]

systemctl enable fail2ban
systemctl start fail2ban

最佳組合: DenyHosts (TCP Wrappers 層、輕量、快速封禁) + fail2ban (防火牆層、支援所有服務、豐富 action) = **纏深防禦**。

常見問題

問題解決
封禁不生效確認服務啟動、日誌路徑正確、TCP Wrappers 支援 (sshd_config 有 UsePAM yes)、/etc/hosts.deny 格式正確
自己被封立即加入 allowed-hosts 白名單,手動從 hosts.deny 移除該 IP,systemctl restart denyhosts
日誌格式不匹配查看 DAEMON_LOG_LEVEL=DEBUG 日誌,對比 SECURE_LOG 實際格式,調整 FAIL_REGEX (進階)
大量攻擊導致 hosts.deny 巨大啟用 PURGE_DENY 自動清理,或改用 fail2ban + ipset (效能更好)

SSH 暴力破解防護三板斧:**修改非預設埠 + 禁用密碼登入 (強制金鑰) + DenyHosts/fail2ban 自動封禁**。DenyHosts 部署簡單、效果立竿見影,是每台 Linux 伺服器上線前的必裝組件。

Copyright © Windows教程網 All Rights Reserved