- Sertifikat SSH mengatasi kerumitan autentikasi SSH berbasis kunci publik yang ada, serta menyediakan kepercayaan otomatis antara klien dan server
- Didukung mulai OpenSSH 5.4, dan CA (otoritas sertifikat) menandatangani kunci pengguna maupun host sehingga autentikasi dimungkinkan tanpa perlu mengubah
authorized_keys
- Sertifikat dapat memuat masa berlaku, pengguna yang diizinkan (principal), IP akses, perintah paksa (force-command), dan lain-lain untuk mendukung kontrol akses yang rinci
- Prosedur TOFU (Trust on First Use) dihilangkan, sehingga saat kunci host berubah, koneksi tetap bisa dilakukan dengan aman tanpa peringatan
- Dengan memanfaatkan server atau alat penandatanganan otomatis, otomatisasi pengelolaan SSH di lingkungan server skala besar dan peningkatan keamanan menjadi mungkin
Ikhtisar sertifikat SSH dan keterbatasan autentikasi SSH berbasis kunci yang ada
- Saat membuat koneksi SSH, kita perlu memeriksa fingerprint kunci host dari server yang pertama kali diakses, tetapi kebanyakan pengguna tidak memverifikasinya dan memakai pendekatan TOFU (Trust on First Use) dengan mengetik
yes
- Administrator dapat memverifikasi fingerprint server secara langsung atau dengan perintah
ssh-keygen -l -f /etc/ssh/ssh_host_ed25519_key
- Autentikasi berbasis kunci publik memungkinkan login tanpa kata sandi, tetapi kunci publik harus didistribusikan ke file
authorized_keys di setiap server
- Dengan SSH agent (
ssh-agent), kunci privat dapat disimpan di memori sehingga autentikasi bisa dilakukan berulang kali tanpa input berulang
- Keterbatasan pendekatan yang ada
- Perlu menyalin kunci publik ke server untuk setiap pengguna
- Saat kunci host berubah, pesan peringatan muncul di sisi klien
- Pengelolaan kepercayaan menjadi tidak praktis karena TOFU
Sertifikat SSH dan CA (otoritas sertifikat)
- Sertifikat SSH (Certificate) didukung mulai OpenSSH 5.4 (Maret 2010), dengan struktur yang memperluas format kunci SSH yang ada
- SSH CA terdiri dari pasangan kunci SSH, dan kunci publiknya berperan sebagai root of trust
- Keunggulan utama
- Tidak perlu mengubah file
authorized_keys di server
- Tidak ada peringatan saat kunci host diganti
- Kepercayaan otomatis terwujud dengan menghilangkan prosedur TOFU
- Sertifikat dapat memuat pengguna yang diizinkan (principal), IP yang diizinkan, masa berlaku, perintah paksa (force-command), dan lain-lain
- Akses diblokir otomatis saat sertifikat kedaluwarsa
Membangun SSH CA dan prosedur penandatanganan
- Di sistem CA, buat pasangan kunci CA dengan algoritme ECDSA
ssh-keygen -t ecdsa -C "SSH CA" -f CA/ssh-ca
- Pengguna mengirimkan kunci publiknya (
*.pub) ke CA, lalu CA menandatanganinya (sign) dan menerbitkan sertifikat (*-cert.pub)
- Contoh:
ssh-keygen -s CA/ssh-ca -I "Jane Jolie" -n jane -z 001 -V +1w jane.pub
- Konfigurasi server
- Simpan kunci publik CA di
/etc/ssh/ssh-ca.pub lalu tambahkan pengaturan TrustedUserCAKeys
- Tanda tangani kunci host server dengan CA (
ssh-keygen -h -s CA/ssh-ca ...) lalu daftarkan pada entri HostCertificate
- Konfigurasi klien
- Tambahkan satu baris
@cert-authority ke file known_hosts
- Contoh:
@cert-authority *.example.com $(cat CA/ssh-ca.pub)
Koneksi dan verifikasi berbasis sertifikat SSH
- Pengguna terhubung dengan memakai sertifikat yang sudah ditandatangani bersama kunci privat (
ssh -i jane -l jane alice.example.com)
- Log server mencatat ID, serial number, fingerprint CA dari sertifikat
- Beberapa nama host atau IP dapat ditambahkan sebagai principal dalam sertifikat
- Jika mencoba login sebagai pengguna selain principal yang ditentukan di sertifikat, akan muncul galat “Certificate invalid: name is not a listed principal”
- Dengan menetapkan perintah paksa (force-command) atau IP yang diizinkan (source-address) di sertifikat, kontrol akses yang rinci dapat diterapkan
Checklist pemeriksaan dan pemecahan masalah
-
Hal yang perlu diperiksa di sisi server
- Pengaturan
TrustedUserCAKeys dan keberadaan kunci publik CA
- Penandatanganan kunci host dan penetapan
HostCertificate
- Perlu me-restart
sshd
-
Hal yang perlu diperiksa di sisi klien
- Kunci pengguna harus sudah ditandatangani oleh CA
- Entri
@cert-authority di known_hosts harus cocok dengan principal
- Jika sertifikat kedaluwarsa, pesan “Certificate invalid: expired” akan ditampilkan
- Jika batasan sertifikat tidak cocok, permintaan kata sandi akan muncul
- Saat sertifikat ditambahkan ke SSH agent, kunci dan sertifikat sama-sama terdaftar (
ssh-add jane)
- Fitur dapat dikendalikan dengan opsi (
-O) saat penandatanganan
- Contoh: gunakan
-O clear untuk menghapus semua izin lalu izinkan hanya permit-agent-forwarding dan permit-port-forwarding
Otomatisasi sertifikat kunci host
- Membangun server penandatanganan otomatis (hkbot) dengan modul Python sshkey-tools dan BottlePy
- Jalankan
hkbot.py di server CA, lalu unggah kunci publik host melalui permintaan HTTP untuk penandatanganan otomatis
- Di klien, instal otomatis dengan perintah
curl -F hostkey=@/etc/ssh/ssh_host_ed25519_key.pub http://CA:8870 | sh
- Terapkan dengan mengubah
/etc/ssh/sshd_config, memverifikasi, lalu menjalankan systemctl restart sshd
- Setelah itu, koneksi SSH dapat dilakukan dengan kepercayaan otomatis dan login berbasis sertifikat
Ringkasan keunggulan sertifikat SSH
- Tidak memerlukan TOFU, ada kepercayaan otomatis antara klien dan server
- Dengan penerbitan sertifikat berumur pendek, kontrol akses sementara dapat diterapkan
- Saat sertifikat kedaluwarsa, akses diblokir otomatis tanpa perlu merapikan
authorized_keys
- Kebijakan rinci dapat diatur, seperti perintah paksa, pembatasan PTY, kontrol IP akses
- Dengan alat otomatisasi, pengelolaan lingkungan server skala besar dapat disederhanakan
- Smallstep SSH diperkenalkan sebagai proyek terkait
Referensi tambahan
Pembaruan
- SSH CA sangat berguna terutama di lingkungan yang memiliki server sendiri dan akses root
- Pada sistem multi-pengguna, pendekatan
known_hosts dan authorized_keys yang ada masih tetap diperlukan
- Draf standardisasi format sertifikat SSH:
draft-miller-ssh-cert-06
1 komentar
Komentar Hacker News
Mengejutkan bahwa orang masih memakai kata sandi SSH
Terutama di lingkungan perusahaan besar, berbagai kebijakan kata sandi saling bertumpuk sehingga hanya untuk masuk ke server saja bisa makan waktu lama
Jadi meskipun diberi tahu untuk memakai kunci lewat ssh-keygen, kebanyakan orang hanya berpikir “nanti suatu saat harus dicoba” lalu akhirnya tidak pernah melakukannya
Namun dalam praktiknya, satu kunci publik sering dipakai di banyak server, atau kunci dibagikan, sehingga pengelolaannya mudah berantakan
Setidaknya kata sandi punya kelebihan karena sederhana
Tidak ada kata sandi, tetapi saat login harus menyentuh Yubikey secara fisik
Setiap beberapa bulan, seseorang kembali menemukan sertifikat SSH lalu menulis posting blog tentang itu
Saya juga menulis artikel terkait 15 tahun lalu, dan kalau dilihat sekarang rasanya masih kurang
Bahkan engineer keamanan pun kadang lupa bahwa yang mereka pakai adalah autentikasi kunci, bukan sertifikat SSH
Mengelola kunci banyak server secara manual terlalu merepotkan
Sekarang saya sedang mempertimbangkan apakah masih layak beralih
Pendekatan TOFU(Trust On First Use) itu sederhana, tetapi cukup efektif
Di server saya, setelah saya memverifikasi host key secara langsung, itu sudah cukup
Di lingkungan perusahaan besar, daftar kunci publik server internal bisa dipasang di situs internal yang ditandatangani dengan SSL
Namun di lingkungan dengan banyak server atau server yang sering berubah, sertifikat jauh lebih baik, dan TOFU punya batasan di banyak sisi
Saya juga berharap browser punya fitur untuk memberi tahu ketika kunci TLS server berubah
Kebanyakan hanya mengetik “yes” dan lanjut
Di kantor, kami membuang sangat banyak waktu dan uang gara-gara inspeksi SSL Zscaler
Kalau muncul error “self-signed certificate in certificate chain”, itu selalu bikin pusing
Ia menanam root certificate sendiri dan mengunci pengaturan browser agar proxy tidak bisa dipakai
Bahkan jika file konfigurasi Firefox atau Chrome diubah, perubahan itu langsung ditimpa lagi
Bahkan untuk mematikannya lewat GUI pun perlu kata sandi IT
Sedikit lebih baik daripada antivirus Cybereason
Itu merusak semua protokol berbasis HTTP
Git, RubyGems, go mod, Nix, dan banyak tool lain jadi rusak
Vendornya bilang ini “transparan”, padahal sama sekali tidak
Mendiagnosis masalah seperti ini butuh waktu berjam-jam, dan kebanyakan admin tidak paham seberapa destruktif dampaknya
Artikel itu hanya menyebut kelebihan sertifikat CA, tetapi jelas ada juga kekurangannya
Saya pribadi belum pernah mengalami masalah keamanan akibat TOFU
Kalau memang ada kekurangan sertifikat SSH, saya penasaran apa saja secara konkret
Jika ingin memperkuat keamanan, kunci publik bisa ditukar lewat kanal aman seperti USB
Kalaupun memakai sertifikat, pada akhirnya prosedurnya tetap sama, hanya pengelolanya berpindah dari pengguna ke admin
Di organisasi skala besar, sertifikat bisa berguna, tetapi dari sisi keamanan umum tetap setara
Tinggal masukkan ke skrip instalasi atau image deployment
TOFU hanya relevan saat mengakses box yang sudah telanjur disiapkan
Di lingkungan dev/stg kami, setengah dari mesin diinstal ulang setiap hari
Berkat sertifikat host SSH, kami tidak perlu lagi menghapus known_hosts atau mempertahankan kunci, jadi jauh lebih praktis
Sebagai proyek pribadi, saya sedang membuat tool bernama Sshifu
Ini adalah tool yang mempermudah login berbasis sertifikat SSH dan SSO
Cukup pasang sshifu-server di server untuk dipakai sebagai CA, lalu atur setiap server SSH agar memercayai CA tersebut
Pengguna tinggal login dengan perintah
npx sshifuLihat repositori GitHub
Di lingkungan operasional nyata, akses berbasis sertifikat justru sering berujung pada masalah pengelolaan yang kompleks
Ada banyak isu seperti sertifikat kedaluwarsa, penghapusan pengguna, atau login saat server bermasalah
Userify sudah 15 tahun menangani masalah seperti ini, dan membangun infrastruktur autentikasi SSH yang stabil itu sama sekali tidak sederhana
Saya menambahkan dukungan sertifikat SSH ke pico.sh, dan itu sangat berguna karena memungkinkan implementasi kontrol akses gaya RBAC
Lihat dokumentasi
Di produksi, sertifikat SSH justru memusatkan kompleksitas dan memperbesar masalah
Satu CA tunggal harus selalu tersedia, dan jika gagal maka seluruh akses ikut terblokir
Ada juga masalah nyata seperti pengaturan TTL, pengelolaan root of trust, dan sulitnya debugging
Pada akhirnya orang-orang memasang kembali cache atau agent
Kami justru melakukan kebalikannya: tiap node menyinkronkan info pengguna lewat HTTPS ke authorized_keys lokal
Dengan begitu kontrol terpusat tetap ada, tetapi kegagalan bersifat lokal
Userify memakai pendekatan ini, dan menangani bukan hanya autentikasi tetapi juga manajemen izin
Sertifikat saja tidak menyelesaikan masalah seperti pembuatan pengguna, peran sudo, atau pembersihan home directory