原作者: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 会话录制会把录制文件保存到 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资源的权限;如果另有组织策略或特殊加密要求,还需要按实际环境验证。本文没有创建存储桶、用户或角色,也没有上传录制。
原文中的参考链接
- Create the following IAM policy
- create an access key
- create an IAM role
- IAM instance profile
- Instance Metadata v2
- so 2 at minimum
- Secret
- S3-compatible API
原文版权归 Tailscale Inc. 所有,源站页脚标示 © 2026 Tailscale Inc.;Tailscale为Tailscale Inc.注册商标,WireGuard为Jason A. Donenfeld注册商标。原创示意图署名未完纪。












暂无评论内容