กลับไปหน้าบทความ

อ่าน 4 นาที

ตัวระบุผู้ใช้

ในระบบปฏิบัติการ ที่คล้าย Unix ตัวระบุผู้ใช้ (มักย่อเป็น User ID หรือ UID ) คือค่าที่ใช้ระบุตัวผู้ใช้ UID ร่วมกับ ตัวระบุกลุ่ม (GID) และเกณฑ์การควบคุมการเข้าถึงอื่นๆ...

ตัวระบุผู้ใช้

ในระบบปฏิบัติการที่คล้าย Unix ตัวระบุผู้ใช้ (มักย่อเป็นUser IDหรือUID ) คือค่าที่ใช้ระบุตัวผู้ใช้ UID ร่วมกับตัวระบุกลุ่ม (GID) และเกณฑ์การควบคุมการเข้าถึงอื่นๆ ใช้เพื่อกำหนดว่าผู้ใช้สามารถเข้าถึงทรัพยากรระบบใดได้บ้างไฟล์รหัสผ่านจะแปลงชื่อผู้ใช้ที่เป็นข้อความไปเป็น UID UID จะถูกจัดเก็บไว้ในinodeของระบบไฟล์Unix กระบวนการที่กำลังทำงาน ไฟล์เก็บถาวร tarและNetwork Information Service (NIS ) ซึ่งปัจจุบันล้าสมัยแล้ว ในสภาพแวดล้อมที่สอดคล้องกับPOSIXคำสั่งshellจะแสดง UID ของผู้ใช้ปัจจุบัน รวมถึงข้อมูลเพิ่มเติม เช่น ชื่อผู้ใช้ และตัวระบุกลุ่ม หลักและเสริม (GID) และชื่อกลุ่ม id

คุณลักษณะของกระบวนการ

มาตรฐาน POSIX ได้เพิ่มฟิลด์ UID ที่แตกต่างกันสามฟิลด์ลงในตารางคำอธิบายกระบวนการ เพื่อให้กระบวนการที่มีสิทธิ์พิเศษสามารถรับบทบาทที่แตกต่างกันได้แบบไดนามิก:

รหัสผู้ใช้ที่มีผลบังคับใช้

UID ที่มีผลบังคับใช้ ( euid) ของกระบวนการจะถูกใช้สำหรับการตรวจสอบการเข้าถึงส่วนใหญ่ นอกจากนี้ยังใช้เป็นเจ้าของไฟล์ที่สร้างโดยกระบวนการนั้นด้วย

รหัสผู้ใช้ระบบไฟล์

นอกจากนี้ Linux ยังมีรหัสผู้ใช้ระบบไฟล์ (User ID fsuid) ซึ่งใช้สำหรับการควบคุมการเข้าถึงระบบไฟล์โดยเฉพาะ โดยจะตรงกับ User ID ของระบบไฟล์euidเว้นแต่จะมีการตั้งค่าไว้เป็นอย่างอื่นอย่างชัดเจน อาจเป็น รหัสผู้ใช้ของ root ได้ก็ต่อ เมื่อ User ID ของระบบ ไฟล์ หรือ User ID ของระบบไฟล์ เป็น root เท่านั้น เมื่อใดก็ตามที่ User ID ruidของระบบไฟล์มีการเปลี่ยนแปลง การเปลี่ยนแปลงนั้นจะถูกส่งต่อไปยัง User ID ของระบบ ไฟล์ด้วย suideuideuidfsuid

จุดประสงค์คือfsuidการอนุญาตให้โปรแกรม (เช่น เซิร์ฟเวอร์ NFS ) จำกัดสิทธิ์การเข้าถึงระบบไฟล์ตามที่กำหนดโดยuidไม่ต้องให้uidสิทธิ์ในการส่งสัญญาณ เนื่องจากเคอร์เนลเวอร์ชัน 2.0 การมีอยู่ของfsuidจึงไม่จำเป็นอีกต่อไป เพราะ Linux ปฏิบัติตาม กฎ SUSv3สำหรับการส่งสัญญาณ แต่fsuidยังคงอยู่เพื่อความเข้ากันได้[ 1 ]

รหัสผู้ใช้จริง

