เหตุใดคำสั่ง sudo จึงไม่ต้องการรหัสผ่านรูท


48

ฉันใช้ Linux มาระยะหนึ่งและทุกครั้งที่ฉันพิมพ์sudoฉันคิดว่าฉันเปลี่ยนไปใช้ผู้ใช้รูทสำหรับคำสั่ง

เห็นได้ชัดว่าสิ่งนี้ไม่เป็นความจริงเพราะสิ่งที่ฉันต้องการคือรหัสผ่านบัญชีผู้ใช้ของฉัน ฉันเดาเพราะฉันไม่ได้ทำงานกับผู้ใช้หลายคนฉันไม่ได้สังเกตสิ่งนี้ในโลกแห่งความเป็นจริง

ฉันไม่แน่ใจว่า Ubuntu ตั้งค่าบัญชีแรกของฉันอย่างไร มีผู้ใช้รูทหรือไม่? ฉันรูทหรือเปล่า ฉันเดาว่าฉันเพิ่งสร้างผู้ใช้ใหม่เมื่อติดตั้ง แต่มันให้สิทธิพิเศษแก่ฉันหรือไม่ สับสนเล็กน้อยที่นี่ ...

เหตุใดฉันจึงได้รับอนุญาตให้เรียกใช้คำสั่งรูทด้วยรหัสผ่านของผู้ใช้


ใช้ผู้ใช้ที่คุณต้องการรหัสผ่านและที่คุณไม่? คุณใช้คำสั่งอะไร จำไว้ว่า sudo นั้นเก็บรหัสผ่านของคุณไว้ครู่หนึ่งก่อนที่คุณจะต้องพิมพ์ซ้ำ
Braiam

11
sudoมีชุดบิต "setuid" ดังนั้นมันจึงทำงานในฐานะผู้ใช้ที่เป็นเจ้าของ (ซึ่งเป็นรากฐานของระบบมาตรฐานทั้งหมดหากฉันไม่เข้าใจผิด) ไม่ใช่ผู้ใช้ที่เปิดตัวมัน sudoจากนั้นโหลด/etc/sudoersไฟล์และตรวจสอบสิ่งที่ได้รับอนุญาตตามผู้ที่เปิดใช้งาน
LawrenceC


1
ฉันขอโทษถ้าฉันทำซ้ำสิ่งที่คนอื่นพูด แต่ฉันหามันไม่เจอ คำตอบคือ: มันเป็นการตัดสินใจเชิงนโยบาย การคาดเดาที่ดีที่สุดของฉันเกี่ยวกับแรงจูงใจคือในการติดตั้งขนาดใหญ่ที่คุณมีคนจำนวนมากที่มีsudoสิทธิ์อาจทำงานในสถานที่ที่มีการกระจายทางภูมิศาสตร์และในการเลื่อน 24 × 7 คุณต้องการยกเลิกสิทธิ์พิเศษของบุคคลหนึ่งได้ทันที คุณสงสัยว่าความซื่อสัตย์ของเขา) หากทุกคนใช้รหัสผ่านรูทแบบหนึ่งเดียวเท่านั้นและคุณเปลี่ยนรหัสผ่านโดยไม่ต้องประสานงานล่วงหน้าอาจเกิดความสับสนวุ่นวาย …
G-Man

1
@HagenvonEitzen ฉันรู้ว่าฉันสองสามวันสาย แต่นี่ไม่ใช่คำถามของเราได้อย่างไร
strugee

คำตอบ:


65

