แก้ปัญหา YubiKey สองตัวกับคำขอ PIN ซ้ำซ้อนบน Git
เจาะลึกปัญหาการใช้ YubiKey สองตัวที่ทำให้ git push ต้องพิมพ์ PIN ซ้ำซ้อน และวิธีแก้ปัญหาด้วย OpenSSH Match exec และ IdentitiesOnly

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
- ผู้เขียนใช้ YubiKey สองตัวโดยลงทะเบียนไว้กับบริการสำคัญทั้งหมดเพื่อความปลอดภัย
- คำสั่ง git push บางครั้งต้องใส่ PIN ซ้ำสองรอบเนื่องจาก SSH สุ่มเลือกคีย์สลับกัน
- การตั้งค่า IdentitiesOnly yes และ Match exec ในไฟล์ config ช่วยจำกัดคีย์ที่ใช้งาน
- การตรวจสอบซีเรียลนัมเบอร์ผ่าน ykman อาจใช้เวลาถึง 350 มิลลิวินาทีต่อครั้ง
การมีฮาร์ดแวร์โทเค็นสำรองเป็นสิ่งสำคัญเพื่อป้องกันจุดล้มเหลวเดี่ยว แต่นักพัฒนาซอฟต์แวร์รายหนึ่งกลับต้องพบกับความน่ารำคาญเล็กๆ น้อยๆ เมื่อทำการ git push ในแต่ละวัน บางครั้งคำสั่งทำงานได้ทันทีด้วยการใส่ PIN เพียงครั้งเดียว แต่บางครั้งระบบกลับปฏิเสธและบังคับให้ต้องกรอก PIN อีกรอบ แม้จะเป็นคำสั่ง รีโป และแล็ปท็อปเครื่องเดิมก็ตาม
สาเหตุของปัญหามาจากฮาร์ดแวร์ YubiKey สองตัวที่ผู้เขียนพกพา ตัวหนึ่งติดอยู่กับพวงกุญแจส่วนอีกตัวเก็บไว้ในลิ้นชัก ทั้งคู่ถูกลงทะเบียนประเภท sk-ssh-ed25519 ไว้ และถูกโหลดเข้าสู่ gnome-keyring agent โดยอัตโนมัติ โดยที่ไม่มีการตั้งค่าไฟล์ ~/.ssh/config ไว้ล่วงหน้า ทำให้ SSH ส่งคีย์ทั้งหมดตามลำดับที่เอเจนต์จัดเตรียมไว้ และ GitHub ยอมรับคีย์แรกที่ตรวจพบเสมอ

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
เมื่อคีย์แรกบนพวงกุญแจอยู่ในพอร์ต USB ระบบจะทำงานได้ปกติ แต่หากสลับเอาคีย์ตัวที่สองจากลิ้นชักเสียบอยู่ SSH จะพยายามใช้คีย์นั้นกับข้อมูลรับรองที่ไม่รู้จัก ส่งผลให้เกิดหน้าต่างขอ PIN เมื่อพิมพ์แล้วจึงล้มเหลว และ SSH ถึงจะสลับไปใช้คีย์ตัวที่ถูกต้อง ซึ่งสถานการณ์นี้ถูกซ้ำเติมด้วยการเปิดใช้งานฟีเจอร์ USER_VERIFICATION_REQD ทำให้ต้องมีการยืนยันตัวตนก่อนทุกครั้ง
การใช้คีย์ความปลอดภัยหลายตัวพร้อมกันเป็นแนวปฏิบัติที่ดีในการสำรองข้อมูล แต่ระบบการจัดการคีย์เริ่มต้นของ SSH มักจะพยายามทดลองคีย์ตามลำดับที่มี ซึ่งอาจสร้างความหงุดหงิดเล็กๆ น้อยๆ ในการทำงานประจำวัน การทำความเข้าใจกลไกการทำงานของ ssh-agent และการกำหนดค่าคอนฟิกเพิ่มเติมจึงเป็นกุญแจสำคัญในการปรับแต่งเวิร์กโฟลว์ให้ราบรื่นขึ้น
ทางออกของเรื่องนี้คือการใช้คำสั่ง Match exec ในไฟล์ OpenSSH config เพื่อตรวจสอบซีเรียลนัมเบอร์ของ YubiKey ที่เสียบอยู่กับพอร์ตจริงๆ ตัวอย่างการตั้งค่ามีดังนี้:
- Match host github.com,gitlab.com exec "%d/.ssh/yk-plugged 12345678" IdentityFile ~/.ssh/id_ed25519_sk_yk1 IdentitiesOnly yes
- Match host github.com,gitlab.com exec "%d/.ssh/yk-plugged 12345679" IdentityFile ~/.ssh/id_ed25519_sk_yk2 IdentitiesOnly yes
หัวใจสำคัญของการแก้ปัญหานี้คือคำสั่ง IdentitiesOnly yes ซึ่งป้องกันไม่ให้ SSH เสนอคีย์ทั้งหมดในเอเจนต์ แต่จะเลือกเฉพาะคีย์ที่ตรงกับ IdentityFile ที่ระบุไว้เท่านั้น อย่างไรก็ตาม การดึงซีเรียลนัมเบอร์ผ่านเครื่องมือ ykman อาจใช้เวลาประมาณ 350 มิลลิวินาทีต่อการรันหนึ่งครั้ง ซึ่งนักพัฒนาต้องชั่งน้ำหนักระหว่างความสะดวกและเวลาที่เสียไปกับการตรวจสอบฮาร์ดแวร์ในทุกๆ คำสั่ง
ที่มา: Dev.to
พบข้อมูลผิดพลาดในบทความนี้? แจ้งปัญหาบทความนี้
ความคิดเห็น
แสดงความคิดเห็น