Engineering guide

短租云端 Mac 的安全基线与密钥清理实战

短租云端 Mac 的安全基线与密钥清理实战

发布前一周临时增加一台云端 Mac,最容易被忽略的不是编译速度,而是访问边界。开发者往往把本机长期使用的 SSH 私钥、仓库令牌和签名材料直接复制过去,任务结束后只删除项目目录。更稳妥的做法,是把每次租期视为一个独立安全周期:接入时建立基线,运行中限制凭据,归还前验证迁出和清理结果。

先定义这次租用的信任边界

先记录节点用途、负责人、租期结束时间和需要接触的数据。用于公开代码测试的机器,与需要处理签名材料的构建节点,不应使用同一套凭据。多人协作时,为每位成员分配独立登录方式,不共享私钥,也不要把管理员凭据写进团队文档。

对象 推荐边界 租期结束动作
SSH 密钥 每台节点或每个租期独立生成 撤销公钥并删除临时私钥
仓库令牌 只授予目标仓库和必要操作 在服务端撤销并核对使用记录
构建材料 仅在任务需要时导入 删除钥匙串条目与临时副本
构建产物 输出到单独目录 校验后迁出,再删除节点副本

短租节点的安全目标不是让凭据永远有效,而是让每份凭据都有明确用途、最小权限和可验证的失效时间。

首次连接后的十五分钟检查

首次登录后不要立刻导入项目。先确认当前用户、系统版本、远程登录状态和防火墙状态,并保留检查结果。系统更新是否立即执行,应结合当前构建工具链的版本要求决定,避免在发布任务中途改变环境。

whoami
sw_vers
sudo systemsetup -getremotelogin
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate
softwareupdate --list

建立租期专用 SSH 密钥

在受控工作站生成专用密钥,不要复制已有的长期私钥。将公钥加入云端 Mac 后,先打开第二个终端验证新连接,再考虑调整旧的访问方式。

umask 077
mkdir -p ~/.ssh
ssh-keygen -t ed25519 -f ~/.ssh/armmacs-rental -C "temporary-build-node"
chmod 700 ~/.ssh
chmod 600 ~/.ssh/armmacs-rental

本地 ~/.ssh/config 可以为节点设置独立别名,并用 IdentitiesOnly yes 防止 SSH 客户端尝试其他密钥。节点地址、用户名和密钥路径应来自本次订单记录,不要把真实地址提交到代码仓库。

Host rented-mac
    HostName <node-address>
    User <node-user>
    IdentityFile ~/.ssh/armmacs-rental
    IdentitiesOnly yes
    ServerAliveInterval 30

让秘密只在需要时出现

不要把令牌写进脚本、项目配置或 Shell 启动文件。优先使用交互式输入、受限环境变量或 macOS 钥匙串,并确保构建日志不会回显变量值。临时文件应放进权限受控的目录,默认权限设置为仅当前用户可读。

umask 077
mkdir -p ~/secure-input
chmod 700 ~/secure-input
security add-generic-password -a build -s ci-token -w

调用结束后立即清除当前 Shell 中的变量。若凭据只服务一次发布,不要让它跨会话长期保留。

unset CI_TOKEN
security delete-generic-password -a build -s ci-token

避免日志和缓存带走秘密

构建脚本不要启用会输出完整命令的调试模式。错误日志共享前,检查请求头、环境变量、节点地址、用户名和文件路径。Derived Data、包管理缓存与测试附件可能包含项目名和内部路径,应按任务敏感度决定是否保留,而不是默认全部打包。

运行期间做轻量审计

至少在人员变更、凭据轮换和关键发布前检查一次登录会话、监听端口、后台进程与磁盘余量。发现陌生进程时,先记录进程号、启动用户和命令路径,再决定终止,避免误杀正在运行的构建任务。

who
ps -axo user,pid,ppid,command
lsof -nP -iTCP -sTCP:LISTEN
df -h
find ~/work -type f -perm -004

最后一条用于发现工作目录中允许其他用户读取的文件。它不是完整的权限审计,但能快速找出明显配置错误。多人使用同一节点时,还应把共享目录与个人目录分开,并避免使用全局可写目录传递签名材料。

租期结束前按顺序迁出与清理

先停止 Runner、构建代理和自定义后台任务,防止清理期间继续生成文件。随后打包需要保留的项目、日志和产物,生成校验值,并在另一台受控设备上解压抽查。只有确认迁出成功后,才删除节点上的工作副本。

mkdir -p ~/export
ditto -c -k --keepParent ~/work/project ~/export/project.zip
shasum -a 256 ~/export/project.zip
git -C ~/work/project status --short

清理范围至少包括项目目录、导出目录、构建缓存、临时目录、钥匙串条目、SSH 授权、公钥记录和专用账户的 Shell 历史。还要从凭据签发端撤销仓库令牌,并从自己的工作站删除本次租期专用私钥。SSD 上反复覆盖单个文件不能替代平台侧的节点回收流程,不应把覆盖次数当作清理完成的证据。

离场前再做一次反向检查:专用密钥能否继续登录,临时令牌是否已失效,后台进程是否仍在运行,导出文件是否还留在节点,工作目录是否存在未提交修改。把结果写入交接记录,能够避免“以为删过”和“实际仍可访问”之间的差距。

常见问题

短租云端 Mac 是否应该复用本机的长期 SSH 私钥?

不应该。为每台节点或每个租期生成独立密钥,设置明确的文件名与用途,结束租用后撤销对应公钥并删除临时私钥,可显著缩小凭据泄露后的影响范围。

删除工作目录后是否就完成了租期结束清理?

没有。还应检查钥匙串条目、SSH 配置、Shell 历史、构建缓存、临时目录、后台进程和导出文件,并在确认校验值与迁出结果后再执行节点回收。

远程连接设置应先追求严格还是先保证可恢复?

先建立第二条已验证的管理连接,再逐项收紧访问设置。不要在唯一的 SSH 会话中直接关闭远程登录,否则配置错误可能导致节点失联。

ArmMacs Cloud Mac

按项目周期使用独享物理节点

选择固定芯片、内存、存储、租期与在售节点,库存可用时进入交付流程。

选择机型并订购