File Permission


File Permission

File Permission

ความสัมพันธ์ของ UID กับ username และ GID กับ groupname

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

สมมติในระบบมีผู้ใช้คนหนึ่งชื่อ sample พิจารณาไฟล์ /etc/passwd ที่ระบุชื่อผู้ใช้ชื่อ sample

sample:x:100:200:Sample account:/home/sample:/bin/bash

อธิบายฟิลด์ต่างๆ ได้ดังนี้ (แต่ละฟิลด์คั่นด้วยเครื่องหมาย ':' )

Field Description
sample ชื่อ username คือ sample
x เป็นรหัสผ่านซี่งจะเก็บค่าไว้ในไฟล์ /etc/shadow
100 เป็น User ID หรือ UID ซึ่งลินุกซ์จะใช้ในการอ้างถึงเจ้าของไฟล์นั้นๆ
200 อ้างถึง GID ซึ่งลินุกซ์ใช้ในการบอกกรุ๊ปของผู้ใช้คนนี้
Sample account รายละเอียดอื่นๆ เพิ่มเติมของผู้ใช้ชื่อ sample
/home/sample เป็นโฮมไดเรกทอรีของผู้ใช้ sample
/bin/bash เชลล์หลักของผู้ใช้

ตาราง 1 รายละเอียดในไฟล์ /etc/passwd

และผู้ใช้ที่ชื่อ sample อยู่ในกรุ๊ป staff พิจารณาไฟล์ /etc/group

staff:x:200:

อธิบายถึงฟิลด์ต่างๆ ได้ดังนี้

Field Description
staff กรุ๊ปชื่อ staff
x ใช้ในการระบุรหัสผ่านให้กับกรุ๊ป
200 เป็น Group ID หรือ GID

ตาราง 2 ตารางแสดงรายละเอียดของไฟล์ /etc/groups

ผู้ใช้ชื่อ sample มี UID เป็น 100 และกรุ๊ปเป็น staff ซึ่งมี GID เป็น 200 ซึ่ง UID และ GID เป็นเลขจำนวนจริงขนาด 16 บิตมีค่าตั้งแต่ 0 จนถึง 65535 บางระบบอาจมี UID หรือ GID เป็นเลข 32 บิตได้ มนุษย์จะใช้ตัวอักษรในการอ้างถึง ส่วนลินุกซ์ จะอ้างถึงเป็นตัวเลขเสมอ เป็นแนวความคิดที่ไม่ซับซ้อนและใช้ได้มีประสิทธิภาพมาก โดย UID และ GID ของผู้ใช้จะกำหนดสิทธิ์ในการเข้าถึงไฟล์ในระบบ โดยจับคู่กันระหว่างชื่อผู้ใช้กับ UID และกรุ๊ป กับ GID

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

ผู้ใช้ในระบบที่ UID เป็น 0 คือ Superuser หรือผู้ดูแลระบบมีสิทธิ์ทุกอย่างในระบบ ซึ่งเป็นจุดประสงค์หลักของผู้บุกรุกในการพยายามที่จะทำให้ตัวเองมีสิทธิ์เทียบเท่าผู้ดูแลระบบไม่วิธีใดก็วิธีหนึ่ง ผู้ดูแลระบบควรจะป้องกันไว้ด้วยวิธีต่างๆ เช่น

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

ในการเปลี่ยนผู้ใช้ในระบบไปเป็นผู้ใช้คนอื่น ลินุกซ์มีคำสั่งที่เกี่ยวข้องสองคำสั่ง คำสั่งแรกคือ SU ซึ่งย่อมาจากคำว่า Substitute User ใช้ในการเปลี่ยน UID ตัวอย่างการใช้งานเช่น

$ whoami
sample
$ su - test
password: -------
$ whoami
test
$

การใช้คำสั่ง SU ต้องใช้ password ของผู้ที่ต้องการจะเปลี่ยนไป อีกคำสั่งหนึ่งที่ควรจะนำไปใช้งานมากกว่าคือ SUDO ซึ่งสามารถกำหนดได้ว่าจะให้เปลี่ยนไปเป็นใครได้บ้าง มีสิทธิ์และขอบเขตแค่ไหนในระบบ

