FEATURED · 精选文章

Fleet 使用 CloudFront 签名 URL 加速 MDM 引导包与软件安装包分发

发布时间 / 2026/9/17 10:33:45
来源 / 创域科博编辑部
栏目 / 资讯中心
Fleet 使用 CloudFront 签名 URL 加速 MDM 引导包与软件安装包分发 Fleet 使用 CloudFront 签名 URL 加速 MDM 引导包与软件安装包分发【免费下载链接】fleetOpen device management项目地址: https://gitcode.com/GitHub_Trending/fl/fleet本篇基于 Fleet 官方文章《How to use CloudFront signed URLs with Fleet》并结合当前仓库源码编写。Fleet v4.63.0 起Fleet Premium 可用支持用 CloudFront 签名 URL 下发 MDM bootstrap 包和软件安装包让全球分布式组织的新设备接入不再挤占单一 Fleet 服务器带宽。读完本文你能完成 S3 CloudFront 签名密钥对的完整配置、理解签名 URL 的生成链路与过期策略并通过日志验证分发链路是否真正走了 CDN。前置条件启用 CloudFront 签名 URL 分发前需要满足以下条件Fleet v4.63.0及以上版本该功能为 Fleet Premium 能力。从源码看S3 软件安装包存储的初始化本身就位于 Premium 分支内serve.go 中license.IsPremium()成立后才会调用s3.NewSoftwareInstallerStore创建 S3 存储Orbit v1.39.0及以上版本 agent 安装在主机上软件安装包下载场景需要一个已配置CloudFront 分发distribution和签名密钥对signing key pair的 S3 桶。关于如何为 S3 桶添加带可信签名者的 CloudFront 分发可按 AWS 官方文档中 private-content-trusted-signers私有内容的可信签名者章节操作即在 CloudFront 创建签名密钥对、将公钥关联到分发并设置为可信签名者、私钥保存在 Fleet 服务器侧。原文档还提到 Fleet 工程师 Victor Lyuboslavsky 曾撰写过一篇 How to securely serve private CDN content using CloudFront 指南思路与此一致。配置 Fleet 服务器的 S3 与 CloudFront三个核心配置项Fleet 的 S3 相关配置通过命令行、环境变量或配置文件统一设置。要启用 CloudFront 签名 URL需设置以下三个选项对应 config.go 中S3Config结构体的三个字段yaml标签即配置文件键名配置项对应结构体字段说明示例值s3_software_installers_cloudfront_urlSoftwareInstallersCloudFrontURLCloudFront 分发的基础 URLhttps://d1234567890.cloudfront.nets3_software_installers_cloudfront_url_signing_public_key_idSoftwareInstallersCloudFrontURLSigningPublicKeyIDCloudFront 签名者的密钥对 IDK1HFGXOMBB6TFFs3_software_installers_cloudfront_url_signing_private_keySoftwareInstallersCloudFrontURLSigningPrivateKeyCloudFront 签名者的私钥PEM 内容换行以\n转义-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQEAz...这三个配置项在启动参数中通过 config.go 注册并从命令行/环境变量/配置文件解析后装配进S3Configconfig.go。私钥环境变量的换行处理私钥内容通常包含换行而环境变量需要单行字符串。因此FLEET_S3_SOFTWARE_INSTALLERS_CLOUDFRONT_URL_SIGNING_PRIVATE_KEY环境变量可以从文件读取并在 macOS 上用 GNU 版本的 sedgsed通过gnu-sed公式安装把换行替换为字面量\nexport FLEET_S3_SOFTWARE_INSTALLERS_CLOUDFRONT_URL_SIGNING_PRIVATE_KEY$(cat ./private_key.pem | gsed -z s/\n/\\n/g)为什么必须是\n转义服务端启动时会做反向处理serve.go 中先把配置值里所有的\\n替换回真正的换行符再交给cryptoutil.ParsePrivateKey解析出 RSA 私钥并断言其实现了crypto.Signer接口// cmd/fleet/serve.go节选 if config.S3.SoftwareInstallersCloudFrontURLSigningPrivateKey ! { signingPrivateKey : strings.ReplaceAll(config.S3.SoftwareInstallersCloudFrontURLSigningPrivateKey, \\n, \n) privateKey, err : cryptoutil.ParsePrivateKey([]byte(signingPrivateKey), CloudFront URL signing private key) ... config.S3.SoftwareInstallersCloudFrontSigner, ok privateKey.(crypto.Signer) }也就是说配置文件/环境变量里传\n两个字符服务端还原成 PEM 多行文本后再解析——如果你在 shell 里导出了带真实换行的私钥解析会直接失败并以 fatal 错误终止启动。启动时的配置校验规则在创建 S3 存储之前Fleet 会调用ValidateCloudFrontURL做严格校验config.go违反任何一条都会导致启动失败基础 URL 必须是合法 URL 且 scheme 为 https——http前缀的 CloudFront URL 直接报 fatalcloudfront url scheme must be https。这也呼应了原文档的明确声明未签名的 CDN URL 不安全Fleet 不支持公钥 ID 与私钥必须成对出现——只设置了其中一个而缺少另一个会报 Both ... must be set for URL signing设置基础 URL 就必须同时提供密钥对——否则报 Both ... must be set when CloudFront distribution URL is set只有密钥对而没有基础 URL——报 s3_software_installers_cloudfront_url must be set to use ...防止配置了密钥却没指分发地址。校验通过后配置通过SoftwareInstallersToInternalCfgconfig.go转换为内部配置只要SoftwareInstallersCloudFrontSigner非空就会构造S3CloudFrontConfig{BaseURL, SigningPublicKeyID, Signer}传给存储层。签名 URL 如何生成源码级链路签名发生在哪一层存储层的核心是commonFileStore.Signcommon_file_store.go它是优先 CloudFront 签名 URL、其次 GCS 预签名 URL、否则报未配置的三档逻辑func (s *commonFileStore) Sign(ctx context.Context, fileID string, expiresIn time.Duration) (string, error) { // Preferred: CloudFront signed URL (AWS), when configured. if s.cloudFrontConfig ! nil { urlToAccess, err : url.JoinPath(s.cloudFrontConfig.BaseURL, s.keyForFile(fileID)) ... signer : sign.NewURLSigner(s.cloudFrontConfig.SigningPublicKeyID, s.cloudFrontConfig.Signer) signedURL, err : signer.Sign(urlToAccess, time.Now().Add(expiresIn)) ... return signedURL, nil } ... }从这段实现可以看出两个关键事实签名 URL 的对象路径由 S3 键拼接而来url.JoinPath(分发基础URL, keyForFile(fileID))而keyForFile会拼上存储前缀软件安装包固定为software-installers前缀见 software_installer.go 中pathPrefix: software-installers。因此 CloudFront 分发的源站映射路径必须与桶内实际对象键一致过期时间由调用方传入expiresIn参数Sign内部以time.Now().Add(expiresIn)作为截止时刻传给 AWS 的URLSigner。按原文档说明Fleet 生成的签名 URL有效期为 6 小时且按需即时生成on the fly——不是预生成后长期挂在那里。MDM bootstrap 包与软件安装包复用同一套 S3 存储与签名逻辑bootstrap 包走s3.NewBootstrapPackageStoreserve.go软件安装包走s3.NewSoftwareInstallerStoreserve.go两者都在同一 Premium 分支内初始化并共享同一份S3Config所以配置一次即对两类分发同时生效。容错与回退策略原文档定义了两层回退保证 CDN 故障不阻塞接入流程服务端Fleet 在为 bootstrap 包生成签名 URL 时出错会回退到使用 Fleet 服务器自身的 URL下发设备仍可从 Fleet 服务器直接拉取包Agent 端Orbit agent 用签名 URL 下载软件包失败时会回退到 Fleet 服务器 URL 重试下载。这使得签名密钥过期、私钥被轮换、CDN 暂时不可用等情况都只造成变慢而不会造成装不上。验证签名 URL 是否真正生效配置完成后如何确认流量真的走了 CloudFront 而不是 Fleet 服务器原文档给出三类观测手段CloudFront 访问日志如果已开启应能看到来自各设备的下载记录APM 或 Fleet 服务器 debug 日志在 APM 追踪和 debug 日志里不应再出现设备从 Fleet 服务器非 CDN API 路径下载包的请求重点检查以下两条GET /api/v1/fleet/bootstrapbootstrap 包下载路径POST /api/fleet/orbit/software_install/packageOrbit 软件包下载路径若这两条路径持续出现来自设备的请求说明签名 URL 未生效例如密钥配置有误导致一直走回退应回查上文启动时的配置校验规则一节。从测试侧也可以印证该链路server/service/integration_install_test.go中的集成测试通过注入SignFunc模拟Sign(ctx, fileID, expiresIn)签名函数来覆盖签名 URL 下发成功与签名失败后回退等行为说明签名 URL 与回退逻辑均有自动化测试保护。小结CloudFront 签名 URL 方案把大体量的 bootstrap 包与软件安装包下载从 Fleet 服务器转移到了全球 CDN 边缘节点URL 按需即时生成、有效期 6 小时、私钥仅保存在服务端、签名密钥对由 CloudFront 在请求侧校验同时保留两级回退保证可靠性。配置上只需三个s3_software_installers_cloudfront_*选项且服务端在启动时会对 URL scheme 与密钥对完整性做强制校验配置错误会立即暴露而非静默失效。结合 CloudFront 日志与两条非 CDN 下载 API 路径的监控可以明确判断分发链路是否真正经由 CDN。主要参考路径server/config/config.go、cmd/fleet/serve.go、server/datastore/s3/common_file_store.go、server/datastore/s3/software_installer.go、server/service/integration_install_test.go。【免费下载链接】fleetOpen device management项目地址: https://gitcode.com/GitHub_Trending/fl/fleet创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