Featured image of post 使用 Teleport 重构 VPS 访问安全:告别 SSH 密钥管理混乱

使用 Teleport 重构 VPS 访问安全:告别 SSH 密钥管理混乱

SSH 密钥散落各处、权限难以回收、审计记录缺失?Teleport 提供零信任架构的 VPS 访问方案——基于证书的短期认证、RBAC 权限控制、完整的操作审计录像,让服务器访问安全从'手工运维'升级为'企业级管控'

引言

你管理着十几台甚至几十台 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 对比

功能SSHTeleport (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 密钥管理:

  1. 短效证书:访问权限自动过期,不再有一把密钥走天下的风险;
  2. RBAC 权限:从"谁能登录"进化到"谁能以什么身份登录哪些机器、能做什么";
  3. 完整审计:每次会话都有录屏和命令记录,安全事件可追溯。

部署 Teleport 不需要修改现有服务器架构——它工作在 SSH 协议层之上,透明地接管访问控制。从今天开始,把你的 VPS 访问从"密钥管理"升级为"零信任安全"。


参考资源

📺 看视频版教程 → DuckDB Lab YouTube

Subscribe for more DuckDB & AI automation tutorials