ในรายละเอียดมันทำงานด้วยวิธีต่อไปนี้:

  1. /usr/bin/sudoไฟล์ที่ปฏิบัติการได้มีการตั้งค่าบิต setuidดังนั้นแม้เมื่อดำเนินการโดยผู้ใช้รายอื่นมันจะทำงานด้วย ID ผู้ใช้ของเจ้าของไฟล์ (รูทในกรณีนั้น)

  2. sudoเช็กอิน/etc/sudoersไฟล์คุณมีสิทธิ์พิเศษอะไรและคุณได้รับอนุญาตให้เรียกใช้คำสั่งที่คุณเรียกใช้หรือไม่ การพูดอย่างง่าย ๆ/etc/sudoersคือไฟล์ที่กำหนดว่าผู้ใช้คนใดสามารถเรียกใช้คำสั่งใดก็ได้โดยใช้sudoกลไก

    นั่นคือวิธีที่ไฟล์นั้นดูบน Ubuntu ของฉัน:

    # User privilege specification
    root    ALL=(ALL:ALL) ALL
    
    # Members of the admin group may gain root privileges
    %admin ALL=(ALL) ALL
    
    # Allow members of group sudo to execute any command
    %sudo   ALL=(ALL:ALL) ALL
    

    บรรทัดที่สามคือสิ่งที่คุณสนใจ มันช่วยให้ทุกคนในกลุ่ม "sudo" เพื่อรันคำสั่งใด ๆ ในฐานะผู้ใช้ใด ๆ

    เมื่อ Ubuntu ตั้งค่าบัญชีแรกระหว่างการติดตั้งจะเพิ่มบัญชีนั้นในกลุ่ม "sudo" คุณสามารถตรวจสอบกลุ่มที่ผู้ใช้อยู่กับgroupคำสั่ง

  3. sudoขอรหัสผ่านจากคุณ เกี่ยวกับความจริงที่ว่ามันต้องการรหัสผ่านของผู้ใช้ไม่ใช่ของรูทนั่นเป็นข้อความที่ตัดตอนมาจากคู่มือ sudoers :

    การพิสูจน์ตัวตนและการบันทึก

    นโยบายความปลอดภัยของ sudoers ต้องการให้ผู้ใช้ส่วนใหญ่ตรวจสอบตัวเองก่อนที่จะสามารถใช้ sudo ไม่จำเป็นต้องใช้รหัสผ่านหากผู้ใช้ที่เรียกใช้เป็นผู้ใช้รูทหากผู้ใช้เป้าหมายเหมือนกันกับผู้ใช้ที่เรียกใช้หรือหากนโยบายได้ปิดใช้งานการตรวจสอบสิทธิ์สำหรับผู้ใช้หรือคำสั่ง ซึ่งแตกต่างจาก su (1) เมื่อ sudoers ต้องการการตรวจสอบความถูกต้องมันจะตรวจสอบความถูกต้องของข้อมูลประจำตัวของผู้ใช้ไม่ใช่ข้อมูลประจำตัวของผู้ใช้เป้าหมาย (หรือของรูท) สิ่งนี้สามารถเปลี่ยนแปลงได้ผ่านการตั้งค่าสถานะ rootpw, targetpw และ runaspw ที่อธิบายไว้ในภายหลัง

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

    %sudo   ALL=(ALL:ALL) NOPASSWD: ALL
    
  4. หลังจากการพิสูจน์ตัวตนsudoเกิดกระบวนการลูกซึ่งรันคำสั่งที่เรียกใช้ เด็กสืบทอด ID ผู้ใช้รูทจากพาเรนต์ - sudoกระบวนการ


ดังนั้นตอบคำถามของคุณอย่างแม่นยำ:

ฉันคิดว่าฉันสลับไปที่ผู้ใช้รูทสำหรับคำสั่ง

คุณพูดถูก แต่ละคำสั่งนำหน้าด้วยการsudoรันด้วย ID ผู้ใช้รูท

มีผู้ใช้รูทหรือไม่?

ใช่มีบัญชีผู้ใช้รูทแยกจากบัญชีผู้ใช้ของคุณที่สร้างขึ้นระหว่างการติดตั้งระบบ อย่างไรก็ตามโดยค่าเริ่มต้นใน Ubuntu คุณไม่ได้รับอนุญาตให้ลงชื่อเข้าใช้เทอร์มินัลเชิงโต้ตอบในฐานะผู้ใช้รูท

ฉันรูทหรือเปล่า

ไม่คุณไม่ใช่รูต คุณมีสิทธิ์ใช้งานคำสั่งแต่ละคำสั่งในฐานะรูทโดยใช้sudoกลไกที่อธิบายไว้ข้างต้น

เหตุใดฉันจึงได้รับอนุญาตให้เรียกใช้คำสั่งรูทด้วยรหัสผ่านของผู้ใช้

คุณต้องป้อนรหัสผ่านของผู้ใช้เท่านั้นเนื่องจากsudoกลไกความปลอดภัยภายใน มันสามารถปิดได้อย่างง่ายดาย คุณได้รับอำนาจรูทเนื่องจาก setuid บิต/usr/bin/sudoไม่ใช่เพราะรหัสผ่านใด ๆ ที่คุณป้อน


6
คำตอบควรเริ่มต้นด้วยส่วน setuid เพราะนั่นคือเหตุผลที่เป็นไปได้จริง / etc / sudoers เป็นเพียงเหตุผลของความยืดหยุ่นของคำสั่ง sudo
daniel kullmann

