将 Tailscale SSH 会话录制保存到 S3

原作者:Tailscale 文档团队(无个人署名)。中文翻译、示意图与技术审校:未完纪。 原文:Send Tailscale SSH session recordings to S3。源页标注最近验证日期为2026年1月9日;本次读取于2026年10月5日。源页将SSH会话录制标为Beta,要求Tailscale v1.40.1或更高版本,并注明可用于Personal和Enterprise套餐。以下完整翻译本页的S3存储配置;产品阶段与套餐信息以实际使用时的官方页面为准。

Tailscale SSH会话、录制节点与S3存储之间的数据流,以及IAM和Web UI访问控制边界
图1:录制数据、节点状态与S3访问权限的关系。示意图:未完纪原创,2026;不表示已执行或验证部署。

默认情况下,Tailscale SSH 会话录制会把录制文件保存到 Docker 宿主机的文件系统中。这样部署录制节点很快,也很直接;但你也可能希望使用 Amazon S3 这样更容易扩展、更具韧性的存储方案。

可以配置会话录制节点,将录制内容发送到 Amazon S3,或其他兼容 S3 的对象存储服务,例如 MinIO、Wasabi、Google Cloud Storage 或 Cloudflare R2。

如果部署录制节点时启用了内置 Web 界面,用户就可以通过该界面访问保存在 S3 中的录制内容。

将 S3 配置为会话录制节点的存储后端

前提条件

要把 S3 配置为会话录制的存储后端,你需要能访问一个 AWS 账户,并拥有创建以下资源的权限:

  • S3 存储桶;
  • IAM 策略。

还需要能够创建下列这一组资源:

  • IAM 用户;
  • IAM 用户的访问密钥。

或者能够创建:

  • IAM 角色。

创建 IAM 策略和用户或角色

