10 คะแนน โดย GN⁺ 2025-03-27 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • Cloudflare เปิดซอร์ส OPKSSH (OpenPubkey SSH)
  • OPKSSH ช่วยให้สร้างและใช้งานคีย์ SSH ได้อัตโนมัติผ่านการล็อกอิน SSO ที่ใช้ OpenID Connect
  • ผู้ใช้ไม่จำเป็นต้องจัดการคีย์สาธารณะ/คีย์ส่วนตัวของ SSH ด้วยตนเองหรือแจกจ่ายไปยังเซิร์ฟเวอร์อีกต่อไป
  • สามารถนำแนวทางการเข้าถึงแบบอิงตัวตนมาใช้กับการยืนยันตัวตน SSH ได้โดยไม่ต้องแก้ไขโปรโตคอล SSH

คำอธิบายพื้นฐานเกี่ยวกับ SSO และ OpenID Connect

  • SSO (Single Sign-On) เป็นวิธีการยืนยันตัวตนที่ช่วยให้ผู้ใช้ล็อกอินครั้งเดียวแล้วเข้าถึงได้หลายระบบ
  • OpenID Connect เป็นโปรโตคอลที่ใช้กับ SSO เป็นหลัก โดยออก ID token ที่มีข้อมูลผู้ใช้
  • ID token มีข้อมูลอย่างอีเมลของผู้ใช้ แต่ไม่มี public key รวมอยู่ด้วย → จึงยังไม่สามารถนำไปใช้กับโปรโตคอลความปลอดภัยอย่าง SSH ได้โดยตรง

แนะนำ OpenPubkey

  • OpenPubkey ใส่ public key ของผู้ใช้เข้าไปใน ID token เพื่อสร้างเป็น PK Token
  • ทำให้สามารถยืนยันได้ว่า “Google รับรองว่าผู้ใช้ alice@example.com กำลังใช้ public key 0x123”
  • สามารถนำไปใช้กับโปรโตคอล OpenID Connect เดิมได้โดยไม่ต้องมีการเปลี่ยนแปลง

บทบาทและข้อดีของ OPKSSH

  • OPKSSH ผสาน OpenPubkey เข้ากับ SSH เพื่อสร้างคีย์ SSH แบบใช้ครั้งเดียวผ่านการล็อกอิน SSO
  • ทำงานได้โดยไม่ต้องเปลี่ยนแปลงโปรโตคอล SSH เดิม และใช้งานได้ด้วยการเพิ่มเพียงสองบรรทัดในไฟล์ตั้งค่า
  • เพิ่มความปลอดภัย

    • ใช้คีย์ SSH แบบใช้ครั้งเดียวแทนคีย์ระยะยาว → ลดความเสียหายเมื่อคีย์รั่วไหลและสามารถจำกัดอายุคีย์ได้
    • หมดอายุภายใน 24 ชั่วโมงโดยค่าเริ่มต้น และสามารถเปลี่ยนค่าได้ผ่านการตั้งค่า
  • เพิ่มความสะดวกให้ผู้ใช้

    • เพียงรันคำสั่ง opkssh login ก็สามารถสร้างคีย์ SSH และล็อกอินได้
    • ไม่จำเป็นต้องคัดลอกคีย์ส่วนตัว SSH ไปยังหลายเครื่อง
  • เพิ่มการมองเห็นในการจัดการ

    • ใช้อีเมลแทนการเข้าถึงแบบอิงคีย์ → ติดตามได้ชัดเจนว่าเป็นผู้ใช้คนใด
    • เพียงเพิ่มอีเมลอย่าง bob@example.com ลงในไฟล์อนุญาตการเข้าถึง ก็สามารถให้สิทธิ์เข้าใช้งานได้ทันที

วิธีการทำงานของ OPKSSH

  • เมื่อผู้ใช้รัน opkssh login:
    • สร้างคู่คีย์ SSH สาธารณะ/ส่วนตัวชั่วคราว
    • ล็อกอินผ่านเบราว์เซอร์ไปยัง OpenID Provider (เช่น Google)
    • หากสำเร็จ จะสร้าง PK Token ที่มี public key และตัวตนของผู้ใช้ผ่านโปรโตคอล OpenPubkey
    • บันทึกไฟล์ public key ที่มี PK Token รวมอยู่ และไฟล์คีย์ส่วนตัวไว้ในไดเรกทอรี .ssh
  • เมื่อเชื่อมต่อ SSH:
    • SSH client ส่ง public key ที่มี PK Token รวมอยู่ไปยัง SSH server
    • เซิร์ฟเวอร์ตรวจสอบความถูกต้องของ public key ผ่าน OpenPubkey verifier ที่ตั้งค่าไว้ด้วย AuthorizedKeysCommand
    • หาก PK Token ถูกต้องและอีเมลอยู่ในรายการอนุญาตการเข้าถึง ก็จะอนุมัติการเชื่อมต่อ

