适配系统:CentOS Linux release 7.9
拿到云服务器,第一件事:安全初始化
初始化核心目标清单:
- 系统完整更新 + 自动清理冗余包、缓存
- 创建普通运维用户,禁用 root 直连操作
- SSH 密钥免密登录、加固 SSH(改端口、禁密码、禁 root 登录)
- Firewalld 防火墙最小化放行端口
- Fail2ban 防 SSH 暴力破解,自动拉黑恶意 IP
- 开启 TCP BBR 网络加速
- 时区、基础运维工具安装
- 一键自动化初始化脚本
一、基础系统信息查看命令
# 系统版本
cat /etc/os-release
# 内核版本
uname -r
# 系统位数
uname -m
# 内存
free -h
# 磁盘挂载
df -h
二、系统更新 + 清理冗余包 / 缓存(你需求的 yum 全套)
CentOS7 使用 yum,对应 Ubuntu apt full-upgrade/autoremove/autoclean 功能整合:
# 1. 全量升级所有软件、内核、安全补丁
yum update -y
# 2. 自动卸载无用孤立依赖、旧内核冗余包
yum autoremove -y
# 3. 清理yum下载的rpm缓存包
yum clean all
# 4. 重建本地软件源缓存,加速后续安装
yum makecache
单行整合一键执行:
yum update -y && yum autoremove -y && yum clean all && yum makecache
判断内核更新后是否需要重启
CentOS7 无reboot-required文件,手动判断:
# 查看当前运行内核
uname -r
# 查看系统已安装内核
rpm -qa | grep kernel
若rpm列出多个内核版本,说明更新了内核,执行重启生效:
reboot
三、安装服务器必备运维工具
CentOS7 无 ufw,使用系统原生firewalld;fail2ban 在 epel 源中,需先装 epel-release:
# 先安装epel扩展源(提供fail2ban、htop等软件)
yum install -y epel-release
# 批量安装全套工具
yum install -y sudo curl wget git vim htop tree unzip net-tools lsof fail2ban
工具对照表
| 工具 | 用途 |
|---|---|
| sudo | 普通用户临时获取 root 权限 |
| curl/wget | 文件下载、接口测试 |
| git | 代码版本管理 |
| vim | 文本编辑器 |
| htop | 可视化进程监控(替代 top) |
| tree | 树形打印目录结构 |
| net-tools | ifconfig、route、netstat 传统网络工具 |
| unzip | 压缩包解压 |
| firewalld | CentOS7 原生系统防火墙(默认自带) |
| fail2ban | 监控登录日志,自动封禁爆破 IP |
| lsof | 查看端口占用、文件占用 |
四、创建非 root 普通运维用户
禁止日常直接使用 root 操作,降低误删、入侵风险:
# 创建用户(将buer替换为你自定义用户名)
useradd buer
# 设置用户登录密码(输入两次,无回显)
passwd buer
输出示例:
更改用户 buer 的密码 。
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
授予 sudo 管理员权限
CentOS7sudo权限统一归属wheel用户组:
# 将用户加入wheel组,获得sudo提权能力
usermod -aG wheel buer
权限验证
# 切换至新建普通用户
su - buer
# 使用sudo提权执行whoami,输出root即权限正常
sudo whoami
五、配置 SSH 密钥免密登录(安全核心)
1. 本地电脑生成 ED25519 密钥对(Windows/Mac/Linux 本地终端执行)
ssh-keygen -t ed25519 -C "buer@yourdomain.com"
一路回车:默认保存路径、不设置私钥密码。
生成文件:
- 私钥:
~/.ssh/id_ed25519(本地妥善保管,绝不外传) - 公钥:
~/.ssh/id_ed25519.pub(上传至服务器)
2. 本地上传公钥到服务器普通用户
# 替换用户名、服务器公网IP
ssh-copy-id buer@服务器IP
报错Host key verification failed(重装系统指纹冲突)修复:
# 删除本地旧主机指纹
ssh-keygen -R 服务器IP
# 重新上传公钥
ssh-copy-id buer@服务器IP
3. 测试密钥登录
ssh buer@服务器IP
# 修改SSH端口后登录命令
ssh -p 22000 buer@服务器IP
4. SSH 安全加固(修改端口、禁 root、禁密码登录)
⚠️ 重要:先密钥登录测试成功,再关闭密码登录,否则会失联!
# 修改配置前备份原文件
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
# 编辑SSH服务配置
vim /etc/ssh/sshd_config
修改 / 新增以下参数(注释 #全部删除):
# 自定义SSH端口,范围1024-65535,示例22000, 有的云服务器SSH放行规则不让修改22端口
Port 22
# 禁止root用户SSH远程登录
PermitRootLogin no
# 启用密钥认证
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
# 关闭密码登录(密钥可用再启用)
PasswordAuthentication no
# 禁止空密码账号登录
PermitEmptyPasswords no
# 最大认证失败次数,3次失败直接断开
MaxAuthTries 3
# 客户端无操作超时断开
ClientAliveInterval 300
ClientAliveCountMax 2
# 仅使用安全SSH2协议
Protocol 2
校验配置 + 重启 sshd 服务
# 校验配置语法,报错则不重启,防止失联
sshd -t
# 重启SSH服务
systemctl restart sshd
# 设置开机自启
systemctl enable sshd
# 查看运行状态
systemctl status sshd
六、Firewalld 防火墙配置(CentOS7 原生,替代 Ubuntu ufw)
1. 启用防火墙并开机自启
# 开机自启+立即启动
systemctl enable firewalld --now
# 查看运行状态
firewall-cmd --state
2. 基础安全策略:默认拒绝所有入站,允许全部出站
firewalld 默认 zone 为public,永久写入规则:
# 默认拒绝外部主动访问本机
firewall-cmd --set-default-zone=public
# 放行自定义SSH端口(和sshd_config端口保持一致)
firewall-cmd --permanent --add-port=22/tcp
# 放行网站80/443
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
# 重载所有永久规则生效
firewall-cmd --reload
防火墙常用操作命令
# 查看已放行端口/服务
firewall-cmd --list-ports
firewall-cmd --list-services
# 新增端口放行(示例3306数据库)
firewall-cmd --permanent --add-port=3306/tcp && firewall-cmd --reload
# 删除放行端口
firewall-cmd --permanent --remove-port=22/tcp && firewall-cmd --reload
# 仅允许指定IP访问SSH
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="1.2.3.4" port protocol="tcp" port="22000" accept' && firewall-cmd --reload
# 重置所有防火墙规则
firewall-cmd --complete-reload
配套提醒:云服务商控制台安全组必须同步放行自定义 SSH 端口、80、443,否则外部无法访问。
七、开启 TCP BBR 网络加速(CentOS7 内核≥4.9 支持)
1. 查看内核版本
uname -r
内核低于 4.9 需升级内核后再操作(我的建议是国内的服务器就不升级了,BBR加速作用不大)。
2. 修改系统内核参数
# 编辑sysctl配置
vim /etc/sysctl.conf
# 文件末尾添加两行
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr
命令行一键追加(避免重复写入):
grep -q "net.core.default_qdisc=fq" /etc/sysctl.conf || echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
grep -q "net.ipv4.tcp_congestion_control=bbr" /etc/sysctl.conf || echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
3. 生效并验证
# 加载新内核参数
sysctl -p
# 输出bbr即开启成功
sysctl net.ipv4.tcp_congestion_control
# 查看系统支持的拥塞算法
sysctl net.ipv4.tcp_available_congestion_control
八、Fail2ban 防 SSH 暴力破解
监控登录日志/var/log/secure,多次密码错误自动用 firewalld 拉黑 IP
1. 复制配置文件(不直接修改 jail.conf,升级不丢失配置)
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
vim /etc/fail2ban/jail.local
2. 修改核心配置
[DEFAULT]
# 封禁时长 600秒=10分钟
bantime = 600
# 600秒内多次失败触发封禁
findtime = 600
# 最多允许3次登录失败
maxretry = 3
# 本地IP白名单,永不封禁
ignoreip = 127.0.0.1/8 ::1
[sshd]
enabled = true
# 填写你的自定义SSH端口
port = 22
maxretry = 3
# CentOS7 SSH登录日志路径(区别Ubuntu /var/log/auth.log)
logpath = /var/log/secure
# 联动firewalld封禁IP
banaction = firewallcmd-ipset
3. 启动 + 开机自启
systemctl restart fail2ban
systemctl enable fail2ban
systemctl status fail2ban
Fail2ban 常用运维命令
# 查看SSH封禁列表
fail2ban-client status sshd
# 手动解封IP
fail2ban-client set sshd unbanip 111.222.33.44
# 手动拉黑恶意IP
fail2ban-client set sshd banip 1.2.3.4
# 修改配置后重载
fail2ban-client reload
# 查看SSH登录失败日志
grep Failed /var/log/secure
误封自救方案
若自己 IP 被封禁:使用云服务器 VNC 控制台登录,执行解封命令,同时把本地公网 IP 加入ignoreip白名单。
九、系统时区配置(默认 UTC 改为上海时区)
# 查看当前时区
timedatectl
# 设置亚洲上海时区
timedatectl set-timezone Asia/Shanghai
# 验证
date
十、扩展实用功能
1. 本地 SSH Config 多服务器快捷登录
本地电脑编辑~/.ssh/config,无需每次输入 IP / 端口 / 密钥,在云服务器厂商允许修改ssh放行规则端口的情况下考虑!!!
Host vps-centos7
HostName 你的服务器公网IP
User buer
Port 22000
IdentityFile ~/.ssh/id_ed25519
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
AddKeysToAgent yes
快捷登录:
ssh vps-centos7
2. 自动安全更新(yum-cron 定时自动打安全补丁)
# 安装自动更新工具
yum install -y yum-cron
# 编辑配置,仅自动安装安全补丁
vim /etc/yum/yum-cron.conf
修改参数:
update_cmd = security
apply_updates = yes
启动并开机自启:
systemctl start yum-cron
systemctl enable yum-cron
3. 系统日志清理,释放磁盘
# 清理临时目录
rm -rf /tmp/* /var/tmp/*
# 限制系统日志最大占用100M
journalctl --vacuum-size=100M
# 清理旧内核(仅保留最新1个)
package-cleanup --oldkernels --count=1 -y
十一、CentOS7.9 一键安全初始化脚本
使用说明:root 用户执行,修改脚本顶部自定义参数
#!/bin/bash
set -e
# =====================配置区=====================
NEW_USER="buer"
NEW_SSH_PORT="22"
TIMEZONE="Asia/Shanghai"
# ================================================
echo "===== CentOS7.9 云服务器安全初始化脚本 ====="
echo "[1/9] 更新系统并清理冗余包、缓存"
yum update -y && yum autoremove -y && yum clean all && yum makecache
echo "[2/9] 安装epel源与全套运维工具"
yum install -y epel-release
yum install -y sudo curl wget git vim htop tree unzip net-tools lsof fail2ban
echo "[3/9] 创建普通运维用户并授予sudo权限"
if id "$NEW_USER" &>/dev/null; then
echo "用户$NEW_USER已存在,跳过创建"
else
useradd $NEW_USER
echo "请设置用户$NEW_USER登录密码:"
passwd $NEW_USER
usermod -aG wheel $NEW_USER
fi
echo "[4/9] 配置用户SSH目录权限(等待粘贴公钥)"
mkdir -p /home/$NEW_USER/.ssh
chmod 700 /home/$NEW_USER/.ssh
touch /home/$NEW_USER/.ssh/authorized_keys
chmod 600 /home/$NEW_USER/.ssh/authorized_keys
chown -R $NEW_USER:$NEW_USER /home/$NEW_USER/.ssh
echo "====================================="
echo "请将本地电脑生成的公钥完整粘贴到下方,粘贴完成按Ctrl+D结束"
cat >> /home/$NEW_USER/.ssh/authorized_keys
echo "公钥写入完成"
echo "[5/9] 加固SSH配置文件"
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sed -i "s/^#*Port .*/Port $NEW_SSH_PORT/" /etc/ssh/sshd_config
sed -i "s/^#*PermitRootLogin .*/PermitRootLogin no/" /etc/ssh/sshd_config
sed -i "s/^#*PasswordAuthentication .*/PasswordAuthentication no/" /etc/ssh/sshd_config
sed -i "s/^#*PermitEmptyPasswords .*/PermitEmptyPasswords no/" /etc/ssh/sshd_config
sed -i "s/^#*MaxAuthTries .*/MaxAuthTries 3/" /etc/ssh/sshd_config
# SSH语法校验,异常直接退出
if ! sshd -t; then
echo -e "\033[31m SSH配置语法错误,终止执行!\033[0m"
exit 1
fi
systemctl restart sshd
systemctl enable sshd
echo "[6/9] 配置Firewalld防火墙"
systemctl enable firewalld --now
firewall-cmd --set-default-zone=public
firewall-cmd --permanent --add-port=${NEW_SSH_PORT}/tcp
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload
echo "[7/9] 开启TCP BBR网络加速"
grep -q "net.core.default_qdisc=fq" /etc/sysctl.conf || echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
grep -q "net.ipv4.tcp_congestion_control=bbr" /etc/sysctl.conf || echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
sysctl -p
echo "[8/9] 配置Fail2ban防暴力破解"
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sed -i "s/^port = ssh/port = $NEW_SSH_PORT/" /etc/fail2ban/jail.local
sed -i "s|logpath = /var/log/auth.log|logpath = /var/log/secure|" /etc/fail2ban/jail.local
sed -i "s/banaction = iptables-multiport/banaction = firewallcmd-ipset/" /etc/fail2ban/jail.local
systemctl restart fail2ban
systemctl enable fail2ban
echo "[9/9] 设置系统时区"
timedatectl set-timezone $TIMEZONE
echo -e "\033[32m ======================================="
echo " CentOS7.9 安全初始化全部完成!"
echo " 新SSH端口:$NEW_SSH_PORT"
echo " 运维用户名:$NEW_USER"
echo " 时区:$TIMEZONE"
echo ""
echo " 登录命令示例:ssh -p $NEW_SSH_PORT $NEW_USER@你的服务器IP"
echo -e " ⚠️ 重要:新开终端测试密钥登录正常后,再关闭当前连接!\033[0m"
脚本使用步骤
- 本地电脑上传脚本到服务器:
scp init_centos7_secure.sh root@服务器IP:~/
- 服务器 root 登录,赋予执行权限并运行:
chmod +x init_centos7_secure.sh
./init_centos7_secure.sh
重要注意事项
- CentOS7 官方已于 2024 年 6 月停止维护,无官方安全补丁,生产环境长期使用建议迁移 Rocky Linux/AlmaLinux8/9;
- 修改 SSH 端口后,云厂商安全组必须同步放行该端口,否则外部无法连接;
- 关闭 SSH 密码登录前,必须完整测试密钥登录,避免服务器失联;
- Fail2ban 依赖 firewalld,不要同时运行 iptables-services,会导致封禁失效;
yum autoremove只会删除无依赖孤立包,不会删除业务运行必需软件,安全可靠。