ความแตกต่างระหว่าง File permission กับ Directory permission

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

คำสั่ง ls ใช้ในการแสดงไฟล์หรือไดเรกทอรีที่มีในระบบ สมมติตัวอย่างการใช้คำสั่ง ls -l เพื่อแสดงไฟล์ test ในระบบ

-rwxr-xr-- 1 sample staff 852 Jul 9 10:10 test

ไฟล์ชื่อ test มีเจ้าของเป็น sample และอยู่ในกรุ๊ปที่ชื่อ staffอธิบายถึงความหมายในฟิลด์ต่างๆ ได้ดังนี้

Field Description
-rwxr-xr-- file permission
1 จำนวน hard link ของไฟล์นี้
sample user ที่เป็นเจ้าของไฟล์
staff กรุ๊ป
852 ขนาดของไฟล์ หน่วยเป็นไบต์
Jul 9 วันที่มีการแก้ไขล่าสุด
10:10 เวลาที่มีการแก้ไขล่าสุด
test ชื่อไฟล์

ตารางที่ 3 ความหมายของฟิลด์เมื่อใช้คำสั่ง ls

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

รูปแบบ ชื่อย่อ การใช้คำสั่ง ls คำอธิบาย
modify time mtime ls -l วันเวลาที่มีการแก้ไขครั้งล่าสุด
access time atime ls -lu วันเวลาที่มีการแก้ไขวันและเวลาโดยใช้ system call ของระบบเช่น utime() เป็นต้น (โดยมากมักไม่ได้ใช้ แต่มักจะใช้ในการวิเคราะห์ไฟล์ในระดับลึกลงไป)
change time ctime ls -lc วันเวลาที่แก้ไขโดยระบบปฏิบัติการเมื่อมีการเปลี่บนแปลงโครงสร้างของไฟล์ ซึ่งโดยปกติ ค่าจะไม่มีการเปลี่ยนแปลง

ตารางที่ 4 เวลาที่มีการบันทึกในระบบ

พิจารณา File permission -rwxr-xr-- ได้ว่า

- r w x r - x r - -
type owner (user) group others

ตารางที่ 5 กลุ่มของ permission

ในแต่ละส่วนอธิบายเพิ่มเติม

Description คำอธิบาย
type บอกถึงชนิดของไฟล์
owner (user) สิทธิ์ในการเข้าถึงไฟล์ของเจ้าของไฟล์
group สิทธิ์ในการเข้าถึงไฟล์ของผู้ใช้ในระบบที่อยู่ในกรุ๊ปที่ระบุไว้
others สิทธื์ในการเข้าถึงไฟล์ของทุกคนในระบบที่ไม่ใช่เจ้าของไฟล์และไม่ได้อยู่ในกรุ๊ป เดียวกันกับ group ที่ระบุไว้

ตารางที่ 6 คำอธิบายเพิ่มเติม permission ในกลุ่มต่างๆ

โดยที่ types จะอธิบายถึงชนิดของไฟล์

types ความหมาย
- ไฟล์ปกติ
d ไดเรกทอรี
c ดีไวซ์แบบ character
b ดีไวซ์แบบ block
l symbolic link
s socket
p FIFO

ตารางที่ 7 แสดงชนิดของไฟล์

ความหมายของ permission หรือสิทธิ์ในการเข้าถึงไฟล์ปกติที่ไม่ใช่ไดเรกทอรี คือ

File
Character Permission ความหมาย
r READ สามารถเปิดไฟล์และอ่านเนื้อความในไฟล์ได้
w WRITE สามารถเพิ่มข้อความ ลบข้อความ หรือเปลี่ยนแปลงเนื้อความในไฟล์ได้
x EXECUTE จะใช้ในกรณีที่ไฟล์นี้สามารถทำงานได้หรือสั่งให้ทำงานได้ ซึ่งจะมีสิทธื์ในการทำงานนี้ปรากฏอยู่

