资讯动态

Teleport AWS AMI 构建与发布全指南:从 Packer 模板到实例自动配置

发布时间:2026/9/20 12:47:19 来源:尧图企业网站定制
Teleport AWS AMI 构建与发布全指南从 Packer 模板到实例自动配置【免费下载链接】teleportThe easiest, and most secure way to access and protect all of your infrastructure.项目地址: https://gitcode.com/gh_mirrors/tel/teleport导读本文基于 Teleport 开源仓库 assets/aws 目录下的官方构建文档assets/aws/README.md系统讲解 Teleport AWS AMIAmazon Machine Image的完整构建、发布与使用流程。你将掌握如何在本机准备构建环境AWS CLI Packer、如何为 OSS 与 Enterprise 版本构建 AMI、AMI 的命名规范与跨区域分发机制以及 AMI 内嵌的自动配置生成 systemd 服务编排 角色选择设计如何让一台裸 EC2 实例在首次启动时自动变成单实例集群、独立 Auth/Proxy/Node 节点或接入已有集群的 Agent。全文以仓库源码为准并补充 Packer 模板、安装硬化脚本、配置生成脚本 等实现细节帮助你理解构建-发布-使用整条链路。一、背景Teleport AMI 解决什么问题Teleport 是面向基础设施的安全访问平台可用于保护 SSH 节点、Kubernetes、数据库与应用。在 AWS 上最省事的交付方式就是把 Teleport 预装进自定义 AMI用户启动 EC2 实例时直接选用该 AMI实例开机后即自动完成 Teleport 的安装、配置与启动无需手工下载二进制、编写配置文件。assets/aws目录就是这套方案的全部资产构建编排Makefile 与 single-ami.pkr.hclPacker HCL 模板系统集成files/system 下的 15 个 systemd 服务/定时器单元配置生成files/bin/teleport-generate-config 及配套辅助脚本硬化安装files/install-hardened.sh质量验证files/tests 下的 BatsBash Automated Testing System测试套件发布工具cmd/update-ami-id 与 cmd/make-public 两个 Go 程序。二、构建环境准备Development instructions2.1 必备工具与最低版本官方文档明确要求两个工具工具最低版本文档要求用途AWS CLIawscli 1.14与 AWS 账号交互、鉴权、上传构建产物Packerv1.4.0执行 EC2 实例启动 → 定制 → 快照 → 注册 AMI 的流水线说明上述版本是 assets/aws/README.md 撰写时的硬性要求。当前仓库的 Packer 模板 single-ami.pkr.hcl 已改用 HCL2 语法并要求安装 HashiCorp 官方amazon插件版本固定为1.2.5见模板第 17–24 行因此实际构建时建议使用较新的 Packer 2.x 与 AWS CLI 2.x与仓库内模板保持兼容。2.2 安装方式macOS 使用 Homebrewbrew install awscli brew install packerLinuxDebian/Ubuntu 系用系统包管理器安装 AWS CLIPacker 则按官方安装指引https://www.packer.io/docs/install下载二进制放入PATHapt install awscli # packer 安装请遵循 https://www.packer.io/docs/install/index.html2.3 构建前四项检查官方文档将构建前准备总结为 4 个步骤确定 AWS 账号决定要在哪个 AWS 账号内构建 AMI配置本地凭据与 IAM 权限确保本地awscliprofile 指向该账号且拥有构建 AMI 所需的最小权限集——EC2启动/终止实例、创建快照/镜像、S3上传 Teleport 安装包、VPC在子网中启动构建实例确定目标区域选择要在哪个区域构建并分发 AMI该区域将在下一步中使用设置构建参数编辑 Makefile 中的关键变量见下文。三、构建参数Makefile 中的关键变量官方文档列出两个必填参数而当前仓库的 Makefile 中实际还包含更多可调项参数默认值说明TELEPORT_VERSION18.10.0要构建的 Teleport 版本。必须是已发布版本二进制可从官方下载站获取未发布版本会导致构建失败见 Makefile 第 1–5 行注释TELEPORT_UID1007非特权用户teleport的 UID。固定 UID 是为了让多台 Auth 服务器在共享 NFS 卷上拥有一致的权限DESTINATION_REGIONS17 个非 opt-in 区域如ap-northeast-1,eu-west-1,us-east-1,...AMI 要复制分发的目标区域逗号分隔、不带空格仅限非 opt-in 区域AWS_ACCOUNT_ID146628656107托管公共 Teleport AMI 的 AWS 账号 ID发布工具用它过滤镜像BUILD_TIMESTAMP自动生成UTC 格式YYYYMMDD-HHMMSSZ构建时间戳写入 AMI 标签BuildTimestampREADME 中给出的参数表TELEPORT_VERSION、DESTINATION_REGIONS与当前 Makefile 完全一致可以放心按表配置。设置方式有两种直接编辑 Makefile或在命令行通过环境变量/make变量覆盖make oss TELEPORT_VERSION15.4.0 DESTINATION_REGIONSus-east-1,us-west-2Makefile 还提供了check-vars目标用于校验TELEPORT_VERSION是否为空.PHONY: check-vars check-vars: if [ -z $(TELEPORT_VERSION) ]; then \ echo TELEPORT_VERSION is not set; exit 1; \ fi;四、构建流程从make oss到 Packer 模板4.1 README 中的官方步骤文档给出的构建命令是make oss并说明构建完成后AMI 会出现在你指定的区域中命名格式为teleport-type-version-arch例如teleport-oss-4.2.10-arm64。需要注意这是 assets/aws/README.md 撰写时的入口。当前 Makefile 中已不存在oss目标构建入口演变为直接调用 Packer HCL 模板下节详述。这说明 AMI 构建链路正在从 Makefile 驱动向纯 Packer 驱动迁移README 中的命令可作为理解历史流程的参考。4.2 当前仓库的 Packer 构建模板single-ami.pkr.hcl 是当前构建的核心它声明了完整的输入变量、基镜像查找、构建器与 provisioner输入变量带校验aws_account_id必须为 12 位数字正则^\d{12}$校验aws_region默认us-west-2aws_vpc_id构建实例所在的 VPC格式校验vpc-前缀 至少 17 位字母数字aws_instance_type用于制作 AMI 的构建实例类型如c5.largeteleport_type仅允许oss或entEnterpriseteleport_versionTeleport 版本teleport_fips布尔值是否构建启用 FIPS 的镜像teleport_tarballTeleport 安装包的本地路径teleport_uid默认1007ami_build_timestamp、ami_name、ami_arch、ami_destination_regions镜像命名与分发控制。基镜像查找第 101–110 行通过data amazon-ami在指定账号内查找最新的teleport-hardened-base-image-arch-al2023-*镜像条件为 EBS 根设备 HVM 虚拟化类型——即 Teleport AMI 基于强化版 Amazon Linux 2023构建。构建器amazon-ebs第 134–181 行关键配置ami_regions把镜像复制到DESTINATION_REGIONS中的每个区域imds_support v2.0且metadata_options.http_tokens required强制实例元数据服务使用 IMDSv2安全加固要求encrypt_boot falsessh_username ec2-userAmazon Linux 默认用户打上BuildTimestamp、BuildTypeproduction、Architecture、TeleportVersion、TeleportEdition、TeleportFipsEnabled等标签——这些标签是后续发布工具make-public、update-ami-id检索镜像的关键索引子网通过tag:purposerelease-ami-builder、tag:environmentprod过滤选择。Provisiner 流水线第 183–221 行创建临时目录/tmp/files上传files/目录systemd 单元 bin 脚本上传 Teleport 安装包为/tmp/teleport.tar.gz将 systemd 单元拷入/etc/systemd/system/bin 脚本拷入/usr/local/bin/以root执行 files/install-hardened.sh传入TELEPORT_UID、TELEPORT_VERSION、TELEPORT_TYPE、TELEPORT_FIPS环境变量。五、镜像内容install-hardened.sh 做了什么files/install-hardened.sh 是 AMI 定制的装配脚本它在构建实例上完成系统级准备系统更新dnf -y update依赖安装uuid随机 token 生成、python3certbot 运行环境随后在/opt/certbot创建 Python venv 并安装certbot与certbot-dns-route53通过 Route53 做 DNS 校验的 Lets Encrypt 证书签发创建 teleport 用户useradd -r teleport -u ${TELEPORT_UID} -d /var/lib/teleport并加入adm组读写系统日志同时chage --maxdays -1 ec2-user关闭密码过期策略对应 CIS 加固项 V-230367目录规划创建/var/lib/teleport0700、/run/teleport、/etc/teleport.d、/opt/teleport/system/{bin,lib/systemd/system}等目录安装二进制解压 tarball将tctl、tsh、teleport、tbot、fdpass-teleport、teleport-update安装到/opt/teleport/system/bin并通过teleport-update link-package建立链接随后清理临时文件FIPS 模式当TELEPORT_FIPS1为所有teleport start的 ExecStart 追加--fips参数并通过fips-mode-setup --enable启用系统级 FIPS 密码策略sudo 安全路径写入/etc/sudoers.d/secure_path保证sudo tctl users add等命令能解析/usr/local/bin下的二进制安全清理删除/root/.ssh/authorized_keys与/home/ec2-user/.ssh/authorized_keys防止构建密钥残留进公共镜像、清除/tmp/files、清空 dnf/yum 缓存开机自启systemctl enable teleport-generate-config.service与teleport.service。六、首次启动的魔法自动配置生成机制AMI 与普通安装包最大的区别在于实例第一次启动时没有任何配置——它需要根据实例自身的角色自动生成/etc/teleport.yaml。这套机制由三部分协作完成6.1 用户数据User Data驱动角色选择用户启动 EC2 时把配置写入/etc/teleport.d/conf通过 User Data 或 cloud-init。配置生成脚本会source该文件读取形如下面的变量TELEPORT_ROLEauth,node,proxy EC2_REGIONus-west-2 TELEPORT_AUTH_TYPEsaml TELEPORT_AUTH_SERVER_LBlocalhost TELEPORT_CLUSTER_NAMEgus-startercluster TELEPORT_DOMAIN_NAMEgus-startercluster.gravitational.io TELEPORT_EXTERNAL_HOSTNAMEgus-startercluster.gravitational.io TELEPORT_DYNAMO_TABLE_NAMEgus-startercluster TELEPORT_DYNAMO_EVENTS_TABLE_NAMEgus-startercluster-events TELEPORT_LOCKS_TABLE_NAMEgus-startercluster-locks TELEPORT_PROXY_SERVER_LBgus-startercluster.gravitational.io TELEPORT_S3_BUCKETgus-startercluster-s3.gravitational.io TELEPORT_ENABLE_MONGODBtrue TELEPORT_ENABLE_MYSQLtrue TELEPORT_ENABLE_POSTGREStrue USE_LETSENCRYPTtrue USE_ACMfalse该示例来自测试夹具 assets/aws/files/tests/starter-cluster.bats 的write_confd_file函数。6.2 配置生成脚本按角色产出不同配置files/bin/teleport-generate-config 会根据TELEPORT_ROLE分支生成完全不同的配置文件TELEPORT_ROLEauth生成专用 Auth 配置使用DynamoDB 后端type: dynamodbaudit_events_uri: dynamodb://...audit_sessions_uri: s3://...并从 SSM 拉取 license/teleport/cluster/license同时启用teleport-ssm-publish-tokens、teleport-get-cert、teleport-renew-cert等定时器最终启动teleport-auth.serviceTELEPORT_ROLEproxy生成专用 Proxy 配置web_listen_addr: 0.0.0.0:3080、public_addr: domain:443支持 TLS Routingproxy_listener_mode: multiplex、ACMAWS Certificate Manager与 Lets Encrypt 两套证书方案、数据库/ Kubernetes 监听段并启动teleport-proxy.service或teleport-proxy-acm.serviceTELEPORT_ROLEnode生成 SSH Node 配置ssh_service.listen_addr: 0.0.0.0:3022通过teleport-ssm-get-token从 SSM 获取 join token启动teleport-node.serviceTELEPORT_ROLEauth,node,proxystarter cluster单实例集群模式。若配置了 DynamoDB/S3 三件套则使用云后端否则退化为本地dir存储默认使用 Lets Encrypt 证书要求TELEPORT_DOMAIN_ADMIN_EMAIL、TELEPORT_DOMAIN_NAME、TELEPORT_S3_BUCKET全部非空并启动teleport.serviceTELEPORT_ROLEagent生成接入已有集群的 Agent 配置支持 SSH、数据库含 Redshift 专用段、应用代理三种子服务通过TELEPORT_JOIN_TOKENTELEPORT_PROXY_SERVER_LB完成 join最终启动teleport.service。脚本通过写入/etc/teleport.d/role.*标记文件来表达角色裁决结果systemd 单元据此决定是否启动见下节。此外FIPS 镜像会自动在authentication段注入local_auth: false因为 FIPS 模式下 Teleport 不允许本地密码认证脚本第 224–233 行的注释明确说明了这一点。6.3 systemd 单元的角色门控files/system 下的服务单元全部使用ConditionPathExists做角色门控。以 teleport.service 为例[Unit] DescriptionTeleport Service Afternetwork.target cloud-final.service teleport-generate-config.service ConditionPathExists/etc/teleport.d/role.all [Service] Userroot Groupadm Typesimple Restartalways RestartSec5 EnvironmentFile-/etc/default/teleport ExecStartPre/usr/local/bin/teleport-all-pre-start ExecStart/usr/local/bin/teleport start --config/etc/teleport.yaml --diag-addr127.0.0.1:3000 --pid-file/run/teleport/teleport.pid ExecReload/bin/sh -c exec pkill -HUP -L -F /run/teleport/teleport.pid PIDFile/run/teleport/teleport.pid LimitNOFILE524288角色标记与单元对应关系如下角色标记文件启动的单元说明/etc/teleport.d/role.allteleport.service单实例集群all-in-one/etc/teleport.d/role.all-acmteleport-acm.service单实例集群 ACM 证书/etc/teleport.d/role.nodeteleport-node.serviceSSH 节点启动前执行teleport-ssm-get-token拉取 join token/etc/teleport.d/role.authteleport-auth.service专用 Auth 服务/etc/teleport.d/role.proxy/role.proxy-acmteleport-proxy.service/teleport-proxy-acm.service专用 Proxy证书方案二选一该目录下还包含teleport-get-cert、teleport-renew-cert、teleport-check-cert三个定时器Lets Encrypt 证书的签发/续期/健康检查以及teleport-ssm-publish-tokens在 Auth 侧定期把 join token 写入 SSM供 Node 拉取。七、测试验证Bats 测试套件构建产物是否可靠files/tests 提供了完整的 Bats 测试覆盖三种部署拓扑starter-cluster*.bats单实例集群验证生成的teleport.yaml为version: v3、DynamoDB 存储段、S3 审计段、监听端口等见 starter-cluster.batsha-auth*.bats / ha-proxy*.bats / ha-node.bats高可用拆分部署Auth/Proxy/Node 分离含 FIPS、TLS Routing、ACM、MySQL 代理等变体agent-ssh / agent-db / agent-app*.batsAgent 模式覆盖 SSH 节点、数据库含 Redshift、默认 region、无标签等场景与应用代理含public_addr、insecure_skip_verify、空 description 等边界。测试通过加载TELEPORT_CONFD_DIR/conf中的变量再对生成的配置文件做grep断言例如test [${TEST_SUITE?}] teleport.storage.type is set correctly { load ${TELEPORT_CONFD_DIR?}/conf echo ${TELEPORT_BLOCK?} | grep -E ^ type: dynamodb }测试夹具files/tests/fixtures 下的common.bash、test-setup.bash、test-teardown.bash负责准备环境变量、执行配置生成脚本并回收环境。八、发布与维护两个 Go 工具 Makefile 自动化构建出的 AMI 默认是私有的Teleport 团队用两个 Go 程序完成发布链路8.1 update-ami-id回写 Terraform 镜像 IDcmd/update-ami-id/main.go 通过--aws-account、--regions、--typeoss/ent/ent-fips、--version四个参数在指定区域中检索teleport-*且is-publictrue的镜像按Architecture、TeleportVersion、TeleportEdition、TeleportFipsEnabled、BuildTypeproduction标签过滤并把查到的 AMI ID 回写到 examples/aws 下的 Terraform 配置中。Makefile 的update-ami-ids-terraform目标一次性更新三种类型.PHONY: update-ami-ids-terraform update-ami-ids-terraform: go run ./cmd/update-ami-id --aws-account $(AWS_ACCOUNT_ID) --regions $(DESTINATION_REGIONS) --version $(TELEPORT_VERSION) --type oss go run ./cmd/update-ami-id --aws-account $(AWS_ACCOUNT_ID) --regions $(DESTINATION_REGIONS) --version $(TELEPORT_VERSION) --type ent go run ./cmd/update-ami-id --aws-account $(AWS_ACCOUNT_ID) --regions $(DESTINATION_REGIONS) --version $(TELEPORT_VERSION) --type ent-fips8.2 make-public将 AMI 设为公开cmd/make-public/main.go 会遍历region × 架构x86_64/arm64× 版本oss/ent× FIPSfalse/true的组合OSSFIPS 组合不存在会跳过找出最新镜像并调用 EC2ModifyImageAttribute把launchPermission设置为All公开实现发布一个版本即全网公开的自动化。8.3 create-update-pr一键提交变更Makefile 的create-update-pr目标依赖update-ami-ids-terraform会自动创建分支、提交对 examples/aws 与assets/aws的改动、推送并调用gh pr create创建 Pull Request随后开启 auto-merge——前提是本机安装并登录了 GitHub CLIgh。九、使用你的 AMI单实例集群与资源接入构建完成并公开后AMI 的使用方式与官方文档指引一致运行单实例 Teleport 集群在 EC2 控制台/Launch Template 中选择teleport-oss-version-arch镜像通过 User Data 写入/etc/teleport.d/conf角色设为TELEPORT_ROLEauth,node,proxy即可获得一个开箱即用的单实例集群把实例接入已有集群以node、proxy、auth或agent角色启动新实例让其加入现有 Teleport 集群以保护 SSH、Kubernetes、数据库和应用资源——Node/Agent 的 join token 通过 SSM 安全下发高可用部署如果自行托管 Auth 与 Proxy 服务可将 Auth 与 Proxy 拆分为独立角色并搭配 DynamoDB/S3 后端参考仓库 examples/aws 下的 Terraform 示例设计高可用架构。文档还特别提示FIPS 镜像在启动时无需额外操作install-hardened.sh与teleport-generate-config已在构建与首次启动阶段分别完成--fips参数注入和local_auth: false配置而 AMI 采用 IMDSv2 强制校验实例角色Instance Profile需要具备访问 SSM Parameter、S3、DynamoDB 的权限否则配置生成与 token 获取步骤会失败。十、总结从 assets/aws/README.md 出发结合仓库源码可以看到 Teleport AMI 是一套完整的构建-发布-使用工程构建由 Makefile/Packer 模板驱动基于强化 Amazon Linux 2023 制作产出teleport-type-version-arch命名规范的镜像支持 OSS/Enterprise、FIPS、多区域复制定制install-hardened.sh完成系统硬化、teleport 用户创建、二进制安装与证书工具链部署自动化teleport-generate-config按角色自动生成配置systemd 单元通过role.*标记门控启动让裸实例秒变集群成员验证与发布Bats 测试套件守护配置正确性update-ami-id/make-public两个 Go 工具负责把最新镜像公开并同步到 Terraform 配置。如需上手实践建议按 assets/aws/README.md 的步骤准备 AWS CLI 与 Packer从make oss或直接调用single-ami.pkr.hcl开始构建第一枚属于你自己的 Teleport AMI。【免费下载链接】teleportThe easiest, and most secure way to access and protect all of your infrastructure.项目地址: https://gitcode.com/gh_mirrors/tel/teleport创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价