尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

阿里云ECS密钥认证实践:用MobaXterm安全关闭密码登录

阿里云ECS密钥认证实践:用MobaXterm安全关闭密码登录 作为常年跟阿里云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 为什么不用PuTTYWinSCP组合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。如果设成noroot无法直接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 restartCentOS 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目录必须是700authorized_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-servicessh firewall-cmd --reload放行SSH服务。4.4 改完sshd_config后把自己锁在门外这个属于“经典翻车”场景改完配置文件重启sshd然后当前连接一断发现再也连不上了。原因可能是密钥配置有问题、sshd_config语法出错、或者SELinux拦了一刀。万一真被锁在门外还有一条保命通道阿里云控制台里的“远程连接”功能。打开ECS实例详情页点“远程连接”可以启动一次VNC或Workbench云端终端不需要SSH直接在网页上进入服务器系统。然后打开/etc/ssh/sshd_config把PasswordAuthentication改回yessystemctl 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才算真正有点固若金汤的意思了。
返回列表