ตารางที่ 8 ตารางแสดง File permission

แต่เมื่อนำมาใช้กับไดเรกทอรีจะมีสิทธิ์ในอีกความหมายหนึ่งดังนี้

Directory
Character Permission ความหมาย
r READ สามารถใช้คำสั่ง ls ในการดูไฟล์ภายในไดเรกทอรีได้
w WRITE สามารถเพิ่มไฟล์ ลบไฟล์ เปลี่ยนชื่อไฟล์ที่อยู่ในไดเรกทอรีได้
x EXECUTE สามารถใช้คำสั่ง cd ทำการเปลี่ยนไดเรกทอรีปัจจุบันเข้าไปได้ หรือใช้ในการเปิดไฟล์ภายในไดเรกทอรีรวมไปถึงไดเรกทอรีย่อยภายใน

ตาราง 9 ตารางแสดง Directory permission

การทำความเข้าใจเรื่อง permission หรือสิทธิ์ในการเข้าถึงทั้งไฟล์หรือไดเรกทอรี เป็นสิ่งจำเป็น เพราะจะช่วยแก้ปัญหาที่เกิดขึ้นได้อย่างรวดเร็ว มีประเด็นสำคัญที่ควรให้ความสนใจบางประเด็นเช่น

  • จำเป็นต้องมีสิทธิ์ EXECUTE สำหรับไดเรกทอรีในการเปลี่ยนเป็นไดเรกทอรีปัจจุบันโดยการใช้คำสั่ง cd หรือ chdir รวมไปถึงการเปลี่ยนไดเรกทอรีที่เป็นไดเรกทอรีภายใต้ไดเรกทอรีที่มีสิทธิ์ดังกล่าวอยู่นี้
  • ถ้าไม่มีสิทธิ์ EXECUTE ของไดเรกทอรีใด จะไม่สามารถเข้าถึงไฟล์ใดๆ ภายใต้ไดเรกทอรีนั้นได้เลยไม่มีข้อยกเว้น รวมไปถึงเจ้าของไดเรกทอรีด้วย ก็ไม่สามารถทำได้
  • ถ้ามีสิทธิ์เฉพาะ EXECUTE แต่ไม่มีสิทธิ์ READ จะสามารถเข้าไปในไดเรกทอรีนั้นได้ แต่จะไม่สามารถใช้คำสั่ง ls ในการดูไฟล์ภายในไดเรกทอรีนั้นได้ (คือไม่มีสิทธิ์ในการอ่านเนื้อความภายในไดเรกทอรี) แต่ถ้าทราบชื่อไฟล์และได้รับสิทธิ์เพียงพอในการเข้าใช้งานไฟล์เหล่านั้น ซึ่งจะเป็นประโยชน์ต่อเจ้าของไฟล์ในการซ่อนเนื้อความในไดเรกทอรีนั้น ซึ่งจะพบเห็นได้บ่อยครั้ง
  • ถ้าจะสร้างลิงค์ไปยังไฟล์ใดในไดเรกทอรีจำเป็นต้องมีสิทธิ์ WRITE และ EXECUTE ในไดเรกทอรีจึงจะสร้างได้ หรือกรณีลบก็เช่นเดียวกัน

ความหมายของ Sticky bit

มีบิตพิเศษอีกหนึ่งบิตเรียกว่า Sticky ซึ่งในปัจจุบันจะใช้กับไดเรกทอรีเท่านั้นมีความหมายคือ ไดเรกทอรีใดก็ตามที่มีบิตที่เรียกว่า Sticky bit อยู่ หมายถึงไฟล์ในไดเรกทอรีจะมีการเปลี่ยนแปลง ลบ เปลี่ยนชื่อ เพิ่มเนื้อหาได้เฉพาะบุคคลสามคนนี้เท่านั้นคือ

  • เจ้าของไฟล์ (ไฟล์ภายใต้ไดเรกทอรีที่มี Sticky bit)
  • เจ้าของไดเรกทอรีที่มี Sticky bit
  • ผู้ดูแลระบบหรือ root