น่าสนใจ ฉันไม่รู้ว่าคุณสามารถระบุได้ว่าsudoสามารถทำงานได้โดยไม่ต้องป้อนรหัสผ่านของฉัน คำตอบที่ดี!
jwir3

1
หมายเหตุ: sudo ที่สามารถกำหนดค่าเพื่อขอรหัสผ่านรากที่มีธงในrootpw sudoers
Reinstate Monica - M. Schröder

2
ในความเป็นจริงคุณสามารถเข้าสู่ระบบในฐานะผู้ใช้รูท: sudo su - rootจะทำเช่นนั้นและให้เทอร์มินัลรูทแก่คุณ อย่างไรก็ตามคุณไม่สามารถล็อกอินเข้าสู่เซสชันเดสก์ท็อปได้อย่างง่ายดายในฐานะรูท
jmiserez

1
โดยทั่วไปsudoมีสิทธิ์ใช้งานรูทด้วยตัวเองและจะตัดสินใจว่าจะมอบให้คุณตามไฟล์คอนฟิกูเรชันหรือไม่
Siyuan Ren

15
  • ประเด็นทั้งหมดsudoคือการให้สิทธิ์ผู้อื่นแก่คุณ (โดยทั่วไปคือรูท) โดยไม่ต้องขอรหัสผ่านของบัญชีอื่น (ไม่เหมือนsu)

  • sudo กำลังขอรหัสผ่านของคุณที่นี่เพื่อให้แน่ใจว่าผู้สัญจรผ่านไปจะไม่ใช้เทอร์มินัลที่ถูกปลดล็อคของคุณในทางที่ผิด

  • Ubuntu และอื่น ๆ อีกมากมาย Linux และ Unix rootระบบปฏิบัติการที่ได้รับการอนุญาตให้บัญชีเริ่มต้นสร้างขึ้นในเวลาการติดตั้งที่เหมาะสมในการเรียกใช้คำสั่งใด

  • ในขณะที่rootยังคงเป็นบัญชีภายใต้ Linux การrootเข้าสู่ระบบโดยตรงจะถูกปิดใช้งานโดยค่าเริ่มต้นเพื่อความปลอดภัยและการตรวจสอบย้อนกลับที่ดีกว่า


7
แม้ว่าค่าเริ่มต้นการเข้าสู่ระบบโดยตรงของ root จะถูกปิดใช้งานแน่นอน แต่ก็ยังมีบัญชีรูทกับ Ubuntu มันไม่ได้เป็นบัญชีบน Solaris อย่างน้อยที่สุดโดยที่บทบาทนั้นเป็นค่าเริ่มต้น
jlliagre

ขอบคุณมาก - ฉันมักจะสงสัยว่ามันทำงานอย่างไรและตอนนี้มันสมเหตุสมผลดีกว่ามาก
mikeserv

5

ปิโอเตอร์ให้คำอธิบายที่ดีมากเกี่ยวกับวิธีการsudoทำงาน อย่างไรก็ตามเขาไม่ได้กระตุ้นว่าทำไมมันถึงทำงานแบบนี้ดังนั้นฉันจะลองเพิ่มที่นี่

ก่อนที่sudoคำสั่งจะถูกสร้างขึ้นเรามีsuคำสั่ง คำสั่งนี้อนุญาตให้ผู้ใช้หนึ่งคนดำเนินการคำสั่งเป็นผู้ใช้อื่นโดยปกติroot(เช่นเดียวกับsudoนี่คือผู้ใช้เป้าหมายเริ่มต้น) มันเป็นการแยกแยะโดยสิ้นเชิงคุณสามารถดำเนินการคำสั่งใด ๆ เนื่องจากผู้ใช้สามารถใช้งานได้จึงเทียบเท่ากับการลงชื่อเข้าใช้ในฐานะผู้ใช้รายนั้นจึงต้องการให้คุณทราบรหัสผ่านของผู้ใช้เป้าหมาย

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

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

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

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


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

เพิ่งพบการเข้าสู่ระบบ sudo ใน /var/log/auth.log - รวมถึงสิ่งอื่น ๆ อีกมากมายรวมถึง IP บางส่วนจากประเทศจีนที่พยายามเข้าถึงรูท ssh ในระบบของฉัน - ดังนั้นถ้าคุณต้องการเห็น sudo คุณต้องกรอง ผ่าน grep หรือคล้ายกัน
โจ

