การเปิดตัว OpenSSH 8.2 พร้อมรองรับโทเค็นการตรวจสอบสิทธิ์แบบสองปัจจัย FIDO/U2F

หลังจากสี่เดือนของการพัฒนา นำเสนอ ปล่อย OpenSSH 8.2ซึ่งเป็นการใช้งานไคลเอ็นต์และเซิร์ฟเวอร์แบบเปิดสำหรับการทำงานผ่านโปรโตคอล SSH 2.0 และ SFTP

การปรับปรุงที่สำคัญในการเปิดตัว OpenSSH 8.2 คือความสามารถในการใช้การตรวจสอบสิทธิ์แบบสองปัจจัยโดยใช้อุปกรณ์ที่รองรับโปรโตคอล U2Fพัฒนาโดยพันธมิตร FIDO. U2F อนุญาตให้สร้างโทเค็นฮาร์ดแวร์ราคาประหยัดเพื่อตรวจสอบสถานะทางกายภาพของผู้ใช้ โดยโต้ตอบกับพวกเขาผ่าน USB, Bluetooth หรือ NFC อุปกรณ์ดังกล่าวได้รับการส่งเสริมให้เป็นวิธีการตรวจสอบสิทธิ์แบบสองปัจจัยบนเว็บไซต์ ได้รับการสนับสนุนโดยเบราว์เซอร์หลักๆ และผลิตโดยผู้ผลิตหลายราย รวมถึง Yubico, Feitian, Thetis และ Kensington

ในการโต้ตอบกับอุปกรณ์ที่ยืนยันการมีอยู่ของผู้ใช้ คีย์ประเภทใหม่ “ecdsa-sk” และ “ed25519-sk” ได้ถูกเพิ่มลงใน OpenSSH ซึ่งใช้อัลกอริธึมลายเซ็นดิจิทัล ECDSA และ Ed25519 รวมกับแฮช SHA-256 ขั้นตอนการโต้ตอบกับโทเค็นจะถูกวางไว้ในไลบรารีระดับกลาง ซึ่งโหลดในลักษณะเดียวกันกับไลบรารีเพื่อรองรับ PKCS#11 และเป็น wrapper ที่ด้านบนของไลบรารี libfido2ซึ่งมีเครื่องมือสำหรับการสื่อสารด้วยโทเค็นผ่าน USB (รองรับโปรโตคอล FIDO U2F/CTAP 1 และ FIDO 2.0/CTAP 2) ไลบรารีระดับกลาง libsk-libfido2 จัดทำโดยนักพัฒนา OpenSSH รวมอยู่ด้วย เข้าสู่คอร์ libfido2 เช่นกัน ไดรเวอร์ HID สำหรับ OpenBSD

ในการตรวจสอบสิทธิ์และสร้างคีย์ คุณต้องระบุพารามิเตอร์ “SecurityKeyProvider” ในการตั้งค่าหรือตั้งค่าตัวแปรสภาพแวดล้อม SSH_SK_PROVIDER โดยระบุเส้นทางไปยังไลบรารีภายนอก libsk-libfido2.so (ส่งออก SSH_SK_PROVIDER=/path/to/libsk-libfido2. ดังนั้น). เป็นไปได้ที่จะสร้าง openssh ด้วยการสนับสนุนในตัวสำหรับไลบรารีเลเยอร์ (--with-security-key-builtin) ในกรณีนี้คุณจะต้องตั้งค่าพารามิเตอร์ “SecurityKeyProvider=internal”
ถัดไปคุณต้องเรียกใช้ “ssh-keygen -t ecdsa-sk” หรือหากคีย์ถูกสร้างขึ้นและกำหนดค่าไว้แล้ว ให้เชื่อมต่อกับเซิร์ฟเวอร์โดยใช้ “ssh” เมื่อคุณเรียกใช้ ssh-keygen คู่คีย์ที่สร้างขึ้นจะถูกบันทึกใน “~/.ssh/id_ecdsa_sk” และสามารถใช้คล้ายกับคีย์อื่นๆ ได้