มักใช้ในไดเรกทอรี /tmp ของลินุกซ์

การคำนวณเลขฐานแปดของ File permission

ในการใช้งาน ไม่ว่าจะเป็นการอ่าน การเปลี่ยนแปลง permission ของไฟล์ใดๆ ในระบบนั้น มักจะระบุ permission ของไฟล์ในรูปเลขฐานแปดแทนการเขียนว่า -rwxr-xr-- เพราะสะดวกกว่า สรุปเป็นตารางในรูปแบบเพื่อช่วยจำได้ว่า

special   owner group others
SUID S 4
SGID S 2 r w x r w x r w x
Sticky T 1 4 2 1 4 2 1 4 2 1
       

วิธีการดูตาราง คือในฟิลด์ special จะรวมเลขเป็นแนวตั้งลงมา ส่วนฟืลด์ owner, group และ others จะรวมเลขเป็นแนวนอน ตัวอย่างเช่น จาก permission เป็น -rwxr-xr-- เมื่อนำมาจับใส่ในตารางจะได้เป็น

special   owner group others
SUID - 4
SGID - 2 r w x r - x r - -
Sticky - 1 4 2 1 4 2 1 4 2 1
0 7 5 4

ซึ่งไม่มีบิตพิเศษไม่ว่าจะเป็น SUID, SGID และ sticky-bit ใดๆ ดังนั้นอ่านเฉพาะตัวอักษรที่มี แล้วนำมารวมกัน ดังนั้นเริ่มบิตแรกไม่มีบิตพิเศษใด ดังนั้นเป็น 0 จากนั้นช่อง owner รวมได้ 7 ของ group ได้ 5 และถัดมาเป็น others ได้ 4 นำมาเขียนเรียงกันได้ดังนั้น -rwxr-xr-- มีคำตอบเป็น 0754

หรืออีกตัวอย่างหนึ่ง เช่น -r-sr-xr-x จับใส่ในตารางได้เป็น

special   owner group others
SUID S 4
SGID - 2 r - x r - x r - x
Sticky - 1 4 2 1 4 2 1 4 2 1
4 5 5 5

ในกรณีที่มีบิตพิเศษ ให้แทนที่บิตพิเศษด้วย EXECUTE หรือ x จากนั้นคำนวณด้วยวิธีการเดิม เห็นว่ามีบิตพิเศษเป็น SUID ดังนั้นได้เป็น 4 ถัดมาเป็น owner รวมกันได้ 5 ส่วน group รวมกันได้ 5 และ others ก็ 5 เช่นเดียวกัน ดังนั้น -r-sr-xr-x มีคำตอบเป็น 4555

สิทธิ์ที่ได้ของ Effective UID ของโพรเซสในการเข้าถึงไฟล์ในระบบ

โพรเซสบนยูนิกซ์ในเวลาใดๆ จะมีหมายเลขประจำที่บอกให้ทราบถึงสิทธิ์ในการเข้าถึงไฟล์ และ/หรือ ไดเรกทอรีใดๆ ในระบบของโพรเซส เรียกว่า Effective UID หรือ EUID โดยปกติจะมีค่าเท่ากัน UID ของผู้ที่สั่งให้โพรเซสในระบบยูนิกซ์ทำงาน ตัวอย่างเช่นสั่งให้โปรแกรม passwd ทำงาน โดยปกติเมื่อผู้ใช้สั่งให้โปรแกรม passwd ทำงาน โพรเซสจะมี EUID เท่ากับ UID ของคนที่สั่งให้โปรแกรมนี้ทำงานขึ้นมา และ EUID นี้เองจะเป็นตัวกำหนดและบอกว่าโพรเซสใดจะมีสิทธิ์ในระบบมากน้อยแค่ไหน ดังรูป


รูปที่ 1 แสดง EUID เมื่อสั่งให้โปรแกรมทำงาน

