Panduan hardening tmux untuk lingkungan produksi: mengunci session dengan lock-session dan lock-after-time, attach read-only, manajemen permission socket, dan kebijakan keamanan secrets agar aman di server production.

Di episode 19 sebelumnya kita membahas multi-server & shared session — broadcast perintah ke banyak server sekaligus, kolaborasi real-time dalam session bersama, dan tata kelola permission antar client. Semakin besar jangkauan tmux kalian, semakin besar pula permukaan yang harus diamankan: sebuah session yang bisa di-attach oleh siapa pun adalah terminal yang bisa diendus oleh siapa pun — setiap keystroke, setiap output, setiap clipboard terbuka lebar.
Keamanan sering dianggap "bukan urusan tmux", padahal justru sebaliknya. Tmux berada di antara terminal dan aplikasi kalian — posisi paling strategis dalam sistem. Ia melihat password yang kalian ketik di prompt sudo, token yang dicetak script, dan log yang memuat data sensitif. Kalau lapisan ini bocor, semua yang berjalan di atasnya ikut terpapar. Episode 20 ini adalah security baseline: kita mengunci session, mencegah attach tidak sah, mengamankan socket, menyembunyikan secrets dari konfigurasi, dan menerapkan kebijakan yang masuk akal untuk server production. Semua contoh merujuk tmux 3.7b sebagai versi stabil terbaru.
Model threat tmux sesederhana ini: siapa pun yang bisa terhubung ke socket bisa meng-attach ke session, dan siapa pun yang bisa attach bisa membaca serta mengetik di dalamnya. Tidak ada autentikasi tambahan — jika socket-nya bisa dijangkau, kendali atas terminal itu pindah tangan.
Ada empat permukaan serangan utama:
sudo dan git push.~/.tmux.conf yang di-commit atau ke environment yang di-snapshot tmux.Analoginya seperti rumah: mengunci pintu tapi membiarkan jendela terbuka tidak ada artinya. Di ruang kerja digital kalian, session tmux adalah ruang kerja; kunci pintunya adalah socket permission; dan alarmnya adalah lock command. Pada episode ini kita pasang semuanya.
Tmux punya tiga perintah lock dengan jangkauan berbeda. Ketiganya menjalankan lock-command dan membuat layar terkunci sampai password user dimasukkan kembali:
| Perintah | Target | Efek |
|---|---|---|
tmux lock-session -t NAMA | Satu session | Mengunci semua client yang terpasang ke session itu |
tmux lock-client -t %0 | Satu client | Mengunci client tertentu saja, yang lain tetap aktif |
tmux lock-server | Seluruh server | Mengunci semua session dan semua client |
tmux lock-session -t mynameKetika terkunci, layar menampilkan password prompt dan tidak ada input yang diteruskan ke pane sampai user yang benar memasukkan password. Ini melindungi session dari orang yang lewat di depan terminal — persis seperti lock screen di laptop.
Mengunci manual hanya berguna kalau kalian ingat. Untuk mesin bersama atau terminal yang sering ditinggal, atur auto-lock: setelah sejumlah detik tanpa aktivitas, tmux mengunci client sendiri.
set -g lock-after-time 600
set -g lock-command 'clear'lock-after-time adalah server option: nilai 600 berarti 10 menit tanpa aktivitas, lalu tmux mengunci. lock-command 'clear' mengganti perintah default (biasanya lock(1) atau vlock) dengan clear — layar dibersihkan sebelum password diminta, sehingga informasi yang tertinggal di layar tidak terlihat oleh orang lain.
Tip
Di desktop yang memakai session manager, lock-command 'clear' adalah pilihan ringan yang tidak memicu lock screen ganda. Di server produksi yang diakses lewat SSH, pertimbangkan lock-after-time yang lebih pendek (misalnya 300) dan kombinasikan dengan idle timeout SSH. Keamanan bekerja berlapis — bukan salah satu saja.
Ketika seseorang harus ikut melihat progress tanpa bisa mengetik, jangan beri mereka kendali penuh. Attach read-only memberi client izin melihat semua output tetapi tidak meneruskan satu tombol pun ke pane:
tmux attach -r -t myname
tmux attach -f read-only -t mynameattach -r adalah singkatan dari client flag read-only (plus ignore-size). Client read-only masih bisa menjalankan detach-client dan switch-client — misalnya berpindah session — tapi tidak bisa mengetik di pane. Ini sangat berguna untuk screen share: rekan melihat output yang sama persis, tanpa risiko menekan tombol di session produksi.
Session bersama (episode 19) bisa "ditumpangi" client yang tidak kalian undang. Untuk membersihkan, detach client lain dari session:
tmux detach-client -s myname
tmux detach-client -a
tmux list-clients -t mynamedetach-client -s myname mengeluarkan semua client lain dari session myname — client yang menjalankan perintah ini aman. -a mengeluarkan semua client kecuali yang aktif. Periksa dulu siapa saja yang terhubung dengan tmux list-clients sebelum bertindak.
Untuk lingkungan multi-user, tmux 3.3+ punya access control list (ACL) via server-access. Kalian bisa memberi akses, mencabut akses, atau memaksa user tertentu attach read-only:
tmux server-access -a devnull
tmux server-access -r devnull
tmux server-access -d devnull
tmux server-access -lWarning
Default tmux sudah aman: socket dibuat dengan permission filesystem yang menolak user lain (hanya owner dan root). ACL server-access adalah lapisan kedua di atas permission filesystem — bukan pengganti. Dan ingat: client read-only pun tetap berbahaya jika user-nya tidak tepercaya, karena ia masih membaca semua output — termasuk password yang muncul di prompt. "Melihat" sama sensitifnya dengan "mengetik".
Socket server tmux secara default berada di $TMPDIR (atau /tmp jika tidak diset) dalam direktori tmux-<UID> — misalnya /tmp/tmux-1000/default. Dua parameter menentukan keamanannya: lokasi dan umask.
tmux -L nama memakai socket $TMPDIR/tmux-<UID>/nama — berguna untuk memisahkan server tmux per konteks, misalnya -L work vs -L personal.tmux -S /path/penuh menempatkan socket di path absolut yang kalian tentukan — fleksibel tapi harus dijaga permission-nya.umask saat server pertama kali dimulai menentukan permission direktori socket. Jalankan tmux dengan umask 077 agar tidak ada file socket yang bisa diakses user lain.umask 077
tmux -L work new-session -s prod
tmux -L work attach -t prodImportant
Direktori tmux-<UID> tidak boleh world-readable, world-writable, atau world-executable — tmux memeriksanya dan menolak menjalankan server bila aturan ini dilanggar. Jangan pernah memaksa chmod 777 pada direktori socket "biar bisa shared". Untuk berbagi session antar user, gunakan mekanisme shared session dari episode 19 yang memang dirancang untuk itu.
Celah paling umum di dunia nyata bukan socket yang bocor, melainkan konfigurasi yang di-commit ke git. Contoh klasik:
setenv -g DB_PASSWORD 'supersecret'
set -g status-left "DB: #{DB_PASSWORD}"Baris setenv di atas menaruh password di konfigurasi yang kemungkinan besar berakhir di repositori dotfiles publik. Lebih parah: update-environment di tmux ikut menyalin variabel dari shell, sehingga secrets yang tadinya lokal bisa "menempel" di environment server tmux. Aturannya sederhana:
DB_PASSWORD='secret' tmux new -s prod — nilainya hidup di proses, bukan di file.setenv -h untuk menandai variabel sebagai hidden sehingga tidak diwariskan ke pane: tmux setenv -h TOKEN.DB_PASSWORD='supersecret' tmux new-session -s prod
tmux setenv -h TOKEN
tmux show-environmentTmux menafsirkan urutan yang diawali ESC sebagai escape sequence (tombol panah, Alt+key, dan lain-lain). Semakin lama tmux menahan rangkaian byte untuk memutuskan interpretasinya — nilai escape-time — semakin lebar jendela di mana byte yang datang (misalnya output program yang diawali ESC) bisa disalahartikan sebagai penekanan tombol. Di sinilah dasar risiko keyboard injection: output dari satu pane bisa memicu keybinding tmux seolah-olah user mengetiknya.
set -sg escape-time 10Menurunkan escape-time ke 10 milidetik menyempitkan jendela itu sekaligus membuat input terasa lebih responsif — sisi performa ini akan kita bahas di episode 21. Di tmux 3.5+ nilai default memang sudah 10, tetapi menuliskannya secara eksplisit melindungi kalian jika menyalin konfigurasi dari mesin dengan tmux lama yang masih memakai 500.
| Praktik | Alasan |
|---|---|
| Jalankan tmux sebagai user non-root | Membatasi dampak jika session di-compromise |
Satu socket (-L) per konteks kerja | Mengisolasi session produksi dari session pribadi |
| Attach read-only untuk pengamat | Mencegah input tak sengaja di session produksi |
lock-after-time di mesin bersama | Mencegah akses saat terminal ditinggal |
| Revoke akses yang tidak terpakai | Mengurangi permukaan serangan bertahap |
| Selalu update ke versi terbaru (3.7b) | Perbaikan keamanan dan bug ikut terpasang |
Prinsip yang menaungi semuanya sama dengan hardening di lapisan lain: berikan akses seminimal mungkin, dan hapus akses yang tidak lagi diperlukan. Tmux yang sehat adalah tmux yang jarang terlihat — ia bekerja diam-diam di belakang, dan tidak menjadi pintu masuk yang malas.
lock-after-time berarti siapa pun bisa duduk dan melanjutkan pekerjaan kalian — termasuk mengeksekusi perintah berbahaya. Pasang auto-lock.setenv berisi password di ~/.tmux.conf. Konfigurasi ini sering ikut di-commit ke repositori dotfiles. Secret harus hidup di environment proses, bukan di file teks.attach -r dan perketat dengan server-access -r bila perlu.escape-time yang tinggi. Konfigurasi lama yang memakai escape-time 500 membuka jendela interpretasi yang lebih lebar. Turunkan ke 10.Episode ini memberi kalian security baseline untuk tmux: mengunci session dengan lock-session, lock-client, lock-server, dan lock-after-time; mencegah attach tidak sah lewat attach -r dan detach-client; mengamankan socket dengan -L, -S, umask, dan ACL server-access; serta menghindari secrets bocor dari konfigurasi yang di-commit. Semuanya menutup empat permukaan serangan yang kita petakan di awal: socket, client, konfigurasi, dan interpretasi input.
Poin yang harus kalian bawa pulang:
Di episode 21 selanjutnya kita akan membahas nested tmux & advanced input handling — menangani tmux di dalam tmux saat SSH ke server, serta mengoptimalkan mouse, extended keys, focus events, clipboard OSC 52, dan true color end-to-end. Setelah mengamankan fondasi, kita akan menghaluskan cara kalian berinteraksi dengannya. Sampai jumpa di episode 21!