เข้าสู่ระบบและภายใน internals


11

ฉันพยายามเข้าใจว่าการอนุญาตของผู้ใช้ทำงานใน Linux เคอร์เนลบูทและเริ่มต้นinitเป็น root ใช่ไหม Init จากนั้นเรียกใช้สคริปต์เริ่มต้นและเรียกใช้getty( agetty) อีกครั้งในฐานะรูท Agetty เพิ่งอ่านชื่อผู้ใช้และเรียกใช้loginยังคงเป็น root ฉันคิดว่า ยังไม่มีอะไรน่าสนใจ แต่เข้าสู่ระบบทำอะไร? ฉันไม่สามารถค้นหาอะไรที่ดีไปกว่า "พยายามลงชื่อเข้าใช้" สมมติว่าการเข้าสู่ระบบพบว่ารหัสผ่านตรงกัน (และเราพยายามเข้าสู่ระบบในฐานะผู้ใช้ปกติ) มันจะเปลี่ยนรหัสผู้ใช้อย่างไร ฉันคิดว่าควรจะมีการเรียกของระบบ แต่ฉันไม่สามารถหามันได้ (บางทีฉันอาจจะตาบอดก็ได้)


suนอกจากนี้เกี่ยวกับ suมีการตั้งค่าบิต 'setuid' ดังนั้นเมื่อเราเรียกใช้มันจะทำงานเหมือนรูทเสมอ แต่เมื่อเราบอกให้ล็อกอินเป็นผู้ใช้ปกติก็ต้องเปลี่ยนรหัสผู้ใช้อีกครั้ง ฉันเข้าใจอย่างถูกต้องหรือไม่ว่า "เวทมนต์" อันเดียวกันนั้นเกิดขึ้นในsuและloginเมื่อพวกเขาต้องเปลี่ยนผู้ใช้? ถ้าใช่ทำไมมีสองโปรแกรมที่แตกต่างกัน มีธุรกิจประเภทใดบ้างที่เกิดขึ้นอย่างจริงจังเมื่อลงชื่อเข้าใช้?

คำตอบ:


9

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

  • login: อ่านอินพุตบนเทอร์มินัลข้อความ
  • su: เรียกใช้โดยผู้ใช้ที่เข้าสู่ระบบอยู่แล้วรับข้อมูลส่วนใหญ่จากอาร์กิวเมนต์บรรทัดคำสั่งรวมถึงข้อมูลการตรวจสอบสิทธิ์ (รหัสผ่าน) จากเทอร์มินัล
  • gksu: คล้ายกับsuแต่อ่านข้อมูลการตรวจสอบสิทธิ์ใน X
  • rlogind: รับอินพุตผ่านการเชื่อมต่อ TCP ผ่านโปรโตคอลrlogin
  • sshd: รับอินพุตผ่านการเชื่อมต่อ TCP ผ่านโปรโตคอลSSH
  • ตัวจัดการการแสดงผล X (xdm, gdm, kdm, …): คล้ายกับloginแต่อ่านอินพุตบน X display