UID จริง ( ruid) และ GID จริง ( rgid) ระบุเจ้าของที่แท้จริงของกระบวนการและมีผลต่อสิทธิ์ในการส่งสัญญาณ กระบวนการที่ไม่มีสิทธิ์ผู้ใช้ระดับสูงสุดอาจส่งสัญญาณไปยังกระบวนการอื่นได้ก็ต่อเมื่อruidUID ของผู้ส่งตรงกับ GID euidของผู้รับ เท่านั้น เนื่องจากกระบวนการลูกจะได้รับข้อมูลประจำตัวจากกระบวนการแม่ ดังนั้นกระบวนการลูกและกระบวนการแม่จึงสามารถส่งสัญญาณถึงกันได้ ruidsuid

รหัสผู้ใช้ที่บันทึกไว้

รหัสผู้ใช้ที่บันทึกไว้จะถูกใช้เมื่อโปรแกรมที่ทำงานด้วยสิทธิ์ระดับสูงจำเป็นต้องทำงานที่ไม่มีสิทธิ์ระดับสูงเป็นการชั่วคราว การเปลี่ยนeuidจากค่าที่มีสิทธิ์ (โดยปกติคือ0) ไปเป็นค่าที่ไม่มีสิทธิ์ (ค่าใดๆ ก็ตามที่ไม่ใช่ค่าที่มีสิทธิ์) จะทำให้ค่าที่มีสิทธิ์ถูกบันทึกไว้ใน ต่อมา สามารถตั้งค่า รหัส suidผู้ใช้ของโปรแกรม กลับไปเป็นค่าที่บันทึกไว้ใน เพื่อให้สามารถกู้คืนสิทธิ์ระดับสูงได้ กระบวนการที่ไม่มีสิทธิ์อาจตั้งค่ารหัสผู้ใช้เป็นหนึ่งในสามค่าเท่านั้น ได้แก่ ค่าของ, ค่าของหรือค่าของ euidsuideuidruidsuideuid

อนุสัญญา

พิมพ์

มาตรฐาน POSIX กำหนดให้ UID ต้องเป็น ชนิด ข้อมูลจำนวนเต็มระบบปฏิบัติการที่คล้าย Unix ส่วนใหญ่จะแสดง UID เป็นจำนวนเต็มที่ไม่ติดลบ ขนาดของค่า UID แตกต่างกันไปในแต่ละระบบ ระบบปฏิบัติการ UNIX บางระบบใช้ค่า 15 บิต ทำให้มีค่าได้ถึง 32767 ในขณะที่ระบบอื่นๆ เช่น Linux (ก่อนเวอร์ชัน 2.4) รองรับ UID 16 บิตทำให้มี ID ที่ไม่ซ้ำกันได้ถึง 65536 รายการ ระบบปฏิบัติการที่คล้าย Unix ในปัจจุบันส่วนใหญ่ (เช่น Solaris 2.0 ในปี 1990, Linux 2.4 ในปี 2001) ได้เปลี่ยนไปใช้ UID 32 บิตทำให้มีID ที่ไม่ซ้ำกันได้ ถึง 4,294,967,296 ( 2³² ) รายการ

สนามที่สงวนไว้

ข้อกำหนด มาตรฐานLinux Standard Base Core Specification ระบุว่าค่า UID ในช่วง 0 ถึง 99 ควรได้รับการจัดสรรแบบคงที่โดยระบบ และไม่ควรสร้างโดยแอปพลิเคชัน ในขณะที่ UID ตั้งแต่ 100 ถึง 499 ควรสงวนไว้สำหรับการจัดสรรแบบไดนามิกโดยผู้ดูแลระบบและสคริปต์หลังการติดตั้ง[ 2 ]

Debian Linuxไม่เพียงแต่สงวนช่วง 100–999 สำหรับผู้ใช้และกลุ่มระบบที่จัดสรรแบบไดนามิกเท่านั้น แต่ยังจัดสรรผู้ใช้และกลุ่มแบบรวมศูนย์และคงที่ในช่วง 60000-64999 และสงวนช่วง 65000–65533 เพิ่มเติมอีกด้วย[ 3 ]

Systemdกำหนดช่วง UID พิเศษจำนวนหนึ่ง รวมถึง[ 4 ]

  • 60001-60513: UID สำหรับไดเร็กทอรีโฮมที่จัดการโดย systemd-homed
  • 61184-65519 (0xef00-0xffef): UID สำหรับผู้ใช้แบบไดนามิก

