
新服务器到手,你要做多少安全配置?
改SSH端口、禁root登录、配防火墙、装fail2ban、设自动更新……每一项单独做,半小时起步。如果配10台,几个小时就过去了。而且手动操作容易漏,漏一项就是隐患。
今天不讲复杂的脚本原理,而是告诉你服务器上线前必须做的6项安全配置。每项都说明白:为什么做、怎么做、不做会怎样。最后附上一键脚本,供需要的人直接用。
为什么需要安全基线?
云服务器一上线,公网IP就暴露在攻击者的扫描范围内。默认配置追求的是“方便”,不是“安全”。你不改,攻击者替你试。
安全基线不是让你变成安全专家,而是把那些“大家都知道但经常忘”的基础配置一次性做完。
6项核心安全配置
1. 禁用root远程登录
为什么做:root是已知用户名,攻击者只需要猜密码。禁用root登录,让他连用户名都要猜。
怎么做:创建普通用户,给它sudo权限,然后修改/etc/ssh/sshd_config中PermitRootLogin为no。
不做会怎样:攻击者可针对root账户持续尝试暴力破解,即使密码足够复杂,大量的失败尝试也会占用系统资源,日志飞速增长。
2. 改用SSH密钥登录,禁用密码
为什么做:密码可被暴力破解、可被键盘记录器窃取。密钥对(公钥+私钥)比密码安全得多。
怎么做:生成密钥对(ssh-keygen -t ed25519),把公钥追加到服务器的~/.ssh/authorized_keys,然后设置PasswordAuthentication no。
不做会怎样:弱密码可能很快被爆破。强密码虽难猜,但每次登录都要手动输入,日常使用很不方便,很多人因此选择弱密码或重复使用密码。
3. 修改SSH默认端口
为什么做:22端口是SSH的默认端口,所有扫描器的第一站。
怎么做:修改Port 22为其他端口,比如Port 2222。
不做会怎样:扫描器只扫22端口,改端口就能过滤掉99%的批量攻击。
4. 配置防火墙(最小开放原则)
为什么做:默认拒绝所有,只开放必需的端口(如SSH端口、80、443)。
怎么做:Ubuntu用ufw,CentOS用firewalld。先deny incoming,再allow具体端口。
不做会怎样:服务器上任何服务都可能被外网访问。你不小心装了个Redis没设密码,别人就能直接连上来。
5. 安装fail2ban防暴力破解
为什么做:即使改了端口、禁了密码,攻击者仍可通过其他服务尝试爆破。fail2ban能自动封禁反复失败的IP。
怎么做:安装fail2ban,配置监控SSH、Nginx等服务的日志,设置3次失败封1小时。
不做会怎样:攻击者可以无限次尝试密码,不受任何限制。你的日志会被塞满,CPU也会被浪费。
6. 开启自动安全更新
为什么做:系统漏洞公布后,黑客立刻开始扫。你不更新,就是靶子。
怎么做:Ubuntu装unattended-upgrades只开安全更新,CentOS用yum-cron。
不做会怎样:出了新漏洞,你的服务器会暴露在风险中。等你手动更新时,可能已经被扫到了。
一键加固脚本
以下脚本整合了上述6项配置,适用于Ubuntu 20.04+和CentOS 7+。
使用方法:
bash
# 下载脚本 wget https://hostol.com/scripts/secure.sh # 添加执行权限 chmod +x secure.sh # 以root用户执行 ./secure.sh
脚本内容(需要时复制):
bash
#!/bin/bash
# 服务器安全加固脚本
# 适用:Ubuntu 20.04+ / CentOS 7+
set -e
# 检测系统
if [ -f /etc/os-release ]; then
. /etc/os-release
OS=$ID
else
echo "无法检测系统类型"
exit 1
fi
echo "开始加固 $OS ..."
# 1. 更新系统
if [ "$OS" = "ubuntu" ]; then
apt update && apt upgrade -y
apt install -y ufw fail2ban unattended-upgrades
elif [ "$OS" = "centos" ]; then
yum update -y
yum install -y epel-release fail2ban
fi
# 2. 创建普通用户(如未创建)
if ! id "deploy" &>/dev/null; then
useradd -m -s /bin/bash deploy
echo "deploy ALL=(ALL) ALL" >> /etc/sudoers
echo "请设置deploy用户密码:"
passwd deploy
fi
# 3. SSH加固
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sed -i 's/#PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
sed -i 's/PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
sed -i 's/PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
echo "UseDNS no" >> /etc/ssh/sshd_config
systemctl restart sshd
# 4. 防火墙
if [ "$OS" = "ubuntu" ]; then
ufw default deny incoming
ufw default allow outgoing
ufw allow 22/tcp
ufw --force enable
elif [ "$OS" = "centos" ]; then
systemctl start firewalld
systemctl enable firewalld
firewall-cmd --permanent --add-service=ssh
firewall-cmd --reload
fi
# 5. 启动fail2ban
systemctl enable fail2ban
systemctl start fail2ban
# 6. 自动安全更新 (Ubuntu)
if [ "$OS" = "ubuntu" ]; then
cat > /etc/apt/apt.conf.d/50unattended-upgrades << EOF
Unattended-Upgrade::Allowed-Origins {
"\${distro_id}:\${distro_codename}-security";
};
Unattended-Upgrade::Automatic-Reboot "false";
EOF
echo "APT::Periodic::Update-Package-Lists \"1\";" > /etc/apt/apt.conf.d/10periodic
echo "APT::Periodic::Unattended-Upgrade \"1\";" >> /etc/apt/apt.conf.d/10periodic
fi
echo "加固完成!"
echo "请记得:"
echo "1. 将本地公钥添加到 /home/deploy/.ssh/authorized_keys"
echo "2. 测试用deploy用户登录成功后,再关闭当前root会话"
注意事项
- 执行前务必备份:脚本会自动备份SSH配置到
.bak文件。 - 不要关掉当前SSH窗口:先用新用户测试登录成功后再关,避免把自己锁在外面。
- SSH端口可自行修改:脚本默认保持22,如需改端口,手动编辑
/etc/ssh/sshd_config中的Port。 - 云厂商安全组:如果你改了SSH端口,记得在云厂商控制台的防火墙(安全组)里也放行新端口。
一个真实案例
一个朋友的初创团队,5台服务器,全是默认配置跑了半年。某天发现其中一台被人种了挖矿病毒,CPU一直100%。排查发现,root密码被爆破,攻击者进来装了挖矿脚本。清理花了4小时,还丢了当天的部分日志。
后来他用这份脚本重新加固了所有服务器,再也没有被扫到过。
他说:“早知道这10分钟能做的事,我就不拖半年了。”
最后一句
安全基线不是什么高深技术,就是那些“大家都知道但经常忘”的基础配置。
一键脚本帮你把6项配置打包,10分钟跑完。以后每台新服务器上线,跑一遍,心里有底。
今天去检查你的服务器,看看这6项做了几项。没做的,现在补上。