ควรคัดลอกคีย์สาธารณะ (id_ecdsa_sk.pub) ไปยังเซิร์ฟเวอร์ในไฟล์authorized_keys ทางฝั่งเซิร์ฟเวอร์ จะมีการตรวจสอบเฉพาะลายเซ็นดิจิทัลเท่านั้น และมีการโต้ตอบกับโทเค็นบนฝั่งไคลเอ็นต์ (คุณไม่จำเป็นต้องติดตั้ง libsk-libfido2 บนเซิร์ฟเวอร์ แต่เซิร์ฟเวอร์ต้องรองรับประเภทคีย์ “ecdsa-sk”) . คีย์ส่วนตัวที่สร้างขึ้น (id_ecdsa_sk) นั้นเป็นที่จับคีย์ โดยสร้างเป็นคีย์จริงเมื่อใช้ร่วมกับลำดับความลับที่จัดเก็บไว้ในฝั่งโทเค็น U2F เท่านั้น หากคีย์ id_ecdsa_sk ตกอยู่ในมือของผู้โจมตี เพื่อผ่านการรับรองความถูกต้อง เขาจะต้องเข้าถึงโทเค็นฮาร์ดแวร์ด้วย โดยที่คีย์ส่วนตัวที่เก็บไว้ในไฟล์ id_ecdsa_sk จะไม่มีประโยชน์

นอกจากนี้ ตามค่าเริ่มต้น เมื่อดำเนินการใดๆ ด้วยคีย์ (ทั้งระหว่างการสร้างและระหว่างการตรวจสอบสิทธิ์) จำเป็นต้องมีการยืนยันการมีอยู่จริงของผู้ใช้ในเครื่อง เช่น มีการเสนอให้แตะเซ็นเซอร์บนโทเค็น ซึ่งทำให้ยากต่อ ทำการโจมตีระบบระยะไกลด้วยโทเค็นที่เชื่อมต่อ เพื่อเป็นการป้องกันอีกระดับหนึ่ง ยังสามารถระบุรหัสผ่านในระหว่างขั้นตอนเริ่มต้นของ ssh-keygen เพื่อเข้าถึงไฟล์คีย์ได้

OpenSSH เวอร์ชันใหม่ยังประกาศการเลิกใช้อัลกอริทึมที่ใช้แฮช SHA-1 ที่กำลังจะเกิดขึ้นเนื่องจาก การส่งเสริม ประสิทธิผลของการโจมตีการชนกันด้วยคำนำหน้าที่กำหนด (ค่าใช้จ่ายในการเลือกการชนกันประมาณ 45 ดอลลาร์) ในหนึ่งในการเปิดตัวที่กำลังจะมาถึง พวกเขาวางแผนที่จะปิดใช้งานความสามารถในการใช้อัลกอริธึมลายเซ็นดิจิทัลของคีย์สาธารณะ "ssh-rsa" ตามค่าเริ่มต้น ซึ่งถูกกล่าวถึงใน RFC ดั้งเดิมสำหรับโปรโตคอล SSH และยังคงแพร่หลายในทางปฏิบัติ (เพื่อทดสอบการใช้งาน ของ ssh-rsa ในระบบของคุณ คุณสามารถลองเชื่อมต่อผ่าน ssh ด้วยตัวเลือก “-oHostKeyAlgorithms=-ssh-rsa”)

