<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[沧海一粟]]></title> 
<link>http://www.dzhope.com/index.php</link> 
<description><![CDATA[Web系统架构与服务器运维,php开发]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[沧海一粟]]></copyright>
<item>
<link>http://www.dzhope.com/post//</link>
<title><![CDATA[SSH 防爆破：动态拉黑恶意IP]]></title> 
<author>jed &lt;jed521@163.com&gt;</author>
<category><![CDATA[服务器技术]]></category>
<pubDate>Mon, 20 Jan 2025 01:53:42 +0000</pubDate> 
<guid>http://www.dzhope.com/post//</guid> 
<description>
<![CDATA[ 
	前言<br/>SSH（Secure Shell）是用于安全远程登录和管理服务器的协议，但其广泛使用也使其成为攻击者暴力破解的目标。SSH爆破攻击是指攻击者通过不断尝试用户名和密码组合，试图破解服务器的登录凭证。这种攻击不仅会消耗服务器资源，还可能导致系统被入侵。因此，采取有效的措施防止SSH爆破攻击至关重要。<br/><br/>实现方式<br/>在Linux系统中，/etc/hosts.allow和/etc/hosts.deny文件用于控制对服务的访问权限。这两个文件的规则基于TCP Wrapper机制，允许系统管理员定义哪些IP地址或主机可以访问特定服务（如SSH）。<br/><br/>/etc/hosts.allow：定义允许访问服务的IP地址或主机。<br/><br/>/etc/hosts.deny：定义禁止访问服务的IP地址或主机。<br/><br/>当两个文件同时存在时，/etc/hosts.allow的规则优先于/etc/hosts.deny的规则。如果某个IP地址在/etc/hosts.allow中被允许访问，那么即使它在/etc/hosts.deny中被拒绝，它仍然可以访问服务。<br/><br/>如果 /etc/hosts.deny 文件为空，所有IP地址都可以访问SSH。<br/><br/>如果 /etc/hosts.deny 文件包含拒绝规则（如 sshd: ALL），则所有IP地址默认被拒绝，除非它们在 /etc/hosts.allow 中被明确允许。<br/><br/>监控并动态更新黑名单<br/>为了动态检测并阻止恶意IP地址，可以编写一个简单的Shell脚本，监控SSH登录失败的日志，并将多次尝试失败的IP地址自动加入 /etc/hosts.deny 文件。<br/><br/><div class="code"> <br/>#!/bin/bash<br/><br/># 配置参数<br/>LOG_FILE=&quot;/var/log/auth.log&quot;&nbsp;&nbsp;# Debian/Ubuntu的SSH日志文件路径<br/>MAX_ATTEMPTS=5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 允许的最大失败尝试次数<br/>TEMP_FILE=&quot;/tmp/ssh_blacklist.tmp&quot;&nbsp;&nbsp;# 临时文件存储IP尝试次数<br/>LAST_POS_FILE=&quot;/tmp/ssh_last_pos.tmp&quot;&nbsp;&nbsp;# 记录上次处理的日志位置<br/><br/># 获取上次处理的日志位置<br/>if &#91; -f &quot;$LAST_POS_FILE&quot; &#93;; then<br/>&nbsp;&nbsp;&nbsp;&nbsp;LAST_POS=$(cat &quot;$LAST_POS_FILE&quot;)<br/>else<br/>&nbsp;&nbsp;&nbsp;&nbsp;LAST_POS=0<br/>fi<br/><br/># 获取当前日志文件大小<br/>CURRENT_POS=$(stat -c %s &quot;$LOG_FILE&quot;)<br/><br/># 如果日志文件没有更新，直接退出<br/>if &#91; &quot;$CURRENT_POS&quot; -le &quot;$LAST_POS&quot; &#93;; then<br/>&nbsp;&nbsp;&nbsp;&nbsp;exit 0<br/>fi<br/><br/># 从上次位置开始解析日志<br/>tail -c +$((LAST_POS + 1)) &quot;$LOG_FILE&quot; &#124; while read line; do<br/>&nbsp;&nbsp;&nbsp;&nbsp;if echo &quot;$line&quot; &#124; grep -q &quot;Failed password&quot;; then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IP=$(echo &quot;$line&quot; &#124; awk &#039;&#123;print $11&#125;&#039;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if &#91; -n &quot;$IP&quot; &#93;; then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ATTEMPTS=$(grep -c &quot;$IP&quot; &quot;$TEMP_FILE&quot;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if &#91; &quot;$ATTEMPTS&quot; -ge &quot;$MAX_ATTEMPTS&quot; &#93;; then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 检查IP是否已在黑名单中<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ! grep -q &quot;$IP&quot; /etc/hosts.deny; then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo &quot;sshd:$IP&quot; &gt;&gt; /etc/hosts.deny<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo &quot;IP $IP 已加入黑名单，禁止登录。&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fi<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo &quot;$IP&quot; &gt;&gt; &quot;$TEMP_FILE&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fi<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fi<br/>&nbsp;&nbsp;&nbsp;&nbsp;fi<br/>done<br/><br/># 更新日志位置<br/>echo &quot;$CURRENT_POS&quot; &gt; &quot;$LAST_POS_FILE&quot;<br/></div><br/>将上述脚本保存为 ssh_blacklist.sh并赋予执行权限：<br/><br/><div class="code"><br/>chmod +x ssh_blacklist.sh<br/></div><br/>手动运行脚本或通过定时任务定期运行：<br/><br/> <br/># 手动执行<br/><div class="code"><br/>./ssh_blacklist.sh<br/></div><br/># 设置定时任务执行<br/>crontab -e<br/>添加以下内容：<br/><br/><div class="code"><br/># 每 5 分钟执行一次检测<br/>*/5 * * * * /path/to/ssh_blacklist.sh<br/></div><br/>通过合理配置 /etc/hosts.allow 和 /etc/hosts.deny 文件，结合简单的Shell脚本监控SSH登录失败日志，您可以实现一个基本的SSH黑名单机制，有效拦截异常IP地址，防止暴力破解攻击。这种方法简单易行，适合大多数Linux系统，能够显著提高SSH服务的安全性。
]]>
</description>
</item><item>
<link>http://www.dzhope.com/post//#blogcomment</link>
<title><![CDATA[[评论] SSH 防爆破：动态拉黑恶意IP]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.dzhope.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>