说实话,提起 CentOS 6,很多老运维心里可能五味杂陈。作为一个已经停止维护多年的系统,它依然活跃在很多遗留业务的服务器上。如果你现在接手了一台 CentOS 6 的机器,或者需要在这样的环境中配置远程安全访问,这篇指南就是为你准备的。我们不会只丢给你一堆命令,而是通过一个真实的“登录失败”噩梦案例,带你一步步拆解 SSH 安全加固和用户权限精细控制的门道。
那个让我半夜惊醒的登录失败故事
记得那年冬天,凌晨三点,手机狂震。某客户的 ERP 系统服务器响应超时。我连上 VPN,用 Xshell 尝试 SSH 登录,结果终端里反复滚动着红色的报错:
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
一开始我以为是密码错了,改了密码还是不行。接着试了密钥登录,也报同样的错。更诡异的是,系统日志 /var/log/secure 里出现大量来自不同 IP 的暴力破解尝试记录:
Mar 15 02:31:12 server sshd[12345]: Failed password for root from 192.168.1.100 port 54321 ssh2
Mar 15 02:31:15 server sshd[12346]: Failed password for admin from 192.168.1.101 port 54322 ssh2
Mar 15 02:31:18 server sshd[12347]: Failed password for test from 192.168.1.102 port 54323 ssh2
排查了半天,发现是 SSH 配置过于宽松,导致账户被暴力破解锁定,连正常的管理员都被挡在门外。这个案例告诉我们:SSH 安全配置不是小事,一字之差可能让你失联整晚。
别慌,我们来系统性地解决这些问题。
SSH 核心配置文件深度解析
CentOS 6 的 SSH 服务由 OpenSSH 提供,核心配置文件是 /etc/ssh/sshd_config。这个文件就像服务器的“门禁系统”,控制着谁能进、怎么进、进到哪里。
1. 端口与监听设置
默认的 22 端口太显眼,就像把家门钥匙挂在门把手上。建议改个端口:
Port 2222
Protocol 2
AddressFamily any
ListenAddress 0.0.0.0
Port 2222:改为非标准端口,减少被扫描到的概率Protocol 2:强制使用 SSH 协议版本 2,版本 1 有已知漏洞AddressFamily any:同时支持 IPv4 和 IPv6,可根据需要调整
2. 身份验证机制配置
这是安全的核心。我们来看几种常见的认证方式:
# 禁用密码登录,只允许密钥认证(最安全)
PasswordAuthentication no
PubkeyAuthentication yes
# 或者保留密码登录,但加强密码策略
PasswordAuthentication yes
ChallengeResponseAuthentication no
UsePAM yes
# 密钥认证相关
AuthorizedKeysFile .ssh/authorized_keys
密钥认证的目录结构应该是这样的:
/home/username/
└── .ssh/
├── authorized_keys # 存放允许登录的公钥
├── id_rsa # 私钥(不要给别人看)
└── id_rsa.pub # 公钥(放到服务器)
生成密钥对的方法:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
然后把公钥复制到服务器:
ssh-copy-id -p 2222 username@server_ip
3. 用户访问控制
不是所有人都需要 root 权限。我们来看如何精细控制:
# 禁止 root 直接登录
PermitRootLogin no
# 只允许特定用户登录
AllowUsers admin user1 user2
# 或者只允许特定用户组
AllowGroups wheel sshusers
# 禁止特定用户
DenyUsers baduser hacker
# 禁止特定用户组
DenyGroups blockedgroup
在 CentOS 6 中,wheel 组是默认的 sudo 组。创建一个普通用户并加入 wheel 组:
useradd -m -s /bin/bash newuser
passwd newuser
usermod -aG wheel newuser
测试 sudo 权限:
su - newuser
sudo ls /root
4. 连接限制与防暴力破解
防止 brute-force 攻击的关键配置:
# 最大认证尝试次数
MaxAuthTries 3
# 登录失败后的锁定时间(秒)
DenySitesInterval 60
# 空闲超时断开
ClientAliveInterval 300
ClientAliveCountMax 2
# 最大并发连接数
MaxSessions 10
MaxStartups 10:30:60
更强大的方案:安装 fail2ban
fail2ban 可以自动封禁多次登录失败的 IP:
# 安装
yum install epel-release
yum install fail2ban
# 创建配置文件
vi /etc/fail2ban/jail.local
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/secure
backend = rhel
maxretry = 3
bantime = 3600
findtime = 600
启动服务:
service fail2ban start
chkconfig fail2ban on
查看被封禁的 IP:
fail2ban-client status sshd
实战:完整的 SSH 安全加固配置
下面是一个生产环境中推荐的 /etc/ssh/sshd_config 完整配置示例:
# SSH 安全加固配置 - CentOS 6
# 最后更新:2024年
# 基本网络设置
Port 2222
Protocol 2
AddressFamily any
ListenAddress 0.0.0.0
ListenAddress ::
# 主机密钥
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
# 日志
SyslogFacility AUTH
LogLevel VERBOSE
# 认证设置
LoginGraceTime 60
PermitRootLogin no
StrictModes yes
MaxAuthTries 3
MaxSessions 10
# 密钥认证
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
# 密码认证(建议关闭)
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM yes
# 允许的用户和组
AllowUsers admin deploy
AllowGroups wheel sshusers
DenyUsers root backup
# 环境变量保持
PermitUserEnvironment no
AcceptEnv LANG LC_*
# 转发设置(根据需求调整)
X11Forwarding no
PrintMotd no
PrintLastLog yes
TCPKeepAlive yes
# 空闲超时
ClientAliveInterval 300
ClientAliveCountMax 2
# 禁止的功能
AllowAgentForwarding no
AllowTcpForwarding no
GatewayPorts no
PermitTunnel no
# 覆盖设置(确保不被 later 配置覆盖)
OverrideAgent no
# 版本信息隐藏
Banner /etc/issue.net
记得修改后重启 SSH 服务:
service sshd restart
重要提示:修改配置前,先备份原配置,并在本地保持一个备用连接,防止把自己锁在外面!
权限最小化原则:让每个用户只做该做的事
安全加固不只是改配置,还要从用户权限层面控制。原则是:最小权限。
1. 创建专用服务账户
不要所有人都用 root。为不同任务创建专门账户:
# 创建部署账户
useradd -m -s /bin/bash deploy
passwd deploy
# 创建监控账户
useradd -m -s /sbin/nologin monitor
2. Sudoers 精细配置
编辑 /etc/sudoers(使用 visudo 命令,防止语法错误):
visudo
添加以下规则:
# admin 用户拥有完整 sudo 权限
admin ALL=(ALL) ALL
# deploy 用户只能重启特定服务
deploy ALL=(root) NOPASSWD: /sbin/service httpd restart, /sbin/service mysqld restart
# monitor 用户只能查看日志
monitor ALL=(root) NOPASSWD: /usr/bin/tail, /usr/bin/cat /var/log/*
测试权限:
su - deploy
sudo service httpd restart
3. 文件权限控制
确保 SSH 相关文件和目录权限正确:
# 检查 .ssh 目录权限
chmod 700 /home/username/.ssh
chmod 600 /home/username/.ssh/authorized_keys
chmod 600 /home/username/.ssh/id_rsa
chown -R username:username /home/username/.ssh
如果权限不对,SSH 会拒绝登录。这是常见的“登录失败”原因之一。
故障排查:遇到登录失败怎么办?
回到开头的那个案例。当出现 Permission denied 时,按以下步骤排查:
1. 检查 SSH 服务状态
service sshd status
service sshd restart
2. 查看详细日志
tail -f /var/log/secure
tail -f /var/log/messages
3. 测试本地登录
先在本机测试,避免远程锁死:
ssh -v username@localhost
-v 参数显示详细调试信息,能定位具体哪一步失败。
4. 常见错误及解决
| 错误信息 | 可能原因 | 解决方案 |
|---|---|---|
| Permission denied (publickey,…) | 密钥不对或权限问题 | 检查 authorized_keys 权限 |
| Connection refused | SSH 服务未启动或端口错误 | 检查服务状态和端口 |
| Connection timed out | 防火墙阻挡 | 检查 iptables 规则 |
| Too many authentication failures | 触发 fail2ban | 等待解封或手动解除 |
5. 防火墙配置
CentOS 6 使用 iptables:
# 允许新端口 2222
iptables -I INPUT -p tcp --dport 2222 -j ACCEPT
# 保存规则
service iptables save
# 重启防火墙
service iptables restart
监控与审计:保持长期安全
安全不是一次性配置,需要持续监控:
1. 登录审计
查看历史登录记录:
last
lastb # 查看失败的登录尝试
lastlog # 查看每个用户最后登录时间
2. 实时监控
使用 auditd 监控 SSH 活动:
# 安装 audit
yum install audit
# 添加规则:监控 /etc/ssh 目录
auditctl -w /etc/ssh -p wa -k ssh_config
# 查看审计规则
auditctl -l
3. 定期安全扫描
# 检查 SSH 配置弱点
ssh-audit server_ip:2222
# 或使用 Openssh 官方建议检查
ssh -G server_ip
给小朋友的比喻:SSH 就像你家大门
如果上面这些概念太技术,我用一个比喻来解释:
- SSH 端口:就像你家门的门牌号。默认是 22 号,坏人很容易找到。换成 2222 号,坏人就得满小区找。
- 密码认证:就像用钥匙开门。钥匙可以复制,有人偷窥到密码就能进来。
- 密钥认证:就像你用指纹或人脸识别。每个人独一无二,很难模仿。
- root 用户:就像小区的总管理员,权力最大,但也最危险。不应该直接让坏人找到他。
- AllowUsers:就像门禁卡,只有指定的人才能进入小区。
- fail2ban:就像一个警惕的保安,发现有人多次按错门铃(输错密码),就把他拉黑名单,禁止进入。
- Sudo:就像你妈妈给你的零花钱权限,只能买特定东西,不能随便花光所有钱。
这样理解是不是清晰多了?
总结:安全是一个过程,不是一次性任务
CentOS 6 虽然老旧,但 SSH 安全的基本原则是通用的:
- 禁用 root 直接登录
- 使用密钥认证代替密码
- 更改默认端口
- 限制允许登录的用户和组
- 安装 fail2ban 防止暴力破解
- 最小化用户权限
- 定期审计和监控
回到那个凌晨三点的案例,最终我是通过以下方式解决的:
- 联系机房运维,通过控制台直接登录服务器
- 检查
/etc/ssh/sshd_config,发现PermitRootLogin yes被意外修改 - 临时修改配置,允许 root 从特定 IP 登录
- 修复后,重新加固配置,重启 SSH 服务
- 安装 fail2ban,设置更严格的策略
从那以后,我养成了习惯:修改 SSH 配置前,先开一个备用终端,配置好后再关闭主连接。永远不要把自己锁在门外。
希望这个从真实案例出发的指南,能帮你搭建起稳固的 SSH 安全防线。如果有具体问题,欢迎随时交流!
