- 教程
- 云原生
【免费下载链接】learn-to-cloud
A courseware built on the belief that anyone can learn foundational cloud engineering skills with the right guide and discipline
本篇指南围绕 Learn to Cloud 课程 Phase 1 的第 4 个主题「SSH(Secure Shell 与远程访问)」展开,帮助学习者理解 SSH 是什么、为什么云工程师离不开它,并完成「从本地终端 SSH 到云端虚拟机」的首次实操。读完本文,你将掌握 SSH 的基本原理、密钥对(key pair)的生成与管理、在 AWS / Azure / GCP 上连接虚拟机的具体命令,以及从密码认证迁移到密钥认证的安全实践。
一、这个主题在课程中的位置
本主题对应的原始文档是 docs/phase1/4-ssh.md(另有西语译本 i18n/es/docusaurus-plugin-content-docs/current/phase1/4-ssh.md),课程规划预估用时为1 天。
在 docs/phase1/README.md 的课程地图中,SSH 是 Phase 1「Linux and Bash」的第 4 个主题,紧随 Git/版本控制(1-versioncontrol.md)、云 CLI(2-cli.md)与 Infrastructure as Code(3-iac.md)之后,衔接第 5 主题 CLI 基础(5-clibasics.md)与第 6 主题 CTF 实验室(6-ctf.md)。
它在阶段目标中扮演的角色是「构建并访问实验室环境」:Phase 1 的 CTF 挑战要求学习者把实验室环境部署到云上,而 SSH 正是进入这台机器的钥匙。文档原生的学习路径很清晰:
- 学概念:理解什么是 SSH;
- 练实操:在 AWS、Azure、GCP 三朵云上练习连接 Linux 实例;
- 过关清单:能回答「SSH 是什么、为什么用它」「如何从终端 SSH 到 VM」「SSH 密钥为什么比密码更好」三个问题。
本文即按这条路径展开,并在每一节补充可落地的命令与仓库内的佐证资料。
二、SSH 是什么:为什么云工程师必须掌握
SSH(Secure Shell)是一种加密的远程登录协议,默认使用TCP 22 端口,允许你在本地终端上安全地登录并操作一台远程计算机(通常是 Linux/Unix 服务器或云端虚拟机)。
相比早期的明文远程协议(如telnet、rlogin),SSH 的核心价值是:
- 加密传输:用户名、密码、命令与输出全部在网络上加密,防止中间人窃听;
- 身份认证:通过密码或密钥对验证「你是谁」,防止冒名登录;
- 完整性校验:通信内容可校验、防篡改。
SSH 并非只用于登录。在云工程日常工作中,它几乎是所有远程操作的基础设施:
| 场景 | 典型命令/工具 |
|---|---|
| 登录远程虚拟机 | ssh user@host |
| 传输文件 | scp、sftp |
| 端口转发 / 加密隧道 | ssh -L、ssh -D、ssh -N |
| 安全 Git 传输 | Git over SSH(如git clone git@host:repo.git) |
对云工程师而言,SSH 是管理 EC2、虚机、容器节点等一切 Linux 计算资源的基本功——本主题也正是后续 Phase 3「安全远程访问」与 Phase 5「网络安全」的起点。
三、动手前的环境准备
在真正连接云端 VM 之前,请先确认本地环境满足以下条件:
1. 本地已安装 SSH 客户端(OpenSSH)
macOS 与主流 Linux 发行版默认自带 OpenSSH,可用以下命令验证:
ssh -V # 输出示例:OpenSSH_9.x, OpenSSL 3.x.x ...如果你在 Windows 上,请按 Phase 1 课程要求先配置WSL(Windows Subsystem for Linux),在 Ubuntu 环境内使用 SSH——课程文档明确指出,所有实验室与工具都期望一个 Linux 环境(参见 docs/phase1/README.md 的 Prerequisites 部分)。
2. 已创建云账号并安装云 CLI
SSH 连接需要一台已运行的目标虚拟机。若尚未完成,请先参考 docs/phase1/2-cli.md 完成 AWS / Azure / GCP 账号创建与 CLI 安装,再参考 docs/phase3/1-virtual-machines-compute-services.md 部署一台 Linux 虚拟机(推荐 Ubuntu 或 Amazon Linux)。
3. 放行 22 端口
多数云平台的安全组(Security Group)/ 网络安全组(NSG)/ VPC 防火墙规则默认允许 22 端口入站,但请务必确认,否则连接会直接超时。
四、核心实操:从本地终端 SSH 到云端虚拟机
SSH 连接的基本语法是:
ssh [选项] 用户名@主机地址常用选项:
| 选项 | 含义 |
|---|---|
-i 私钥路径 | 指定用于认证的私钥文件(如-i ~/.ssh/my-key.pem) |
-p 端口 | 指定端口(默认 22,当服务器改端口时使用) |
-v | 输出详细调试信息,排障利器 |
-l 用户名 | 直接指定登录用户(也可用user@host写法) |
首次连接会发生什么?
第一次连接新主机时,SSH 会提示确认对方的 host key 指纹(fingerprint):
The authenticity of host 'ec2-3-xxx.compute.amazonaws.com (3.xxx)' can't be established. ED25519 key fingerprint is SHA256:xxxxxxxx... Are you sure you want to continue connecting (yes/no/[fingerprint])?输入yes后,该主机的指纹会被记录到本地~/.ssh/known_hosts,此后连接不再重复询问。确认指纹来自可信来源是防止中间人攻击的关键步骤——云厂商控制台通常能查到实例的指纹,可交叉核对。
4.1 AWS EC2
AWS EC2 在创建实例时即要求绑定密钥对(key pair),公钥写入实例,私钥.pem由你下载保存。默认用户名取决于 AMI:
# Amazon Linux 2 / 2023 镜像 ssh -i ~/.ssh/my-key.pem ec2-user@<公有IP或公有DNS> # Ubuntu 镜像 ssh -i ~/.ssh/my-key.pem ubuntu@<公有IP或公有DNS>注意:私钥文件权限过宽会被 OpenSSH 直接拒绝(见下文「权限管理」),AWS 官方要求.pem权限至少为chmod 400。
4.2 Azure
Azure 创建 Linux 虚拟机时,可在「身份验证类型」中选择SSH 公钥(推荐)或密码。创建时指定的用户名通常是azureuser。连接方式:
ssh azureuser@<公有IP>若创建时上传了公钥,本地需有对应私钥(Azure 也支持在门户「连接」页直接生成包含-i参数的完整 SSH 命令);若选择了密码认证,首次连接会提示输入密码。
4.3 GCP
GCP Compute Engine 提供了最省事的方案——gcloudCLI 可以自动生成临时密钥并完成登录:
gcloud compute ssh <实例名> --zone=<可用区> # 示例 gcloud compute ssh my-instance --zone=us-central1-a首次执行时gcloud会生成/上传 SSH 密钥并询问你是否设置本地 passphrase;它还会自动把结果写入~/.ssh/。若想手动指定用户,可追加--参数或使用标准ssh 用户名@外部IP。
4.4 退出会话
exit # 或 Ctrl + D五、SSH 密钥 vs 密码:为什么密钥更安全
这是原文档清单中的核心问题:「我理解 SSH 密钥,并且知道为什么它们比密码更好」。答案要从认证机制说起。
密码认证的弱点:
- 弱口令与复用:暴力破解(brute force)工具可以批量尝试常见密码,公网实例在数小时内就会收到大量扫描尝试;
- 密码在网络上传输时虽有加密,但服务器侧一旦被攻破,密码可能被窃取;
- 密码无法做到「一次一密」,也难以精细吊销。
密钥认证的原理:
SSH 密钥对由非对称加密生成:
- 私钥(private key):留存在本地,相当于你的「身份凭证」,绝不能泄露;
- 公钥(public key):上传并追加到服务器的
~/.ssh/authorized_keys文件,相当于「门禁名单」。
登录时,客户端用私钥对挑战数据签名,服务器用authorized_keys中的公钥验签。由于公钥和私钥在数学上配对,服务器能确认「持有私钥的人」就是被授权者。密钥长度动辄 256 位(ED25519)或 4096 位(RSA),暴力破解在计算上不可行,因此远比密码抗攻击。
核心安全习惯:私钥永不离开本地、永不提交到 Git 仓库、永不上传服务器;而公钥可以公开分发。课程在 CTF 挑战中专门强调「保持你的私钥安全、确保正确的文件权限」(见 docs/phase1/5-clibasics.md 的 Challenge 8「SSH Secrets」)。
六、生成与管理密钥对:ssh-keygen 实战
6.1 生成密钥对
现代 OpenSSH 推荐使用ED25519算法:
ssh-keygen -t ed25519 -C "你的邮箱或注释"如需兼容旧系统,可用 RSA 4096 位:
ssh-keygen -t rsa -b 4096 -C "你的邮箱或注释"交互过程中可设置passphrase(私钥口令),即使私钥文件被盗也无法直接使用;-C注释建议写邮箱,便于在服务器authorized_keys中区分多把钥匙。
生成后~/.ssh/目录下会出现两个文件:
| 文件 | 角色 | 建议权限 |
|---|---|---|
id_ed25519(私钥) | 本地身份凭证,绝不出本地 | 600(chmod 600) |
id_ed25519.pub(公钥) | 可上传到服务器authorized_keys | 644 |
known_hosts | 记录已确认的服务器指纹 | 自动维护 |
authorized_keys | 服务器侧的公钥名单(在远程机上) | 600/644 |
config | 为不同主机配置别名/密钥/用户(可选) | 600 |
6.2 权限管理:chmod 600
OpenSSH 对密钥文件权限非常严格,私钥如果被「其他人可读」,会直接报错:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: UNPROTECTED PRIVATE KEY FILE! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Permissions 0644 for 'id_ed25519' are too open.因此对私钥执行:
chmod 600 ~/.ssh/id_ed25519 # 私钥仅本人可读写 chmod 700 ~/.ssh # 目录仅本人可访问这正是课程 Challenge 8 中chmod 600命令的用意(见 docs/phase1/5-clibasics.md)。在 CTF 与真实渗透场景中,~/.ssh/目录也常是侦察重点:用ls -la ~/.ssh/列出内容、用find ~/.ssh -type f找出所有密钥文件、用cat authorized_keys审查有哪些公钥被授权——这些命令在本主题清单对应的「CLI 基础」主题中都有讲解。
6.3 把公钥部署到服务器:ssh-copy-id
若目标服务器支持密码首次登录,一条命令即可把本地公钥追加到远端authorized_keys:
ssh-copy-id 用户名@主机地址 # 输入一次密码后,公钥即被安装,此后可免密登录手动等价操作是:
cat ~/.ssh/id_ed25519.pub | ssh 用户名@主机地址 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"6.4 用 ssh-agent 管理密钥(可选)
当本地有多把密钥、或私钥设置了 passphrase 时,可将密钥加载进 ssh-agent,避免每次连接重复输入:
eval "$(ssh-agent -s)" ssh-add ~/.ssh/id_ed25519七、常见连接问题排查
| 报错 / 现象 | 原因 | 处理 |
|---|---|---|
Permission denied (publickey) | 私钥不对、用户名不对、公钥未部署 | 核对-i路径与默认用户名;检查远端authorized_keys |
UNPROTECTED PRIVATE KEY FILE | 私钥权限过宽 | chmod 600 ~/.ssh/id_ed25519 |
Host key verification failed | 服务器指纹与known_hosts记录不一致(可能换过实例) | 确认是合法变更后移除旧记录:ssh-keygen -R 主机地址 |
| 连接超时 | 安全组未放行 22 端口、或实例无公网 IP | 检查安全组/防火墙入站规则 |
| 忘记用户名 | 不同镜像默认用户不同 | Amazon Linux 为ec2-user,Ubuntu 为ubuntu,Debian 为admin,Azure 常为azureuser |
排障时给ssh加-v(可叠加到-vvv)能输出完整的握手与认证过程,是定位问题的第一手段。
八、从 SSH 到更安全的远程访问:课程中的进阶
掌握基础 SSH 后,课程在Phase 3 第 4 主题「安全远程访问」中(见 docs/phase3/4-secure-remote-access.md)提出了一个重要观点:在云环境中,基于会话的访问管理正在替代「直接暴露 22 端口 + SSH」的旧模式。
三大云厂商的对应服务:
| 云厂商 | 会话式访问服务 | 核心思路 |
|---|---|---|
| AWS | Systems Manager Session Manager(SSM) | 无需公网 22 端口、无需 bastion,通过 IAM 授权建立会话 |
| Azure | Azure Bastion | 托管式跳板机,基于 TLS 的 RDP/SSH 会话 |
| GCP | IAP(Identity-Aware Proxy) | 基于身份与上下文策略的 TCP 转发 |
这类方案的优势包括:实例可以不暴露公网 SSH 端口、访问控制收敛到 IAM 策略、会话可审计可录制。课程对应的实操任务要求你配置会话式访问,并用 IAM 策略落实**最小权限(least privilege)**原则——这与 docs/phase5/1-csf-iam-implementation.md 的 IAM 主题一脉相承。
而在本阶段,你只需要先把「理解 SSH、会用密钥登录 VM」这件事做扎实,因为它是后续理解这些托管方案为什么更安全的底层知识。
九、主题完成清单(Checklist)
原文档给出的过关标准如下,请在继续下一主题前逐条自检:
- 我理解 SSH 是什么以及为什么使用它——能用一句话向别人解释 Secure Shell 的加密、认证与端口 22;
- 我知道如何从本地终端 SSH 到虚拟机——能在 AWS / Azure / GCP 上完成一次真实登录、执行命令并退出;
- 我理解 SSH 密钥并且知道为什么它们比密码更好——能说明公钥/私钥配对原理,会使用
ssh-keygen生成密钥并正确设置chmod 600权限。
若三项都打上了勾,说明你已经具备云工程师最基础也最常用的远程访问能力,可以继续学习 docs/phase1/5-clibasics.md(Linux CLI 基础)并进入 docs/phase1/6-ctf.md 的 CTF 实战,在那里你将把这些 SSH 技巧用在真实的攻防挑战中。
十、延伸阅读(仓库内)
- docs/phase1/4-ssh.md:本主题英文原文档(课程骨架)
- docs/phase1/5-clibasics.md:Challenge 8「SSH Secrets」中的密钥管理命令与最佳实践
- docs/phase1/README.md:Phase 1 目标、前置条件与课程地图
- docs/phase3/1-virtual-machines-compute-services.md:虚拟机与计算服务部署
- docs/phase3/4-secure-remote-access.md:SSM / Bastion / IAP 会话式安全远程访问
- docs/phase5/1-csf-iam-implementation.md:IAM 与最小权限实现
- 教程
- 云原生
【免费下载链接】learn-to-cloud
A courseware built on the belief that anyone can learn foundational cloud engineering skills with the right guide and discipline
相关推荐
从零掌握 SSH:用一条命令安全访问云虚拟机(Learn to Cloud 实战指南)
从零掌握 SSH:用一条命令安全访问云虚拟机(Learn to Cloud 实战指南) 本篇指南对应 Learn to Cloud 课程 Phase 1「Lin
教程云原生Learn to Cloud 云 CLI 搭建指南:三大云厂商命令行工具安装、配置与实战应用
Learn to Cloud 云 CLI 搭建指南:三大云厂商命令行工具安装、配置与实战应用 本篇指南基于 Learn to Cloud(L2C)课程 Phas
教程云原生Learn to Cloud 第五阶段实战:为你的 Journal API 构建企业级云安全体系
Learn to Cloud 第五阶段实战:为你的 Journal API 构建企业级云安全体系 本文是 Learn to Cloud 课程 Phase 5(S
教程云原生
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考