在 AWS 账户中创建下面的 IAM 策略。将 Resource 中两处 <bucket-name> 都替换为你的 S3 存储桶名称。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetBucketLocation",
        "s3:GetObject",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::<bucket-name>/*",
        "arn:aws:s3:::<bucket-name>"
      ]
    }
  ]
}

如果运行录制节点时不启用内置 Web 界面,可以从策略中去掉 s3:GetObject 和 s3:ListBucket。s3:PutObject 与 s3:GetBucketLocation 始终必需。

如果准备使用 IAM 访问密钥获得写入存储桶的权限,将这项策略分配给一个新的 IAM 用户,并为该用户创建访问密钥。如果准备使用 IAM 角色,就创建一个角色,再附加前面定义的策略。

部署录制节点

将 S3 用作存储后端时,录制节点的部署方式与标准文件系统部署类似,只需增加 IAM 凭据或角色,以及 S3 存储桶的信息。

使用 AWS 访问密钥部署

使用访问密钥时,指定 AWS access key 和 secret key。以下样例按本页后文的参数定义,将原文的 AWS_ACCESS_KEY 修正为 AWS_ACCESS_KEY_ID,并去掉最后一行多余的续行符、为变量加上引号;其余流程相同。原始样例保存在源文快照中。

docker run --name tsrecorder --rm -it \
  -e TS_AUTHKEY="$TS_AUTHKEY" \
  -e AWS_ACCESS_KEY_ID="$AWS_ACCESS_KEY_ID" \
  -e AWS_SECRET_ACCESS_KEY="$AWS_SECRET_ACCESS_KEY" \
  -v "$HOME/tsrecorder:/data" \
  tailscale/tsrecorder:stable \
  /tsrecorder --dst='s3://s3.us-east-2.amazonaws.com' --statedir=/data/state \
  --bucket="$S3_BUCKET_NAME" --ui

使用已附加的 IAM 角色部署

使用 IAM 角色时,凭据从 AWS 元数据服务取得。你需要为运行容器的环境配置可用的 IAM 角色;如果在 EC2 实例上运行,还要配置 IAM 实例配置文件(instance profile)。

docker run --name tsrecorder --rm -it \
  -e TS_AUTHKEY="$TS_AUTHKEY" \
  -v "$HOME/tsrecorder:/data" \
  tailscale/tsrecorder:stable \
  /tsrecorder --dst='s3://s3.us-east-2.amazonaws.com' --statedir=/data/state \
  --bucket="$S3_BUCKET_NAME" --ui

编辑说明:这个角色示例同样移除了原文最后的续行反斜杠,并给Shell变量加引号。两段命令保留原文的 stable 镜像标签以便对应文档;生产部署应在验证后固定适用的版本或镜像摘要。--rm -it 是交互式示例,不包含后台常驻、故障重启与监控配置。

如果承载 Docker 容器的实例使用 Instance Metadata Service v2,默认的 PUT 响应跳数上限是1。为了让 Docker 中的应用能够使用实例配置文件,需要把容器经过实例的额外一跳考虑进去,因此原文要求至少设置为2。实际值应根据容器网络路径配置。

必需参数:

  • --dst:指定录制保存位置,接受本地文件路径或 S3 区域端点 URL。使用 S3 存储时,值必须以 s3:// 开头。也可以通过环境变量 TSRECORDER_DST 设置。
  • --statedir:指定录制节点保存内部状态的目录,接受本地文件路径。

可选参数(其中部分在特定部署方式下必需):

  • --hostname:录制节点的主机名,默认 recorder。也可以通过环境变量 TSRECORDER_HOSTNAME 设置。
  • --access-key:能够向 S3 存储桶上传录制的 IAM 用户的 AWS access key。使用 S3 且未为实例配置 IAM 角色时必需,也可以通过环境变量 AWS_ACCESS_KEY_ID 设置。
  • --secret-key:同一 IAM 用户的 AWS secret access key。使用 S3 且未为实例配置 IAM 角色时必需,也可以通过环境变量 AWS_SECRET_ACCESS_KEY 设置。
  • --bucket:录制文件要上传到的 S3 存储桶名称,使用 S3 后端时必需。也可以通过环境变量 TSRECORDER_BUCKET 设置。
  • --state:Tailscale 状态文件的路径,用于在容器重启后保留录制节点状态。可以使用持久卷,也可以使用 Kubernetes Secret;还可通过环境变量 TS_STATE 设置。若使用 Secret,值写为 kube:<secret-name>。录制节点必须有读取、更新和 patch 该 Secret 的权限;若 Secret 尚不存在,节点会创建它,因此也需要创建权限。
  • 如果没有设置 --state,状态会保存在 --statedir 指定的目录中。
  • --ui:启用录制容器的 Web 界面,供查看 SSH 会话录制。未提供此参数时,默认为 false;也可以通过环境变量 TSRECORDER_UI 设置。使用 Web 界面时,必须在 tailnet 中启用 HTTPS。
  • 启用 Web 界面后,应通过访问控制策略限制录制节点的 443 端口,避免未经授权的 tailnet 成员看到敏感录制。

连接 S3 所需的 AWS IAM 凭据有多种提供方式,优先级从高到低如下:

  • 通过 --access-key 和 --secret-key 指定;
  • 设置 AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY;
  • 不指定上述两种方式,在具有适当权限的 EC2 实例上使用角色凭据。

Cloudflare R2 兼容性

Cloudflare R2 Storage 提供兼容 S3 的 API,但由于实现差异,还需要一项额外设置。将 R2 用作会话录制存储服务时,除了已有环境变量,还要将 S3_SEND_CONTENT_MD5 设置为 true。

S3_SEND_CONTENT_MD5=true

编辑说明:凭据、权限与部署边界

源文的访问密钥命令写作 AWS_ACCESS_KEY,同页参数说明及凭据优先级却写作 AWS_ACCESS_KEY_ID;本文采用后者并明确记录了差异。参数说明中误称 TSRECORDER_BUCKET 为secret access key的措辞,也按其实际含义改为存储桶名称。这是基于源文内部一致性的静态修订,没有运行容器验证。

示例变量均为占位符,没有提供真实密钥。IAM角色可减少长期访问密钥的管理负担;如果必须传入密钥,环境变量仍可能被拥有宿主机或容器管理权限的人查看,不要把实际值写进文章、镜像、版本库或公开日志。将策略资源限定到录制专用桶;未启用UI时去掉读取和列举权限。录制可能包含终端中的令牌、命令输出和其他敏感内容,应事先取得必要授权,并限制查看与保留范围。对象存储会产生相应费用。

本文只覆盖S3存储后端,不替代Tailscale SSH录制功能本身的启用步骤和tailnet策略。s3://s3.us-east-2.amazonaws.com 是原文的区域端点示例,应与实际存储服务匹配。IAM策略并未授予所有AWS资源的权限;如果另有组织策略或特殊加密要求,还需要按实际环境验证。本文没有创建存储桶、用户或角色,也没有上传录制。

原文中的参考链接

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容