แต่บางครั้งจำเป็นต้องใช้สิทธิ์มากกว่าที่มีอยู่ ในการเข้าถึงไฟล์สำคัญ ไม่ว่าจะเป็นการอ่านการเขียนไฟล์สำคัญของระบบ ซึ่งโดยทั่วไปผู้ใช้ทั่วไปไม่มี ยกตัวอย่างเช่นโปรแกรม passwd ซึ่งเป็นโปรแกรมทีใช้ในการเปลี่ยนรหัสผ่านของผู้ใช้ในระบบ ซึ่งทราบกันดีว่าข้อมูลของผู้ใช้ในระบบทุกคนจะเก็บไว้ในไฟล์ /etc/passwd และรหัสผ่านเก็บในไฟล์ /etc/shadow ซึ่งอนุญาตให้เฉพาะผู้ดูแลระบบหรือ root มีสิทธิ์ในการเขียนไฟล์สองไฟล์นี้ ดังนั้นตามกฎเกณฑ์ของระบบเมื่อจะทำการเปลี่ยนรหัสผ่านของตนเอง เมื่อสั่งให้โปรแกรม passwd ทำงาน จะได้โพรเซสของ passwd ขึ้นมาซึ่งจะมี EUID เท่ากับ UID ของผู้ใช้ในระบบไม่ใช่ผู้ดูแลระบบที่มีสิทธิ์อ่านเขียนไฟล์ ดังนั้นจะไม่สามารถเปลี่ยนรหัสผ่านได้

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

โปรแกรมที่มีการเปลี่ยน UID ขณะที่มีการทำงานหรือเมื่อเป็นโพรเซสเรียกว่าโปรแกรม SUID โดยจะใช้วิธีการเปลี่ยน UID ให้ตรงกับเจ้าของโปรแกรมนั้นๆ โดยอย่างในตัวอย่างนี้คือ passwd ซึ่งเจ้าของไฟล์นี้คือ root ดังนั้นเมื่อโปรแกรมทำงานจะได้โพรเซสที่มี EUID เป็น root หรือเจ้าของโปรแกรม passwd ซึ่งจะไม่ใช่ผู้ใช้ที่สั่งให้โปรแกรม passwd ทำงานอย่างในกรณีทั่วไป ดังรูป


รูปที่ 2 การทำงานของโปรแกรม SUID

สำหรับ SGID ใช้แนวความคิดเดียวกันแต่เปลี่ยนจากเจ้าของไฟล์เป็น group เดียวกับไฟล์นั้นๆ

สำหรับการระบุ SUID และ SGID จะระบุในตำแหน่งเดียวกับ EXECUTE ใน permission ของไฟล์หรือโปรแกรมในระบบตัวอย่างเช่นโปรแกรม passwd

-r-sr-xr-x 1 root root 13476 Aug 7 2001 /usr/bin/passwd

จะเห็นว่ามีเครื่องหมายว่า 's' ใช้ในการระบุ SUID ของโปรแกรม passwd และตัวอย่างโปรแกรมที่มี SGID เช่น

-r-xr-sr-x 1 root root 4562 Aug 8 2001 /tmp/samples

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

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

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

ปัญหาของความผิดพลาดที่เกิดขึ้นบ่อยครั้งสำหรับ SUID ยกตัวอย่างการใช้คำสั่งดังต่อไปนี้

$ cp /bin/sh /tmp/test
$ chmod 4755 /tmp/test
$ /tmp/test
$ whoami
root
$

