发布前一周临时增加一台云端 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
按项目周期使用独享物理节点
选择固定芯片、内存、存储、租期与在售节点,库存可用时进入交付流程。