การกู้คืนจากการตั้งค่าเชลล์ของรูทเป็นไฟล์ที่ไม่ดี


23

สมมติว่าฉันได้ทำสิ่งไร้สาระเช่นใช้ 'chsh' เพื่อเปลี่ยนเชลล์ของผู้ใช้รูทเป็นไฟล์พา ธ ที่ไม่ดี การล็อกอินเข้าสู่บัญชีรูทในอนาคตจะล้มเหลวโดยทันทีการอ้างถึง / bin / สิ่งที่ไม่ถูกค้นพบและบูตคุณกลับไปที่หน้าจอเข้าสู่ระบบ นอกเหนือจากโหมดการกู้คืนหรือการแทรก LiveCD เพื่อแก้ไข / etc / passwd ตัวเลือกของฉันสำหรับการกู้คืนระบบของฉันคืออะไร? สมมติว่า (เพื่อความสนุก?) ว่าไม่มีผู้ใช้รายอื่นในวงล้อ คิด?


นี่เป็นสถานการณ์สมมุติที่คุณเสนอหรือไม่?
Chris Down

ฉันทำสิ่งนี้อย่างแน่นอนในการติดตั้ง FreeBSD (ค่อนข้างใหม่) มันได้รับการติดตั้งใหม่อีกครั้งดังนั้นฉันจึงคิดว่าตอนนี้ค่อนข้างเป็นข้อสงสัย แต่ฉันอยากรู้ว่าเส้นทางที่ดีที่สุดในการกู้คืนจะเป็นอย่างไรถ้าฉันมีระบบเต็มรูปแบบในปัจจุบัน
พฤศจิกายน

เคยไปที่นั่นทำแล้วได้รับเสื้อยืด แต่ด้วยผลลัพธ์ของทุกเครื่องที่ฉันจัดการฉันจะดูแลบัญชีรากสำรองในกรณี
Mark D

คำตอบ:


30

เมื่อบูทให้ต่อท้ายinit=/bin/bash(หรือพา ธ ไปยังเชลล์ที่ทำงานได้) กับตัวเลือกการบูตของคุณ - คุณจะถูกดร็อปตรงไปที่เชลล์ผู้ใช้คนเดียว คุณอาจต้องทำmount -o remount,rw /ก่อนที่จะแก้ไข/etc/passwdรายการในสภาพแวดล้อมนั้น exec /sbin/init 3หลังจากนั้นเพียงแค่เริ่มต้นใหม่หรือไม่ทำ เพียงแค่ไม่ได้พิมพ์exitหรือกด Ctrl + D เป็นเหล่านี้จะส่งผลให้ในความหวาดกลัวเคอร์เนล *

การเปลี่ยนแปลงเพิ่มเติมของวิธีนี้อาจจำเป็นสำหรับบางระบบที่โหลดในโหมดสองขั้นตอน (พร้อมรูปเริ่มต้น) หากคุณสังเกตเห็นว่าตัวเลือกการบูตประกอบด้วยinit=และที่สำคัญที่สุดreal_init=สถานที่ที่/bin/bashควรใส่ควรเป็นพารามิเตอร์หลัง (เช่นreal_init=/bin/bash)

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


ดีสำหรับการexecแต่ฉันคิดว่ามันจะดีกว่าที่จะไม่เลอะมากเกินไปกับจุดติดตั้งไว้ล่วงหน้า
Stéphane Gimenez

2
@ Stéphคุณต้องทำอย่างนั้นถ้าเคอร์เนลของคุณไม่เมาท์รูทอ่าน - เขียน มิฉะนั้นคุณจะไม่สามารถแก้ไขไฟล์ใด ๆ (รวมถึง/etc/passwd)
rozcietrzewiacz

ความคิดที่ดี! ฉันจัดการเพื่อเข้าสู่โหมดผู้ใช้คนเดียว แต่มันก็ไม่ได้ตีฉันว่าฉันต้องนับใหม่ / เป็นอ่าน / เขียนเพื่อแก้ไข / etc / passwd ขอบคุณ!
พฤศจิกายน

@roz แน่นอนว่าฉันกำลังพยายามจะบอกว่าฉันจะจัดการกับการยกเลิกการต่อเชื่อมทุกอย่างอื่นอาจถูกเมานท์ (นอกเหนือจาก/) ก่อนที่จะดำเนินการ init
Stéphane Gimenez

@ Stéphไม่ควรมีปัญหากับการเมานต์ แจ้งให้ทราบว่า/bin/bashจะทำงานตรงจุดนั้น/sbin/initจะถูกดำเนินการในการบูตปกติ ดังนั้นจึงไม่มีการดำเนินการที่เป็นไปได้โดยระบบในเวลานั้น
rozcietrzewiacz

10

คุณสามารถใช้suและระบุเชลล์เพื่อดำเนินการ (ฉันไม่แน่ใจว่าคุณกำลังพยายามบอกเป็นนัยหรือไม่ว่าโน้ตของคุณไม่เกี่ยวกับผู้ใช้รายอื่นwheel):

