File Permissions in Linux

Datafarm
5 min readDec 21, 2022

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

โดยทุก ๆ ไฟล์ในระบบ Linux นั้นจะมีสิทธิ์ หรือ Permission ของแต่ละไฟล์ ซึ่งในการดูสิทธิ์ของไฟล์เราจะใช้คำสั่ง

ls -l
รูปแสดงสิทธิ์ของไฟล์

สำหรับกรอบสีแดงด้านหน้าสุดที่ผมวงไว้ ก็จะเป็นสิทธิ์ หรือ Permission นั่นเอง แล้วตัวอักษร “-rwxrwxrwx” มันคืออะไร ผมจะมาอธิบายนะครับ แต่ก่อนอื่นเราต้องรู้ก่อนว่า แต่ละตัวอักษรหมายความว่าไรบ้าง…

ประเภทของ Permission

ทุกคนจะเห็นว่า -rwxrwxrwx จะมีแค่ 3 ตัวคือ r, w, x นั่นก็คือสิทธิ์ใน Linux โดยแต่ละอันจะแตกต่างกันไป ดังนี้

r = Read คือ มีสิทธิในการอ่านข้อมูลในไฟล์
w = Write คือ มีสิทธิในการแก้ไขข้อมูลในไฟล์
x = Execute คือ มีสิทธิในการเรียกใช้งานไฟล์ หรือ execute ไฟล์

เพื่อน ๆ อาจจะงงว่าแล้วทำไมถึงมีหลายตัวซ้ำ ๆ กัน นั่นก็เพราะว่าในระบบ Linux นั้น จะมีผู้ใช้อยู่ 3 ระดับด้วยกัน ทำให้ต้องแบ่งสิทธิ์ในแต่ระดับผู้ใช้ด้วย

ประเภทของ File ownership

ในระบบ Linux จะมีระดับของผู้ใช้อยู่ 3 ระดับ คือ

  1. “User/Owner” หรือ เจ้าของไฟล์
  2. “Group” หรือ กลุ่ม ใน 1 กลุ่มอาจจะมีหลายๆ User ก็ได้
  3. “Other” คือ คนอื่น ๆ ที่ไม่ใช่เจ้าของและไม่อยู่ในกลุ่มของไฟล์

วิธีการอ่านสิทธิ์ หรือ Permission

หลังจากที่เพื่อน ๆ รู้กันแล้วว่ามีสิทธิ์และผู้ใช้อะไรบ้าง ผมจะยกตัวอย่างเพื่อให้เข้าใจง่ายๆตามนี้ คือ “-rwxr-xrw-” ในการอ่าน “-rwxr-xrw-” นั้น ผมจะแบ่งออกมาเป็นทั้งหมด 4 ช่องด้วยกัน โดยจะแบ่งเป็นช่องแรก 1 ตัวอักษรและที่เหลือแบ่งเป็นช่อง ช่องละ 3 ตัวอักษรตามนี้

- | rwx | r-x | rw-

ผมจะอธิบายไปทีละช่องว่าแต่ละช่องคืออะไรบ้าง

ช่องที่ 1 จะมีแค่ตัว “d” กับ “-“ เท่านั้น คือ เป็นการบอกว่าไฟล์นี้เป็น Directory หรือไม่ จากตัวอย่าง คือ

  • (-) คือ ไฟล์นี้ไม่ใช่ Directory

ช่องที่ 2 จะเป็นการบอกสิทธิ์ของ “User/Owner” หรือ เจ้าของไฟล์ จากตัวอย่าง คือ

  • (rwx) คือ “User/Owner” หรือ เจ้าของไฟล์มีสิทธิ์ Read, Write, Execute

ช่องที่ 3 จะเป็นการบอกสิทธิ์ของ “Group” หรือ กลุ่ม จากตัวอย่าง คือ

  • (r-x) คือ “Group” หรือ คนที่อยู่ในกลุ่มนี้ มีสิทธิ์ Read, ไม่มีสิทธิ์ Write, และมีสิทธิ์ Execute

ช่องที่ 4 จะเป็นการบอกสิทธิ์ของ “Other” หรือ คนอื่นๆที่ไม่ใช่เจ้าของไฟล์และอยู่ในกลุ่ม จากตัวอย่าง คือ

  • (rw-) คือ “Other” หรือ คนอื่นๆที่ไม่ใช่เจ้าของและอยู่ในกลุ่มมีสิทธิ์ Read, Write,และไม่มีสิทธิ์ Execute

