裝了 Tailscale SSH 之後,有兩個延伸功能都和「記錄或遠端操作 SSH 工作階段」有關,但用途完全不同:
- 工作階段錄影(session recording):把 Tailscale SSH 的畫面串流到 tailnet 內一台自己架的 recorder,存成 asciinema 格式,供日後稽核、重播。這篇會誠實說明它目前的上線狀態。
- 瀏覽器 SSH(SSH Console):在 Admin console 的 Machines 頁面直接開一個瀏覽器裡的 SSH 視窗,適合手邊的裝置沒裝 Tailscale、或只想快速登進去操作的情境。
兩者都只對「走 Tailscale SSH」的連線生效,所以請先讀過 Tailscale SSH,再回來看這篇。
本文依 2026 年 10 月的 Tailscale 官方文件整理,以 Tailscale v1.104 為準。工作階段錄影(
tsrecorder)與瀏覽器 SSH(SSH Console)官方都標示 beta;工作階段錄影已停止提供給新使用者(既有支援到 2027 年 8 月)。本文的設定步驟屬文件整理、未實機驗證,Docker(tailscale/tsrecorder:stable)與asciinema未釘版本。上線狀態與方案限制可能變動,動手前請重新查官方文件。
兩個功能的差別
| 工作階段錄影 | 瀏覽器 SSH | |
|---|---|---|
| 官方名稱 | Tailscale SSH session recording | Tailscale SSH Console |
| 目的 | 把 SSH 畫面錄下來稽核、重播 | 在瀏覽器裡操作 SSH |
| 上線狀態 | beta;已停止提供給新使用者(既有使用者到 2027 年 8 月) | beta |
| 方案 | 官方文件標示:Personal、Enterprise(不含 Standard/Premium) | 所有方案 |
| 誰能設定/使用 | Owner、Admin、Network admin | Owner、Admin、IT admin、Network admin |
| 額外組件 | 自己架一台 recorder(tsrecorder) |
無,瀏覽器就是節點 |
工作階段錄影
上線狀態:已停止提供給新使用者
Tailscale 已不再透過 tsrecorder 提供工作階段錄影給新使用者;既有使用者的支援預計到 2027 年 8 月結束,之後改由 Tailscale PAM 提供 session 紀錄與特權存取管理。也就是說,如果你現在才要開始用,官方文件開頭就放著這則 deprecation 公告,tsrecorder 這條路等於關門了。
需要工作階段錄影與稽核時,官方目前的建議是:
- Tailscale PAM(beta):在 Admin console 的 Sessions 頁面查看連線紀錄;SSH 服務可開啟錄影,用 video replay、full text、events 檢視 session 內容。
- 或聯絡 Tailscale Sales。
本文接下來的設定步驟,是依官方文件整理的歷史做法,未實機驗證,主要讓你了解運作原理,以及既有使用者或自架情境下的做法。
運作方式
- 錄影從目的節點(被連的 SSH 伺服器)串流到 tailnet 內一台 recorder 節點。recorder 是用
tsnet寫成的二進位檔,部署成 Docker 容器。 - 流量走 tailnet,端對端加密,Tailscale 看不到內容。
- 錄影存成 asciinema 格式:一行一筆的 JSON,可直接當文字搜尋,也能用
asciinemaCLI 或 recorder 內建網頁重播。 - recorder 可以把錄影存在主機檔案系統,也可以直接上傳到 Amazon S3 或其他 S3 相容儲存。
只錄輸出,不錄按鍵
官方文件寫得很清楚:錄影記錄的是「終端機畫面上出現的所有文字」,也就是輸出(output),不記錄按鍵本身(keystroke)。但有兩個細節:
- 一般打字時,終端機預設會把輸入的字元**回顯(echo)**到畫面上。這些回顯的字元屬於「輸出」,所以會出現在錄影裡——你輸入的指令通常還是看得見。
- 真正錄不到的是不回顯的輸入,例如在密碼提示下輸入的字元。畫面沒出現的字,錄影裡就沒有。
- 使用二進位協定時(例如舊版的
scp),錄影會把傳送的二進位資料也錄進去,可能包含敏感內容。
換句話說,錄影是「螢幕錄影」而非「鍵盤側錄」;但螢幕上出現過的密碼、token 等敏感字,一樣會進錄影檔。
自己架 recorder(文件整理)
前置條件:Tailscale SSH 已設定好,且你是 tailnet 的 Owner、Admin 或 Network admin。
1. 建 tag 與 auth key
recorder 一定要有 tag,建議開一個專用 tag:
"tagOwners": {
"tag:session-recorder": ["autogroup:admin"]
}再到 Admin console 的 Keys 頁面建一把 auth key、掛上這個 tag(tailnet 有 device approval 就用 pre-approved key)。
2. 部署 recorder
export TS_AUTHKEY=<你的-auth-key>
docker pull tailscale/tsrecorder:stable
docker run --name tsrecorder --rm -it \
-e TS_AUTHKEY=$TS_AUTHKEY \
-v $HOME/tsrecorder:/data \
tailscale/tsrecorder:stable \
/tsrecorder --dst=/data/recordings --statedir=/data/state --ui--dst 必填,指定錄影存放位置(本機路徑或 S3 region URL)。其他常用旗標:
| 旗標 | 用途 |
|---|---|
--dst(必填) |
錄影存放位置,本機路徑或 S3 region URL(環境變數 TSRECORDER_DST) |
--statedir |
內部狀態目錄;未指定 --state 時必填 |
--state |
指向 state 檔,跨容器重啟保存節點身分(例如掛在 persistent volume) |
--ui |
開啟內建網頁 UI(聽 443 埠);啟用前 tailnet 要先開 HTTPS |
--hostname |
recorder 節點名稱,預設 recorder |
--access-key/--secret-key/--bucket |
用 S3 存放時的 AWS 憑證與 bucket |
recorder 的 80 埠用來接收錄影,443 埠是網頁 UI。recorder 用 tsnet 加入 tailnet,所以跑 Docker 的主機不必是 tailnet 成員。使用 Tailscale 的 Kubernetes operator 時,也可以改用 Recorder Custom Resource 部署。
3. 在 policy 開啟錄影
在 ssh 規則裡加上 recorder 欄位,指定 recorder 的 tag:
{
"action": "accept",
"src": ["group:admins"],
"dst": ["tag:server"],
"users": ["ubuntu"],
"recorder": ["tag:session-recorder"],
"enforceRecorder": false
}- 沒寫
recorder的規則,session 就不錄。 enforceRecorder預設false(fail open):recorder 連不上時,SSH 照常放行,只是那段沒錄到。設true(fail closed)則 recorder 不可用時拒絕 SSH 連線,並中斷已在錄的 session。- 同一條連線同時符合多條規則、
enforceRecorder值不同時,以 policy 檔案裡先出現的那條為準。
最小權限範例
{
"groups": {
"group:admins": ["alice@example.com"]
},
"tagOwners": {
"tag:server": ["group:admins"],
"tag:session-recorder": ["group:admins"]
},
"grants": [
// 網路層:admins 才能 SSH 到 tag:server(22 埠)
{
"src": ["group:admins"],
"dst": ["tag:server"],
"ip": ["22"]
},
// 只有開了 --ui 才需要:限制誰能開 recorder 的網頁 UI(443 埠)
{
"src": ["group:admins"],
"dst": ["tag:session-recorder"],
"ip": ["tcp:443"]
}
],
"ssh": [
{
"action": "accept",
"src": ["group:admins"],
"dst": ["tag:server"],
"users": ["ubuntu"],
"recorder": ["tag:session-recorder"],
"enforceRecorder": true
}
]
}SSH 伺服器把錄影送到 recorder 的 80 埠,這條由 Tailscale 自動放行,不用寫進 grants。要自己寫的是:誰能 SSH 到伺服器(22 埠),以及——如果開了網頁 UI——誰能開 443 埠。後者別設成全 tailnet 都開,否則任何人都能看錄影。規則寫法見 ACL / Grants 入門。
查看錄影
錄影存在你指定的目錄,路徑是 /dir/<stable-node-id>/<timestamp>.cast。
- 開
--ui:瀏覽器開https://{recorder-name}.{tailnet-dns-name}.ts.net。 - CLI:
cat <session-recording.cast>直接看原始 JSON,asciinema play <session-recording.cast>重播。 - 搜尋:asciinema 是文字格式,
grep "sudo" <session-recording.cast>就能找關鍵字。
recorder 磁碟滿了會存不下錄影,導致 session 被中斷、新 session 被拒。要清出空間或加儲存,再把 policy 的 recorder 欄位加回去。
限制
- 只錄 Tailscale SSH 的 session,其他走 tailnet 的 SSH 不錄。
- 錄影從目的節點串流,不能改成從來源節點串流。
- 只錄輸出、不錄輸入;輸出裡的敏感資料(例如螢幕上顯示的密碼、token)也會一併錄進去。
- 生產環境可部署多台 recorder 做 failover(見官方文件)。
瀏覽器 SSH(SSH Console)
運作方式
在 Admin console 的 Machines 頁面對某台機器按 SSH 按鈕,瀏覽器就開出一個 SSH 視窗,不必在裝置上裝 SSH 用戶端。
背後是 WebAssembly:瀏覽器裡跑 Tailscale 用戶端、WireGuard、userspace networking stack 和一個 SSH client。開 session 時,Tailscale 用你的身分產生一把 ephemeral auth key,建一台暫時(ephemeral)節點,名稱像 tailscale-ssh-console-alice-example-com-12345abcde;session 結束後這台節點自動移除。
- 連線端對端加密,Tailscale 讀不到內容。
- 流量全部經 DERP relay,不是直連;DERP 也無法解密內容。
誰能用、怎麼開
- beta,所有方案都能使用。
- 只有 Owner、Admin、IT admin、Network admin 能用,一般 Member 看不到這個選項。
步驟:
- 到 Machines 頁面找到要連的機器。
- 右邊選單選 SSH to machine(或 hover 後按 SSH)。
- 選本機帳號;下拉沒列到的帳號選 Other 手動輸入。
- 依提示重新驗證身分(每個新 session 都要重新驗證)。
- 新視窗標題
Tailscale — SSH to <機器名>就是 SSH session。
看不到 SSH 按鈕,代表那台機器沒開 Tailscale SSH,或 policy 不允許你連。
安全與限制
- 每次開 session 會依序「建 auth key → 建 ephemeral 節點 → 授權 → 撤銷 auth key」,這些事件都進 configuration audit logs。
- 結束方式:執行
exit、關視窗,或 policy 改到不再允許——改 policy 後 session 會自動結束。 - 只能從 Admin console 發起,不能產生獨立的 SSH session。
- 所有流量走 DERP relay。
參考資料
- Tailscale SSH session recording(官方文件)
- Tailscale SSH Console(官方文件)
- Tailscale SSH(官方文件)
- Tailscale PAM session logs(官方文件)
- Session recording with the Tailscale Kubernetes Operator(官方文件)
- Deploy multiple Tailscale SSH session recorder nodes(官方文件)
- tailscale/tsrecorder(Docker Hub)
- asciinema
- Tailscale SSH:不用管理 SSH 金鑰
- 方案與限制比較(Personal、Personal Plus、Premium 等)