Bảo vệ khóa SSH bằng Secure Enclave trên macOS
Một lập trình viên đã thử lưu khóa SSH trong Secure Enclave của Mac bằng công cụ có sẵn của Apple, qua đó khóa riêng tư không thể bị sao chép hay trích xuất khỏi phần cứng. Giải pháp hoạt động được nhưng giao diện xác thực Touch ID khá thô và khóa không thể sao lưu, nên anh quyết định tìm phương án khác.

Khóa SSH thường chỉ nằm trong thư mục ~/.ssh/ và được bảo vệ bằng đúng quyền truy cập tệp. Bất kỳ đoạn mã độc nào đọc được hệ thống tệp đều có thể sao chép khóa và đăng nhập vào mọi máy chủ mà chủ nhân có quyền.
Đó là lý do một lập trình viên đã thử chuyển khóa SSH vào Secure Enclave — phân hệ bảo mật nằm trên chip của Mac, tách biệt với bộ xử lý chính. Khóa riêng tư được sinh ra bên trong và không bao giờ rời khỏi đó.
Hộp thoại xác thực Touch ID
Các lựa chọn hiện có
Tác giả đã khảo sát một số cách bảo vệ khóa SSH:
- Secure Enclave gốc của macOS: không cần ứng dụng bên thứ ba, tích hợp sẵn trong hệ điều hành.
- Secretive: ứng dụng bên thứ ba lưu khóa trong Secure Enclave.
- YubiKey: khóa bảo mật phần cứng hỗ trợ FIDO2.
- 1Password / Bitwarden: lưu khóa trong kho mã hóa và dùng trình đại lý SSH (SSH agent) của họ. Bitwarden mới bổ sung hỗ trợ khóa SSH, kể cả ở gói miễn phí, nhưng đây vẫn là giải pháp phần mềm: khóa được mã hóa khi lưu trữ nhưng sẽ được giải mã trong bộ nhớ khi sử dụng.
Điều tác giả thực sự muốn là bảo mật gắn với phần cứng: khóa riêng tư phải hoàn toàn không thể trích xuất, kể cả khi chiếc Mac bị xâm nhập toàn bộ. Như vậy chỉ còn YubiKey hoặc Secure Enclave, và anh chọn thử phương án gốc trước để không phải mang thêm phần cứng hay duy trì ứng dụng ngoài.
Secure Enclave SSH hoạt động thế nào
Từ macOS Sequoia, macOS hỗ trợ khóa SSH được hậu thuẫn bởi Secure Enclave. Khi SSH tới một máy chủ, Mac yêu cầu Secure Enclave ký thử thách xác thực (authentication challenge). Nếu bật Touch ID, mỗi lần ký đều phải có xác nhận của người dùng. Khóa riêng tư không tồn tại trên đĩa hay trong bộ nhớ.
Luồng làm việc khá giống khóa SSH thông thường: trên máy chủ từ xa vẫn chép khóa công khai vào authorized_keys, chỉ khác là trên đĩa chỉ còn một tham chiếu vô dụng nếu không có đúng chiếc Mac đó.
Thiết lập từng bước
Bước 1: Tạo khóa. macOS cung cấp lệnh sc_auth (Smart Card Authentication) để quản lý định danh CryptoTokenKit, và dù tên gọi như vậy, nó vẫn làm việc được với Secure Enclave:
sc_auth create-ctk-identity -l "ssh-MacBook" -k p-256-ne -t bio
Trong đó -l là nhãn tham chiếu chỉ hiển thị cục bộ, -k p-256-ne là đường cong NIST P-256 không thể xuất (non-exportable), còn -t bio buộc xác thực sinh trắc học cho mọi lần dùng.
Tác giả gặp lỗi errKCAuthFailed khi chạy lệnh, nguyên nhân là phần đăng ký Touch ID đã bị đặt lại. Đăng ký lại vân tay trong System Settings → Touch ID & Password thì lệnh chạy bình thường. Có thể kiểm tra bằng sc_auth list-ctk-identities.
Bước 2: Xuất tham chiếu khóa. Tệp được tạo ra không phải khóa riêng tư mà chỉ là tham chiếu để SSH yêu cầu Secure Enclave ký:
ssh-keygen -w /usr/lib/ssh-keychain.dylib -K -N ""
Khi được hỏi PIN, chỉ cần nhấn Enter. Lệnh tạo ra các tệp id_ecdsa_sk_rk và id_ecdsa_sk_rk.pub, sau đó chuyển chúng vào ~/.ssh/.
Bước 3: Cấu hình biến môi trường. Thêm vào ~/.zshrc dòng export SSH_SK_PROVIDER=/usr/lib/ssh-keychain.dylib rồi nạp lại shell. Tác giả lưu ý các hướng dẫn cũ trên mạng khuyên dùng ssh-add -K, nhưng cờ này đã bị loại bỏ, và ngay cả các cờ thay thế --apple-use-keychain cũng không dùng được cho khóa Secure Enclave vì chúng dành cho Keychain truyền thống chứ không phải CryptoTokenKit.
Bước 4 và 5: Lấy khóa công khai và chép lên máy chủ. Khóa công khai có dạng [email protected], và đoạn ssh: ở cuối là mã định danh ứng dụng FIDO2, không phải chú thích. Có thể dùng ssh-copy-id hoặc chép tay vào authorized_keys.
Bước 6: Chỉ định khóa trong ~/.ssh/config. SSH không tự dò tệp tên id_ecdsa_sk_rk, nó chỉ nhận diện các tên chuẩn như id_rsa, id_ed25519, id_ecdsa. Vì vậy cần khai báo rõ bằng IdentityFile, đặt khóa Secure Enclave lên đầu nếu muốn nó làm mặc định. Tác giả cũng phải tạm tắt IdentityAgent của 1Password vì có thể xung đột.
Bước 7: Kiểm tra. Kết nối SSH sẽ hiện hộp thoại Touch ID rồi mới vào được máy chủ.
Những điểm chưa hài lòng
Hộp thoại Touch ID hiển thị dòng chữ "ctccardtoken needs to authenticate to continue" thay vì thông báo thân thiện kiểu "SSH muốn dùng khóa của bạn". Nguyên nhân là thông báo đến từ CryptoTokenKit, một framework cấp thấp mà Apple chưa trau chuốt cho người dùng SSH cuối. Nếu thấy khó chịu, Secretive cho giao diện đẹp hơn nhiều trong khi vẫn dùng Secure Enclave bên dưới.
Tác giả ban đầu định tạo hai khóa — một có Touch ID cho máy chủ quan trọng, một không có cho các thao tác Git — nhưng nhận ra nếu bỏ -t bio thì mã độc có thể dùng khóa một cách âm thầm. Với -t bio, mỗi lần khóa được dùng đều có dấu hiệu rõ ràng, nên anh khuyên dùng -t bio cho tất cả.
Cái giá phải trả: không có sao lưu
Khóa Secure Enclave gắn chặt với chiếc Mac cụ thể. Máy hỏng thì khóa mất theo. Đây là thiết kế có chủ đích: khóa không xuất được nên cũng không sao lưu được. Cách bù đắp là dùng nhiều khóa — thêm cả khóa Secure Enclave lẫn một khóa dự phòng (từ YubiKey hoặc một chiếc Mac khác) vào authorized_keys của máy chủ, để mất một thiết bị vẫn còn đường vào qua thiết bị kia.
Kết luận của tác giả: đây là cách lưu khóa SSH an toàn hơn hẳn so với để trên ổ đĩa, nhưng anh vẫn đang tìm các giải pháp khác như Secretive vì chất lượng giao diện của công cụ gốc chưa đáp ứng được kỳ vọng vào các tính năng bảo mật của Apple.
Góc nhìn
Với các kỹ sư và doanh nghiệp Việt Nam, bài viết cho thấy một hướng nâng cấp bảo mật có thể áp dụng ngay trên máy Mac đang dùng: khóa SSH nằm trong phần cứng nghĩa là mã độc đánh cắp tệp hay các bài tập tuyển dụng giả mạo đòi chạy mã cục bộ sẽ không còn lấy được khóa riêng tư. Đổi lại, cần chấp nhận hy sinh tính tiện lợi — mỗi thao tác cần Touch ID — và phải thiết kế quy trình dự phòng ngay từ đầu, vì không có sao lưu khóa.
Điểm cần lưu ý là các hướng dẫn cũ trên mạng về khóa SSH trên macOS có thể đã lỗi thời với các cờ đã bị loại bỏ. Khi triển khai cho cả nhóm, nên chuẩn hóa tài liệu nội bộ theo đúng phiên bản macOS và OpenSSH đang dùng, đồng thời dựa vào authorized_keys nhiều khóa để tránh bị khóa ngoài hệ thống khi một thiết bị gặp sự cố.
Nguồn: gatezh.com · Quy trình biên tập
Bài viết liên quan

Công nghệ
Bảo mật SSH trên macOS bằng Touch ID: Cài đặt trong 3 lệnh với Secure Enclave
21 tháng 10, 2026

Công nghệ
macOS Tahoe: Sao chép keychain đăng nhập giữa các máy Mac không còn hoạt động trên thiết bị có Secure Enclave
11 tháng 9, 2026

Cloud & DevOps
Cơ chế bảo mật Escrow cho iCloud Keychain: Cách Apple bảo vệ dữ liệu của bạn
25 tháng 4, 2026