引言
你管理着十几台甚至几十台 VPS,每台都有自己的 SSH 密钥。问题随之而来:
- 员工离职后,你手动登录每台服务器删除公钥,漏了一台就留下后门;
- 紧急情况下需要临时访问某台服务器,只能把私钥通过微信发给同事,密钥在聊天记录里留存;
- 某次安全审计发现,有员工用同一把密钥登录了生产库和开发机,权限完全混用;
- 出问题时找不到是谁在什么时间执行了什么命令,SSH 日志只记录 IP 和时间,没有命令内容。
这些痛点的根源在于:SSH 的设计初衷是可信网络环境下的身份验证,而不是现代云原生架构中的零信任访问控制。
Teleport 是一个开源的访问平台,它用基于证书的短期认证替代了 SSH 密钥,提供 RBAC 权限控制、会话录屏审计、动态资产发现等能力。更重要的是,它可以完全替代 SSH 作为 VPS 的访问入口,无需修改现有服务器配置。
本文将带你从零搭建 Teleport,将你的 VPS 访问安全从"密钥散管理"升级为"零信任管控"。
为什么 SSH 密钥管理如此痛苦
在理解 Teleport 之前,先看看传统 SSH 访问的深层问题。
问题一:密钥生命周期难以管控
SSH 密钥一旦生成,就永久有效——除非你手动轮换。这意味着:
- 一把密钥可以无限期地使用,没有过期机制;
- 密钥丢失或泄露后,你必须找到所有使用该密钥的服务器逐一删除;
- 员工离职时,你不可能记得他登录过哪些服务器。
问题二:权限粒度太粗
SSH 只提供"能不能登录"的二元判断。登录后你是谁、能执行什么命令、能访问哪些资源,SSH 完全不管。
你需要额外的工具(如 sudo、sudoers、pam)来限制权限,但这些工具各自为政,管理复杂且容易出错。
问题三:审计能力几乎为零
SSH 日志只记录:谁、从哪个 IP、在什么时间登录了。它不记录:
- 登录后执行了什么命令;
- 传输了哪些文件;
- 会话中进行了什么操作。
发生安全事件时,你几乎无法追溯。
问题四:密钥分发不安全
把私钥分发给同事,常见做法有:
- 通过邮件/聊天记录发送
.pem文件; - 让对方用自己的密钥对服务器免密登录;
- 直接把密钥写在文档里共享。
无论哪种方式,私钥都以明文形式暴露在传输和存储过程中。
Teleport 的核心设计理念
Teleport 的设计哲学可以概括为一句话:用短效证书替代长期密钥,用中心化策略替代分散配置。
基于证书的认证
Teleport 不依赖 SSH 密钥对。相反,它签发短期的、角色绑定的访问证书:
- 证书有效期可配置(默认 12 小时,最长 10 天);
- 证书绑定用户的角色和属性,过期自动失效;
- 用户只需持有私钥(本地缓存),无需管理服务器端的授权列表。
零信任架构
Teleport 假设网络不可信,所有访问都必须经过认证和授权:
- 每次连接都验证用户身份和权限;
- 支持 MFA(TOTP、WebAuthn、SAML);
- 支持 IP 白名单和地理位置限制。
集中式策略管理
所有访问规则在一个地方定义:
- RBAC(基于角色的访问控制):定义谁可以访问哪些资源、以什么身份登录;
- 动态基础设施发现:新服务器加入集群后自动被 Teleport 发现并应用策略;
- 策略即代码:配置文件可以版本化管理。
完整的会话审计
Teleport 记录每一次会话的完整信息:
- 终端会话录屏(Terry Studio 格式);
- 命令执行历史;
- 文件传输记录;
- 支持回放审计。
架构概览
Teleport 采用客户端-服务器架构,核心组件包括:
┌─────────────────────────────────────────────────────┐
│ 用户终端 │
│ tsh CLI / Web UI / kubectl / rdp / ssh │
└──────────────────┬──────────────────────────────────┘
│ HTTPS + mTLS
┌──────────────────▼──────────────────────────────────┐
│ Teleport Auth Server │
│ · 用户认证(MFA) │
│ · 证书签发 │
│ · 会话录制 │
│ · 策略存储 │
└──────────────────┬──────────────────────────────────┘
│
┌─────────────┼─────────────┐
│ │ │
┌────▼────┐ ┌────▼────┐ ┌────▼────┐
│Proxy │ │Proxy │ │Proxy │
│(SSH) │ │(HTTPS) │ │(K8s) │
└────┬────┘ └────┬────┘ └────┬────┘
│ │ │
│ ┌────────┴────────┐ │
│ │ Teleport Nodes │ │
│ │ (VPS 1, VPS 2..)│ │
│ └─────────────────┘ │
│ │
└─────── 外部用户 ──────────┘
- Auth Server:控制平面,负责认证、授权、证书签发和会话录制;
- Proxy Server:数据平面,处理加密连接转发,暴露统一的访问入口;
- Node:被管理的服务器,运行 Teleport 代理程序;
- tsh:用户客户端,替代
ssh命令。
部署 Teleport:三步搞定
第一步:部署 Auth + Proxy Server
推荐将 Auth Server 和 Proxy Server 部署在同一台 VPS 上(适合小规模团队)。
# 下载 Teleport
curl -fsSL https://apt.releases.teleport.dev/gpg | sudo dd of=/usr/share/keyrings/teleport-archive-keyring.asc
echo "deb [signed-by=/usr/share/keyrings/teleport-archive-keyring.asc] https://apt.releases.teleport.dev/ubuntu jammy stable" | sudo tee /etc/apt/sources.list.d/teleport.list
sudo apt-get update && sudo apt-get install teleport-usm
# 生成自签名证书(生产环境建议使用 Let's Encrypt)
sudo teleport cert create --type=host --host=your-domain.com --out=file
# 创建 Teleport 配置
sudo tee /etc/teleport.yaml <<EOF
auth_service:
enabled: "yes"
listen_addr: 0.0.0.0:3025
cluster_name: vps-access
authentication:
type: local
second_factor: on
webauthn:
rp_id: your-domain.com
tokens:
- proxy,node:teleport-token-xxxx
- proxy:teleport-proxy-token-xxxx
proxy_service:
enabled: "yes"
listen_addr: 0.0.0.0:443
public_addr: your-domain.com
acme:
enabled: "yes"
email: admin@your-domain.com
ssh_service:
enabled: "yes"
listen_addr: 0.0.0.0:3023
logging:
output: /var/log/teleport.log
error_output: /var/log/teleport-error.log
audit_events:
output: /var/log/teleport-auth.log
EOF
# 启动服务
sudo systemctl enable teleport && sudo systemctl start teleport
# 创建初始管理员账户
tctl auth sign --type=user --ttl=0 --credentials=file /tmp/user.crt /tmp/user.key
sudo teleport user add --roles=editor,access --logins=root,ubuntu $(whoami) --output=insecure
第二步:将 VPS 加入 Teleport 集群
在你想要管理的每台 VPS 上安装 Teleport Node:
# 在所有目标 VPS 上执行
curl -fsSL https://apt.releases.teleport.dev/gpg | sudo dd of=/usr/share/keyrings/teleport-archive-keyring.asc
echo "deb [signed-by=/usr/share/keyrings/teleport-archive-keyring.asc] https://apt.releases.teleport.dev/ubuntu jammy stable" | sudo tee /etc/apt/sources.list.d/teleport.list
sudo apt-get update && sudo apt-get install teleport-usm
# 生成节点注册令牌
sudo teleport token add --type=host --ttl=24h node-token
# 配置节点
sudo tee /etc/teleport.yaml <<EOF
auth_token: node-token
auth_servers:
- your-domain.com:443
ssh_service:
enabled: "yes"
commands:
- name: hostname
command: [hostname]
format: text
terminal_session_server_selection: proxy
logging:
output: /var/log/teleport.log
error_output: /var/log/teleport-error.log
EOF
# 重启并加入集群
sudo systemctl enable teleport && sudo systemctl restart teleport
第三步:配置 RBAC 权限
Teleport 内置了灵活的 RBAC 系统。你可以用 tctl 命令或 YAML 文件定义角色:
# 查看内置角色
tctl get roles
# 创建自定义角色:只读审计员
cat > /tmp/read-only-auditor.yaml <<EOF
kind: role
version: v5
metadata:
name: readonly-auditor
spec:
allow:
logins: ["root", "ubuntu"]
nodes:
- ".*"
rules:
- resources: ["audit_log"]
verbs: ["list", "read"]
- resources: ["session"]
verbs: ["list", "read", "play"]
deny:
logins: []
nodes: []
EOF
tctl create -f /tmp/read-only-auditor.yaml
# 分配角色给用户
tctl users roles add alice,readonly-auditor
核心角色能力对照:
| 角色 | 可访问节点 | 可登录用户 | 会话录屏 | 命令审计 | 导出日志 |
|---|---|---|---|---|---|
admin | 全部 | root/ubuntu 等 | ✓ | ✓ | ✓ |
editor | 全部 | 指定用户 | ✓ | ✓ | ✓ |
access | 全部 | 指定用户 | ✓ | ✓ | ✗ |
auditor | 只读 | 无登录 | ✓ 回放 | ✓ 查看 | ✓ |
日常使用:用 tsh 替代 ssh
安装客户端工具后,你就可以用 tsh 来访问所有已注册的 VPS:
# 登录 Teleport 集群
tsh login --proxy=your-domain.com --user=alice
# 列出所有可用服务器
tsh nodes
# 像 ssh 一样连接(但更强大)
tsh ssh root@web-server-01
# 查看会话历史
tsh sessions
# 回放某个会话
tsh play <session-id>
# 导出审计日志
tsh audit --from=2026-08-01 --to=2026-08-29 > audit-report.json
tsh vs ssh 对比
| 功能 | SSH | Teleport (tsh) |
|---|---|---|
| 认证方式 | 密钥/密码 | 证书 + MFA |
| 密钥管理 | 分散在各服务器 | 中心化,自动轮换 |
| 权限控制 | 二元(能/不能) | RBAC 细粒度 |
| 会话审计 | 仅登录日志 | 完整录屏 + 命令 |
| 过期机制 | 无 | 证书自动过期 |
| 多因素认证 | 需额外配置 | 内置支持 |
| Web UI | 无 | 内置浏览器访问 |
进阶:集成现有工具链
与 GitHub Actions 集成
# .github/workflows/deploy.yml
name: Deploy via Teleport
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Login to Teleport
run: |
tsh login --proxy=${{ secrets.TELEPORT_PROXY }} --token=${{ secrets.TELEPORT_TOKEN }}
- name: Deploy to VPS
run: |
tsh ssh deploy@vps-01 "cd /app && git pull && docker-compose up -d"
与 Slack/钉钉通知集成
当检测到异常登录时自动告警:
# 在 Teleport 配置中启用告警
teleport yaml set /services/alerts/notifications - '{
"method": "webhook",
"endpoint": "https://hooks.slack.com/services/xxx",
"events": ["session.start", "auth.failure"]
}'
与 Prometheus 监控集成
Teleport 暴露了标准的 metrics 端点:
# prometheus scrape config
scrape_configs:
- job_name: 'teleport'
static_configs:
- targets: ['your-domain.com:3000']
关键指标:
teleport_auth_requests_total:认证请求总数teleport_sessions_active:当前活跃会话数teleport_proxy_connections_total:代理连接数
成本分析
Teleport 开源版(USM - Universal Security Mesh)完全免费,核心功能不限数量:
| 功能 | 开源版 | 企业版 |
|---|---|---|
| VPS 节点数量 | 无限制 | 无限制 |
| 用户数量 | 无限制 | 无限制 |
| RBAC 权限 | ✓ | ✓ + 高级策略 |
| 会话录屏 | ✓ | ✓ + AI 分析 |
| MFA 认证 | ✓ (TOTP/WebAuthn) | ✓ + SAML/OIDC |
| 审计日志 | 本地存储 | 远程存储 + 保留策略 |
| SCIM 同步 | ✗ | ✓ (对接 Okta/Azure AD) |
| 高级告警 | ✗ | ✓ |
对于个人开发者和中小型团队,开源版完全够用。企业版主要在 SCIM 集成、审计日志远程存储、AI 辅助分析等方面有增强。
迁移指南:从 SSH 到 Teleport
渐进式迁移策略
不需要一次性切换,Teleport 支持混合模式:
阶段一:并行运行
· 保留原有 SSH 访问方式
· 新服务器使用 Teleport 管理
· 老服务器逐步迁移
阶段二:逐步切换
· 核心服务器优先迁移
· 在 Teleport 中配置 RBAC
· 关闭部分服务器的直接 SSH
阶段三:全面迁移
· 所有服务器通过 Teleport 访问
· 关闭防火墙上的 22 端口
· SSH 密钥全部撤销
迁移检查清单
- 备份所有现有 SSH 密钥和授权列表
- 在 Teleport 中创建与现有权限对应的 RBAC 角色
- 逐个迁移服务器,验证 Teleport 访问正常后再关闭直接 SSH
- 回收所有旧 SSH 密钥
- 关闭服务器防火墙的 22 端口(仅允许 Teleport Proxy)
- 配置会话录屏和审计告警
- 培训团队成员使用
tsh命令
总结
Teleport 解决了一个每个 VPS 运维者都会遇到的核心问题:如何安全、可控地访问多台服务器。
它用三个关键创新替代了传统 SSH 密钥管理:
- 短效证书:访问权限自动过期,不再有一把密钥走天下的风险;
- RBAC 权限:从"谁能登录"进化到"谁能以什么身份登录哪些机器、能做什么";
- 完整审计:每次会话都有录屏和命令记录,安全事件可追溯。
部署 Teleport 不需要修改现有服务器架构——它工作在 SSH 协议层之上,透明地接管访问控制。从今天开始,把你的 VPS 访问从"密钥管理"升级为"零信任安全"。