มาถึงตรงนี้เพื่อน ๆ อาจจะสงสัยว่า เจ้าของไฟล์ (User/Owner), กลุ่ม (Group) ดูยังไง ผมจะอธิบายตามรูปนี้นะครับ

เลข 1 คือ “kali” เป็นชื่อของ เจ้าของไฟล์ (User/Owner) ส่วน เลข 2 คือ “pentest” เป็นชื่อของ กลุ่ม (Group) ใครที่อยู่ในกลุ่มนี้ก็จะสามารถใช้สิทธิ์กลุ่มนี้ได้

ตัวอย่างการอ่านสิทธิ์เพิ่มเติม

“drxw-rxr — ” แบ่งเป็น d | rwx | r-x | r —

  • d = ไฟล์นี้เป็น โฟลเดอร์ หรือ directory
  • rwx = “User/Owner” ได้(r), writeได้ (w), execute ไฟล์ได้(x)
  • r-x = “Group” read ได้ (r), write ไม่ได้ (-), execute ได้(x)
  • r — = “Other” read ได้ (r) write ไม่ได้ (-), execute ไม่ได้ (-)

“-rw-r — r— ” แบ่งเป็น -| rw- | r — | r —

  • - = ไฟล์นี้ไม่ใช่ โฟลเดอร์ หรือ directory
  • rw- = “User/Owner” read ได้ (r), writeได้ (w), execute ไฟล์ไม่ได้ (-)
  • r — = “Group” read ได้(r), writeไม่ได้ (-), execute ไฟล์ไม่ได้(-)
  • r — = “Other” read ได้ (r) writeไม่ได้ (-), execute ไฟล์ไม่ได้ (-)

หลังจากที่เพื่อน ๆ ได้รู้เรื่องการอ่านสิทธิ์ หรือ Permission ในระบบ Linux ไปแล้ว แต่ในบางครั้งไฟล์ในระบบ Linux ก็ไม่มีมีแค่ rwx แต่เป็นตัว s หรือ t สิทธิ์ทั้ง 2 อันนี้เป็นสิทธิ์พิเศษของระบบ Linux ก็คือ SUID กับ Sticky bit

SUID (Set owner User ID up on execution)

เป็นไฟล์โปรแกรมที่ตั้งค่าเป็น SUID ไว้โดยปกติแล้วเมื่อ “User” ใด ๆ ก็ตามเรียกใช้งานไฟล์จะ execute ด้วยสิทธิ์ของตัวเองแต่ไฟล์ที่มีการตั้งค่า SUID ไว้ เมื่อถูกเรียกใช้งาน หรือ execute มันจะถูกทำงานโดยสิทธิ์ของเจ้าของไฟล์(User/Owner) คือไม่ว่าคนที่เรียกใช้งานไฟล์นี้จะเป็นสิทธิ์อะไรก็ตาม แต่ไฟล์จะทำงานด้วยสิทธิ์ของเจ้าของไฟล์

ในบางโปรแกรมเราอยากจะให้ “User” ธรรมดาสามารถใช้คำสั่งบางตัวด้วยสิทธิ์สูงได้ เช่น ไฟล์ passwd เป็น command ที่ใช้เปลี่ยนรหัสผ่าน ซึ่งการเปลี่ยนรหัสผ่านใน Linux นั้นจะต้องเข้าไปแก้ไขในไฟล์ /etc/shadow แต่ Linux ไม่อยากให้ “User” ธรรมดาแก้ไขไฟล์ /etc/shadow ได้ เพราะว่า “User” อาจจะไปแก้ไขรหัสผ่านของคนอื่น ดังนั้น Linux จึงตั้งค่า SUID ให้ไฟล์ passwd เพื่อ “User” สามารถ execute ด้วยสิทธิ์ของ “root” ได้

Sticky Bit

เป็นการกำหนดไฟล์ว่าไฟล์นี้ทุก ๆ คนสามารถอ่านและเขียนได้ แต่ไม่สามารถถูกลบได้ และจะสามารถถูกลบได้โดย เจ้าของไฟล์ (User/Owner) หรือ root เท่านั้น โดย Sticky bit ส่วนมากจะใช้กับ Share Directory เป็นหลัก

ผมจะยกตัวอย่าง จากรูปมี directory ชื่อ “workspace1” กับ “workspace2” โดย workspace2 ตั้งค่า Sticky bit ไว้ โดยทั้ง 2 directory สามารถ read, write หรือ execute ไฟล์ได้ตามรูป ดังนั้นตามสิทธิ์แล้วทุกคนสามารถทำอะไรก็ได้ในทั้งสอง directory นี้