เพื่อให้การเปลี่ยนไปใช้อัลกอริธึมใหม่ใน OpenSSH ราบรื่นขึ้น ในรีลีสในอนาคต การตั้งค่า UpdateHostKeys จะถูกเปิดใช้งานตามค่าเริ่มต้น ซึ่งจะย้ายไคลเอนต์ไปยังอัลกอริธึมที่เชื่อถือได้มากขึ้นโดยอัตโนมัติ อัลกอริธึมที่แนะนำสำหรับการย้ายข้อมูล ได้แก่ rsa-sha2-256/512 ที่ใช้ RFC8332 RSA SHA-2 (รองรับตั้งแต่ OpenSSH 7.2 และใช้เป็นค่าเริ่มต้น), ssh-ed25519 (รองรับตั้งแต่ OpenSSH 6.5) และ ecdsa-sha2-nistp256/384/521 บน RFC5656 ECDSA (รองรับตั้งแต่ OpenSSH 5.7)

ใน OpenSSH 8.2 ความสามารถในการเชื่อมต่อโดยใช้ "ssh-rsa" ยังคงมีอยู่ แต่อัลกอริทึมนี้ได้ถูกลบออกจากรายการ CASignatureAlgorithms ซึ่งกำหนดอัลกอริทึมที่อนุญาตสำหรับการลงนามใบรับรองใหม่แบบดิจิทัล ในทำนองเดียวกัน อัลกอริธึม diffie-hellman-group14-sha1 ได้ถูกลบออกจากอัลกอริธึมการแลกเปลี่ยนคีย์เริ่มต้นที่รองรับแล้ว มีข้อสังเกตว่าการใช้ SHA-1 ในใบรับรองเกี่ยวข้องกับความเสี่ยงเพิ่มเติม เนื่องจากผู้โจมตีมีเวลาไม่จำกัดในการค้นหาการชนกันของใบรับรองที่มีอยู่ ในขณะที่เวลาของการโจมตีคีย์โฮสต์ถูกจำกัดด้วยการหมดเวลาการเชื่อมต่อ (LoginGraceTime ).

การเรียกใช้ ssh-keygen ขณะนี้มีค่าเริ่มต้นเป็นอัลกอริทึม rsa-sha2-512 ซึ่งได้รับการสนับสนุนตั้งแต่ OpenSSH 7.2 ซึ่งอาจสร้างปัญหาความเข้ากันได้เมื่อพยายามประมวลผลใบรับรองที่ลงนามใน OpenSSH 8.2 บนระบบที่ใช้ OpenSSH เวอร์ชันเก่า (เพื่อแก้ไขปัญหาเมื่อเมื่อใด การสร้างลายเซ็น คุณสามารถระบุ “ssh-keygen -t ssh-rsa” ได้อย่างชัดเจน หรือใช้อัลกอริทึม ecdsa-sha2-nistp256/384/521 ที่ได้รับการสนับสนุนตั้งแต่ OpenSSH 5.7)