การแก้ปัญหาทางเทคนิค

  • การส่ง PK Token: ใช้ฟิลด์ส่วนขยายของใบรับรอง SSH เพื่อใส่ PK Token ลงใน public key ของ SSH
  • การตรวจสอบความถูกต้องบนเซิร์ฟเวอร์: ใช้ AuthorizedKeysCommand เพื่อมอบหมายการตรวจสอบความถูกต้องของ public key ให้กับโปรแกรมแบบกำหนดเอง (OpenPubkey verifier)
  • การตรวจสอบความสอดคล้องของ public key: ยืนยันว่า public key ที่ปกป้องเซสชัน SSH ตรงกับคีย์ภายใน PK Token

การเปิดซอร์สและความหมายของมัน

  • OPKSSH ถูกเผยแพร่บน GitHub ภายใต้ไลเซนส์ Apache 2.0
  • ก่อนหน้านี้ยังอยู่ในระดับต้นแบบ แต่ตอนนี้มีรีลีสที่เสถียรพร้อมฟังก์ชัน SSH ที่สมบูรณ์แล้ว
  • Cloudflare จะไม่ดูแลหรือรับประกันโครงการนี้ แต่ได้บริจาคโค้ดให้กับชุมชน OpenPubkey

การปรับปรุงหลัก

  • เพิ่มฟังก์ชัน SSH ที่พร้อมใช้งานจริง
  • มีสคริปต์ติดตั้งอัตโนมัติให้
  • รวมเครื่องมือคอนฟิกที่ปรับปรุงแล้ว

1 ความคิดเห็น

 
GN⁺ 2025-03-27
ความคิดเห็นจาก Hacker News
  • ใบรับรอง SSH มีมานานแล้ว และสามารถสร้าง SSH CA ของตัวเองเพื่อออกใบรับรองอายุสั้นได้
    • มีตัวเลือกหลากหลายสำหรับการรับใบรับรองแบบอัตโนมัติ และหนึ่งในนั้นคือโปรเจกต์ step-ca
    • step-ca สามารถสื่อสารกับระบบ OAUTH/OIDC และผู้ให้บริการคลาวด์ได้
    • ยังมีโซลูชันเชิงพาณิชย์ด้วย
  • ชอบวิธีใช้ SSH CA ร่วมกับฮาร์ดแวร์มากกว่า
    • ไม่จำเป็นต้องเรียกโค้ดของบุคคลที่สามจาก SSHD จึงช่วยลดพื้นผิวและเวกเตอร์การโจมตีให้น้อยที่สุด
    • สามารถป้องกันการรั่วไหลของคีย์หรือการโจมตีแบบนำกลับมาใช้ซ้ำได้อย่างสมบูรณ์
    • ทำทุกอย่างได้ด้วยคำสั่ง ssh-keygen มาตรฐาน จึงเป็นประโยชน์ในมุมมองของผู้ดูแลระบบ
  • ตั้งข้อสงสัยต่อคำกล่าวที่ว่า ID token ไม่ได้รวมกุญแจสาธารณะของผู้ใช้ไว้ จึงไม่สามารถปกป้องโปรโตคอล SSH ได้โดยตรง
    • การยืนยันตัวตน SSH ไม่จำเป็นต้องเป็นแบบใช้คีย์เสมอไป
    • สงสัยว่าน่าจะทำผ่าน GSSAPI ได้หรือไม่
  • ใช้ Teleport เพื่อทำการยืนยันตัวตน SSH แบบใบรับรอง และออกใบรับรองอายุสั้นผ่านการยืนยันตัวตน SSO
    • มีข้อดีด้านการควบคุมสิทธิ์เข้าถึงและบันทึกการตรวจสอบ
  • กำลังพัฒนาทางเลือกแทน SSH ชื่อ Terminalwire
    • เหมาะสำหรับการรันคำสั่งแบบครั้งเดียวกับ SaaS จากเวิร์กสเตชันของนักพัฒนา
    • คล้าย SSH ที่สตรีม stdio จากเซิร์ฟเวอร์ไปยังไคลเอนต์ แต่มีคำสั่งเพิ่มเติม
  • เปรียบเทียบกับเทคโนโลยี SSH key ของ Userify
    • Userify ใช้คีย์ทั่วไปแบบกระจาย และรวมศูนย์เฉพาะ control plane ส่วนกลาง
    • ยังเข้าสู่ระบบเซิร์ฟเวอร์ได้แม้เซิร์ฟเวอร์ยืนยันตัวตนจะออฟไลน์
    • มีความสามารถในการยุติเซสชันผู้ใช้และลบบัญชี
  • ในฐานะผู้เขียนบล็อกโพสต์และผู้มีส่วนร่วมหลักของ opkssh พร้อมตอบคำถาม
  • แยกความแตกต่างจากการรัน SSH CA ที่รองรับ OIDC ได้ยาก
    • เซิร์ฟเวอร์เพียงแค่ต้องเชื่อถือคีย์ของ CA
  • มี OpenSSH fork ที่รองรับ X.509 certificate CA
    • คิดว่าน่าสนใจที่มีการนำเสนอทั้งมาตรฐานที่ส่งคืนกุญแจสาธารณะเป็นโทเค็น และไบนารีสำหรับยืนยันตัวตนฝั่งเซิร์ฟเวอร์ที่ใช้สิ่งนี้เพื่อล็อกอินเข้า SSH ว่าเป็นนวัตกรรม