Linux服务器系统安全加固教程
为什么刚买的服务器就要做安全加固?
云服务器默认配置下,root密码可以直接登录、SSH端口是22,这类弱配置很容易被扫描工具撞库或暴力破解。
根据经验,一台暴露公网的Linux服务器,如果不做任何加固,最快几小时内就会被尝试登录数百次。
下面这套操作按顺序执行即可,每步都有命令和说明。
第一步:先更新系统,堵住已知漏洞
登录服务器后第一件事是让软件包都更新到最新版本。
# Debian/Ubuntu 系统
apt update && apt upgrade -y
# CentOS/Rocky/Alma 系统
yum update -y 或 dnf update -y
注意:更新可能重启内核或服务,建议在业务低峰期做。
更新后如果提示需要重启,用 reboot 重启一次。
第二步:配置SSH,干掉弱密码登录
SSH是服务器最大的入口,下面三步能堵住大部分攻击。
2.1 创建普通用户并赋予sudo权限
# 创建一个新用户,比如admin
adduser admin
# 设置密码(按提示输入两遍)
passwd admin
# 赋予sudo权限
usermod -aG sudo admin # Debian/Ubuntu
usermod -aG wheel admin # CentOS/Rocky
test一下:用 ssh admin@你的IP 登录一次,确认能正常连接。
2.2 配置SSH密钥登录(推荐,更安全)
在本地电脑生成密钥对(已生成过的跳过):
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
把公钥传上服务器:
ssh-copy-id -i ~/.ssh/id_rsa.pub admin@你的IP
# 如果没ssh-copy-id命令,手动复制也可以
之后登录就用密钥,不需要输密码了。
2.3 修改SSH配置文件,禁用root直接登录并改端口
sudo vim /etc/ssh/sshd_config
找到或添加以下三项:
Port 2222 # 把22改成其他端口,如2222
PermitRootLogin no # 禁止root直接登录
PasswordAuthentication no # 禁止密码登录(前提密钥已生效)
重点警告:改端口前,一定要在云服务器的安全组/防火墙里放行新端口(比如2222),否则改完自己就进不去了。
保存后重启SSH服务:
sudo systemctl restart sshd
# 或 sudo service ssh restart
现在用新端口重新登录一次:ssh -p 2222 admin@你的IP,确认能连上再退出旧会话。
第三步:安装Fail2ban,自动封禁暴力破解
Fail2ban会扫描日志,发现登录失败多次的IP直接临时封禁。
3.1 安装Fail2ban
# Debian/Ubuntu
apt install fail2ban -y
# CentOS/Rocky
yum install epel-release -y && yum install fail2ban -y
3.2 配置SSH保护
复制一份默认配置:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo vim /etc/fail2ban/jail.local
找到 [sshd] 部分,确保参数类似:
[sshd]
enabled = true
port = 2222 # 改为你自己设定的SSH端口
bantime = 3600 # 封禁1小时(单位秒)
maxretry = 5 # 5次失败就封
启动并启用:
sudo systemctl enable fail2ban --now
验证状态:sudo fail2ban-client status sshd,可以看到已封IP列表。
第四步:配置防火墙,只开必要端口
使用iptables或firewalld(CentOS)或ufw(Ubuntu)。
这里以ufw为例,宝塔面板用户可以直接在面板安全里操作。
4.1 安装ufw(Ubuntu/Debian)
sudo apt install ufw -y
# 先允许SSH新端口,否则下面启用防火墙后自己会被踢
sudo ufw allow 2222/tcp
# 再允许其他服务,比如Web(80/443)
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# 然后启用防火墙
sudo ufw enable
查看规则:sudo ufw status verbose
4.2 CentOS/RHEL用firewalld
sudo firewall-cmd --zone=public --add-port=2222/tcp --permanent
sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --add-service=https --permanent
sudo firewall-cmd --reload
避坑:防火墙没开放新SSH端口时不要重启ssh或退出当前会话,否则会断连。
第五步:关闭无用服务和端口,设置密码策略
5.1 停用不需要的服务
# 查看所有监听端口
sudo ss -tlnp
# 如果发现不必要的服务(如telnet、rsh等),用systemctl stop并disable
sudo systemctl disable --now service_name
5.2 设置密码复杂度(可选)
在 /etc/security/pwquality.conf 中配置:
minlen = 12 # 密码最小长度12
minclass = 3 # 至少包含三类字符
或者用 chage 设置密码过期时间:
sudo chage -M 90 admin # admin用户密码90天后过期
常见问题与避坑
Q:修改SSH端口后连不上怎么办?
别慌,使用云服务商控制台的VNC/IPMI远程登录(比如阿里云“远程连接”、腾讯云“VNC”)。
登录后把 /etc/ssh/sshd_config 里的端口改回22,重启sshd,再检查防火墙和安全组是否放行了新端口。
Q:我已经禁止密码登录了,但密钥认证不成功?
先检查本地 ~/.ssh/id_rsa 权限是否600,公钥是否追加到了服务器 ~/.ssh/authorized_keys。
可以用 ssh -vvv -p 2222 admin@IP 查看详细日志。
Q:Fail2ban会不会误封自己?
设置合理的 maxretry 和 bantime,一般5次失败封1小时较安全。
如果不小心被封了,用云控制台VNC登录后执行 sudo fail2ban-client unban IP 解封。
效果验证
- 测试SSH旧端口:用
ssh -p 22 admin@IP连接,应该直接超时或拒绝连接。 - 测试密钥登录:用
ssh -p 2222 admin@IP能正常进入。 - 测试暴力破解防护:故意连续输错几次密码,之后查看
sudo fail2ban-client status sshd,应该能看到你的测试IP被封。 - 检查防火墙:
sudo ufw status或sudo firewall-cmd --list-all确认只开放了必要端口。
以上步骤完成后,你的服务器安全等级已经比90%的默认服务器高。
如果你用的是宝塔面板,很多操作可以在面板安全页面里点选完成,但原理一样。
经常检查 /var/log/auth.log 或 /var/log/secure,看看还有没有异常登录尝试。