Dukungan native SSH key berbasis Secure Enclave di macOS
(gist.github.com/arianvp)- Di versi Tahoe macOS, fitur pembuatan dan penggunaan SSH key dengan Secure Enclave didukung secara bawaan
- Library
/usr/lib/ssh-keychain.dylibmengimplementasikan antarmuka SecurityKeyProvider selain PKCS11Provider untuk smart card yang sudah ada, sehingga bisa berkomunikasi langsung dengan Secure Enclave alih-alih perangkat FIDO2 - Dengan perintah
sc_auth, pengguna dapat membuat kunci autentikasi biometrik berbasis Touch ID, lalu menggunakanssh-keygenataussh-adduntuk memuat dan memakai key langsung dari area aman - Jika menetapkan variabel lingkungan
SSH_SK_PROVIDERdi.zprofile, maka SSH, ssh-agent, dan ssh-keygen akan mengenalinya secara otomatis - Tanpa alat eksternal, hanya dengan fitur bawaan macOS, kini dimungkinkan membangun skema autentikasi SSH yang sekaligus aman dan praktis
Gambaran umum dukungan SSH key berbasis Secure Enclave
- macOS Tahoe mendukung pembuatan dan penggunaan SSH key berbasis Secure Enclave
- Sebelumnya diperlukan proyek eksternal seperti
secretive, tetapi sekarang bisa digantikan oleh fitur bawaan macOS
- Sebelumnya diperlukan proyek eksternal seperti
/usr/lib/ssh-keychain.dylibmengimplementasikan SecurityKeyProvider sehingga Secure Enclave dapat diakses dengan cara yang mirip perangkat FIDO2- Melalui fitur ini, autentikasi SSH bisa dilakukan dengan chip keamanan bawaan macOS tanpa perangkat keras eksternal seperti YubiKey
Pembuatan dan pengelolaan key
- Perintah
sc_auth create-ctk-identity -l ssh -k p-256-ne -t biomembuat key Secure Enclave yang memerlukan autentikasi Touch ID- Daftar key yang dibuat dan hash-nya dapat dilihat dengan perintah
list-ctk-identities - Key dapat dihapus dengan perintah
delete-ctk-identity
- Daftar key yang dibuat dan hash-nya dapat dilihat dengan perintah
- Opsi
list-ctk-identities -t sshdapat digunakan untuk melihat fingerprint SSH key
Penggunaan di SSH
- Perintah
ssh-keygen -w /usr/lib/ssh-keychain.dylib -K -N ""digunakan untuk memuat pasangan key dari Secure Enclave- Tidak perlu memasukkan PIN, autentikasi dilakukan dengan Touch ID
- “Private key” yang dihasilkan bukan secret key yang sebenarnya, melainkan nilai referensi kredensial FIDO
- Setelah public key disalin ke server dengan
ssh-copy-id,
koneksi dapat dilakukan dengan perintahssh -o SecurityKeyProvider=/usr/lib/ssh-keychain.dylib localhost
Integrasi dengan ssh-agent
- Dengan perintah
ssh-add -K -S /usr/lib/ssh-keychain.dylib, key Secure Enclave dapat langsung didaftarkan ke ssh-agent- Key yang telah didaftarkan dapat diperiksa dengan
ssh-add -L - Setelah itu autentikasi dilakukan dengan perintah
ssh -o SecurityKeyProvider=/usr/lib/ssh-keychain.dylib
- Key yang telah didaftarkan dapat diperiksa dengan
Pengaturan default SecurityKeyProvider
- Bisa ditentukan langsung di
.ssh/config, atau tambahkan
export SSH_SK_PROVIDER=/usr/lib/ssh-keychain.dylibke.zprofileagar dikenali otomatis - Setelah itu, cukup gunakan perintah
ssh-add -Kataussh my-serveruntuk koneksi SSH berbasis security key
Key yang dapat diekspor (Exportable Keys)
- Perintah
sc_auth create-ctk-identity -l ssh-exportable -k p-256 -t biodapat membuat key untuk ekspor yang dienkripsi dengan Secure Enclave- Key dapat diekspor ke file PEM dengan
export-ctk-identity,
lalu didaftarkan ulang di perangkat lain denganimport-ctk-identities
- Key dapat diekspor ke file PEM dengan
- Pendekatan ini sedikit lebih rendah dari sisi keamanan, tetapi lebih menguntungkan untuk cadangan
Diskusi pengembang dan perluasan kode
- Di komentar, dibahas kemungkinan penggunaan flag
.biometryCurrentSet- Saat ini hanya didukung "apakah biometrik digunakan atau tidak (on/off)", tanpa kontrol yang lebih rinci
- Penulis meninjau kemungkinan menambahkan fitur biometryCurrentSet ke fungsi
sk_enroll()dengan melakukan reverse-engineering padassh-keychain.dylib - Contoh kode yang diajukan memerlukan code signing (codesign) dengan akun Apple Developer Program agar bisa mengakses Secure Enclave
- Kode tersebut mencakup logika pembuatan key, penandatanganan, dan pendaftaran (
sk_enroll,sk_sign, dll.),
serta mengimplementasikan proses pembuatan dan penandatanganan ECDSA P-256 key di Secure Enclave
Ringkasan
- macOS kini mendukung secara native autentikasi SSH yang langsung memanfaatkan Secure Enclave
- Melalui autentikasi biometrik berbasis Touch ID dan struktur yang kompatibel dengan FIDO2, keamanan dan kemudahan penggunaan meningkat
- Tanpa perangkat keras eksternal atau software tambahan, SSH key dapat dikelola hanya dengan fitur bawaan sistem
- Para pengembang juga sedang bereksperimen memperluas
ssh-keychain.dylibuntuk kontrol biometrik yang lebih terperinci
1 komentar
Komentar Hacker News
Jika saya memahaminya dengan benar, ini berarti kunci privat tidak bisa dicadangkan
Karena disimpan di dalam Secure Enclave, jika laptop hilang maka kuncinya juga ikut hilang
Sepertinya hanya kunci publik yang bisa diekspor. Tentu mungkin ada pendekatan lain atau reset oleh admin, tetapi tetap terasa agak mengkhawatirkan
Nantinya OP akan menambahkan balasan dan memperbarui halaman web
man sc_auth. Alih-alih membuatnya langsung di Secure Enclave, kita bisa membuat kunci terenkripsi yang dapat dieksporContoh perintahnya menjalankan
sc_auth create-ctk-identity -l ssh-exportable -k p-256 -t bio, lalu setelah itu bisa membuat file.pemdenganexport-ctk-identityDi perangkat lain, itu bisa diimpor kembali dengan
import-ctk-identities. Konten ini rencananya akan ditambahkan ke panduanInti PKI adalah hanya kunci publik yang berpindah, dan kunci privat harus ada di satu tempat saja
Dengan begitu, dalam kondisi apa pun kunci tidak akan bocor
Kunci privat yang dibuat di YubiKey juga tidak bisa dicadangkan
Idealnya satu per perangkat, agar tidak masalah meski perangkat hilang atau dicuri
Saya menyimpan YubiKey yang dilindungi PIN di brankas. Jadi kalau laptop, ponsel, dan YubiKey harian saya semuanya hilang, saya tetap siap
Kalau melangkah sedikit lebih jauh, penandatanganan GPG berbasis ECDSA juga memungkinkan
Hanya saja, karena bug, diperlukan GPG dan SSH agent yang sudah dipatch
Ada versi paket dengan UI untuk macOS (KeetaNetwork/agent),
dan backend yang sama juga berjalan di Linux dengan TPM melalui PKCS#11
Perbedaan antara GPG dan SSH hanyalah cara pembungkusan kunci dan tanda tangan; pada dasarnya semuanya ECDSA
Secretive lebih mudah dikonfigurasi, tetapi saya berpikir untuk beralih ke cara ini agar mengurangi satu aplikasi
Saya merangkum cara menyiapkan kunci SSH berbasis TPM di Windows 11 di blog saya
Ini fitur yang cukup keren
Saya sudah lama menggunakan Secretive, dan itu jauh lebih nyaman daripada kunci atau kartu fisik
Setiap kali kunci SSH digunakan, saya harus menekan tombol atau melakukan autentikasi sidik jari, jadi saya bisa tahu dengan jelas kapan kunci itu dipakai
Saya bisa mempertahankan tunnel ssh-agent sehingga tetap bisa melakukan penandatanganan git dengan aman di server jarak jauh
Hanya saja, versi Tahoe penuh bug dan sering macet. Saya tidak punya waktu untuk men-debug, jadi saya biarkan saja
Saya pernah susah dengan UX SSH berbasis Smart Card dulu, tetapi kalau stabil, ini layak dicoba
Melalui
ssh-askpass, kita bisa meminta konfirmasi setiap kali kunci privat digunakan. Hanya saja, tidak bisa membedakan lokal/jarak jauhCara ini memakai kurva yang dicurigai telah disisipi backdoor oleh NSA, jadi perlu hati-hati
Saya penasaran, kalau disimpan di dalam Secure Enclave, mengapa masih perlu file kunci privat
skdi OpenSSH juga sama. Bahkan dengan opsi “resident key”, file kunci privat tetap diperlukanItu sebenarnya hanya referensi ke kredensial FIDO dan tidak berisi data kunci rahasia yang sesungguhnya
Untuk kunci
sknon-resident, file itu diperlukan karena authenticator perangkat keras tidak menyimpan stateSaya tidak yakin apakah implementasi macOS ini menyimpan state atau tidak. Bisa jadi akan rusak saat OS diinstal ulang
Ada proyek bernama facebookincubator/sks
Ini adalah library golang yang mengabstraksikan berbagai kunci SSH berbasis perangkat keras, dan mendukung Linux, Windows, serta macOS
Karena itu, dulu saya mulai membuat ssh-tpm-agent sendiri
Saya ingin menggunakan kunci privat yang sama di iPhone untuk menandatangani email atau file
Saya penasaran apakah iCloud bisa menangani ini
Yang disinkronkan justru Passkey. Kita perlu membuat SecurityKeyProvider baru yang berkomunikasi dengan API Passkey
Passkey terikat pada bundle ID aplikasi atau domain tertentu
Misalnya jika Secretive mendukung Passkey, pasangan kunci itu tidak bisa dipakai di aplikasi lain, tetapi
akan disinkronkan antarperangkat untuk aplikasi yang sama
Sudah waktunya menambahkan fitur baru ke KeyMux
Alat ini mendukung kunci enclave untuk SSH, SSL, dan PGP,
misalnya Anda bisa mengakses server Vault dengan sertifikat SSL berbasis Secure Enclave lalu melakukan autentikasi SSH dengan kunci privat Vault yang tidak dapat diekspor
Bisa dilihat di keymux.com dan tautan App Store