การเปลี่ยนแปลงอื่นๆ:

  • มีการเพิ่มคำสั่งรวมใน sshd_config ซึ่งช่วยให้คุณสามารถรวมเนื้อหาของไฟล์อื่น ๆ ที่ตำแหน่งปัจจุบันของไฟล์การกำหนดค่า (สามารถใช้ glob masks เมื่อระบุชื่อไฟล์)
  • เพิ่มตัวเลือก "ไม่จำเป็นต้องสัมผัส" ลงใน ssh-keygen ซึ่งจะปิดการใช้งานความจำเป็นในการยืนยันการเข้าถึงโทเค็นทางกายภาพเมื่อสร้างคีย์
  • มีการเพิ่มคำสั่ง PubkeyAuthOptions ใน sshd_config ซึ่งรวมตัวเลือกต่างๆ ที่เกี่ยวข้องกับการรับรองความถูกต้องของคีย์สาธารณะ ในปัจจุบัน รองรับเฉพาะแฟล็ก "ไม่จำเป็นต้องสัมผัส" เท่านั้นในการข้ามการตรวจสอบสถานะทางกายภาพสำหรับการรับรองความถูกต้องของโทเค็น โดยการเปรียบเทียบแล้ว ตัวเลือก "ไม่จำเป็นต้องสัมผัส" ได้ถูกเพิ่มลงในไฟล์ที่ได้รับอนุญาต_keys
  • เพิ่มตัวเลือก "-O write-attestation=/path" ให้กับ ssh-keygen เพื่ออนุญาตให้เขียนใบรับรองการรับรอง FIDO เพิ่มเติมเมื่อสร้างคีย์ OpenSSH ยังไม่ได้ใช้ใบรับรองเหล่านี้ แต่สามารถใช้เพื่อตรวจสอบว่าคีย์ถูกวางไว้ในร้านฮาร์ดแวร์ที่เชื่อถือได้ในภายหลัง
  • ในการตั้งค่า ssh และ sshd ตอนนี้คุณสามารถตั้งค่าโหมดการจัดลำดับความสำคัญของการรับส่งข้อมูลผ่านคำสั่ง IPQoS เลอ ดีเอสซีพี (พฤติกรรมต่อฮอปความพยายามต่ำ);
  • ใน ssh เมื่อตั้งค่า "AddKeysToAgent=yes" หากคีย์ไม่มีช่องความคิดเห็น ระบบจะเพิ่มลงใน ssh-agent เพื่อระบุเส้นทางไปยังคีย์เป็นความคิดเห็น ใน
    ssh-keygen และ ssh-agent ตอนนี้ใช้ป้ายกำกับ PKCS#11 และชื่อเรื่อง X.509 แทนเส้นทางไลบรารีเป็นความคิดเห็นในคีย์

  • เพิ่มความสามารถในการส่งออก PEM สำหรับคีย์ DSA และ ECDSA ไปยัง ssh-keygen
  • เพิ่ม ssh-sk-helper ที่ปฏิบัติการได้ใหม่ ซึ่งใช้เพื่อแยกไลบรารีการเข้าถึงโทเค็น FIDO/U2F
  • เพิ่มตัวเลือกการสร้าง “--with-zlib” ให้กับ ssh และ sshd สำหรับการคอมไพล์ด้วยการสนับสนุนไลบรารี zlib
  • ตามข้อกำหนดของ RFC4253 คำเตือนเกี่ยวกับการบล็อกการเข้าถึงเนื่องจากการเกินขีดจำกัด MaxStartups จะแสดงอยู่ในแบนเนอร์ที่แสดงระหว่างการเชื่อมต่อ เพื่อให้การวินิจฉัยง่ายขึ้น ส่วนหัวของกระบวนการ sshd ซึ่งมองเห็นได้เมื่อใช้ยูทิลิตี้ ps จะแสดงจำนวนการเชื่อมต่อที่ได้รับการตรวจสอบสิทธิ์ในปัจจุบันและสถานะของขีดจำกัด MaxStartups
  • ใน ssh และ ssh-agent เมื่อเรียกใช้โปรแกรมเพื่อแสดงคำเชิญบนหน้าจอที่ระบุผ่าน $SSH_ASKPASS ตอนนี้แฟล็กที่มีประเภทของคำเชิญจะถูกส่งเพิ่มเติม: "ยืนยัน" - กล่องโต้ตอบการยืนยัน (ใช่/ไม่ใช่), "ไม่มี ” - ข้อความแสดงข้อมูล "ว่างเปล่า" — ขอรหัสผ่าน;
  • เพิ่มการดำเนินการลายเซ็นดิจิทัลใหม่ "find-principals" ใน ssh-keygen เพื่อค้นหาไฟล์ผู้ลงนามที่ได้รับอนุญาตสำหรับผู้ใช้ที่เกี่ยวข้องกับลายเซ็นดิจิทัลที่ระบุ
  • ปรับปรุงการสนับสนุนสำหรับการแยกกระบวนการ sshd บน Linux โดยใช้กลไก seccomp: ปิดการใช้งานการเรียกระบบ IPC อนุญาต clock_gettime64(), clock_nanosleep_time64 และ clock_nanosleep()

ที่มา: opennet.ru

เพิ่มความคิดเห็น