1148 字
6 分钟

使用 Teleport 打造统一跳板入口

TIP

本文为notion里的旧文章,现在搬运到博客里。

在最近部署了大量虚拟机之后,常常需要从不同入口连接服务器,这不仅增加管理成本,也带来了安全与维护上的不便。一个统一、安全、可审计的跳板机显得非常必要。在调研多种方案后,Teleport 成为了理想选择。

不要问为什么不用jumpserver,问就是太丑了。

Teleport 是一体化的访问控制平台,可集中管理 SSH、Kubernetes、数据库、内部应用、桌面访问等多种资源,建立统一的访问入口,同时提供零信任访问、安全审计、短期证书、SSO 集成等能力。

本文将从 Teleport 的概念、核心功能到 Docker 部署、节点录入,完整介绍如何搭建属于自己的跳板系统。


什么是 Teleport?#

Teleport 是一个开源的基础设施访问平台(Infrastructure Access Platform),核心理念是通过统一的 Proxy 入口来代理所有内部资源的访问,包括:

  • SSH
  • Kubernetes
  • 数据库
  • 内部 Web 应用
  • Windows 远程桌面
  • 工作负载身份(Workload Identity)

Architecture of the setup you will complete in this guide

Teleport 由几个主要组件组成:

  • Auth Service 负责认证、授权、证书管理、RBAC 策略等。

  • Proxy Service 对外暴露唯一入口(通常是 443 或 3080),所有访问通过 Proxy 中转。

  • Node/Kube/DB/Application/Desktop Agent 部署在目标资源上的代理,使这些资源接入 Teleport 集群。

Teleport 的核心价值在于:

身份安全(Identity Security)#

  • 基于短期证书,无需长期 SSH 密钥。
  • 可消除影子访问和常驻权限。
  • 强化 RBAC 管理。

统一访问入口(Unified Access Plane)#

  • 所有访问统一从 Proxy Service 进入。
  • 支持 SSO、MFA、Device Trust。
  • 集中记录所有会话和审核日志。

核心功能模块#

1. SSH 安全访问#

  • 使用短期证书替代长期 SSH 密钥
  • 支持会话录制与回放
  • 统一权限管理
  • 兼容传统 SSH 工具(通过 tsh

2. Kubernetes 访问控制#

  • 统一通过 Teleport 的身份和 RBAC 管理多个 K8s 集群
  • kubectl 会话可审计
  • 多集群访问无需管理 kubeconfig 文件

3. 数据库访问#

  • 支持 PostgreSQL、MySQL 等
  • 通过 Teleport Proxy 转发数据库连接
  • 审计数据库查询
  • 无需本地保存静态数据库凭据

4. 内部应用与桌面访问#

  • Application Service 可代理内网 Web 应用
  • Desktop Service 可代理 RDP,实现安全的 Windows 桌面访问

5. Workload Identity(工作负载身份)#

  • 为服务间调用自动签发短期证书/JWT
  • 遵循 SPIFFE 标准
  • 支持自动轮换

典型使用场景#

  • 跨团队运维管理:统一管理所有 SSH、K8s、DB 访问,所有会话都可审计。
  • 零信任架构:每一次访问均基于实时认证与授权。
  • 混合云与多云环境:私网资源无需暴露,通过反向隧道接入 Teleport。
  • CI/CD 集成:通过 API 或 Terraform 控制访问策略与证书发放。

使用 Docker 部署 Teleport#

以下示例适合个人或轻量级环境。生产环境建议增加:

  • TLS 证书(ACME/手动)
  • 持久化存储
  • 高可用配置

部署参考:https://goteleport.com/docs/


1. 准备配置目录#

Terminal window
mkdir -p teleport/data teleport/config teleport/certs

2. 生成 Teleport 配置文件#

Terminal window
docker run --hostname localhost --rm \
--entrypoint=/usr/local/bin/teleport \
public.ecr.aws/gravitational/teleport-distroless:17.4.8 \
configure --roles=proxy,auth > ./teleport/config/teleport.yaml

根据需要修改其中的 proxy_service

proxy_service:
enabled: "yes"
web_listen_addr: 0.0.0.0:3080
tunnel_listen_addr: 0.0.0.0:3024
listen_addr: 0.0.0.0:3023
public_addr:
- localhost:3080
https_key_file: /etc/teleport/certs/server-key.pem
https_cert_file: /etc/teleport/certs/server.pem
acme: {}

如需要 TLS,可使用 cfssl 自行生成证书。


3. 启动 Teleport 服务#

Terminal window
docker run -d --restart=always \
--hostname localhost --name teleport \
-v ~/Applications/teleport/config:/etc/teleport \
-v ~/Applications/teleport/data:/var/lib/teleport \
-v ~/Applications/teleport/certs:/etc/teleport/certs \
-p 3025:3025 -p 3080:3080 -p 3023:3023 \
public.ecr.aws/gravitational/teleport-distroless:17.4.8

4. 验证状态#

Terminal window
docker exec teleport tctl status

5. 创建第一个用户#

Terminal window
docker exec teleport tctl users add admin \
--roles=editor,access \
--logins=root,ubuntu

复制输出的邀请链接,在浏览器中设置密码和 MFA。


6. 登录 Teleport Web UI#

https://<服务器IP>:3080

自签证书会提示风险,测试环境可忽略。


使用 tsh 登录集群#

安装 tsh 后:

Terminal window
tsh login --proxy=<IP或域名>:3080 --user=admin

连接节点:

Terminal window
tsh ssh ubuntu@node-a

将其他服务器加入 Teleport(录入节点)#

方法一:从 Web UI 生成脚本(推荐)#

  1. 打开 Teleport Web UI
  2. 点击 Add Resource / Enroll New Server
  3. 复制生成的脚本,例如:
Terminal window
sudo bash -c "$(curl -kfsSL https://<IP>:3080/scripts/<token>/install-node.sh)"

在目标节点执行此脚本即可自动加入集群。


方法二:使用 tctl 手动生成令牌#

Terminal window
docker exec teleport tctl nodes add --ttl=5m --roles=node --format=json

然后在目标节点手动安装 Teleport 并填写 token 与 auth_server 地址。


验证节点是否加入#

在 Web UI 或使用:

Terminal window
tsh ls

即可看到新加入的服务器资源,并可直接 SSH 登录。


使用 Teleport 打造统一跳板入口
https://catcat.blog/2025/12/docker-doploy-teleport.html
作者
猫猫博客
发布于
2025-12-01
许可协议
CC BY-NC-SA 4.0