
ในโพสต์นี้ เราจะพัฒนาขั้นตอนสำหรับการเข้าถึงโฮสต์ 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-9-512-742@smallstep.com เพื่อไม่ให้ลืมว่า CA นี้เป็นของรหัสความปลอดภัยใด
นอกเหนือจากการเพิ่มคีย์ลงใน 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: ecdsa-sha2-nistp256-cert-v01@openssh.com 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:~$- ตอนนี้คุณสามารถสร้างใบรับรองสำหรับผู้ใช้บนโฮสต์ที่เชื่อถือผู้ออกใบรับรองของคุณได้
- Вы можете удалить emergency. Вы можете сохранить 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 เพื่อเลี่ยงผ่านได้ หากคุณต้องการส่งใบรับรองให้กับเพื่อนร่วมงาน ตัวเลือกที่ง่ายและปลอดภัยที่สุดคือ . ในการดำเนินการนี้ คุณจำเป็นต้องมีเพียงสองไฟล์ - ในกรณีของเราคือ Emergency และ Emergency-cert.pub
สิ่งที่ฉันชอบเกี่ยวกับแนวทางนี้คือการสนับสนุนฮาร์ดแวร์ คุณสามารถใส่คีย์ความปลอดภัยไว้ในตู้นิรภัยได้ โดยคีย์จะไม่ไปไหนทั้งนั้น
เป็นโฆษณา
เซิร์ฟเวอร์มหากาพย์ - เป็น ด้วยโปรเซสเซอร์อันทรงพลังจาก AMD ความถี่คอร์ CPU สูงถึง 3.4 GHz การกำหนดค่าสูงสุดช่วยให้คุณสามารถแก้ปัญหาได้เกือบทุกปัญหา - คอร์ CPU 128 คอร์, RAM 512 GB, NVMe 4000 GB เข้าร่วมกับเรา!
ที่มา: will.com
