- ใน macOS Tahoe มีการรองรับ การสร้างและใช้งานคีย์ SSH ด้วย Secure Enclave แบบในตัว
- ไลบรารี
/usr/lib/ssh-keychain.dylib นอกจากจะรองรับ PKCS11Provider สำหรับสมาร์ตการ์ด เดิมแล้ว ยังมีการอิมพลีเมนต์อินเทอร์เฟซ SecurityKeyProvider ทำให้สื่อสารกับ Secure Enclave ได้โดยตรงแทนอุปกรณ์ FIDO2
- ใช้คำสั่ง
sc_auth เพื่อ สร้างคีย์ยืนยันตัวตนด้วยชีวมิติผ่าน Touch ID และใช้ ssh-keygen หรือ ssh-add เพื่อ โหลดและใช้งานคีย์จากพื้นที่ความปลอดภัยโดยตรง ได้
- หากตั้งค่าตัวแปรสภาพแวดล้อม
SSH_SK_PROVIDER ใน .zprofile จะทำให้ SSH, ssh-agent, ssh-keygen รู้จักโดยอัตโนมัติ
- สามารถสร้างโครงสร้างการยืนยันตัวตน SSH ที่ ได้ทั้งความปลอดภัยและความสะดวก โดยใช้เพียงความสามารถพื้นฐานของ macOS โดยไม่ต้องมีเครื่องมือภายนอก
ภาพรวมการรองรับคีย์ SSH บน Secure Enclave
- macOS Tahoe รองรับ การสร้างและใช้งานคีย์ SSH บน Secure Enclave
- เดิมทีจำเป็นต้องใช้โปรเจ็กต์ภายนอกอย่าง
secretive แต่ตอนนี้สามารถใช้ความสามารถพื้นฐานของ macOS แทนได้แล้ว
/usr/lib/ssh-keychain.dylib อิมพลีเมนต์ SecurityKeyProvider ทำให้เข้าถึง Secure Enclave ได้ในลักษณะคล้ายกับอุปกรณ์ FIDO2
- ด้วยความสามารถนี้ จึงสามารถทำ SSH authentication ด้วยชิปความปลอดภัยที่มีอยู่ใน macOS ได้ โดยไม่ต้องใช้อุปกรณ์ฮาร์ดแวร์ภายนอกอย่าง YubiKey
การสร้างและจัดการคีย์
- ใช้คำสั่ง
sc_auth create-ctk-identity -l ssh -k p-256-ne -t bio เพื่อ สร้างคีย์ Secure Enclave ที่ต้องยืนยันตัวตนด้วย Touch ID
- ใช้คำสั่ง
list-ctk-identities เพื่อตรวจดูรายการคีย์ที่สร้างไว้และค่าแฮช
- ใช้คำสั่ง
delete-ctk-identity เพื่อลบคีย์ได้
- ใช้ตัวเลือก
list-ctk-identities -t ssh เพื่อตรวจสอบ ลายนิ้วมือคีย์ SSH (fingerprint)
การใช้งานกับ SSH
- ใช้คำสั่ง
ssh-keygen -w /usr/lib/ssh-keychain.dylib -K -N "" เพื่อ โหลดคู่คีย์จาก Secure Enclave
- ไม่จำเป็นต้องป้อน PIN และยืนยันตัวตนด้วย Touch ID
- “private key” ที่สร้างขึ้นไม่ใช่คีย์ลับจริง แต่เป็น ค่าอ้างอิงข้อมูลรับรอง FIDO
- คัดลอก public key ไปยังเซิร์ฟเวอร์ด้วย
ssh-copy-id แล้ว
สามารถเชื่อมต่อด้วยคำสั่ง ssh -o SecurityKeyProvider=/usr/lib/ssh-keychain.dylib localhost
การทำงานร่วมกับ ssh-agent
- ใช้คำสั่ง
ssh-add -K -S /usr/lib/ssh-keychain.dylib เพื่อ ลงทะเบียนคีย์ Secure Enclave เข้ากับ ssh-agent โดยตรง
- ตรวจสอบคีย์ที่ลงทะเบียนแล้วได้ด้วย
ssh-add -L
- จากนั้นยืนยันตัวตนด้วยคำสั่ง
ssh -o SecurityKeyProvider=/usr/lib/ssh-keychain.dylib
การตั้งค่า SecurityKeyProvider เป็นค่าเริ่มต้น
- จะกำหนดโดยตรงใน
.ssh/config หรือเพิ่ม
export SSH_SK_PROVIDER=/usr/lib/ssh-keychain.dylib ใน .zprofile เพื่อให้ระบบรู้จักโดยอัตโนมัติก็ได้
- หลังจากนั้นก็สามารถใช้เพียง
ssh-add -K หรือ ssh my-server เพื่อ เชื่อมต่อ SSH ด้วยคีย์ความปลอดภัย ได้
คีย์แบบส่งออกได้ (Exportable Keys)
- ใช้คำสั่ง
sc_auth create-ctk-identity -l ssh-exportable -k p-256 -t bio เพื่อ สร้างคีย์สำหรับส่งออกที่ถูกเข้ารหัสด้วย Secure Enclave ได้
- ส่งออกเป็นไฟล์ PEM ด้วย
export-ctk-identity และ
ลงทะเบียนกลับบนอุปกรณ์อื่นได้ด้วย import-ctk-identities
- วิธีนี้มี ความปลอดภัยลดลงเล็กน้อยแต่เหมาะกับการสำรองข้อมูล
การถกเถียงของนักพัฒนาและการขยายโค้ด
- ในคอมเมนต์มีการพูดถึงความเป็นไปได้ในการใช้แฟล็ก
.biometryCurrentSet
- ปัจจุบันรองรับเพียง การเปิดหรือปิดการใช้ชีวมิติ เท่านั้น และยังควบคุมรายละเอียดไม่ได้
- ผู้เขียนได้ ทำ reverse-engineering กับ
ssh-keychain.dylib เพื่อตรวจสอบความเป็นไปได้ในการเพิ่มฟังก์ชัน biometryCurrentSet ให้กับฟังก์ชัน sk_enroll()
- ตัวอย่างโค้ดที่เสนอจำเป็นต้อง codesign ด้วยบัญชี Apple Developer Program จึงจะเข้าถึง Secure Enclave ได้
- ในโค้ดมีลอจิกสำหรับ การสร้างคีย์ การลงนาม และการลงทะเบียน (
sk_enroll, sk_sign เป็นต้น) และมีการอิมพลีเมนต์กระบวนการสร้างและลงนามด้วย คีย์ ECDSA P-256 บน Secure Enclave
สรุป
- ตอนนี้ macOS รองรับ การยืนยันตัวตน SSH ที่ใช้ Secure Enclave โดยตรง แบบเนทีฟแล้ว
- ด้วยโครงสร้างที่ใช้ชีวมิติผ่าน Touch ID และเข้ากันได้กับ FIDO2 ทำให้ ทั้งความปลอดภัยและความสะดวกดีขึ้น
- สามารถจัดการคีย์ SSH ได้ด้วย ความสามารถที่มีอยู่ในระบบเท่านั้น โดยไม่ต้องใช้อุปกรณ์ภายนอกหรือซอฟต์แวร์เพิ่มเติม
- นักพัฒนากำลังทดลองขยาย
ssh-keychain.dylib เพื่อรองรับ การควบคุมชีวมิติที่ละเอียดขึ้น
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ถ้าฉันเข้าใจไม่ผิด นี่หมายความว่า ไม่สามารถสำรอง private key ได้
เพราะมันถูกเก็บไว้ใน Secure Enclave ดังนั้นถ้าทำโน้ตบุ๊กหาย คีย์ก็หายไปด้วย
ดูเหมือนว่าจะ export ได้แค่ public key เท่านั้น แน่นอนว่าอาจมีวิธีอื่นหรือรีเซ็ตโดยผู้ดูแลระบบได้ แต่ก็ยังรู้สึกไม่ค่อยสบายใจอยู่ดี
ต่อมา OP บอกว่าจะมาตอบและอัปเดตหน้าเว็บ
man sc_authได้ แทนที่จะสร้างใน Secure Enclave โดยตรง สามารถสร้าง คีย์สำหรับ export แบบเข้ารหัส ได้ตัวอย่างคำสั่งคือรัน
sc_auth create-ctk-identity -l ssh-exportable -k p-256 -t bioจากนั้นใช้export-ctk-identityเพื่อสร้างไฟล์.pemได้และนำกลับเข้าในอุปกรณ์อื่นด้วย
import-ctk-identitiesได้ จะเพิ่มเนื้อหานี้ลงในไกด์หัวใจของ PKI คือย้ายเฉพาะ public key และ private key ควรมีอยู่เพียงที่เดียว
แบบนี้ไม่ว่าอย่างไรก็จะไม่มีการรั่วไหลของคีย์
private key ที่สร้างบน YubiKey ก็สำรองไม่ได้เช่นกัน
เพื่อให้ไม่เป็นปัญหาแม้เครื่องจะหายหรือถูกขโมย อุดมคติคือมีแยกไว้เครื่องละหนึ่งคีย์
ฉันเก็บ YubiKey ที่ป้องกันด้วย PIN ไว้ในตู้เซฟ เผื่อกรณีที่โน้ตบุ๊ก โทรศัพท์ และ YubiKey ที่ใช้ประจำหายหมดพร้อมกัน
ถ้าขยับไปอีกหน่อย ก็ทำ ลายเซ็น GPG แบบ ECDSA ได้ด้วย
แต่เพราะบั๊กจึงต้องใช้ GPG และ SSH agent เวอร์ชันที่แพตช์แล้ว
มีเวอร์ชันแพ็กเกจที่รวม UI สำหรับ macOS (KeetaNetwork/agent)
และ backend เดียวกันก็ทำงานบน Linux ผ่าน TPM via PKCS#11 ได้
ความต่างระหว่าง GPG กับ SSH มีแค่วิธีห่อคีย์และลายเซ็นเท่านั้น โดยพื้นฐานแล้วทั้งหมดคือ ECDSA
Secretive ตั้งค่าง่ายกว่า แต่ฉันคิดจะเปลี่ยนมาใช้วิธีนี้เพื่อ ลดจำนวนแอปลงหนึ่งตัว
ฉันเขียนวิธีตั้งค่า TPM-backed SSH key บน Windows 11 ไว้ในบล็อกของฉัน
เป็นฟีเจอร์ที่เจ๋งมาก
ฉัน ใช้ Secretive มานาน แล้ว และมันสะดวกกว่าคีย์หรือการ์ดแบบ physical มาก
ทุกครั้งที่มีการใช้ SSH key จะต้องกดปุ่มหรือสแกนนิ้ว ทำให้รู้ชัดว่ามันถูกใช้งานเมื่อไร
สามารถคง ssh-agent tunnel ไว้เพื่อเซ็น git อย่างปลอดภัยบนเซิร์ฟเวอร์ระยะไกลได้
แต่เวอร์ชัน Tahoe มีบั๊กเยอะและค้างบ่อย ฉันไม่มีเวลามาไล่ดีบักเลยปล่อยไว้แบบนั้น
UX ของ SSH แบบ Smart Card เคยทำให้ฉันลำบากมาแล้ว แต่ถ้ามันเสถียรก็น่าลอง
สามารถยืนยันทุกครั้งที่ใช้ private key ผ่าน
ssh-askpassได้ เพียงแต่แยกไม่ออกว่าเป็นการใช้งานจาก local หรือ remoteวิธีนี้ใช้ curve ที่ถูกสงสัยว่า NSA ใส่ backdoor ไว้ ดังนั้นควรระวัง
สงสัยว่าถ้าเก็บไว้ใน Secure Enclave แล้ว ทำไมยังต้องมีไฟล์ private key อีก
skก็เหมือนกัน แม้จะมีตัวเลือก “resident key” ก็ยัง ต้องมีไฟล์ private keyแต่มันเป็นเพียง reference ไปยัง FIDO credential เท่านั้น ไม่ได้มีข้อมูล secret key จริงอยู่ข้างใน
สำหรับคีย์
skแบบ non-resident นั้น จำเป็นต้องมีไฟล์เพราะ hardware authenticator ไม่ได้เก็บสถานะไว้ยังไม่แน่ใจว่า implementation ของ macOS เป็นแบบเก็บสถานะหรือไม่เก็บสถานะ และอาจพังได้เมื่อ reinstall OS
มีโปรเจกต์ชื่อ facebookincubator/sks
เป็น ไลบรารี golang ที่ทำ abstraction ให้ SSH key แบบใช้ฮาร์ดแวร์หลายชนิด รองรับ Linux, Windows, macOS
เลยเมื่อก่อนฉันเริ่มทำ ssh-tpm-agent เอง
ฉันอยากใช้ private key เดียวกันเพื่อลงลายเซ็นอีเมลหรือไฟล์บน iPhone ด้วย
สงสัยว่า iCloud จะจัดการเรื่องนี้ให้ได้ไหม
สิ่งที่ซิงก์แทนคือ Passkey ต้องสร้าง SecurityKeyProvider ตัวใหม่ที่คุยกับ Passkey API
Passkey จะถูกผูกกับ bundle ID ของแอปหรือโดเมนที่ระบุ
เช่น ถ้า Secretive รองรับ Passkey คีย์คู่นั้นจะใช้กับแอปอื่นไม่ได้ แต่
จะซิงก์กันได้ระหว่างหลายอุปกรณ์ของแอปเดียวกัน
ได้เวลาเพิ่มฟีเจอร์ใหม่ให้ KeyMux แล้ว
เครื่องมือนี้รองรับ enclave key สำหรับ SSH, SSL, PGP
ตัวอย่างเช่น สามารถเข้า Vault server ด้วย SSL certificate ที่อิง Secure Enclave แล้วทำ SSH authentication ด้วย Vault private key แบบ export ไม่ได้
ดูได้ที่ keymux.com และ ลิงก์ App Store