สวัสดีครับเพื่อน ๆ วันนี้ผมจะมาพูดสิ่งที่สำคัญอีกอย่างหนึ่งในระบบ 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 ระดับ คือ
- “User/Owner” หรือ เจ้าของไฟล์
- “Group” หรือ กลุ่ม ใน 1 กลุ่มอาจจะมีหลายๆ User ก็ได้
- “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 ได้