服务器被暴力ssh爆破,如何防护与封禁IP
前言
刚装好的服务器没几天,一看登录日志吓一跳——全是各种IP在尝试SSH登录,用户名猜遍了root、admin、test,密码也是暴力破解。这就是典型的SSH暴力破解攻击。如果你的服务器密码又简单,很容易被破解进来。本文就讲一下怎么发现暴力破解、怎么封禁恶意IP,以及怎么从根本上防护。
第一步:查看SSH登录日志
先看看有没有被爆破。CentOS7 的SSH日志在 /var/log/secure:
tail -100 /var/log/secure
如果看到大量类似这样的记录,就是被爆破了:
Failed password for root from 1.2.3.4 port 12345 ssh2
Failed password for admin from 5.6.7.8 port 23456 ssh2
统计一下尝试登录的次数最多的IP:
grep "Failed password" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -rn | head -10
输出会列出尝试登录次数最多的10个IP。
防护方案一:使用 fail2ban 自动封禁
手动封禁太慢了,用 fail2ban 可以自动检测并封禁恶意IP。
1. 安装 EPEL 源
yum install epel-release -y
2. 安装 fail2ban
yum install fail2ban -y
3. 配置 fail2ban
vi /etc/fail2ban/jail.local
写入以下内容:
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/secure
maxretry = 3
bantime = 86400
findtime = 600
参数说明:
enabled = true:启用这个规则maxretry = 3:最多尝试3次bantime = 86400:封禁24小时(单位秒)findtime = 600:10分钟内的失败次数
4. 启动 fail2ban
systemctl start fail2ban
systemctl enable fail2ban
5. 查看封禁状态
fail2ban-client status sshd
防护方案二:手动封禁恶意IP
如果不想装 fail2ban,也可以手动用 firewall-cmd 封禁IP:
封禁单个IP
firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='1.2.3.4' reject"
firewall-cmd --reload
查看已封禁的规则
firewall-cmd --list-rich-rules
解除封禁
firewall-cmd --permanent --remove-rich-rule="rule family='ipv4' source address='1.2.3.4' reject"
firewall-cmd --reload
防护方案三:修改SSH默认端口
SSH默认端口是22,所有人都知道,扫端口的机器人都会先扫22。改成一个不常见的端口能挡住90%的自动扫描。
1. 编辑SSH配置
vi /etc/ssh/sshd_config
找到 #Port 22,改成:
Port 22222
2. 防火墙开放新端口
firewall-cmd --permanent --add-port=22222/tcp
firewall-cmd --reload
3. 重启SSH服务
systemctl restart sshd
注意: 改完端口后,连接时要指定新端口:ssh -p 22222 root@你的服务器IP。千万不要关掉当前SSH窗口!新开一个窗口测试,确认新端口能连上了再关旧窗口。
防护方案四:禁止root密码登录,改用密钥登录
最彻底的防护就是不让密码登录,只用SSH密钥登录。
1. 生成SSH密钥对
在你本地电脑上执行:
ssh-keygen -t rsa -b 4096
一路回车,会生成两个文件:
~/.ssh/id_rsa:私钥,放在你本地~/.ssh/id_rsa.pub:公钥,上传到服务器
2. 上传公钥到服务器
ssh-copy-id -p 22222 root@你的服务器IP
3. 配置SSH禁用密码登录
vi /etc/ssh/sshd_config
找到并修改:
PasswordAuthentication no
PermitRootLogin yes
PubkeyAuthentication yes
4. 重启SSH服务
systemctl restart sshd
注意: 改之前一定要确认密钥登录能正常用!不然改完就连不上了。
防护方案五:限制只允许特定IP登录
如果你自己的IP是固定的,可以只允许自己的IP登录SSH:
firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='你的IP/24' port protocol='tcp' port='22' accept"
firewall-cmd --permanent --remove-port=22/tcp
firewall-cmd --reload
这样只有你指定的IP段才能连SSH,其他IP直接拒绝。
常见坑
坑1:改了SSH端口忘了开防火墙
改完SSH端口后,忘了在防火墙里开放新端口,结果新端口连不上,旧端口也关了,直接把自己锁在外面。
解决: 改完端口后,一定要先开防火墙再重启SSH,而且要新开窗口测试。
坑2:用fail2ban把自己封了
测试的时候故意输错几次密码,结果被fail2ban封了自己的IP。
解决: 把自己的IP加到 fail2ban 的忽略列表里:
ignoreip = 127.0.0.1/8 你的IP
坑3:禁用密码登录前没测试密钥
直接就把 PasswordAuthentication no 了,结果密钥没配好,连不上服务器了。
解决: 先测试密钥登录能正常用,再禁用密码登录。千万不要关当前窗口,新开窗口测试。
总结
SSH暴力破解防护的优先级:
- 改SSH端口:从22改成其他端口,挡住大部分自动扫描
- 用fail2ban:自动封禁多次失败的IP
- 用密钥登录:禁用密码登录,这是最彻底的防护
- 限制IP:只允许自己的IP段登录
防护措施不是越多越好,够用就行。最推荐的组合是:改端口 + fail2ban + 密钥登录,这一套下来基本就很安全了。
遇到问题加QQ23979811 协助处理
CentOS7 关闭SELinux详细步骤,临时+永久关闭
前言
刚装完 CentOS7,部署网站的时候老是遇到各种权限问题:文件明明权限对了还是访问不了,端口也开了就是连不上。排查半天发现是 SELinux 在捣乱。SELinux 是 CentOS 自带的强制访问控制安全机制,安全性很高,但对新手来说确实不太友好。本文详细讲一下怎么临时和永久关闭 SELinux,以及关闭前需要知道的注意事项。
什么是 SELinux
SELinux(Security-Enhanced Linux)是 Linux 内核的一个安全模块,提供强制访问控制(MAC)机制。它比传统的自主访问控制(DAC)更严格,不仅看文件权限,还看进程和文件的安全上下文(SELinux 标签)。
CentOS7 默认开启 SELinux,这也是为什么很多新手部署完网站各种报错的原因——Nginx、PHP、MySQL 的进程和文件上下文不匹配,SELinux 直接拦截。
查看 SELinux 状态
在关闭之前,先看看 SELinux 当前是什么状态:
getenforce
输出可能是:
Enforcing:强制模式,SELinux 正在拦截违规操作Permissive:宽容模式,只记录警告不拦截Disabled:已关闭
也可以用这个命令看更详细的信息:
sestatus
输出示例:
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
临时关闭 SELinux(重启后失效)
如果你只是临时测试一下,不想改配置文件,可以用这个方法:
setenforce 0
setenforce 0 表示切换到 Permissive 宽容模式,SELinux 不会再拦截操作,但会在日志里记录。这个命令立即生效,不需要重启。
验证一下:
getenforce
应该输出 Permissive。
注意: 这种方式重启服务器后 SELinux 会重新开启,所以只是临时生效。
永久关闭 SELinux(重启后依然关闭)
要永久关闭,需要修改配置文件:
1. 编辑 SELinux 配置文件
vi /etc/selinux/config
2. 修改 SELINUX 的值
找到这一行:
SELINUX=enforcing
改成:
SELINUX=disabled
3. 保存退出,重启服务器
reboot
重启后再验证一下:
getenforce
应该输出 Disabled。
三种模式说明
SELinux 有三种模式,大家可以根据需求选择:
| 模式 | 说明 |
|---|---|
enforcing |
强制模式,SELinux 强制执行策略,违规操作直接拦截 |
permissive |
宽容模式,只记录警告日志,不拦截操作 |
disabled |
完全关闭 SELinux |
建议: 如果只是临时调试,可以用 permissive 模式,既能放行所有操作,又能通过日志看到哪些操作被 SELinux 拦截了。生产环境如果实在搞不懂 SELinux,再考虑完全关闭。
常见坑
坑1:改了配置文件没重启就以为关了
很多朋友改完 /etc/selinux/config 文件,马上用 getenforce 查看,发现还是 Enforcing,就以为没改成功。其实配置文件改了之后必须重启服务器才会生效。临时生效用 setenforce 0,永久生效必须重启。
坑2:改了 SELINUX=disabled 但还有问题
有时候即使把 SELinux 关了,之前设置的安全上下文标签还在,可能会导致一些奇怪的问题。如果遇到这种情况,可以重启服务器彻底解决。
坑3:生产环境直接关闭有安全风险
SELinux 是一道安全防线,生产环境直接完全关闭会降低系统安全性。建议先尝试把模式改成 permissive,看看日志里哪些操作被拦截了,再针对性地调整上下文标签,而不是直接全部关掉。
总结
CentOS7 关闭 SELinux 的两种方式:
临时关闭(立即生效,重启失效):
setenforce 0
永久关闭(重启后生效):
- 编辑
/etc/selinux/config - 把
SELINUX=enforcing改成SELINUX=disabled - 重启服务器
新手刚部署完服务器,先临时关了跑通业务,后面再慢慢研究 SELinux 的配置,别一上来就跟它死磕。
遇到问题加QQ23979811 协助处理