บนFreeBSDผู้ดูแลแพ็กเกจที่ต้องการ UID สำหรับแพ็กเกจของตนสามารถเลือก UID ที่ว่างอยู่ในช่วง 50 ถึง 999 จากนั้นจึงลงทะเบียนการจัดสรรแบบคงที่[ 5 ] [ 6 ]

ระบบ POSIX บางระบบจัดสรร UID สำหรับผู้ใช้ใหม่โดยเริ่มจาก 500 ( macOS , Red Hat Enterprise Linuxจนถึงเวอร์ชัน 6) ในขณะที่ระบบอื่นๆ เริ่มต้นที่ 1000 (Red Hat Enterprise Linux ตั้งแต่เวอร์ชัน 7, [ 7 ] openSUSE , Debian [ 3 ] ) ในระบบ Linux หลายระบบ ช่วงเหล่านี้จะถูกระบุไว้ใน/etc/login.defsสำหรับuseraddและเครื่องมือที่คล้ายกัน

การจัดสรร UID ส่วนกลางในเครือข่ายองค์กร (เช่น ผ่าน เซิร์ฟเวอร์ LDAPและNFS ) อาจจำกัดการใช้เฉพาะหมายเลข UID ที่สูงกว่า 1000 และอยู่นอกช่วง 60000–65535 เพื่อหลีกเลี่ยงความขัดแย้งที่อาจเกิดขึ้นกับ UID ที่จัดสรรไว้ในเครื่องคอมพิวเตอร์ไคลเอ็นต์ เมื่อมีการสร้างผู้ใช้ใหม่ในเครื่อง ระบบในเครื่องควรตรวจสอบและหลีกเลี่ยงความขัดแย้งกับ UID ที่มีอยู่แล้วใน NSS [หมายเหตุ 1 ]

การจำลองเสมือนระดับระบบปฏิบัติการสามารถแมปตัวระบุผู้ใช้ใหม่ได้ เช่น การใช้เนมสเปซของ Linuxและด้วยเหตุนี้จึงจำเป็นต้องจัดสรรช่วงที่จะใช้แมป UID และ GID ที่แมปใหม่เหล่านั้น:

  • snapdแมป UID และ GID ให้อยู่ในช่วง524288-589823 (0x80000-0x8ffff)
  • systemd-nspawnจะจัดสรรช่วง UID ต่อคอนเทนเนอร์โดยอัตโนมัติโดยใช้ช่วง 524288-1879048191 (0x80000-0x6fffffff) [ 4 ]

ผู้เขียน systemd แนะนำว่าระบบเวอร์ชวลไลเซชันระดับระบบปฏิบัติการ ควรจัดสรร UID จำนวน 65536 (2 16 ) ตัวต่อคอนเทนเนอร์ และแมปโดยการเพิ่มจำนวนเต็มที่เป็นผลคูณของ2 16 [ 4 ]

คุณค่าพิเศษ

  • 0: ผู้ใช้ระดับสูงสุดโดยปกติจะมี UID เป็นศูนย์ (0) [ 8 ]
  • −1: ค่านี้(uid_t) -1สงวนไว้โดย POSIX เพื่อระบุอาร์กิวเมนต์ที่ถูกละเว้น[ 9 ]
  • 65535: ค่านี้ยังคงถูกหลีกเลี่ยง เนื่องจากเป็นค่าส่งคืนข้อผิดพลาดของ API เมื่อ uid_t มีขนาด 16 บิต
  • ไม่มีใคร: ในอดีต ผู้ใช้ " nobody " ได้รับการกำหนด UID -2โดยระบบปฏิบัติการหลายระบบ แม้ว่าจะมีการใช้ ค่าอื่นๆ เช่น 2 15 −1 = 32,767 เช่นโดย OpenBSD [ 10 ]เพื่อความเข้ากันได้ระหว่าง UID 16 บิตและ 32 บิต ปัจจุบันระบบปฏิบัติการ Linux หลายระบบตั้งค่าเป็น 2 16 −2 = 65,534 โดยค่าเริ่มต้นเคอร์เนล Linux จะส่งคืนค่านี้เมื่อ UID 32 บิตไม่พอดีกับค่าส่งคืนของการเรียกใช้ระบบ 16 บิต[ 11 ] Fedora Linuxกำหนด UID สุดท้ายของช่วงที่จัดสรรแบบคงที่สำหรับการใช้งานระบบ (0–99) ให้กับ nobody: 99 และเรียกใช้ 65534 nfsnobodyแทน

