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

资讯详情

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

华为云CentOS密钥登录全攻略:从密码到密钥,安全与便利兼得

华为云CentOS密钥登录全攻略:从密码到密钥,安全与便利兼得 直接在华为云上买过Centos服务器的朋友估计都经历过这么一个场景控制台创建实例的时候系统提示你设置登录方式很多人随手就选了“密码登录”然后设置一个自己都觉得难记的密码。等服务器开了通过VNC或者SSH密码登上去看似一切顺利。但用久了你会发现密码登录带来的问题比想象中多——密码泄露、暴力破解、日志里一堆Failed Password的记录......后来我把自己在华为云上跑的所有Centos实例全部切成了密钥方式登录实测下来不仅安全性上了一个台阶日常操作反而更省事。这篇文章就把我从“用密码”到“只用密钥”的完整过程、配置细节和踩过的坑全部整理出来覆盖从华为云控制台创建密钥对、绑定到Centos实例、本地客户端连接配置到常见报错排查的完整链路。不管你是刚买第一台华为云服务器的新手还是想把手头所有实例都切换成密钥登录的老手这篇文章里的步骤都可以直接照着抄。1. 为什么要用密钥登录密码方式在云服务器场景下真的不够用1.1 密码登录的三个现实痛点先说最直接的痛点。云服务器和家里那台NAS不一样它的SSH端口默认是暴露在公网上的这意味着全世界任何一个角落的人只要知道你的IP就能尝试用常见用户名和密码去“撞”。我自己的服务器在启用密钥登录之前检查过日志光是22端口上的暴力破解尝试一天就有几百上千次。虽然我用的密码足够复杂但这种事就像天天有人在你家门口试钥匙就算门锁再结实心里也不踏实。第二个问题是密码本身的管理成本。一台两台服务器还好如果服务器多了每个实例都要设一个不重复的强密码要么靠密码管理器记要么就在某个地方存一份明文清单。而这份清单一旦泄露所有服务器全部沦陷。更麻烦的是某些团队场景下成员离职后还得逐个修改所有服务器的密码运维成本极高。第三个问题也是最容易忽略的密码登录方式下密码本身会通过网络传输。虽然SSH协议是加密的但如果你用的是弱密码字典攻击直接在服务端就能碰运气撞开。更别说某些云平台的安全组配置不当或者客户端机器中了马密码被记录下来。相比之下密钥方式用的是非对称加密的一对“钥匙”私钥不参与网络传输只在本地持有安全模型完全不一样。1.2 密钥登录的原理一把锁配一把钥匙钥匙不出门密钥登录说白了就是一套“公钥加密、私钥解密”的非对称加密体系。你可以把公钥理解成一把只有锁芯的锁把这把锁放到服务器上私钥是你手里的一把专用钥匙。你把锁安在服务器门上每次要进门的时候服务器会拿出一道谜题你用私钥解开服务器确认你是钥匙的持有者就放行。整个过程中私钥永远只存在于你的本地电脑里不需要上传到任何地方也不会在网络里传来传去。而公钥哪怕被任何人拿走都没关系因为它只能用来验证你的私钥无法反推出私钥。这就是为什么密钥登录比密码登录更安全——密码在认证过程中会触碰网络私钥不会。在Centos这类Linux发行版上这套机制落地到OpenSSH服务里就是两个文件的事服务端存放公钥的文件叫~/.ssh/authorized_keys客户端持有私钥文件。连接的时候SSH客户端用私钥签名服务端用公钥验签一来一回认证就完成了。1.3 哪些场景特别适合用密钥登录个人开发者手里有多台华为云ECS希望统一身份认证不用记多套密码需要做自动化部署、CI/CD流水线脚本里用密码登录既不安全也不方便密钥方式可以免交互团队协作场景每个成员有独立的密钥服务器侧通过authorized_keys统一管理哪个人离职了只需删一条记录希望降低暴力破解风险同时保留用密码作为应急兜底手段2. 华为云创建密钥对的完整流程与细节2.1 进入密钥对管理页面操作路径很直接登录华为云控制台在顶部搜索框输入“密钥对”或者在“计算 弹性云服务器 ECS”的左侧导航栏里找到“密钥对”菜单。这里要提醒一句密钥对是分区域Region的你在华北-北京四创建的密钥对在华东-上海一是不存在的。所以创建密钥对之前先确认服务器所在区域否则后面绑定的时候会找不到密钥。这个看似细小的点我见过不少新同事踩过。进入密钥对管理页面后点击“创建密钥对”按钮。2.2 创建密钥对时的关键参数与私钥下载创建密钥对的对话窗口里有几个关键选项逐个说一下密钥对名称自定义就好建议用有辨识度的名称比如ecs-centos-dev或者ops-passwordless方便后续多个密钥对时区分密钥类型华为云支持SSH_RSA和SSH_ED25519两种。如果客户端环境都比较新建议选ED25519算法更高效密钥更短如果考虑到老系统兼容性选SSH_RSA也没问题点击“确定”后系统会立即生成密钥对并自动弹出一个下载私钥文件的提示。这里有一个极其关键的注意点私钥文件只在这个时刻提供一次下载关闭窗口后就再也无法从华为云控制台获取了。所以下载下来的私钥文件一定要妥善保存。我个人的建议是立即把私钥文件移动到本机的~/.ssh/目录macOS/Linux或指定安全目录Windows不要一直放在“下载”文件夹里对私钥文件设置合适的权限这个后面专门说最好在一开始就批量创建几个密钥对分别用于开发环境、生产环境避免以后复用同一把钥匙导致权限边界模糊下载下来的私钥文件在Windows上通常是.pem格式在Linux/macOS上也是一个文本文件。这个文件里包含了完整的私钥内容开头一般是-----BEGIN RSA PRIVATE KEY-----或者-----BEGIN OPENSSH PRIVATE KEY-----。2.3 密钥对的三种使用时机华为云上的密钥对不是只能在新购服务器时用实际上有三种场景新购ECS实例时直接绑定在“购买弹性云服务器”的向导里登录方式选择“密钥对”然后下拉选择一个已有的密钥对对已有ECS实例重置密钥对在ECS实例的详情页找到“重置密钥对”或“更换密钥对”的选项。可以解绑旧的密钥对绑定新的通过控制台VNC登录后手动配置这是纯手动方案在服务器里面操作authorized_keys文件前面两种是华为云控制的第三种是灵活的通用方案。本篇重点覆盖场景一和场景二也就是云平台托管的密钥方式。3. 购买并绑定Centos云服务器实例3.1 购买ECS实例时的登录方式选择在华为云上购买弹性云服务器ECS时有几个配置需要按实际情况来选择镜像类型选择“公共镜像”操作系统选 CentOS版本按需求选。CentOS 7.9 目前还是很常见的稳定选择CentOS Stream 或者 8.x 也可以但要注意官方支持周期登录凭证这里就是关键了选择“密钥对”然后在密钥对下拉框里选择之前创建好的密钥对云硬盘、网络、安全组等按常规配置即可这里要特别说一句如果你购买的是竞价计费实例或者按需实例建议在购买前就把密钥对准备好因为竞价实例的启动速度很快如果临时抱佛脚创建密钥对可能会来不及绑定。3.2 首次启用密钥登录前安全组别拦错端口SSH默认走22端口所以在安全组规则里要确保入方向放行了TCP 22端口。我遇到过一种情况远程端口改了比如改成2222但是安全组里没放行结果密钥配得再对也连不上。华为云安全组规则配置入口在“控制台 网络 虚拟私有云 VPC 安全组”找到实例绑定的安全组添加入方向规则优先级默认1即可策略允许协议端口TCP 22源地址如果要更严格可以只填你自己的公网IP或者办公网段如果图省事可以填0.0.0.0/0但我不建议这么做。把源地址收紧是低成本高收益的加固手段另外如果服务器有弹性公网IPEIP记得先绑定好EIP否则本地无法直接通过公网访问。3.3 已有密码登录实例如何切换到密钥登录又不断连如果你手头已经有通过密码登录的Centos实例想切换到密钥登录最稳妥的方式是先在本地生成密钥对然后把公钥追加到服务器的“authorized_keys”文件中。步骤大概是本地生成密钥对如果还没有的话用密码登录服务器编辑~/.ssh/authorized_keys把公钥内容追加进去测试密钥登录成功后再决定是否彻底关闭密码登录这条路径的好处是即使密钥登录配置失败你仍然可以通过密码登录进入服务器修复不会把自己锁在门外。所以我在实际操作中都是先“添加密钥认证”测试通过后再“禁用密码认证”而不会一步到位。4. 本地客户端连接Centos前的准备工作4.1 Windows系统用PuTTY还是直接用OpenSSHWindows用户登录华为云Centos服务器常见有两种方式第一种用Windows 10/11自带的OpenSSH客户端直接在PowerShell或者CMD里敲命令。这种方式最轻量推荐优先使用。检查方法是打开PowerShell输入ssh如果提示使用方法说明已经有了。如果没有可以在“设置 应用 可选功能”里添加“OpenSSH 客户端”。第二种用PuTTY。PuTTY的好处是图形化界面而且自带PuTTYgen可以处理密钥格式转换。但要注意华为云下载下来的私钥文件通常是OpenSSH格式PuTTY直接识别不了需要用PuTTYgen做一次格式转换打开PuTTYgen点击“Load”加载私钥文件加载时文件类型要选择“All Files (.)”加载成功后点击“Save private key”保存为PuTTY的.ppk格式在PuTTY的“Connection SSH Auth”里加载这个ppk文件这一步是Windows上最容易出问题的地方很多人用PuTTY登录报错“Unable to use key file”绝大多数都是因为没做格式转换。4.2 macOS/Linux直接使用OpenSSH零额外依赖macOS和主流Linux发行版自带的OpenSSH客户端直接就能用无需安装任何额外工具。私钥文件下载后我建议立刻移动到~/.ssh/目录下然后执行mv ~/Downloads/your-key.pem ~/.ssh/your-key.pem chmod 400 ~/.ssh/your-key.pem到这里文件就准备好了连接命令很简单ssh -i ~/.ssh/your-key.pem root你的服务器IP4.3 私钥文件权限chmod 600还是400为什么太宽松会报错之所以要把私钥权限改到600或400是因为OpenSSH客户端有一个安全机制如果发现私钥文件的权限过于宽松比如其他用户也能读它会直接拒绝使用这个密钥并报出类似这样的错误Permissions 0644 for your-key.pem are too open.这个设计初衷很好防止私钥被同机器的其他用户窃取。权限数字对照400所有者只读这是最安全的600所有者可读可写也可以接受千万避免使用644这种默认下载权限。我的做法是统一设成400因为私钥文件只需要读不需要写。4.4 常见SSH客户端一览客户端平台特点适合人群OpenSSH命令行Linux/macOS/Windows轻量、脚本友好所有用户PuTTYWindows图形化、老牌习惯图形界面的用户TermiusWindows/macOS/Linux/移动端跨端同步、界面现代多设备用户Visual Studio Code Remote-SSH各平台编辑器集成、开发方便开发人员XshellWindows标签页管理、功能丰富运维人员实际使用中我自己最常用的还是命令行OpenSSH加VS Code Remote-SSH前者用于快速登录后者用于写代码和改配置。5. 实战密钥方式登录Centos服务器的完整过程5.1 命令行方式登录的详细解析假设你已经有一台华为云Centos服务器EIP是1.2.3.4私钥文件在~/.ssh/ecs-centos.pem。登录命令ssh -i ~/.ssh/ecs-centos.pem root1.2.3.4如果一切正常你会直接进入服务器的shell没有密码输入过程。第一次连接时如果服务器不在known_hosts里会有一个确认提示The authenticity of host 1.2.3.4 (1.2.3.4) cant be established. ECDSA key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxx. Are you sure you want to continue connecting (yes/no/[fingerprint])?输入yes回车即可。这里有个优化点如果你希望以后不用再指定私钥文件路径可以在~/.ssh/config里配置主机别名。例如建一个~/.ssh/config文件内容如下Host my-centos HostName 1.2.3.4 User root IdentityFile ~/.ssh/ecs-centos.pem保存后以后只需要执行ssh my-centos就能直接登录不用记IP、用户名、密钥路径。5.2 Windows下用PuTTY登录的图形化操作如果你选择PuTTY界面上的操作分四步在“Session”页面Host Name填服务器EIPPort填22Connection type选SSH在左侧“Connection SSH Auth”中点击“Browse”选择转换好的ppk私钥文件回到“Session”页面在Saved Sessions里填一个名字点“Save”方便下次直接双击加载点击“Open”开始连接首次连接会弹出指纹确认点“Accept”即可登录进去以后PuTTY的窗口会自动以root身份或者你创建的用户进入系统。5.3 首次登录后的系统自查清单密钥登录成功只是万里长征第一步。进了系统之后我建议按这个顺序做一遍基础体检确保后续使用不踩坑# 查看系统版本 cat /etc/centos-release # 查看内核 uname -a # 检查SSH服务状态 systemctl status sshd # 查看是否有异常登录记录 last -n 20 # 检查密钥是否已经生效到authorized_keys cat ~/.ssh/authorized_keys # 查看磁盘空间 df -h确认无误后可以顺手做两件小事一是把系统时间校准一下安装chrony或使用ntpdate同步时间二是更新一下系统软件包缓存。这些和密钥登录本身无关但属于服务器初始化应有的操作。5.4 登录日志验证与安全确认登录成功之后可以通过服务端日志确认这次登录是通过密钥认证而非密码认证。执行sudo grep sshd /var/log/secure | tail -20在日志里如果看到类似这样的一行Accepted publickey for root from 1.2.3.4 port 52314 ssh2: RSA SHA256:xxxxxxxx这就说明这次登录是公钥认证成功。而如果是密码登录日志里一般是Accepted password for root from 1.2.3.4 port 52314 ssh2养成查看登录日志的习惯可以帮你及时发现异常认证行为。6. 常见问题与排查技巧实录6.1 Permission denied (publickey) 的排查流程密钥方式登录时最常见的报错就是root1.2.3.4: Permission denied (publickey,gssapi-keyexch,chost)这个问题产生的原因有很多不要急按顺序排查先确认自己用的用户名对不对。如果是Centos公共镜像默认用户是root确认私钥文件路径是否正确有没有输错-i参数确认私钥权限是不是400或600执行ls -l ~/.ssh/your-key.pem检查确认服务器上authorized_keys文件里是否有对应的公钥确认SSH服务配置文件/etc/ssh/sshd_config里没有禁用公钥认证关键参数是PubkeyAuthentication yes确认SELinux没有拦截SSH对 authorized_keys 文件的访问这个排查顺序基本能覆盖90%的“Permission denied”场景。我自己碰到过最奇葩的一次是服务器上/root目录权限变成了777结果sshd因为目录权限过宽拒绝读取authorized_keys文件。把/root权限改回700后问题消失。6.2 私钥文件权限报错的两种处理办法如果Windows下用OpenSSH登录有时会遇到Bad permissions. Try removing permissions for others.解决办法有两个一是在PowerShell里用icacls命令修改权限icacls .\your-key.pem /inheritance:r /grant:r %USERNAME%:R二是直接把私钥文件复制到一个干净的目录然后右键 属性 安全把除了当前用户之外的所有用户都删掉并确保Administrators没有读权限。换到macOS或Linux下就是老生常谈的chmod 400 your-key.pem。6.3 密钥登录失败时的应急兜底华为云VNC如果你在本地怎么调都连不上最可靠的后备方案是华为云控制台自带的VNC登录。在ECS实例列表的操作列点击“远程登录”就能打开一个网页版的终端。这个终端完全走云平台内部通道不依赖SSH端口不需要密钥也不依赖你在本地配置的客户端如果VNC能登上说明服务器本身没问题问题出在密钥或SSH配置层面。VNC登录进去后你就可以检查ssh配置、authorized_keys文件、权限问题等。这种“带外管理”通道是云服务器相比物理机的一大优势关键时刻能救命。6.4 私钥丢失后的补救方案假设你的私钥文件被误删了或者本地电脑坏了该怎么登录服务器华为云控制台提供了“重置密钥对”的功能。在ECS实例详情页找到“密钥对”相关选项选择重置为新的密钥对然后下载新的私钥文件。这个过程需要你通过控制台的登录凭证或VNC先做身份验证验证通过后即可执行。这是云托管的密钥对和自建密钥对最大的区别云平台在密码之外还留了一个带外管理的入口让你在私钥失效时还有恢复的办法。但如果你当初是手动在服务器上配置的authorized_keys并且云平台侧没有保留公钥记录那恢复流程会复杂得多。这也是为什么我比较推荐直接用华为云托管的密钥对功能而不是完全手动自建。6.5 使用密钥登录后还需不需要保留密码登录如果你已经确认密钥登录稳定可用可以考虑在sshd_config里禁用密码认证PasswordAuthentication no修改完成后重启sshd服务sudo systemctl restart sshd这里有个重要提醒在禁用密码认证之前一定要先确认你至少有一条可用的密钥登录途径。否则一旦配置错误或者密钥在客户端丢失你又没开启VNC或绑定其他登录方式那就真的是“进不了门”了。我的建议是第一步先启用密钥认证第二步通过密钥登录测试几天第三步再关闭密码认证。整个过程给足自己缓冲。7. 密钥管理的进阶实操与安全习惯7.1 多服务器场景下的密钥组织方式如果你有多台华为云ECS不建议所有服务器共用同一把私钥。虽然共用一把密钥操作最方便但一旦私钥泄露所有服务器都暴露无遗。比较好的做法是按环境划分开发环境一组密钥、生产环境一组密钥按项目划分每个项目组使用独立的密钥对按人划分每个团队成员有一个独立的密钥公钥加入服务器的authorized_keys按人划分时在华为云上创建密钥对并下载私钥然后把公钥内容配置到服务器上。这样哪个人离职了只需要把对应的公钥从服务器上删掉其他人不受影响。7.2 利用ssh config管理多主机连接服务器多了以后IP地址、用户名、密钥路径很容易记混。我强烈建议在客户端配置~/.ssh/config文件来统一管理语法很简洁Host prod-web1 HostName 1.2.3.4 User root IdentityFile ~/.ssh/prod-web1.pem Host prod-web2 HostName 1.2.3.5 User root IdentityFile ~/.ssh/prod-web2.pem配置好后ssh prod-web1即可直连完全不用记IP和密钥路径。VS Code的Remote-SSH也支持读取这个config文件在开发环境里配置好后打开VS Code就能直接选择远程主机效率会明显提升。7.3 定期轮换密钥的策略密钥和密码一样需要定期轮换。华为云的密钥对管理页面支持删除旧的密钥对并创建新的配合ECS的重置密钥对功能可以做到比较平滑的轮换在华为云创建新的密钥对在ECS实例上执行“重置密钥对”绑定新密钥本地用新私钥测试登录确认无误后把旧密钥对从华为云控制台删除同时删除本地旧私钥轮换周期可以根据团队安全策略来个人使用的话一年一次也不算频繁。关键是不要一次轮换太多服务器分批次进行可以降低操作失误的风险。7.4 与密码登录相比的整体安全收益最后从安全收益角度做一个对比方便你给团队决策时解释维度密码登录密钥登录暴力破解容易被字典攻击无法暴力破解密码泄露风险网络传输、中间人风险私钥不触网多服务器管理多密码难以管理统一密钥策略自动化支持需要expect等技巧原生免交互审计与回收需要逐个改密删除公钥即可回收从我个人的实际体验来说华为云服务器 Centos 密钥登录这套组合最直观的感受是日志里再也没有海量的Failed Password攻击记录了配合修改SSH默认端口和配置fail2ban的话基本上可以睡个安稳觉。如果你想在这条路上再深挖一步可以研究一下在Centos上配置双因素认证比如结合TOTP把密钥验证和OTP验证叠加起来用那是另一个安全级别的玩法。这里也分享一个小习惯任何时候在服务器上修改SSH相关配置我都是先开一个新的连接测试确认没问题后再关闭旧连接而不是直接在一个连接里改了配置又重启ssh。毕竟SSH配置改错的后果经常是直接把自己锁在门外。
返回列表