su -c /bin/bash

มิฉะนั้นคุณสามารถทำสิ่งที่คล้ายกันถ้า ssh daemon ของคุณอนุญาตให้ล็อกอินรูท:

ssh root@localhost /bin/bash

คุณยังสามารถตั้งค่าเชลล์เป็น init ของคุณใน bootloader ตัวอย่างเช่นinit=/bin/kshหรือคล้ายกัน


1
ความคิดที่ดี =) ตามที่คุณสงสัยว่าจะไม่มีผู้ใช้รายอื่นสามารถใช้ 'su' ได้ sshd ยังปิดใช้งานการเข้าสู่ระบบด้วย
noffle

6

ถ้า bootloader ของคุณมีการกำหนดให้การแก้ไขสดของพารามิเตอร์ของเคอร์เนล, การแก้ปัญหาคือการเริ่มต้นใหม่และใช้เปลือกเป็นกระบวนการ init init=/bin/bashเช่น /etc/passwdจากนั้นติดสิ่งที่จะต้องมีการติดตั้งด้วยมือและแก้ไข และอีกครั้งกับบูตตามปกติของคุณsyncinit


ว้าวฉันเพิ่งสังเกตเห็นว่าคุณโพสต์คำตอบเดียวกันในนาทีเดียวกับตัวฉัน :-)
rozcietrzewiacz

6

หากส่วนสำคัญของคำถามของคุณคือคุณได้ปิดกั้นวิธีการทั้งหมดที่จะกลายเป็นรากแล้วตามคำนิยามคุณไม่สามารถกลายเป็นราก

เป็นเรื่องปกติที่จะอนุญาตให้สามวิธีในการรูทบนระบบยูนิกซ์:

  • ล็อกอินด้วยรูทโดยป้อนrootที่พรอมต์ล็อกอินและพิมพ์รหัสผ่านรูท สิ่งนี้รันเชลล์ของรูท
  • ล็อกอินในฐานะผู้ใช้ธรรมดาจากนั้นกลายเป็นรูทด้วยการรันsuและพิมพ์รหัสผ่านรูท ในบางระบบสิ่งนี้จำเป็นต้องอยู่ในกลุ่มเฉพาะ (มักเรียกว่าwheel); ในระบบอื่นใครก็ตามที่รู้รหัสผ่านรูทสามารถเป็นรูทได้ ระบบที่ใช้ PAM สำหรับการตรวจสอบความถูกต้องใช้pam_wheelเพื่อจัดการกลุ่มล้อเลื่อนหากมี หากคุณระบุคำสั่งด้วยคำสั่งsu -cนั้นจะถูกดำเนินการผ่านเชลล์ของรูท
  • เข้าสู่ระบบในฐานะผู้ใช้ธรรมดาจากนั้นกลายเป็นรูทโดยการเรียกใช้sudoและพิมพ์รหัสผ่านของคุณเอง บัญชีผู้ใช้จะต้องได้รับพลัง sudo โดยผู้ดูแลระบบ sudoersคุณสามารถเรียกใช้คำสั่งใด ๆ โดยไม่คำนึงถึงข้อ จำกัด ในไฟล์โดยไม่คำนึงถึงเชลล์ของรูท

วิธีดั้งเดิมในการป้องกันเชลล์ของรูทที่ไม่พร้อมใช้งานคือการกำหนดบัญชีอื่นด้วย UID 0 และเชลล์อื่น ( toorเป็นชื่อดั้งเดิม) ตัวอย่างเช่นถ้าเชลล์ของรูทเป็นไฟล์เรียกทำงานที่เชื่อมโยงแบบไดนามิก (เป็นความคิดที่ดีที่จะอนุรักษ์หน่วยความจำ) และการอัพเกรดไลบรารีผิดไปเชลล์ของรูทอาจไม่สามารถใช้งานได้ บัญชีรากอื่นจะมีการปฏิบัติการเชื่อมโยงแบบคงอาจจะเป็นหนึ่งเดียวกับสาธารณูปโภคร่วมกันในตัวเช่นBusyBox


5

คำตอบข้างต้นนั้นยอดเยี่ยมและฉันเรียนรู้จากการอ่าน หากคุณจำรายละเอียดของวิธีการเหล่านี้ไม่ได้และไม่ต้องกังวลเกี่ยวกับการรีบูตคุณสามารถบู๊ตระบบของคุณได้ตลอดเวลาโดยใช้ไลฟ์ดิสทริบิวชันซีดีติดตั้ง / พาร์ติชันแล้วแก้ไข / etc / passwd และรีบูต ไม่สง่างามเท่าที่กล่าวไว้ข้างต้น แต่จำได้ง่ายกว่า


คุณควรชี้ให้เห็นความเสี่ยงที่เกี่ยวข้องกับการแก้ไข/etc/passwdไฟล์ด้วยตนเอง นอกเหนือจากนี้จุดดี - ฉันแค่ต้องการเพิ่มข้อเสนอแนะเดียวกันกับคำตอบของฉัน
rozcietrzewiacz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.