某公司运维误共享root密码致服务器遭入侵 手把手教你CentOS6 SSH远程连接配置与用户权限管理全攻略
上周有个朋友凌晨三点给我打电话,声音都在抖——他们公司的服务器被黑了。
原因说出来让人哭笑不得:一个刚入职不到一个月的运维小哥,为了方便远程调试,把 root 密码直接写进了一个共享文档,而这个文档的链接,不知怎么被发到了某个开源社区。三天后,黑客拿着密码连上服务器,挖矿程序跑满 CPU,数据库里的用户信息全被拖走。
今天这篇,就从头到尾讲讲 CentOS 6 的 SSH 配置和用户权限管理。虽然 CentOS 6 已经停止维护了(我知道,很多企业还在用,别急着喷),但里面的安全原则,对任何 Linux 系统都适用。
一、先看清问题:root 密码到底能有多危险
很多人觉得”密码设复杂一点不就行了”,但事实是:root 密码一旦泄露,没有任何补救措施。
你想想,root 意味着什么?
- 可以读任意文件(包括
/etc/shadow,里面是所有用户的哈希密码) - 可以安装后门程序
- 可以修改日志,抹掉入侵痕迹
- 可以创建新的管理员账号
- 可以关闭防火墙、卸载安全软件
那个运维小哥的密码是 Root@2024!,复杂度够高了吧?没用。黑客用 hydra 工具跑 SSH 爆破,平均 47 分钟就撞上了。而那个共享文档的链接,甚至没设置访问密码。
核心教训:root 密码不该存在任何”方便”的地方。
二、CentOS 6 SSH 配置完整指南
2.1 确认 SSH 服务状态
# 查看 sshd 是否在运行
service sshd status
# 如果没有运行,启动它
service sshd start
# 设置开机自启动
chkconfig sshd on
# 确认开机自启已生效
chkconfig --list sshd
2.2 修改 SSH 端口(避开自动化扫描)
默认的 22 端口是黑客扫描的首要目标。改成高位端口,能挡住 99% 的自动化攻击。
# 备份原始配置
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
# 编辑配置
vi /etc/ssh/sshd_config
找到 Port 22 这一行,改成:
Port 2222
保存后重启 sshd:
service sshd restart
注意:改完端口后,确保防火墙也放行新端口,否则你自己也连不上了:
# 查看当前 iptables 规则
iptables -L -n | grep 2222
# 如果没放行,添加规则(以 2222 为例)
iptables -I INPUT -p tcp --dport 2222 -j ACCEPT
service iptables save
2.3 禁止 root 直接登录
这是最关键的一步。root 不应该通过 SSH 直接登录,所有管理员必须先用普通账号登进去,再 sudo su。
vi /etc/ssh/sshd_config
添加或修改:
PermitRootLogin no
同时,建议也禁用空密码登录:
PermitEmptyPasswords no
重启生效:
service sshd restart
2.4 配置密钥登录(替代密码)
密码再复杂也有被爆破的风险,SSH 密钥对才是正解。
第一步:在客户端生成密钥对
# 在本地机器上执行
ssh-keygen -t rsa -b 4096 -C "your@email.com"
# 过程中会让你输入密码短语(passphrase),建议设置一个复杂的
# 这相当于给你的密钥再加一把锁
第二步:把公钥复制到服务器
# 使用 ssh-copy-id(如果服务器允许密码登录)
ssh-copy-id -p 2222 user@your-server-ip
# 或者手动复制
cat ~/.ssh/id_rsa.pub | ssh -p 2222 user@your-server-ip "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
第三步:禁用密码登录
vi /etc/ssh/sshd_config
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no
重启 sshd:
service sshd restart
现在只有持有私钥的人才能登录,即使密码泄露也没用。
2.5 限制登录用户和白名单
不是所有人都需要 SSH 登录权限。
vi /etc/ssh/sshd_config
# 只允许特定用户登录
AllowUsers admin1 admin2 deploy
# 或者用 AllowGroups(推荐,基于用户组管理)
AllowGroups sshusers
创建用户组并添加用户:
# 创建用户组
groupadd sshusers
# 创建普通用户并加入组
useradd -m -s /bin/bash -G sshusers admin1
useradd -m -s /bin/bash -G sshusers admin2
# 设置密码(用随机密码)
passwd admin1
2.6 配置 SSH 超时和重试限制
防止暴力破解的最后一道防线。
vi /etc/ssh/sshd_config
# 空闲 300 秒后断开连接
ClientAliveInterval 300
ClientAliveCountMax 2
# 连续 3 次失败后断开
MaxAuthTries 3
# 登录失败后延迟 5 秒再响应(拖慢爆破速度)
LoginGraceTime 30
三、用户权限管理:最小权限原则
3.1 理解 sudo 配置
CentOS 6 使用 /etc/sudoers 文件控制 sudo 权限。编辑方式有讲究:
# 永远用 visudo 编辑,它会做语法检查
visudo
一个安全的 sudoers 配置示例:
# root 全部权限
root ALL=(ALL) ALL
# admin1 可以执行所有命令(需要密码)
admin1 ALL=(ALL) ALL
# admin2 只能执行特定命令
admin2 ALL=(ALL) /usr/bin/systemctl, /usr/bin/journalctl, /bin/cat /var/log/*
# deploy 用户只能执行部署脚本
deploy ALL=(root) NOPASSWD: /opt/scripts/deploy.sh
关键点:
NOPASSWD只用于确定的、不可逆的脚本(如部署),不要给交互式命令- 永远不要给 sudo 权限
rm -rf /或mount这样的命令 - 定期审计
/var/log/audit/audit.log,看谁在用什么权限
3.2 创建专用的运维账号
别再让人用 root 或者通用账号登录了。
# 创建运维组
groupadd ops
# 创建用户,指定登录 shell 为 bash
useradd -m -s /bin/bash -G ops zhangsan
useradd -m -s /bin/bash -G ops lisi
# 设置强密码(用密码生成器)
openssl rand -base64 16
# 然后把生成的密码告诉用户,并要求他首次登录后立即修改
# 设置密码过期策略(90 天强制修改)
chage -M 90 zhangsan
chage -M 90 lisi
3.3 监控和审计
# 查看最近登录记录
last
# 查看失败登录尝试
grep "Failed password" /var/log/secure | wc -l
# 查看谁在用 sudo
grep "sudo" /var/log/secure | tail -20
# 实时监控系统调用(需要安装 auditd)
service auditd start
auditctl -w /etc/shadow -p wa -k shadow_changes
auditctl -w /etc/sudoers -p wa -k sudoers_changes
四、那个被黑的公司后来做了什么
故事还没完。
那个公司被黑之后,花了两周做了以下整改:
- root 密码改为密钥登录,完全禁用密码认证
- 所有运维账号纳入跳板机管理,不再允许直接 SSH 到生产服务器
- 部署了 fail2ban,连续 5 次失败登录自动封 IP 30 分钟
- 开启了完整审计日志,所有 sudo 操作实时推送到钉钉群
- 定期轮换密码,使用密码管理器(1Password 企业版)生成和存储密码
三个月后,他们又经历了一次攻击——黑客扫描到了 2222 端口,尝试了 17 次密码登录,全部失败。fail2ban 自动封了黑客的 IP。而他们的服务器,连日志都没被碰过。
五、速查清单
如果你今天就要去整改,照着这个做:
- [ ] 修改 SSH 端口(不是 22)
- [ ] 禁止 root 直接登录(
PermitRootLogin no) - [ ] 配置 SSH 密钥登录
- [ ] 禁用密码登录(
PasswordAuthentication no) - [ ] 限制允许登录的用户/用户组
- [ ] 配置 fail2ban
- [ ] 为每个运维人员创建独立账号
- [ ] 配置 sudoers 最小权限
- [ ] 开启审计日志
- [ ] 密码使用密码管理器生成,不重复使用
最后说一句:安全不是功能,是习惯。
那个运维小哥不是故意的,他只是为了”方便”。但服务器安全这件事上,方便和安全永远是对立的。你多花五分钟配置密钥登录,可能就能避免一次损失几十万的入侵事故。
如果你的服务器还在用 CentOS 6,我建议你同时规划升级路径。CentOS 6 的漏洞不再修补,这本身就是一个巨大的安全风险。
有问题欢迎在评论区讨论。
