- Trên phiên bản Tahoe của macOS, tính năng tạo và sử dụng khóa SSH bằng Secure Enclave được hỗ trợ sẵn
- Thư viện
/usr/lib/ssh-keychain.dylib ngoài PKCS11Provider dành cho thẻ thông minh hiện có còn triển khai giao diện SecurityKeyProvider, cho phép giao tiếp trực tiếp với Secure Enclave thay vì thiết bị FIDO2
- Với lệnh
sc_auth, có thể tạo khóa sinh trắc học dựa trên Touch ID; thông qua ssh-keygen hoặc ssh-add, có thể nạp và sử dụng khóa trực tiếp từ vùng bảo mật
- Nếu thiết lập biến môi trường
SSH_SK_PROVIDER trong .zprofile, thì SSH, ssh-agent, ssh-keygen đều tự động nhận diện
- Có thể triển khai cấu trúc xác thực SSH vừa an toàn vừa tiện lợi chỉ bằng các tính năng mặc định của macOS, không cần công cụ bên ngoài
Tổng quan về hỗ trợ khóa SSH dựa trên Secure Enclave
- macOS Tahoe hỗ trợ tạo và sử dụng khóa SSH dựa trên Secure Enclave
- Trước đây cần các dự án bên ngoài như
secretive, nhưng giờ có thể thay thế bằng tính năng mặc định của macOS
/usr/lib/ssh-keychain.dylib triển khai SecurityKeyProvider, cho phép truy cập Secure Enclave theo cách tương tự như thiết bị FIDO2
- Nhờ tính năng này, có thể thực hiện xác thực SSH bằng chip bảo mật tích hợp của macOS mà không cần phần cứng ngoài như YubiKey
Tạo và quản lý khóa
- Có thể tạo khóa Secure Enclave yêu cầu xác thực Touch ID bằng lệnh
sc_auth create-ctk-identity -l ssh -k p-256-ne -t bio
- Có thể kiểm tra danh sách khóa đã tạo và mã băm bằng lệnh
list-ctk-identities
- Có thể xóa khóa bằng lệnh
delete-ctk-identity
- Có thể kiểm tra dấu vân tay khóa SSH (fingerprint) bằng tùy chọn
list-ctk-identities -t ssh
Sử dụng trong SSH
- Có thể nạp cặp khóa từ Secure Enclave bằng lệnh
ssh-keygen -w /usr/lib/ssh-keychain.dylib -K -N ""
- Không cần nhập PIN, xác thực bằng Touch ID
- “private key” được tạo ra không phải là khóa bí mật thực tế mà là giá trị tham chiếu thông tin xác thực FIDO
- Sau khi sao chép khóa công khai lên máy chủ bằng
ssh-copy-id,
có thể kết nối bằng lệnh ssh -o SecurityKeyProvider=/usr/lib/ssh-keychain.dylib localhost
Tích hợp với ssh-agent
- Có thể đăng ký trực tiếp khóa Secure Enclave vào ssh-agent bằng lệnh
ssh-add -K -S /usr/lib/ssh-keychain.dylib
- Có thể kiểm tra các khóa đã đăng ký bằng
ssh-add -L
- Sau đó thực hiện xác thực bằng lệnh
ssh -o SecurityKeyProvider=/usr/lib/ssh-keychain.dylib
Thiết lập SecurityKeyProvider mặc định
- Có thể chỉ định trực tiếp trong
.ssh/config, hoặc thêm vào .zprofile dòng
export SSH_SK_PROVIDER=/usr/lib/ssh-keychain.dylib để tự động nhận diện
- Sau đó chỉ cần dùng các lệnh
ssh-add -K hoặc ssh my-server để kết nối SSH dựa trên khóa bảo mật
Khóa có thể xuất ra (Exportable Keys)
- Có thể tạo khóa dùng để xuất ra, được mã hóa bằng Secure Enclave bằng lệnh
sc_auth create-ctk-identity -l ssh-exportable -k p-256 -t bio
- Có thể xuất ra file PEM bằng
export-ctk-identity,
và đăng ký lại trên thiết bị khác bằng import-ctk-identities
- Cách này giảm bớt mức độ an toàn phần nào nhưng thuận tiện cho sao lưu
Thảo luận của nhà phát triển và mở rộng mã
- Trong phần bình luận có thảo luận về việc có thể dùng cờ
.biometryCurrentSet hay không
- Hiện tại chỉ hỗ trợ “có dùng sinh trắc học hay không (bật/tắt)”, không thể điều khiển chi tiết hơn
- Tác giả đã đảo ngược kỹ thuật (reverse-engineering)
ssh-keychain.dylib để xem xét khả năng bổ sung tính năng biometryCurrentSet vào hàm sk_enroll()
- Ví dụ mã được đề xuất yêu cầu ký mã (codesign) bằng tài khoản Apple Developer Program thì mới có thể truy cập Secure Enclave
- Trong mã có bao gồm logic tạo khóa, ký, đăng ký (
sk_enroll, sk_sign, v.v.),
và hiện thực quá trình tạo và ký khóa ECDSA P-256 trong Secure Enclave
Tóm tắt
- macOS giờ đã hỗ trợ gốc xác thực SSH tận dụng trực tiếp Secure Enclave
- Nhờ xác thực sinh trắc học bằng Touch ID và cấu trúc tương thích FIDO2, độ an toàn và tính tiện dụng được cải thiện
- Có thể quản lý khóa SSH chỉ bằng các tính năng tích hợp sẵn của hệ thống, không cần phần cứng ngoài hay phần mềm bổ sung
- Các nhà phát triển đang thử nghiệm mở rộng
ssh-keychain.dylib để kiểm soát sinh trắc học chi tiết hơn
1 bình luận
Ý kiến trên Hacker News
Nếu tôi hiểu đúng, điều này có nghĩa là không thể sao lưu khóa riêng tư
Vì nó được lưu trong Secure Enclave, nên nếu làm mất laptop thì khóa cũng mất theo
Có vẻ chỉ có thể xuất khóa công khai. Tất nhiên có thể có cách tiếp cận khác hoặc reset bởi quản trị viên, nhưng dù vậy vẫn có chút gì đó khiến tôi thấy bất an
OP nói sau đó sẽ trả lời và cập nhật trang web
man sc_auth. Thay vì tạo trực tiếp trong Secure Enclave, có thể tạo khóa có thể xuất ra ở dạng mã hóaVới lệnh ví dụ như
sc_auth create-ctk-identity -l ssh-exportable -k p-256 -t bio, sau đó có thể tạo file.pembằngexport-ctk-identityCó thể nhập lại trên thiết bị khác bằng
import-ctk-identities. Tôi định sẽ thêm nội dung này vào hướng dẫnCốt lõi của PKI là chỉ di chuyển khóa công khai, còn khóa riêng tư phải chỉ tồn tại ở một nơi
Như vậy trong mọi trường hợp khóa cũng sẽ không bị lộ
Khóa riêng tư được tạo trên YubiKey cũng không thể sao lưu
Lý tưởng nhất là mỗi thiết bị có một khóa riêng, để nếu làm mất hay bị trộm thiết bị cũng không thành vấn đề
Tôi cất một YubiKey được bảo vệ bằng PIN trong két sắt. Như vậy nếu laptop, điện thoại và YubiKey dùng hằng ngày của tôi đều biến mất thì vẫn còn phương án dự phòng
Đi xa hơn một chút thì còn có thể ký GPG dựa trên ECDSA
Tuy nhiên do lỗi nên cần GPG và SSH agent đã được vá
Có một phiên bản gói có kèm UI cho macOS (KeetaNetwork/agent),
và cùng backend đó cũng hoạt động trên Linux với TPM qua PKCS#11
Khác biệt giữa GPG và SSH chỉ là cách bọc khóa và chữ ký, còn về cơ bản tất cả đều là ECDSA
Secretive có thiết lập đơn giản hơn, nhưng tôi định chuyển sang cách này để bớt đi một ứng dụng
Tôi đã viết lại cách thiết lập khóa SSH dựa trên TPM trên Windows 11 trên blog của tôi
Đây là một tính năng khá tuyệt
Tôi đã dùng Secretive trong thời gian dài, và nó tiện hơn nhiều so với khóa hay thẻ vật lý
Mỗi khi khóa SSH được dùng, bạn phải bấm nút hoặc xác thực vân tay nên luôn biết rõ khi nào nó đang được sử dụng
Bạn có thể duy trì tunnel ssh-agent để ký git an toàn ngay cả trên máy chủ từ xa
Tuy nhiên bản Tahoe có rất nhiều lỗi và thường xuyên bị treo. Tôi không có thời gian để debug nên cứ để vậy
Trải nghiệm SSH dựa trên Smart Card trước đây từng khiến tôi khổ sở, nhưng nếu ổn định thì cũng đáng để thử
Có thể xác nhận mỗi lần dùng khóa riêng tư thông qua
ssh-askpass. Chỉ là nó không phân biệt được local hay remoteCần cẩn thận vì cách này dùng đường cong từng bị nghi là có backdoor do NSA cài vào
Tôi thắc mắc tại sao đã lưu trong Secure Enclave mà vẫn cần file khóa riêng tư
skcủa OpenSSH cũng vậy. Dù có tùy chọn “resident key” thì vẫn cần file khóa riêng tưĐây chỉ đơn thuần là tham chiếu đến thông tin xác thực FIDO, chứ không chứa dữ liệu khóa bí mật thực sự
Với khóa
skkhông thường trú, file là cần thiết vì bộ xác thực phần cứng không lưu trạng tháiTôi không chắc triển khai của macOS là có lưu trạng thái hay không lưu trạng thái. Nó có thể bị hỏng khi cài lại OS
Có một dự án tên là facebookincubator/sks
Đây là thư viện golang trừu tượng hóa nhiều loại khóa SSH dựa trên phần cứng, hỗ trợ Linux, Windows và macOS
Vì vậy trước đây tôi đã bắt đầu tự làm ssh-tpm-agent
Tôi muốn dùng cùng khóa riêng tư đó trên iPhone để ký email hoặc file
Tôi tự hỏi liệu iCloud có thể xử lý việc này không
Thay vào đó, Passkey mới được đồng bộ. Cần tạo một SecurityKeyProvider mới giao tiếp với API Passkey
Passkey bị ràng buộc với bundle ID của ứng dụng hoặc domain cụ thể
Ví dụ nếu Secretive hỗ trợ Passkey, thì cặp khóa đó sẽ không thể dùng trong ứng dụng khác, nhưng
sẽ được đồng bộ giữa nhiều thiết bị dùng cùng một ứng dụng
Đã đến lúc thêm tính năng mới cho KeyMux
Công cụ này hỗ trợ enclave key cho SSH, SSL và PGP,
ví dụ có thể truy cập máy chủ Vault bằng chứng chỉ SSL dựa trên Secure Enclave để thực hiện xác thực SSH bằng khóa riêng tư Vault không thể xuất ra
Có thể xem tại keymux.com và liên kết App Store