作为常年跟阿里云ECS打交道的运维,我接手一台服务器后的第一件事,永远是检查它的登录方式。如果它还开着root密码登录,我几乎能想象到它在公网上被扫描器撞库的画面——每天成千上万次的暴破尝试,就等着一个弱密码送上门。所以这篇内容,就是把ECS从“密码登录”切换到“密钥认证”的完整实操,工具用Windows下最顺手的MobaXterm。
这篇指南不是简单的“点两下就完事”的操作截图,我会把密钥认证的工作原理、MobaXterm的选型理由、生成密钥、部署公钥、关闭密码登录、常见故障排查全部串起来讲清楚。无论你是刚买了一台ECS的新手,还是被云盾告警骚扰到不行想彻底加固的老手,照着做,基本都能在一小时内完成迁移。
1. 为什么要从密码登录切到密钥认证:安全账本与工作原理
1.1 密码登录在公网上的脆弱性
先把账算清楚。一台公网ECS暴露在互联网上,22端口是扫描器最爱碰的目标。阿里云安全组如果直接放行22端口给所有人,你的服务器每时每刻都在接收大量SSH连接请求。攻击者手里有巨大的密码字典,配合自动化工具轮番尝试root、admin、123456这类常见弱口令。
你可能觉得“我密码设得够复杂就没事”,但问题是:复杂密码照样存在被社工钓鱼、在聊天记录里泄露、在笔记软件里被翻出来的风险,而且一旦泄露,攻击者就能长驱直入。密码本质上是“共享秘密”,只要你告诉过别人或者存过某个地方,这个秘密就不再完全属于你。
换一个角度,就算你的ECS设置了高强度密码,很多运维团队为了省事会直接用同一个密码覆盖多台机器。一台机器被攻破,意味着所有机器都裸奔。这种“一损俱损”的账,在安全审计里非常难看。
密钥认证恰恰解决了这两个问题:私钥不出本地机器、不参与网络传输,不存在“共享秘密”被截获的渠道;而且私钥长度动辄2048位甚至4096位,暴力破解的计算成本高到完全不划算。当我把ECS切到纯密钥登录后,阿里云后台的暴力破解告警基本绝迹——这不是玄学,而是攻击者尝试了一会儿就会直接放弃。
1.2 密钥认证到底靠不靠谱:非对称加密的花样
很多人一听“密钥认证”就觉得高大上,其实原理没那么复杂。你可以把SSH密钥对想象成一把特制的锁和钥匙:公钥是锁芯,可以随便放在服务器的~/.ssh/authorized_keys文件里;私钥是钥匙,必须牢牢攥在自己手里。
当你用MobaXterm发起SSH连接时,服务器会拿你的公钥生成一段随机挑战数据,发送给客户端。客户端用私钥对这个挑战进行签名,再把签名结果回传给服务器。服务器用公钥验证签名,验证通过就放行登录。整个过程呈现“挑战-应答”模式,私钥自始至终只存在于本地,不发送到网络,即使中间有人抓包也拿不到任何能逆推私钥的信息。
这个机制还有一个好处:非对称加密里,由公钥推导出私钥在计算上是不可行的。所以公钥到处放没关系,哪怕被下载了也无所谓,没有私钥就进不去。这就是为什么把公钥装进ECS之后,服务器磁盘被拖走也不怕被人解锁登录。
1.3 切换后的真实收益
我在实际操作中的感受很明显:第一,云盾的暴力破解拦截告警数量直接归零,因为攻击者根本没有密码可用;第二,团队成员之间不用再“口头传密码”,每个人各自持有私钥,谁登录过机器一查日志就知道;第三,配合MobaXterm的会话日志保存功能,每次操作都能留痕,出了问题可以追溯。
对个人用户而言,收益更直观:你再也不用记那个长到反人类的服务器密码,也不用三天两头换密码怕被猜中,私钥文件在你的U盘或本地磁盘里,插上就能连。
2. 工具选型:MobaXterm凭什么胜任
2.1 MobaXterm是什么
Windows生态下,SSH客户端的选择其实不少:老牌的PuTTY、后起之秀FinalShell、Termius,甚至直接用Windows自带的OpenSSH命令行。但论综合体验,我最常用的还是MobaXterm,它的定位不只是SSH客户端,而是一个“瑞士军刀”式的远程终端工具。
第一次打开MobaXterm,你会看到左侧会话管理栏、上方功能按钮区、下方是终端窗口,而且它内置了SFTP文件管理器。连接一台Linux服务器的同时,右边就能直接拖拽文件上传下载,不用单独开一个WinSCP。这种“终端+文件传输”合一的设计,省掉了大量窗口切换的时间损耗。
更关键的是,MobaXterm自带X Server功能。如果你需要通过SSH运行Linux上的图形界面程序,比如安装Oracle数据库时的图形安装向导,它能直接把窗口拉到Windows桌面上来显示,不用额外装Xming这类工具。
2.2 为什么不用PuTTY+WinSCP组合
PuTTY是经典,但它的痛点也很明显:密钥格式用的是.ppk,跟OpenSSH标准密钥格式不兼容;生成密钥要打开PuTTYgen,传文件要另开WinSCP,配置文件散落各处。每次新建服务器连接,都得重新填主机、端口、用户名,体验非常割裂。
MobaXterm虽然也类基于PuTTY生态,但它把密钥解析做了统一。MobaXterm的MobaKeyGen生成的密钥,既可以保存为.ppk格式,也可以通过菜单直接导出OpenSSH格式的私钥。更贴心的是,在SSH会话配置里,它既能直接加载.ppk文件,也能加载OpenSSH私钥文件,不需要来回转换格式。这一点在实际操作中太省心了。
2.3 安装与基础设置(中文界面、日志)
MobaXterm官网提供免费版和付费版,个人日常使用免费版完全够用。下载后有两种形态:安装版和便携版。我推荐便携版,直接解压到D盘或U盘就能运行,重装系统后也不用重新配置会话。
首次启动后,建议先把两件事做好:
- 设置中文界面:进入
Settings → Configuration → General → Language,下拉选择“中文(简体)”,重启软件即可。需要说明的是,官方自带的多语言切换是完整可用的,没必要去找汉化补丁版本,官方版更稳定可靠。 - 开启会话日志:进入
Settings → Configuration → SSH,把“SSH会话日志”设为自动保存,并指定日志目录。这样每次连接服务器,所有操作都会以日期命名写入日志文件,安全审计和排障时翻日志非常有用。
3. 实操步骤:从生成密钥到封锁密码通道
3.1 Step 1:用MobaKeyGen生成RSA密钥对
打开MobaXterm后,点击菜单栏的Tools → MobaKeyGen (SSH key generator),这就是MobaXterm内置的密钥生成器。界面跟PuTTYgen很像,但集成的更好。
在参数区,Type选择RSA,密钥位数建议选4096。有人问2048够不够,坦白说2048在当前安全性下仍然可用,但4096的强度余量更大,而且软硬件成本几乎可以忽略,没必要省这一点。如果你使用的是较新的系统,也可以选择Ed25519,它是更现代的橢圆曲线算法,密钥更短、性能更好,但有些老系统对它的支持不完善,RSA 4096是兼容性最稳的选择。
点击Generate之后,MobaKeyGen会提示你在界面空白区域移动鼠标,用鼠标轨迹产生的随机性来生成密钥。这时候随便在框里画圈、上下晃动,直到进度条跑完即可。生成完成后,上面会出现一大串ssh-rsa AAAA...开头的公钥内容。
接下来按顺序做三件事:
- 在
Key comment栏填一个备注,比如my-ecs-key。这个备注会跟随公钥尾部,方便你日后识别这把钥匙属于哪台机器。 - 点击
Save private key,保存私钥。注意:不要给私钥设置密码(passphrase)?不对,这里恰恰建议设置。给私钥加一道口令,相当于别人偷走你的私钥文件也无法直接使用。缺点是你每次连接时MobaXterm会弹窗要口令,可以用Save credentials记住。这个看个人取舍,生产环境建议加。 - 点击
Save public key,保存公钥。这个公钥文件就是你要部署到ECS上的内容。
私钥保存的时候,MobaKeyGen默认存的是.ppk格式。如果你打算只用MobaXterm,那.ppk直接能用;如果你还希望用其他工具或命令行来登录,建议在Conversions → Export OpenSSH key里再导出一份OpenSSH格式的私钥。这两份私钥文件都要妥善保管,优先放在U盘或加密压缩包中。
3.2 Step 2:把公钥部署到ECS(购买新机和已有实例)
公钥部署分两种情况,操作路径完全不同。
情况A:购买新ECS时绑定密钥对。
在阿里云ECS购买页的“登录凭证”区域,选择“密钥对”。如果还没有密钥对,点“创建密钥对”,阿里云会提供两种方式:直接在控制台生成,或者导入你自己的公钥。我比较推荐导入自己生成的公钥,因为私钥已经保存在本地MobaXterm里,阿里云控制台生成的密钥对虽然也能下载私钥,但多一道下载环节就多一份泄露风险。
选择“导入已有公钥”,把MobaKeyGen界面里的公钥整段复制进去,填个密钥对名称,创建完成后在购买页面选中它就行。实例启动后,阿里云会把公钥自动写入root用户的~/.ssh/authorized_keys文件,你不需要做任何额外操作,直接用MobaXterm密钥登录即可。
情况B:已有ECS实例,手工写入公钥。
对已经用密码登录跑着的机器,操作也不难。先用现有方式登录ECS(比如密码SSH或阿里云控制台Workbench远程连接),然后执行下面这几条命令:
mkdir -p ~/.ssh chmod 700 ~/.ssh echo "ssh-rsa AAAA... my-ecs-key" >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys第一条命令创建.ssh目录(如果不存在),第二条把目录权限设为700(仅自己可读写执行),第三条把公钥追加到authorized_keys,第四条把文件权限设为600(仅自己可读写)。这几步权限设置非常关键,后面排查无法登录的时候,大部分问题都出在这里。
如果你是给普通用户配置而不是root,比如用户叫admin,把命令里的~替换成/home/admin,并确保.ssh目录和authorized_keys文件的所有者是admin。
3.3 Step 3:配置MobaXterm密钥登录会话
接下来回到MobaXterm,新建一个SSH会话。
点左上角Session,选择SSH,填写以下信息:
- 远程主机:ECS公网IP
- 端口:22
- 用户名:root(或你的普通用户名)
先不要急着点连接,展开Advanced SSH settings,勾选Use private key,然后浏览选择你刚才保存的私钥文件,.ppk或OpenSSH格式都可以。
填好后点OK保存会话,双击这个会话发起连接。如果一切正常,MobaXterm会直接用私钥完成认证,不会再询问密码。如果私钥设置了passphrase,则可能弹窗输入口令。
这里确认能连上之后,先别急着关掉当前会话。保持这个窗口一直开着,再去进行下一步配置。这个经验非常重要,相当于给自己留一条备用通道,万一修改配置时出了问题,你还有这个已认证的会话可以撤销。
3.4 Step 4:修改sshd_config彻底禁用密码认证
密钥登录验证通过后,才轮到“关密码”。这一步要做的是修改SSH服务端配置/etc/ssh/sshd_config。
先备份配置文件:
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date +%F)然后编辑文件:
vim /etc/ssh/sshd_config重点确认以下几项。按这些值设置:
PermitRootLogin prohibit-password PubkeyAuthentication yes PasswordAuthentication no KbdInteractiveAuthentication no ChallengeResponseAuthentication no先说PermitRootLogin。如果设成no,root无法直接SSH登录,你需要先用普通用户登录再sudo切换;如果设成yes,代表root仍然允许密码登录,这对我们来说又回到了不安全状态。prohibit-password的意思很微妙:允许root通过密钥登录,但禁止root通过密码登录。这是最推荐的组合,既方便管理,又堵死了密码暴破这条路。
PasswordAuthentication毫无疑问设为no,这是关键开关。
ChallengeResponseAuthentication和KbdInteractiveAuthentication在部分系统的实现里也走密码验证流程,为了避免漏网之鱼,一并关掉。
一个容易忽略的点是:修改完文件后,先执行sshd -t检查语法,再重启服务。sshd -t只会检查配置文件的正确性,不会影响当前运行中的SSH服务。
sshd -t systemctl restart sshd如果系统是Ubuntu/Debian的老版本,重启命令用service ssh restart,CentOS 7及以后、Alibaba Cloud Linux、以及其他大多数Systemd发行版,都用systemctl restart sshd。
重启完sshd后,在已经打开的MobaXterm会话里再开一个标签页,重新连接一次ECS。确认用密钥依然能顺利登录。然后,找一个无法访问的终端窗口或换个网络环境,尝试用密码登录一次,你会发现果断被拒。密码通道从此关闭。
4. 常见问题与排查技巧实录
4.1 提示 sshpass: command not found
这个报错在MobaXterm连接时时有出现,尤其是使用密码方式连接远程主机的时候。
原因是MobaXterm某些场景下会调用外部sshpass工具来传递密码,而Windows环境里并没有这个命令。我在实践中发现,这个报错绝大多数出现在会话配置里选择了外部SSH工具而不是内嵌引擎的情况,或者空密码会话触发的兼容分支。
解决办法很简单:优先确认你的会话已经改用私钥认证,密钥登录不需要sshpass;如果某个特殊场景仍然要用密码,检查MobaXterm的Settings → Configuration → SSH,确认没有强制勾选某些外部ssh的兼容选项。实在不行,最简单粗暴的做法是直接用私钥方案,绕开密码传输就没有这个报错。
4.2 Permission denied (publickey) 的排查顺序
密钥登录时最烦的就是提示Permission denied (publickey),服务端日志里写着Authentication refused或者No supported authentication methods。这时候按下面这个顺序查:
- 私钥格式是否匹配:MobaXterm加载的是
.ppk还是OpenSSH私钥?如果文件被编辑器改动过或者换行符不对,会导致解析失败。重新用MobaKeyGen导出一次。 - 公钥是否写入正确位置:登录用户如果是
root,公钥要写在/root/.ssh/authorized_keys;如果是普通用户,要写进/home/用户名/.ssh/authorized_keys。写错地方是新手最常见的错误。 - 权限是否过松:
.ssh目录必须是700,authorized_keys文件必须是600。权限过松时,OpenSSH出于安全考虑会直接拒绝使用这个公钥。执行一遍chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys。 - SELinux上下文:如果你用的是CentOS/Rocky/AlmaLinux这类带SELinux的系统,有时文件权限和用户都对,却仍然无法登录。可以先尝试
restorecon -R ~/.ssh恢复SELinux的安全上下文,再看是否能登录。 - authorized_keys内容是否有断行:公钥必须是一整行,如果粘贴时被自动换行拆成多行,一样会认证失败。用
cat -A /root/.ssh/authorized_keys查看每行末尾的换行符情况。
4.3 MobaXterm连接超时,端口不通
连接超时大多是网络层问题,不是密钥配置问题。首先要查阿里云安全组:控制台里找到你的ECS实例,查看安全组规则,确认入方向是否放行了22端口。常见错误是只放行了80/443,或者放行了80/443后忘记了22。
其次检查本地网络,有些公司或家庭网络禁用22端口,或者某些网络环境需要走代理。MobaXterm的会话配置里也可以设置代理服务器,如果你在公司网络环境下,可能需要给SSH会话单独配置代理。
最后看服务器自身防火墙。用阿里云控制台Workbench直接登录服务器,执行systemctl status firewalld查看防火墙状态,必要时执行firewall-cmd --permanent --add-service=ssh && firewall-cmd --reload放行SSH服务。
4.4 改完sshd_config后把自己锁在门外
这个属于“经典翻车”场景:改完配置文件,重启sshd,然后当前连接一断,发现再也连不上了。原因可能是密钥配置有问题、sshd_config语法出错、或者SELinux拦了一刀。
万一真被锁在门外,还有一条保命通道:阿里云控制台里的“远程连接”功能。打开ECS实例详情页,点“远程连接”,可以启动一次VNC或Workbench云端终端,不需要SSH,直接在网页上进入服务器系统。然后打开/etc/ssh/sshd_config,把PasswordAuthentication改回yes,systemctl restart sshd,再用密码登录进去慢慢排查。
吃了几次亏之后,我现在已经把“先开一个已经认证的MobaXterm会话再动sshd_config”变成铁律。改配置之前,我还会顺手开好阿里云的Workbench页面,两头留退路。
4.5 小细节:中文界面、日志、多主机管理
如果你下载的MobaXterm打开还是英文,刚才提过,Settings → Configuration → General → Language里切换为中文并重启即可。
日志保存也值得多说一句。安全升级这件事不只是“把密码关掉”,更重要的是“每步操作可回溯”。在MobaXterm的会话设置里,勾选“日志自动保存”,选择保存路径后,以后每次SSH操作都会留下记录。哪天出了事故,翻日志就知道谁在哪台机器上执行过什么命令,这个习惯在团队协作里非常有用。
多主机管理方面,我建议你在左侧会话栏按项目建几个文件夹,比如“生产环境”“测试环境”“个人实验室”,然后把不同账号的会话拖进去。每个会话的密钥可以独立指定,这样即使多台ECS共用同一把私钥,也能在MobaXterm里理得清清楚楚。
写在最后的一点经验
把密码登录彻底关掉之后,我最大的感受不是“安全了”这三个字的一劳永逸,而是告警变少了、日志变清晰了、操作变简单了。云盾围绕暴破的告警确实归零,但真正让我安心的,是所有入口都收敛到了私钥这一个点上:私钥在,人就在;私钥丢了,我随时可以吊销公钥重新换一把。
最后分享一个习惯:每半年左右轮换一次密钥对。换的方法很简单——生成新密钥,把新的公钥追加到ECS的authorized_keys里,确认新私钥能登录后,再从authorized_keys里删掉旧公钥。全程不用改sshd_config,也不用重启服务,只是在MobaXterm里换一下私钥文件路径而已。
顺带说一句,私钥文件千万别往网盘、聊天工具里传,也尽量别用工作微信发来发去。把它放进本地加密磁盘或者加密压缩包里,密码和密钥分开存放,这样就算机器丢了,别人拿到私钥文件也要先过密码那一关。这套组合拳打下来,你的阿里云ECS才算真正有点固若金汤的意思了。