แก้ไข. suยังล็อก แต่เนื่องจากเพิ่งเริ่มเชลล์ใหม่มันแค่บันทึกข้อเท็จจริงที่ว่ามีใครบางคนรัน
Barmar

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

1
@richard เนื่องจากsudoอนุญาตให้คุณ จำกัด คำสั่งที่ผู้ใช้สามารถดำเนินการได้คุณสามารถลองให้แน่ใจว่าคุณไม่ให้สิทธิ์การเข้าถึงคำสั่งที่เขียนทับบันทึกเหล่านั้น
Barmar

3

คำตอบสำหรับคำถามของคุณคือ:

เมื่อคุณเรียกใช้คำสั่งกับsudoคุณเรียกใช้คำสั่งที่มีpriviliges สูงที่เป็นpriviliges ราก คุณจะต้องพิมพ์รหัสผ่านของผู้ใช้ปกติของคุณเพราะคุณ (ผู้ใช้) ได้รับการเพิ่ม sudoers ไฟล์ที่ช่วยให้คุณpriviliges ราก


2
ยกเว้นว่า sudo ไม่ได้หมายถึงสิทธิ์ที่ยกระดับ แต่ต่างกับผู้ใช้ปัจจุบัน เช่นคุณสามารถเรียกใช้โปรแกรมในฐานะผู้ใช้ปกติที่ไม่มีเชลล์ นอกจากนี้การอยู่ในไฟล์ sudoers ไม่ได้ให้รูท
James Tocknell

1
@aragilar ใช่sudoไม่ได้ให้สิทธิ์ในการยกระดับ แต่จะทำงานด้วยสิทธิ์ยกระดับหลังจากทำสิ่งนี้ (การตรวจสอบการรับรองความถูกต้องอาจทำให้สิทธิ์ลดลง) มันต้องการสิทธิ์ที่ยกระดับเหล่านี้เพื่อให้สามารถเปลี่ยนผู้ใช้ได้
ctrl-alt-delor

1
แน่นอนว่าsudoใช้สิทธิ์ในการยกระดับสิทธิ์ (แต่นั่นไม่ใช่เอกลักษณ์ของ sudo เช่นการเมาท์ก็ทำได้เช่นกัน) แต่คำสั่งที่คุณโทรเช่นcommandในsudo commandอาจไม่ (ขึ้นอยู่กับสิ่งที่ตั้งไว้ /etc/sudoers)
James Tocknell

1

ขั้นแรกการปิดใช้งานบัญชีมักจะทำโดยการตั้งรหัสผ่านที่เข้ารหัสเป็น * ซึ่งไม่ใช่ค่าที่เข้ารหัสของสตริงใด ๆ ฉันไม่สามารถตรวจสอบได้ในตอนนี้ แต่ฉันเชื่อว่านั่นคือสิ่งที่ Ubuntu ทำเพื่อรูทเช่นกัน ดังนั้นในทางเทคนิคแล้วไม่มีรหัสผ่านรูทบน Ubuntu

แต่ sudo นำหน้า Ubuntu; มันถูกออกแบบมาสำหรับระบบที่มีรหัสผ่านรูทอย่างแน่นอน เหตุใดจึงไม่ต้องการรหัสผ่านรูท โดยทั่วไปแล้ว sudo ถูกออกแบบมาเพื่อให้สิทธิ์ในการเรียกใช้คำสั่งเฉพาะสำหรับผู้ใช้บางรายเช่นอนุญาตให้รูทของนักพัฒนาเข้าถึงแอปพลิเคชั่นเว็บใหม่ แต่ไม่เริ่มเซิร์ฟเวอร์ตามอำเภอใจ ในทางกลับกันการรู้รหัสผ่านรูทจะช่วยให้คุณเข้าถึงได้ไม่ จำกัด คุณสามารถใช้ล็อกอินหรือ su เพื่อเปิดรูทเชลล์และรันคำสั่งโดยพลการ เนื่องจาก sudo ต้องทำงานกับผู้ที่ไม่มีระดับการเข้าถึงดังกล่าวจึงไม่สามารถเรียกใช้รหัสผ่านรูทได้


นอกจากนี้ยังอนุญาตให้เพิกถอนสิทธิ์การใช้งานรูทของผู้ใช้โดยไม่ต้องเปลี่ยนรหัสผ่านรูท
Ian D. Scott
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.