跳转到内容

安全模型

Tarsail 是部署传输工具,不是安全平台。

它的安全模型刻意保持明确:使用 SSH 传输,只复制显式配置的文件,避免打印密钥内容,并把密钥生命周期管理留给操作者。

Tarsail 支持三种实际 SSH 路径。

不传 --identity-file--ask-password 时,Tarsail 会用配置的 target 调用系统 sshscp

Terminal window
tarsail deploy

这会使用你的正常 SSH 配置,包括默认身份和系统 SSH 支持的 host alias。

Terminal window
tarsail --identity-file ~/.ssh/my-app-deploy-key deploy

或:

Terminal window
tarsail --ssh-key ~/.ssh/my-app-deploy-key deploy

Tarsail 把密钥路径传给 sshscp。它不会读取或上传私钥内容。

Terminal window
tarsail --ask-password deploy

Tarsail 请求一次远端用户的 SSH 密码,并在当前命令里用于远端 SSH 命令和文件上传。

密码模式:

  • 不把密码存到磁盘;
  • 不打印密码;
  • 只把密码保存在进程内存中;
  • 使用本地 ~/.ssh/known_hosts 做主机密钥验证;
  • 不能与 --identity-file 同时使用。

密码模式使用 known_hosts

如果主机尚未受信任,Tarsail 会失败并要求你先用系统 SSH 客户端连接:

Terminal window

通过可信渠道确认主机密钥后再接受。

不要为了让部署通过而关闭主机密钥检查。

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_filesecrets

在服务器上,Tarsail 解压前会检查 tar 条目,并拒绝绝对路径或父目录穿越等不安全归档路径。

Tarsail 不会:

  • 加固服务器;
  • 创建用户;
  • 配置 sudo;
  • 安装 Docker;
  • 管理防火墙;
  • 申请 TLS 证书;
  • 轮换密钥;
  • 加密远端 shared/ 目录;
  • 扫描镜像;
  • 扫描源码密钥;
  • 管理数据库凭据;
  • 备份数据;
  • 保证零停机;
  • 执行应用授权策略。

这些仍然是应用和基础设施职责。

公开示例应该使用占位值:

example.com
/opt/my-app
192.0.2.10

不要公开:

  • 真实生产 IP;
  • 私有域名;
  • 绑定私有基础设施的真实用户名;
  • 凭据;
  • token;
  • 私钥路径;
  • 带密码的数据库 URL;
  • 完整 .env 文件。

如果密钥被提交或贴到公开 issue,应该轮换。只删除文本不够。

常规部署建议:

  • 优先使用 SSH 密钥认证;
  • 条件允许时使用专门的 deploy 用户;
  • target.path 使用项目专属路径;
  • 环境和密钥文件放在 git 外;
  • 私密文件使用 mode: 600
  • 服务器访问变化后运行 doctor
  • 避免应用日志打印环境变量值;
  • 单独记录数据库备份和回滚行为。