1 คะแนน โดย GN⁺ 2025-11-24 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • ใน 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 ความคิดเห็น

 
GN⁺ 2025-11-24
ความคิดเห็นจาก 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 ได้ จะเพิ่มเนื้อหานี้ลงในไกด์
    • โดยหลักแล้วคีย์ต้นฉบับไม่ได้มีไว้ให้ “export” ยิ่งย้ายคีย์ก็ยิ่งมีความเสี่ยงที่จะถูกเปิดเผย
      หัวใจของ PKI คือย้ายเฉพาะ public key และ private key ควรมีอยู่เพียงที่เดียว
    • ใช่ ควรสร้างหลายคีย์ไว้สำหรับสำรอง
      แบบนี้ไม่ว่าอย่างไรก็จะไม่มีการรั่วไหลของคีย์
    • การ export private key ไม่ได้เป็น แนวคิดเดียวกับ YubiKey
      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 ไว้ในบล็อกของฉัน

    • สงสัยว่าใน Linux สามารถเก็บ ssh-key ไว้ใน TPM ได้ไหม
  • เป็นฟีเจอร์ที่เจ๋งมาก
    ฉัน ใช้ Secretive มานาน แล้ว และมันสะดวกกว่าคีย์หรือการ์ดแบบ physical มาก
    ทุกครั้งที่มีการใช้ SSH key จะต้องกดปุ่มหรือสแกนนิ้ว ทำให้รู้ชัดว่ามันถูกใช้งานเมื่อไร
    สามารถคง ssh-agent tunnel ไว้เพื่อเซ็น git อย่างปลอดภัยบนเซิร์ฟเวอร์ระยะไกลได้
    แต่เวอร์ชัน Tahoe มีบั๊กเยอะและค้างบ่อย ฉันไม่มีเวลามาไล่ดีบักเลยปล่อยไว้แบบนั้น
    UX ของ SSH แบบ Smart Card เคยทำให้ฉันลำบากมาแล้ว แต่ถ้ามันเสถียรก็น่าลอง

    • ฉันก็ชอบ Secretive เหมือนกัน แต่ ฟีเจอร์ยืนยันของ ssh-agent นั้น OpenSSH รองรับมานานแล้ว
      สามารถยืนยันทุกครั้งที่ใช้ private key ผ่าน ssh-askpass ได้ เพียงแต่แยกไม่ออกว่าเป็นการใช้งานจาก local หรือ remote
  • วิธีนี้ใช้ curve ที่ถูกสงสัยว่า NSA ใส่ backdoor ไว้ ดังนั้นควรระวัง

  • สงสัยว่าถ้าเก็บไว้ใน Secure Enclave แล้ว ทำไมยังต้องมีไฟล์ private key อีก

    • implementation ของ OpenSSH แบบ 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

    • แต่มีแค่ไลบรารี golang อย่างเดียวก็ยังทำให้ ssh-agent ทำงานไม่ได้
      เลยเมื่อก่อนฉันเริ่มทำ ssh-tpm-agent เอง
  • ฉันอยากใช้ private key เดียวกันเพื่อลงลายเซ็นอีเมลหรือไฟล์บน iPhone ด้วย
    สงสัยว่า iCloud จะจัดการเรื่องนี้ให้ได้ไหม

    • คีย์แบบนี้จะ ไม่ซิงก์ผ่าน 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