前言
服务器安全加固它们的核心目的都是为了增加攻击者的成本,并减少被自动化脚本攻破的概率
-
禁用 Root 用户登录
- 增加暴力破解的难度(最主要原因)
- 权限审计与责任追溯(区分团队用户)
- 防止误操作(最小权限原则)
-
修改 SSH 默认端口 (Port 22)
- 规避自动化扫描脚本(主要作用)
- 保持/var/log/secure日志干净
第一步:创建一个拥有sudo权限的普通用户
在禁用Root登录之前,你必须确保有一个普通用户可以登录并执行管理员命令(sudo)。
- 创建新用户 (假设用户名为
adminuser):
useradd -m adminuser
- 设置密码:
passwd adminuser
# 输入两次新密码
使用 SSH 密钥对登录(最强推荐)
目前最主流的SSH验证方式。在你的电脑生成一对密钥(公钥和私钥),把公钥放到服务器上。
- 配置: 在
/etc/ssh/sshd_config中设置:
PubkeyAuthentication yes # 开启密钥登录
PasswordAuthentication no # 彻底关闭密码登录(!)
- 注意:在关闭密码登录前,务必确认密钥登录已经配置成功。
-
授予 sudo 权限:
- CentOS / RHEL / Fedora:
-
usermod -aG wheel adminuser - Ubuntu / Debian:
-
usermod -aG sudo adminuser
-
关闭 sudo 密码: (可选-取消 sudo 密码虽然方便,但降低了安全性)
visudo
- 这会打开
/etc/sudoers文件。 - 默认编辑器可能是
nano(下方有快捷键提示)或vi/vim
你需要找到合适的位置(通常在文件末尾添加即可),根据你的需求选择以下 一种 方式:
方式 A:只针对特定用户(推荐)
假设你的用户名是 adminuser,在文件最后一行添加:
adminuser ALL=(ALL:ALL) NOPASSWD: ALL
- 请将
adminuser替换为你实际的用户名。 NOPASSWD:是关键指令(注意冒号和空格)。
方式 B:针对整个用户组(例如 wheel 或 sudo 组)
如果你希望所有拥有管理员权限的用户都不需要密码:
找到类似下面这一行(以 % 开头表示组):
- CentOS / RHEL (通常是
%wheel):
## 找到这一行
%wheel ALL=(ALL) ALL
## 修改为:
%wheel ALL=(ALL) NOPASSWD: ALL
- Ubuntu/ Debian (通常是
%sudo):
## 找到这一行
%sudo ALL=(ALL:ALL) ALL
## 修改为:
%sudo ALL=(ALL:ALL) NOPASSWD: ALL
保存并退出
-
如果你是在
nano编辑器中 (屏幕下方有^O Write Out等提示):- 按
Ctrl + O,然后按Enter(回车)保存。 - 按
Ctrl + X退出。
- 按
-
如果你是在
vi或vim编辑器中:- 按
Esc键退出编辑模式。 - 输入
:wq并按回车(保存并退出)。
- 按
验证
无需重启服务,立即生效。可以输入一个 sudo 命令测试:
sudo ls /root
如果直接列出了文件而没有提示输入密码,说明配置成功。
第二步:修改用户密码
如果你需要修改当前用户(包括root)或其他用户的密码。
- 修改当前登录用户的密码:
passwd
- 修改特定用户的密码 (需要root权限) :
passwd 用户名
# 例如: passwd root 或 passwd adminuser
第三步:修改SSH配置文件 (端口与Root登录)
SSH的主配置文件通常位于 /etc/ssh/sshd_config。
- 备份配置文件 (养成好习惯):
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
- 编辑配置文件: 使用你熟悉的编辑器(如
vi,vim, 或nano):
vim /etc/ssh/sshd_config
-
修改 SSH ****端口: 找到
#Port 22这一行。- 去掉前面的
#注释符号。 - 将
22修改为你想要的端口号(建议在 1024-65535 之间,避免冲突,例如2222)。 - 修改前:
#Port 22 - 修改后:
Port 2222
- 去掉前面的
-
禁用 Root 登录: 找到
PermitRootLogin这一行。- 如果它是
yes,改为no。 - 修改后:
PermitRootLogin no
- 如果它是
-
保存并退出:
- 如果是
vim: 按Esc,输入:wq,回车。 - 如果是
nano: 按Ctrl+O保存,Ctrl+X退出。
- 如果是
开启 SSH 空闲超时自动登出(常搭配使用-可选)
防止你离开电脑时,已经连接的SSH窗口被他人恶意操作。
- 做法:修改
/etc/ssh/sshd_config: (或者配置 TMOUT 环境变量 )
ClientAliveInterval 300 # 服务端每300秒向客户端发送一次心跳
ClientAliveCountMax 0 # 如果客户端没响应(或空闲),允许尝试0次后断开
- 作用:如果你去上厕所或下班忘记关终端,5分钟无操作后,连接会自动断开。
安装防暴力破解神器:Fail2Ban(可选)
Fail2Ban 是一个自动化保护工具,它会监控系统日志。
-
原理:如果检测到某个IP在短时间内连续输错密码 N 次(例如5次),它会立即修改防火墙规则,将这个IP封禁(Ban掉)一段时间(例如1小时或永久)。
-
安装:
- Ubuntu/Debian:
sudo apt install fail2ban - CentOS:
sudo yum install fail2ban
- Ubuntu/Debian:
-
作用:它是修改SSH端口的最佳搭档。即使你没改端口,有了Fail2Ban,暴力破解脚本试几次就被拉黑了,无法继续尝试
启用双因子认证 (可选)
给SSH登录加一把“动态锁”。
- 做法:在服务器安装
google-authenticator模块。登录时,除了输入密码(或密钥),还需要输入手机 App(如 Google Authenticator 或 Microsoft Authenticator)上每30秒变化的 6 位数字验证码。
第四步:配置防火墙 (至关重要)
在 重启 SSH 服务之前,必须放行新 端口 ,否则你会被锁在外面!
根据你的操作系统选择对应的防火墙命令:
情况 A: 如果你是 CentOS 7/8/9 / RHEL (使用 firewalld)
- 放行新 端口 (例如 2222):
firewall-cmd --permanent --add-port=2222/tcp
- 重新加载防火墙:
firewall-cmd --reload
- SELinux 设置 (如果是 CentOS / RHEL 且开启了SELinux) : 如果修改了端口,SELinux可能会阻止SSH在非标准端口运行。
# 安装管理工具 (如果没有)
yum install -y policycoreutils-python-utils # CentOS 8/Stream
# 或 yum install -y policycoreutils-python # CentOS 7
# 允许SSH使用新端口
semanage port -a -t ssh_port_t -p tcp 2222
情况 B: 如果你是 Ubuntu / Debian (使用 ufw)
- 放行新 端口:
ufw allow 2222/tcp
- (注意:如果你还要保留 22端口 作为备用,可以暂时不删,确认无误后再删)
- 重新加载防火墙:
ufw reload
情况 C: 如果使用的是云服务器 (AWS, 阿里云, 腾讯云等)
- 务必去云服务商的控制台(网页端) ,找到“安全组”或“防火墙”设置。
- 添加一条入站规则:协议 TCP,端口
2222,源IP0.0.0.0/0(或指定你的IP)。 - 如果不做这一步,即使系统内部防火墙开了,外部也被云厂商拦截了。
第五步:重启 SSH 服务并验证
- 重启 服务:
# CentOS / RHEL / Ubuntu / Debian 通用
systemctl restart sshd
-
验证 (关键步骤) :
- 绝对不要关闭当前的 SSH 窗口!
- 打开一个新的终端窗口(或在你的SSH客户端如PuTTY/Xshell中新建连接)。
- 尝试使用新用户和新 端口登录:
ssh -p 2222 adminuser@你的服务器IP
-
结果测试:
- 如果能登录成功 -> 恭喜,配置完成。
- 尝试用 root 登录 -> 应该提示 "Permission denied"(被拒绝)。
- 如果新窗口连接不上 -> 回到原来的(未关闭的)窗口检查配置文件和防火墙,把端口改回22,重启服务以恢复访问。
历史命令记录优化(可选)
防止敏感信息泄露。
- 背景:你在终端输入的命令会被记录在
~/.bash_history中。如果你在命令里带了密码(比如mysql -u root -p123456),这非常危险。 - 做法: 在
/etc/profile或~/.bashrc中设置:
export HISTTIMEFORMAT="%F %T " # 给历史记录加时间戳,方便审计
export HISTCONTROL=ignoreboth # 忽略空格开头的命令
- 技巧:如果你要输入敏感命令,在命令最前面加一个空格,这条命令就不会被记录到历史文件中。
总结:一套标准的加固方案
对于大多数生产环境服务器,做到以下 4 点通常就能阻挡绝大部分的攻击:
- 非 Root + Sudo
- SSH 改 端口 + 密钥登录 + 禁用密码
- Fail2Ban 自动封禁
- 防火墙只开必要 端口