ผมสร้างไฟล์ชื่อ “notes.txt” ไว้ทั้ง 2 directory โดยใช้ User “kali” ในการสร้าง

เปลี่ยน User เป็น “tom” จากนั้นลบไฟล์ “notes.txt” ในทั้ง 2 directory

จะพบว่าไม่สามารถลบไฟล์ใน workspace2 ได้เนื่องจาก “tom” ไม่ใช่เจ้าของไฟล์นั่นเอง

การให้สิทธิ์ไฟล์ chmod

เพื่อน ๆ อาจจะเคยเห็นคำสั่ง เช่น chmod 777 <file>, chmod 544 <file>, chmod 600 <file> คำสั่ง “chmod” นั้นเป็นการให้สิทธิ์ไฟล์ ซึ่งตัวเลขก็คือเป็นค่าสิทธิ์ หรือ Permission ซึ่งผมบอกไว้ก่อนว่าเราสามารถให้สิทธิ์ไฟล์โดยใช้ตัวอักษรก็ได้ แต่ว่าผมถนัดตัวเลขมากกว่า ผมจึงจะมาอธิบายในส่วนของตัวเลขนะครับ

โดยก่อนอื่นต้องรู้ก่อนว่าสิทธิ์ หรือ Permission แต่ละอันมีค่าดังนี้

  • อ่านไฟล์ (read) = 4
  • เขียนไฟล์ (write) = 2
  • เรียกใช้ไฟล์ (execute) = 1
  • ไม่มีสิทธิ์ (-) = 0

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

วิธีการให้สิทธิ์

“chmod 754” วิธีก็คือเราจะแบ่งตัวเลข 3 ตัวออกเป็น 3 ช่อง เหมือนกับการอ่านสิทธิ์เลย

754 แบ่งเป็น 7 | 5 | 4 แต่ละช่องเป็นของ User/Owner | Group | Other ตามลำดับ

ช่องแรก คือ (7) ของ User/Owner เราจะดูว่าเลขอะไรบ้างที่รวมกันแล้วได้ 7 ก็คือ

  • (4+2+1) หมายความว่า User/Owner → read ได้, write ได้, execute ได้

ช่องสอง คือ (5) ของ Group เลขที่รวมกันได้ 5 คือ

  • (4+0+1) หมายความว่า Group → read ได้, write ไม่ได้, execute ได้

ช่องสาม คือ (4) ของ Other เลขที่รวมกันได้ 4 คือ

  • (4+0+0) หมายความว่า Other → read ได้, write ไม่ได้, execute ไม่ได้

จากการอธิบายด้านบนผมสรุปเลขสิทธิ์ออกมาดังนี้

  • 0 (0+0+0) คือ read ไม่ได้, write ไม่ได้, execute ไม่ได้
  • 1 (0+0+1) คือ read ไม่ได้, write ไม่ได้, execute ได้
  • 2 (0+2+0) คือ read ไม่ได้, write ได้, execute ไม่ได้
  • 3 (0+2+1) คือ read ไม่ได้, write ได้, execute ได้
  • 4 (4+0+0) คือ read ได้, write ไม่ได้, execute ไม่ได้
  • 5 (4+0+1) คือ read ได้, write ไม่ได้, execute ได้
  • 6 (4+2+0) คือ read ได้, write ได้, execute ไม่ได้
  • 7 (4+2+1)คือ read ได้, write ได้, execute ได้

ตัวอย่างการให้สิทธิ์เพิ่มเติม

“chmod 600” แบ่งเป็น 6 | 0 | 0

  • 6 = (4+2+0) คือ User/Owner → read ได้, write ได้, execute ไม่ได้
  • 0 = (0+0+0) คือ Group → read ไม่ได้, write ไม่ได้, execute ไม่ได้
  • 0 = (0+0+0) คือ Other → read ไม่ได้, write ไม่ได้, execute ไม่ได้

“chmod 701” แบ่งเป็น 7 | 0 | 1

  • 7 = (4+2+1) คือ User/Owner → read ได้, write ได้, execute ได้
  • 0 = (0+0+0) คือ Group → read ไม่ได้, write ไม่ได้, execute ไม่ได้
  • 1 = (0+0+1) คือ Other → read ไม่ได้, write ไม่ได้, execute ได้

--

--

No responses yet