โดยปกติโปรแกรม /bin/sh จะมีเจ้าของเป็น root เมื่อทำการสำเนาโดยใช้คำสั่ง cp แล้วจากนั้นทำการเปลี่ยนสิทธิ์ให้กับไฟล์ที่ได้ทำการสำเนา โดยให้มี SUID ดังนั้นเมื่อสั่งให้โปรแกรมทำงานจะได้ EUID เป็นเจ้าของไฟล์นั้นหรือ root และเนื่องจากว่าโปรแกรมนี้คือ /bin/sh ซึ่งเป็นเชลล์ของระบบดังนั้นจึงสามารถทำอะไรกับระบบได้ทุกอย่างเทียบเท่ากับสิทธิ์ของผู้ดูแลระบบ อย่างไรก็ดี ใน ลินุกซ์ไม่อนุญาตให้เกิดการทำงานตามที่แสดงในตัวอย่างได้แล้ว แต่ตัวอย่างดังกล่าวก็แสดงให้เห็นได้เป็นอย่างดีว่า SUID มีประโยชน์ถ้านำไปใช้งานได้อย่างถูกต้อง แต่จะเป็นภัยต่อระบบถ้าผู้ดูแลระบบไม่รอบคอบเพียงพอ

วิธีการหลีกเลี่ยงและป้องกันปัญหาที่เกิดจาก SUID และ SGID ตัวอย่างเข่น

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

    # find / \( -perm -4000 -o -perm -2000 \) -print

  • ถ้าสามารถหลีกเลี่ยงได้ สมควรทำเช่นการ mount สามารถเลือกให้ mount แบบไม่ให้คำสั่งหรือโปรแกรมที่มี SUID หรือ SGID ทำงานได้เช่น

    # mount /dev/hda3 /share -o nosuid

umask ในลินุกซ์
umask ย่อมาจากคำว่า user file-creation mode mask เป็นเลขฐานแปดจำนวนสี่บิตใช้สำหรับตัดสินใจสำหรับ permission ของไฟล์ที่สร้างใหม่ในระบบ ในลินุกซ์ได้กำหนดค่า umask ไว้ในไฟล์ /etc/bashrc โดยใช้คำสั่ง

umask 0022

การใช้งาน umask อธิบายได้ว่าค่าเลขฐานแปดที่ตามหลังคำสั่ง umask เป็นค่าที่ใช้ในการนำไปทำการ XOR กับค่าดีฟอลต์ในการสร้างไฟล์ในระบบซึ่งจะเป็นค่าที่กำหนดภายในเคอร์เนล ซึ่งมีค่าดังตาราง

ลักษณะของไฟล์ ค่าดีฟอลต์ของ permission ของระบบ
ไฟล์ปกติที่ไม่ใช่โปรแกรม 0666
โปรแกรมใช้งานในระบบ 0777

ค่า umask ที่กำหนดโดยผู้ใช้ระบบจะนำไป XOR กับค่าดีฟอลต์ในการสร้างไฟล์ของระบบ ตัวอย่างเช่นถ้าใช้ค่า umask เป็น 0022 ดังนั้นไฟล์ที่ไม่ใช่โปรแกรมที่สร้างใหม่จะมี permission เป็น 0644 หรือ -rw-r--r--

default file-creation 0666 XOR
umask 0022
result 0644  

หรือตัวอย่างในการสร้างโปรแกรมใหม่จะมี permission เป็น 0755 หรือ -rwxr-xr-x ดังตาราง

default file-creation 0777 XOR
umask 0022
result 0755  

ปกติมักนิยมใช้ค่าที่มากับระบบ แต่ถ้าผู้ดูแลระบบต้องการความยืดหยุ่นก็อาจจะปรับค่าที่มากับระบบได้

ขอบคุณข้อมูลจากคุณ เลอศักดิ์ ลิ้มวิวัฒน์กุล  thaicert

คำสำคัญ (Tags): #file permission
หมายเลขบันทึก: 107654เขียนเมื่อ 30 มิถุนายน 2007 18:19 น. ()แก้ไขเมื่อ 6 พฤษภาคม 2012 17:02 น. ()สัญญาอนุญาต: จำนวนที่อ่านจำนวนที่อ่าน:


ความเห็น (0)

ไม่มีความเห็น

พบปัญหาการใช้งานกรุณาแจ้ง LINE ID @gotoknow
ClassStart
ระบบจัดการการเรียนการสอนผ่านอินเทอร์เน็ต
ทั้งเว็บทั้งแอปใช้งานฟรี
ClassStart Books
โครงการหนังสือจากคลาสสตาร์ท