ในโพสต์นี้ เราจะพัฒนาขั้นตอนสำหรับการเข้าถึงโฮสต์ SSH ในกรณีฉุกเฉินโดยใช้คีย์ความปลอดภัยของฮาร์ดแวร์แบบออฟไลน์ นี่เป็นเพียงแนวทางเดียว และคุณสามารถปรับเปลี่ยนให้เหมาะกับความต้องการของคุณได้ เราจะจัดเก็บผู้ออกใบรับรอง SSH สำหรับโฮสต์ของเราไว้ในคีย์ความปลอดภัยของฮาร์ดแวร์ รูปแบบนี้จะใช้ได้กับ OpenSSH เกือบทุกประเภท รวมถึง SSH ที่มีการลงชื่อเพียงครั้งเดียว
ทั้งหมดนี้มีไว้เพื่ออะไร? นี่เป็นทางเลือกสุดท้าย นี่คือแบ็คดอร์ที่จะช่วยให้คุณสามารถเข้าถึงเซิร์ฟเวอร์ของคุณได้ เมื่อไม่มีอะไรทำงานด้วยเหตุผลบางประการ
เหตุใดจึงใช้ใบรับรองแทนคีย์สาธารณะ/ส่วนตัวสำหรับการเข้าถึงในกรณีฉุกเฉิน
- ใบรับรองอาจมีอายุการใช้งานที่สั้นมากซึ่งต่างจากคีย์สาธารณะ คุณสามารถสร้างใบรับรองที่ถูกต้องเป็นเวลา 1 นาทีหรือ 5 วินาทีก็ได้ หลังจากช่วงเวลานี้ ใบรับรองจะใช้ไม่ได้กับการเชื่อมต่อใหม่ เหมาะสำหรับการเข้าถึงในกรณีฉุกเฉิน
- คุณสามารถสร้างใบรับรองสำหรับบัญชีใดก็ได้บนโฮสต์ของคุณ และหากจำเป็น ให้ส่งใบรับรอง “แบบครั้งเดียว” ดังกล่าวให้กับเพื่อนร่วมงาน
คุณต้องการอะไร
- คีย์ความปลอดภัยของฮาร์ดแวร์ที่รองรับคีย์ประจำ
คีย์ถิ่นที่อยู่คือคีย์เข้ารหัสลับที่จัดเก็บไว้ในคีย์ความปลอดภัยทั้งหมด บางครั้งพวกเขาได้รับการป้องกันด้วย PIN ตัวอักษรและตัวเลข ส่วนสาธารณะของรหัสถิ่นที่อยู่สามารถส่งออกได้จากรหัสความปลอดภัย หรือจะใช้ร่วมกับหมายเลขอ้างอิงรหัสส่วนตัวก็ได้ ตัวอย่างเช่น คีย์ USB ของ Yubikey 5 series รองรับคีย์ Resident ขอแนะนำว่ามีไว้สำหรับการเข้าถึงโฮสต์ในกรณีฉุกเฉินเท่านั้น สำหรับโพสต์นี้ ฉันจะใช้เพียงคีย์เดียว แต่คุณควรมีอีกหนึ่งคีย์สำหรับการสำรองข้อมูล - สถานที่ที่ปลอดภัยสำหรับเก็บกุญแจเหล่านั้น
- OpenSSH เวอร์ชัน 8.2 ขึ้นไปบนเครื่องคอมพิวเตอร์ของคุณและบนเซิร์ฟเวอร์ที่คุณต้องการให้เข้าถึงในกรณีฉุกเฉิน Ubuntu 20.04 มาพร้อมกับ OpenSSH 8.2
- (เป็นทางเลือก แต่แนะนำ) เครื่องมือ CLI สำหรับตรวจสอบใบรับรอง
การอบรม
ขั้นแรก คุณต้องสร้างผู้ออกใบรับรองซึ่งจะอยู่ที่คีย์ความปลอดภัยของฮาร์ดแวร์ ใส่กุญแจแล้วรัน:
$ ssh-keygen -t ecdsa-sk -f sk-user-ca -O resident -C [security key ID]
ตามความคิดเห็น (-C) ฉันระบุ [ป้องกันอีเมล]ดังนั้นคุณจึงไม่ลืมว่ารหัสความปลอดภัยใดที่เป็นของผู้ออกใบรับรองนี้
นอกเหนือจากการเพิ่มคีย์ลงใน Yubikey แล้ว ไฟล์ XNUMX ไฟล์จะถูกสร้างขึ้นในเครื่อง:
- sk-user-ca ซึ่งเป็นตัวจัดการคีย์ที่อ้างถึงคีย์ส่วนตัวที่เก็บไว้ในคีย์ความปลอดภัย
- sk-user-ca.pub ซึ่งจะเป็นคีย์สาธารณะสำหรับผู้ออกใบรับรองของคุณ
แต่ไม่ต้องกังวล Yubikey จะเก็บคีย์ส่วนตัวอื่นที่ไม่สามารถเรียกคืนได้ ดังนั้นทุกอย่างจึงเชื่อถือได้ที่นี่
บนโฮสต์ ในฐานะรูท ให้เพิ่ม (หากคุณยังไม่ได้ดำเนินการ) สิ่งต่อไปนี้ในการกำหนดค่า SSHD ของคุณ (/etc/ssh/sshd_config):
TrustedUserCAKeys /etc/ssh/ca.pub
จากนั้นบนโฮสต์ ให้เพิ่มคีย์สาธารณะ (sk-user-ca.pub) ลงใน /etc/ssh/ca.pub
รีสตาร์ทดีมอน:
# /etc/init.d/ssh restart
ตอนนี้เราสามารถลองเข้าถึงโฮสต์ได้แล้ว แต่ก่อนอื่นเราจำเป็นต้องมีใบรับรอง สร้างคู่คีย์ที่จะเชื่อมโยงกับใบรับรอง:
$ ssh-keygen -t ecdsa -f emergency
ใบรับรองและคู่ SSH
บางครั้งการใช้ใบรับรองแทนคู่คีย์สาธารณะ/ส่วนตัวอาจเป็นเรื่องที่น่าสนใจ แต่ใบรับรองเพียงอย่างเดียวไม่เพียงพอที่จะรับรองความถูกต้องของผู้ใช้ ใบรับรองแต่ละใบยังมีรหัสส่วนตัวที่เกี่ยวข้องด้วย นี่คือสาเหตุที่เราต้องสร้างคู่คีย์ "ฉุกเฉิน" นี้ก่อนที่เราจะออกใบรับรองให้ตนเอง สิ่งสำคัญคือเราแสดงใบรับรองที่ลงนามไปยังเซิร์ฟเวอร์ โดยระบุคู่คีย์ที่เรามีคีย์ส่วนตัวดังนั้นการแลกเปลี่ยนคีย์สาธารณะจึงยังมีชีวิตอยู่และดี ใช้งานได้แม้จะมีใบรับรองก็ตาม ใบรับรองช่วยลดความจำเป็นที่เซิร์ฟเวอร์จะต้องจัดเก็บคีย์สาธารณะ
ต่อไป ให้สร้างใบรับรองเอง ฉันต้องการการอนุญาตผู้ใช้ Ubuntu ในช่วงเวลา 10 นาที คุณสามารถทำได้ในแบบของคุณ
$ ssh-keygen -s sk-user-ca -I test-key -n ubuntu -V -5m:+5m emergency
คุณจะถูกขอให้ลงนามใบรับรองโดยใช้ลายนิ้วมือของคุณ คุณสามารถเพิ่มชื่อผู้ใช้เพิ่มเติมได้โดยคั่นด้วยเครื่องหมายจุลภาค เช่น -n ubuntu,carl,ec2-user
เพียงเท่านี้คุณก็ได้รับใบรับรองแล้ว! ถัดไปคุณต้องระบุสิทธิ์ที่ถูกต้อง:
$ chmod 600 emergency-cert.pub
หลังจากนี้ คุณสามารถดูเนื้อหาของใบรับรองของคุณได้:
$ step ssh inspect emergency-cert.pub
นี่คือลักษณะของฉัน:
emergency-cert.pub
Type: [email protected] user certificate
Public key: ECDSA-CERT SHA256:EJSfzfQv1UK44/LOKhBbuh5oRMqxXGBSr+UAzA7cork
Signing CA: SK-ECDSA SHA256:kLJ7xfTTPQN0G/IF2cq5TB3EitaV4k3XczcBZcLPQ0E
Key ID: "test-key"
Serial: 0
Valid: from 2020-06-24T16:53:03 to 2020-06-24T17:03:03
Principals:
ubuntu
Critical Options: (none)
Extensions:
permit-X11-forwarding
permit-agent-forwarding
permit-port-forwarding
permit-pty
permit-user-rc
คีย์สาธารณะในที่นี้คือคีย์ฉุกเฉินที่เราสร้างขึ้น และ sk-user-ca เชื่อมโยงกับผู้ออกใบรับรอง
ในที่สุดเราก็พร้อมที่จะรันคำสั่ง SSH แล้ว:
$ ssh -i emergency ubuntu@my-hostname
ubuntu@my-hostname:~$
- ตอนนี้คุณสามารถสร้างใบรับรองสำหรับผู้ใช้บนโฮสต์ที่เชื่อถือผู้ออกใบรับรองของคุณได้
- คุณสามารถลบเหตุฉุกเฉินได้ คุณสามารถบันทึก sk-user-ca ได้ แต่คุณไม่จำเป็นต้องบันทึกเนื่องจากอยู่บนคีย์ความปลอดภัยด้วย คุณอาจต้องการลบคีย์สาธารณะ PEM ดั้งเดิมออกจากโฮสต์ของคุณ (เช่นใน ~/.ssh/authorized_keys สำหรับผู้ใช้ Ubuntu) หากคุณใช้เพื่อการเข้าถึงในกรณีฉุกเฉิน
การเข้าถึงเหตุฉุกเฉิน: แผนปฏิบัติการ
วางคีย์ความปลอดภัยแล้วรันคำสั่ง:
$ ssh-add -K
สิ่งนี้จะเพิ่มคีย์สาธารณะและตัวอธิบายคีย์ของผู้ออกใบรับรองให้กับตัวแทน SSH
ตอนนี้ส่งออกกุญแจสาธารณะเพื่อสร้างใบรับรอง:
$ ssh-add -L | tail -1 > sk-user-ca.pub
สร้างใบรับรองที่มีวันหมดอายุ เช่น ไม่เกินหนึ่งชั่วโมง:
$ ssh-keygen -t ecdsa -f emergency
$ ssh-keygen -Us sk-user-ca.pub -I test-key -n [username] -V -5m:+60m emergency
$ chmod 600 emergency-cert.pub
และตอนนี้ SSH อีกครั้ง:
$ ssh -i emergency username@host
หากไฟล์ .ssh/config ของคุณทำให้เกิดปัญหาขณะเชื่อมต่อ คุณสามารถเรียกใช้ ssh ด้วยตัวเลือก -F none เพื่อเลี่ยงผ่านได้ หากคุณต้องการส่งใบรับรองให้กับเพื่อนร่วมงาน ตัวเลือกที่ง่ายและปลอดภัยที่สุดคือ
สิ่งที่ฉันชอบเกี่ยวกับแนวทางนี้คือการสนับสนุนฮาร์ดแวร์ คุณสามารถใส่คีย์ความปลอดภัยไว้ในตู้นิรภัยได้ โดยคีย์จะไม่ไปไหนทั้งนั้น
เป็นโฆษณา
เซิร์ฟเวอร์มหากาพย์ - เป็น
ที่มา: will.com