ทางเลือกอื่นๆ

NFSv4มีจุดประสงค์เพื่อช่วยหลีกเลี่ยงการชนกันของตัวระบุตัวเลข โดยการระบุผู้ใช้ (และกลุ่ม) ในแพ็กเก็ตโปรโตคอลโดยใช้ชื่อข้อความ “user@domain” แทนที่จะใช้ตัวเลขจำนวนเต็ม อย่างไรก็ตาม ตราบใดที่เคอร์เนลของระบบปฏิบัติการและระบบไฟล์ในเครื่องยังคงใช้ตัวระบุผู้ใช้ที่เป็นตัวเลขจำนวนเต็มอยู่ การทำเช่นนี้จะส่งผลให้ต้องมีขั้นตอนการแปลงเพิ่มเติม (โดยใช้กระบวนการ daemon idmap) ซึ่งอาจทำให้เกิดจุดล้มเหลวเพิ่มเติมหากกลไกการแมป UID หรือฐานข้อมูลในเครื่องได้รับการกำหนดค่าไม่ถูกต้อง สูญหาย หรือไม่ตรงกัน ส่วน “@domain” ของชื่อผู้ใช้สามารถใช้เพื่อระบุว่าหน่วยงานใดเป็นผู้จัดสรรชื่อนั้น ตัวอย่างเช่น ในรูปแบบของ

  • ชื่อโดเมน Kerberos
  • ชื่อโดเมนActive Directory
  • ชื่อผู้จำหน่ายระบบปฏิบัติการ (สำหรับการจัดสรรเฉพาะรุ่น)
  • ชื่อของคอมพิวเตอร์ (สำหรับการจัดสรรเฉพาะอุปกรณ์)

แต่ในทางปฏิบัติ การใช้งานที่มีอยู่จำนวนมากอนุญาตให้ตั้งค่าโดเมน NFSv4 ได้เพียงค่าคงที่เท่านั้น ทำให้ไม่สามารถใช้งานได้จริง

ดูเพิ่มเติม

หมายเหตุ

  1. ^สำหรับช่วงการจัดสรรทั้งสอง: เมื่อมีการจัดสรร UID เกิดขึ้น NSS จะถูกตรวจสอบหาการชนกันก่อน และจะเลือก UID อื่นหากพบรายการ[1]
ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=User_identifier&oldid=1353008556 "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ ตัวระบุผู้ใช้

ในระบบปฏิบัติการ ที่คล้าย Unix ตัวระบุผู้ใช้ (มักย่อเป็น User ID หรือ UID ) คือค่าที่ใช้ระบุตัวผู้ใช้ UID ร่วมกับ ตัวระบุกลุ่ม (GID) และเกณฑ์การควบคุมการเข้าถึงอื่นๆ...

คุณลักษณะของกระบวนการ

มาตรฐาน POSIX ได้เพิ่มฟิลด์ UID ที่แตกต่างกันสามฟิลด์ลงในตารางคำอธิบายกระบวนการ เพื่อให้กระบวนการที่มีสิทธิ์พิเศษสามารถรับบทบาทที่แตกต่างกันได้แบบไดนามิก:

รหัสผู้ใช้ที่มีผลบังคับใช้

UID ที่มีผลบังคับใช้ ( euid ) ของกระบวนการจะถูกใช้สำหรับการตรวจสอบการเข้าถึงส่วนใหญ่ นอกจากนี้ยังใช้เป็นเจ้าของไฟล์ที่สร้างโดยกระบวนการนั้นด้วย

รหัสผู้ใช้จริง

UID จริง ( ruid ) และ GID จริง ( rgid ) ระบุเจ้าของที่แท้จริงของกระบวนการและมีผลต่อสิทธิ์ในการส่งสัญญาณ กระบวนการที่ไม่มีสิทธิ์ผู้ใช้ระดับสูงสุดอาจส่งสัญญาณไปยังกระบวนการอื่นได้ก็ต่อเมื่อ ruid UID ของผู้ส่งตรงกับ GID euid ของผู้รับ เท่านั้น เนื่องจาก...