哈喽,朋友。看到CentOS 6这个词,我猜你可能是在维护一套“古老”但依然坚挺的遗留系统,或者是在一个封闭的内网环境里跑着关键业务。虽然红帽早就在2020年停止了对CentOS 6的支持(它确实是Linux世界的“活化石”了),但在很多传统企业、工控设备或者老式服务器上,它依然在发光发热。
今天咱们不聊那些虚头巴脑的理论,直接切入实战。我会把这事儿讲得就像咱俩坐在机房里,我拿着鼠标,你看着屏幕一样。咱们要把SSH这扇“门”给守好了,毕竟这是你进入服务器内部的唯一通道,通道不安全,里面再有钱也是给别人做嫁衣。
先把工具箱摆好
在动手改配置之前,你得确保手边有这几样东西,就像修车得有扳手一样:
- 一台已经装好CentOS 6的机器(物理机、虚拟机,甚至是你云厂商里的老实例)。
- 本地客户端:
- Linux/Mac用户:终端自带,无需安装。
- Windows用户:推荐用 PuTTY、Xshell 或者 MobaXterm。别再用那种十年前的老旧终端模拟软件了,效率低还容易出bug。
- 密钥生成工具:如果在Linux/Mac上,用
ssh-keygen;Windows上PuTTY自带puttygen.exe。 - root权限:没错,这事儿你得用root干,或者有个能sudo的账号。
第一步:开放防火墙,让SSH流量畅通无阻
很多时候,连不上SSH不是SSH服务挂了,而是被墙挡在外面了。CentOS 6用的是经典的iptables,跟现在的firewalld(CentOS 7⁄8+)不一样,别搞混了。
1.1 检查当前防火墙状态
先看看你的防火墙开着没,端口通没通。
# 查看iptables规则
sudo iptables -L -n -v
# 或者直接看服务状态(虽然iptables本身没有systemd服务名,但可以看init.d状态)
sudo service iptables status
如果看到Chain INPUT (policy ACCEPT),说明根本没开防火墙,那咱们得警惕了——生产环境裸奔是很危险的,后面我会教你怎么加规则。如果看到有规则,咱们继续。
1.2 开放22端口(SSH默认端口)
我们要允许TCP协议的22端口入站。编辑iptables规则文件,或者直接命令行添加。为了持久化,咱们改配置文件:
sudo vi /etc/sysconfig/iptables
在INPUT链里,找到类似这样的一行:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
如果找不到,就在-A INPUT -j REJECT --reject-with icmp-host-prohibited这行之前插入上述规则。确保规则顺序正确,iptables是按顺序匹配的,一旦匹配成功就终止。
插好之后,保存退出,重启iptables服务:
sudo service iptables restart
1.3 验证端口是否开放
别猜,验证。用netstat看看SSH监听在哪个IP上,用telnet或nc从另一台机器测试连通性。
# 在服务器上检查SSH监听状态
sudo netstat -tlnp | grep sshd
你应该看到类似这样的输出:
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1234/sshd
tcp 0 0 :::22 :::* LISTEN 1234/sshd
如果只有127.0.0.1:22,那意味着SSH只监听本地,外网根本连不进来。这时候你得去改SSH的配置文件(后面会讲)。
如果只有:::22(IPv6),而你的网络是IPv4,那也可能连不上。确保它同时监听0.0.0.0和::,或者根据你的网络环境固定一个。
第二步:SSH服务核心配置——禁止Root直接登录
这是重中之重。很多黑客扫描的就是直接以root登录的SSH。你要做的是:创建一个普通用户,通过sudo提权,彻底关闭root的直接登录权限。
2.1 编辑SSH配置文件
sudo vi /etc/ssh/sshd_config
找到以下几行,按如下修改:
# 禁止root直接登录
PermitRootLogin no
# 允许密码认证(初期为了方便,后面我们会改用密钥,彻底禁用密码)
PasswordAuthentication yes
# 允许公钥认证
PubkeyAuthentication yes
# 指定authorized_keys文件位置(默认就好)
AuthorizedKeysFile .ssh/authorized_keys
注意:PermitRootLogin no 这个设置一旦生效,你就再也无法直接用root账号ssh进去了。如果你还没创建好普通用户,或者普通用户没配好sudo,你会把自己锁在门外。所以,务必先完成后续的用户创建和sudo配置,再重启SSH服务。
2.2 创建一个专用的运维账户
别用默认的那些账户,自己建一个,名字随意,比如ops或者admin,但别叫test这种太敷衍的。
sudo useradd -m -s /bin/bash ops
sudo passwd ops
设置一个强密码,字母+数字+符号,至少12位。这时候,你可以尝试用ops账号通过密码登录,确保路径通畅。
2.3 配置sudo权限
CentOS 6默认可能没有安装sudo,先检查:
which sudo
如果没有,装一下:
sudo yum install sudo -y
然后编辑sudoers文件,务必使用visudo命令,它会检查语法错误,避免你把自己锁死:
sudo visudo
在文件末尾添加:
ops ALL=(ALL) ALL
这意味着ops用户可以在任何主机上以任何用户身份执行任何命令。为了更安全,你可以限制只允许执行特定命令,或者允许免密码sudo(谨慎使用):
# 允许ops免密码sudo(方便运维,但有风险)
ops ALL=(ALL) NOPASSWD: ALL
保存退出后,测试一下sudo是否生效:
su - ops
sudo whoami
如果输出root,说明配置成功。
第三步:配置密钥认证——告别密码,进入“无感”安全时代
密码认证容易被暴力破解,密钥认证几乎不可能被破解(除非你的私钥泄露)。咱们来配置它。
3.1 在本地生成密钥对
Linux/Mac用户:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
一路回车,使用默认路径~/.ssh/id_rsa。这会生成两个文件:
id_rsa:私钥,千万别给别人看,也别上传到服务器。id_rsa.pub:公钥,这个要放到服务器上。
Windows用户(使用PuTTY):
- 运行
puttygen.exe。 - 点击“Generate”按钮,移动鼠标鼠标指针随机移动来生成随机数。
- 设置 passphrase(密码短语),建议设置,这样即使私钥泄露,没有密码也打不开。
- 点击“Save private key”,保存为
.ppk格式(PuTTY专用)。 - 在“Public key for pasting into OpenSSH authorized_keys file”文本框里,选中所有内容,复制。
3.2 将公钥上传到服务器
方法一:使用ssh-copy-id(最优雅)
在你的本地机器上执行:
ssh-copy-id ops@<服务器IP>
输入ops用户的密码,公钥就会被追加到~/.ssh/authorized_keys里。
方法二:手动复制(通用)
在服务器上,以ops用户登录(如果此时还能用密码登录的话):
su - ops
mkdir -p ~/.ssh
chmod 700 ~/.ssh
vi ~/.ssh/authorized_keys
把你刚才复制的公钥内容粘贴进去,保存退出。然后设置权限:
chmod 600 ~/.ssh/authorized_keys
权限非常重要! .ssh目录必须是700,authorized_keys必须是600,否则SSH会拒绝读取。
3.3 禁用密码认证,只留密钥
确认密钥登录没问题后,回到SSH配置文件:
sudo vi /etc/ssh/sshd_config
修改:
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no
把PasswordAuthentication和ChallengeResponseAuthentication都设为no。UsePAM设为no可以进一步减少一些认证绕过的风险,但有些系统依赖PAM,如果遇到问题可以改回yes。
第四步:重启SSH服务,验证新配置
现在,咱们的配置都改好了,得让服务生效。
sudo service sshd restart
千万不要直接断开当前的SSH连接! 开一个新的终端窗口,尝试用密钥登录:
ssh ops@<服务器IP>
如果设置了passphrase,它会让你输入私钥的密码。如果一切顺利,你应该直接登录进去,而不是输入ops用户的密码。
验证一下root登录是否被禁止:
ssh root@<服务器IP>
应该会提示Permission denied (publickey). 或者类似的拒绝信息。
第五步:进阶加固——让SSH更难被攻破
除了上面这些基础操作,还有几个“狠招”可以用,特别是面对公网环境时。
5.1 更改SSH默认端口
把22端口改成别的,比如2222。这不能阻止攻击,但能减少99%的自动化扫描噪音。
sudo vi /etc/ssh/sshd_config
添加或修改:
Port 2222
同时,记得在iptables里允许新端口,并删除22端口的规则:
sudo vi /etc/sysconfig/iptables
确保有:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 2222 -j ACCEPT
然后重启iptables和sshd:
sudo service iptables restart
sudo service sshd restart
之后连接就要用:
ssh -p 2222 ops@<服务器IP>
5.2 限制允许登录的用户
只有特定用户才能通过SSH登录,其他用户(包括root,虽然我们已经禁止了)一律拒绝。
在sshd_config里添加:
AllowUsers ops devops1 devops2
DenyUsers root
这样,只有ops、devops1、devops2这三个用户可以登录。
5.3 安装fail2ban,防止暴力破解
虽然咱们禁用了密码认证,但万一有人发现你的端口开放,还是会尝试密钥爆破(虽然极难)。fail2ban可以监控日志,发现多次失败登录就封禁IP。
sudo yum install fail2ban -y
sudo chkconfig fail2ban on
配置/etc/fail2ban/jail.local:
[ssh-iptables]
enabled = true
filter = sshd
action = iptables[name=SSH, port=ssh, protocol=tcp]
sendmail-whois[name=SSH, dest=root]
logpath = /var/log/secure
maxretry = 3
bantime = 3600
这里意思是:在/var/log/secure日志里,如果某个IP在1小时内尝试登录超过3次失败,就封禁它1小时(3600秒)。
启动服务:
sudo service fail2ban start
第六步:常见问题与排查技巧
即使配置再完美,偶尔也会出幺蛾子。以下是几个最常见的坑:
6.1 登录后立刻断开,或者提示“connection reset by peer”
这通常是SELinux的问题。CentOS默认开启SELinux,可能会阻止SSH访问某些目录或文件。
查看SELinux状态:
getenforce
如果是Enforcing,尝试临时关闭测试:
sudo setenforce 0
如果关闭后能登录,那就是SELinux策略问题。你可以选择长期关闭(不推荐生产环境),或者修复上下文:
sudo restorecon -Rv /home/ops/.ssh
6.2 密钥登录失败,提示“Permission denied (publickey)”
- 检查
authorized_keys文件权限是否为600。 - 检查
.ssh目录权限是否为700。 - 检查
/etc/ssh/sshd_config里PubkeyAuthentication是否为yes。 - 查看SSH服务端日志,获取更详细的错误信息:
sudo tail -f /var/log/secure
然后在你本地重新尝试登录,服务器端的日志会实时滚动,告诉你哪里出错了。
6.3 修改端口后连不上了
检查iptables规则是否生效,以及SSH服务是否监听在新端口上:
sudo netstat -tlnp | grep sshd
确保输出里有0.0.0.0:2222或:::2222。
总结
配置CentOS 6的SSH安全,核心就三步:开端口、禁Root、用密钥。
- 防火墙:用iptables开放必要的端口,其他一律拒绝。
- Root登录:坚决禁止,创建普通用户并赋予sudo权限。
- 认证方式:弃用密码,全面改用SSH密钥对,并设置passphrase。
- 加固:改端口、限制用户、装fail2ban。
这套流程走下来,你的CentOS 6服务器在SSH层面就达到了一个相当高的安全水位。虽然CentOS 6本身已经不再安全更新,但至少把大门守住了,让攻击者无机可乘。
记住,安全不是一次性的工作,而是持续的过程。定期审计日志,更新策略,保持警惕。希望这份指南能帮到你,如果还有具体问题,随时来问。祝你的服务器运行平稳,无风无浪。