โปรแกรมเหล่านี้ทำงานในลักษณะเดียวกัน

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

  2. เมื่อได้รับการยืนยันแล้วว่าผู้ใช้มีอำนาจในการเข้าสู่ระบบและในบัญชีใดโปรแกรมเข้าสู่ระบบจะสร้างการอนุญาตของผู้ใช้ตัวอย่างเช่นกลุ่มที่ผู้ใช้จะเป็นของในเซสชั่นนี้

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

  4. ในที่สุดโปรแกรมการเข้าสู่ระบบจะตั้งค่าเซสชันของผู้ใช้ มีหลายขั้นตอนย่อย:

    1. ตั้งค่าสิทธิ์กระบวนการเป็นสิ่งที่ตัดสินใจในการให้สิทธิ์: ผู้ใช้กลุ่มข้อ จำกัด ... คุณสามารถดูตัวอย่างง่ายๆของขั้นตอนย่อยนี้ได้ที่นี่ (จัดการได้เฉพาะผู้ใช้และกลุ่ม) แนวคิดพื้นฐานคือโปรแกรมการเข้าสู่ระบบยังคงทำงานเป็นรูท ณ จุดนี้จึงมีสิทธิ์สูงสุด ก่อนอื่นจะลบสิทธิ์ทั้งหมดนอกเหนือจากการเป็นผู้ใช้รูทและในที่สุดก็มีการโทรsetuidเพื่อปล่อยสิทธินั้น แต่ไม่ได้รับสิทธิพิเศษอย่างน้อยที่สุด
    2. อาจติดไดเรกทอรีบ้านของผู้ใช้แสดงข้อความ“ คุณมีจดหมาย” เป็นต้น
    3. เรียกใช้บางโปรแกรมในฐานะผู้ใช้โดยทั่วไปคือเชลล์ของผู้ใช้ (สำหรับloginและsuหรือsshdหากไม่ได้ระบุคำสั่งตัวจัดการการแสดงผล X จะเรียกใช้ตัวจัดการเซสชัน X หรือตัวจัดการหน้าต่าง)

ทุกวันนี้ส่วนใหญ่ใช้PAM (โมดูลการพิสูจน์ตัวตนแบบเสียบได้)เพื่อให้วิธีการที่เหมือนกันในการจัดการบริการเข้าสู่ระบบ PAM แบ่งการทำงานออกเป็น4 ส่วน :“ auth” ครอบคลุมทั้งการรับรองความถูกต้อง (1 ด้านบน) และการอนุญาต (2 ด้านบน); “ บัญชี” และ“ เซสชัน” นั้นมีค่า 3 และ 4 ข้างต้น และยังมี“ รหัสผ่าน” ซึ่งไม่ได้ใช้สำหรับการเข้าสู่ระบบ แต่เพื่ออัปเดตโทเค็นการตรวจสอบสิทธิ์ (เช่นรหัสผ่าน)


4

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

นอกจากนี้ยังมีการเรียกแบบขนานเช่นsetgidการเปลี่ยนกลุ่มที่กระบวนการทำงานเป็น


4

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

ที่จริงแล้วการทิ้งสิทธิพิเศษของรูทค่อนข้างเล็กน้อย POSIX กำหนดsetuid()และsetgid()ฟังก์ชั่นซึ่งเปลี่ยน ID ผู้ใช้และกลุ่มของคุณตามลำดับ (จริงและมีประสิทธิภาพหากคุณเริ่มเป็นรูท) loginเรียกทั้งสองอย่างนี้รวมinitgroups()ถึงตั้งค่ากลุ่มเสริมที่คุณมี (เนื่องจากsetgidเป็นเพียงการตั้งค่า ID กลุ่มหลักของคุณ)

เป็นเคอร์เนลที่จัดการการเปลี่ยนแปลง 'UID / GID จริง ฉันจะค้นหาการนำไปใช้ของการเรียกระบบเคอร์เนล Linux ได้อย่างไร อธิบายอะไรมากมายเกี่ยวกับตึกระฟ้า ในแหล่งเคอร์เนลของฉันฉันมี:

#define __NR_setgid 144
__SYSCALL(__NR_setgid, sys_setgid)
#define __NR_setuid 146
__SYSCALL(__NR_setuid, sys_setuid)

ดังนั้น 144 และ 146 คือหมายเลขการโทรของระบบสำหรับฟังก์ชั่นเหล่านั้นในเครื่องของฉัน


ฉันไม่ได้ตรวจสอบsuแหล่งที่มาเพื่อดูว่ามันทำอะไร แต่ฉันสงสัยว่ามันจะลดระดับสิทธิ์การใช้งานรูทก่อนที่จะexec()ใช้เชลล์ด้วยวิธีเดียวกัน

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