安全模型
Tarsail 是部署传输工具,不是安全平台。
它的安全模型刻意保持明确:使用 SSH 传输,只复制显式配置的文件,避免打印密钥内容,并把密钥生命周期管理留给操作者。
SSH 认证
Section titled “SSH 认证”Tarsail 支持三种实际 SSH 路径。
默认 SSH 行为
Section titled “默认 SSH 行为”不传 --identity-file 或 --ask-password 时,Tarsail 会用配置的 target 调用系统 ssh 和 scp:
tarsail deploy这会使用你的正常 SSH 配置,包括默认身份和系统 SSH 支持的 host alias。
tarsail --identity-file ~/.ssh/my-app-deploy-key deploy或:
tarsail --ssh-key ~/.ssh/my-app-deploy-key deployTarsail 把密钥路径传给 ssh 和 scp。它不会读取或上传私钥内容。
tarsail --ask-password deployTarsail 请求一次远端用户的 SSH 密码,并在当前命令里用于远端 SSH 命令和文件上传。
密码模式:
- 不把密码存到磁盘;
- 不打印密码;
- 只把密码保存在进程内存中;
- 使用本地
~/.ssh/known_hosts做主机密钥验证; - 不能与
--identity-file同时使用。
主机密钥验证
Section titled “主机密钥验证”密码模式使用 known_hosts。
如果主机尚未受信任,Tarsail 会失败并要求你先用系统 SSH 客户端连接:
通过可信渠道确认主机密钥后再接受。
不要为了让部署通过而关闭主机密钥检查。
远端命令执行
Section titled “远端命令执行”Tarsail 通过 SSH 和 sh -c 执行远端命令。
为了降低 shell 注入风险,配置验证限制了项目名、target 名、用户、host、路径、服务名和托管目标路径。
这就是 Tarsail 会拒绝很多普通 YAML 或 shell 也许能接受的字符的原因。
Tarsail 只传输显式配置的密钥:
compose: env_file: source: .deploy/prod.env target: shared/.env
secrets: - source: .deploy/app.key target: shared/secrets/app.key配置的环境文件和密钥文件会上传到 shared/。
它们不会进入发布包。
Tarsail 会在打印命令输出和错误前,对常见敏感模式做脱敏。
脱敏是安全兜底,不是安全保证。不要让命令和 Compose 配置打印密钥。
发布包包含:
- manifest 元数据;
- Compose 文件;
- 保存的 Docker 镜像 tar 文件;
- 配置的非密钥托管文件。
发布包不包含配置的 compose.env_file 或 secrets。
在服务器上,Tarsail 解压前会检查 tar 条目,并拒绝绝对路径或父目录穿越等不安全归档路径。
Tarsail 不负责保护什么
Section titled “Tarsail 不负责保护什么”Tarsail 不会:
- 加固服务器;
- 创建用户;
- 配置 sudo;
- 安装 Docker;
- 管理防火墙;
- 申请 TLS 证书;
- 轮换密钥;
- 加密远端
shared/目录; - 扫描镜像;
- 扫描源码密钥;
- 管理数据库凭据;
- 备份数据;
- 保证零停机;
- 执行应用授权策略。
这些仍然是应用和基础设施职责。
公开文档卫生
Section titled “公开文档卫生”公开示例应该使用占位值:
example.com/opt/my-app192.0.2.10不要公开:
- 真实生产 IP;
- 私有域名;
- 绑定私有基础设施的真实用户名;
- 凭据;
- token;
- 私钥路径;
- 带密码的数据库 URL;
- 完整
.env文件。
如果密钥被提交或贴到公开 issue,应该轮换。只删除文本不够。
推荐部署姿态
Section titled “推荐部署姿态”常规部署建议:
- 优先使用 SSH 密钥认证;
- 条件允许时使用专门的 deploy 用户;
target.path使用项目专属路径;- 环境和密钥文件放在 git 外;
- 私密文件使用
mode: 600; - 服务器访问变化后运行
doctor; - 避免应用日志打印环境变量值;
- 单独记录数据库备份和回滚行为。