chmod 777 คืออะไร ทำไมต้อง chmod และมันไม่ปลอดภัยจริงหรือ

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

ทำความเข้าใจกับสิทธิ์หรือ Permissions กันก่อน
จริงๆแล้วสิทธิ์เป็นเรื่องของความปลอดภัยพื้นฐาน ใช้เพื่อบอกว่า "ใคร" สามารถ "ทำอะไร" ได้บ้าง ใคร แบ่งออกเป็น 3 กลุ่ม ได้แก่
  • Owner หรือเจ้าของ เป็นชื่อผุ้ใช้งานภายในเครื่อง หรือผู้ที่สร้างไฟล์หรือไดเร็คทอรี่นั้นๆขึ้นมา (เช่น root ftp)
  • Group กลุ่มของเจ้าของ ใช้จัดกลุ่มผู้ใช้งานเป็นกลุ่มๆ อีกที
  • Public คือผุ้ใช้ทั่วไป บางทีอาจเรียก Other หรืออื่นๆ ได้แก่ผู้ใช้ที่เรียกใช้ไฟล์ หรือเปิดดูไฟล์นั้นๆ ที่ไม่ได้เป็น Owner และไม่ได้อยู่ใน Group รวมถึงคนที่เรียกดูจากอินเตอร์เน็ตด้วย
ทำอะไรได้บ้าง แบ่งออกเป็น 3 อย่างอีกเช่นกัน
  • Read สามารถอ่านไฟล์ได้ ใครก็ตามที่ได้รับสิทธิ์นี้จะสามารถอ่านไฟล์นั้นได้ หรือถ้าเป็นไดเร็คทอรี่ก็จะสามารถแสดงรายชื่อไฟล์ในไดเร็คทอรี่ได้
  • Write สามารถเขียนไฟล์ได้ ใครก็ตามที่ได้รับสิทธิ์นี้จะสามารถเขียนไฟล์ แก้ไขไฟล์ สร้างไฟล์หรือไดเร็คทอรี่ ลบไฟล์หรือไดเร็คทอรี่ ได้
  • Execute สามารถประมวลผลไฟล์ได้ ใครก็ตามที่ได้รับสิทธิ์นี้จะสามารถสั่งประมวลผลไฟล์ได้ (เช่นให้ไฟล์ PHP ประมวลผล)
วิธีการกำหนดสิทธิให้กับไฟล์และไดเร็คทอรี่ คือการกำหนดให้ไฟล์หรือไดเร็คทอรี่นั้นๆ "ใคร" (Owner,Group และ Public) สามารถ "ทำอะไร" (Read, Write และ Execute) ได้บ้าง โดยใช้ตัวเลข 0-7 แทนความสามารถต่างๆ (ผมอธิบายแค่เฉพาะที่เป็นตัวเลขนะครับ เพราะจริงๆแล้วยังสามารถกำหนดค่าเป็นรูปแบบอื่นๆได้อีก)
  • 0 คือ ไม่สามารถทำอะไรได้เลยกับ Files หรือ Folder นั้นๆได้เลย
  • 1 คือ สามารถเรียกให้ Files หรือ Folder มาประมวลผลอย่างเดียว
  • 2 คือ สามารถให้มีการเขียนใน Files หรือ Folder ได้
  • 3 คือ สามารถให้มีการเขียนและประมวลผล ใน Files หรือ Folder ได้
  • 4 คือ สามารถเรียกให้ Files หรือ Folder มาอ่านได้อย่างเดียว
  • 5 คือ สามารถให้มีการอ่านและประมวลผล ใน Files หรือ Folder ได้
  • 6 คือ สามารถให้มีการอ่านและเขียน ใน Files หรือ Folder ได้
  • 7 คือ การกำหนดให้  Files หรือ Folder ทำได้ทุกอย่าง อ่าน เขียน และประมวลผล

ตัวอย่างการกำหนดสิทธิ์
Owner Group Public
7 7 5
จะมีความหมายว่า
  • Owner สามารถอ่าน เขียน และประมวลผลได้
  • Group สามารถอ่าน เขียน และประมวลผลไฟล์ ได้เช่นกัน
  • Public สามารถอ่าน และประมวลผลไฟล์ แต่ไม่สามารถเขียนได้
ดังนั้นถ้ามีการกำหนดสิทธิ์เป็น 777 ก็เท่ากับว่า "ทุกคน" จะสามารถทำอะไรกับไฟล์หรือไดเร็คทอรี่นั้นๆก็ได้
โดยปกติทั่วๆไป เราจะกำหนดให้ไดเร็คทอรี่ต่างๆมีสิทธิ์เป็น 644 (ไดเร็คทอรี่อ่านได้อย่างเดียว) และ ไฟล์ให้เป็น 775 (ไฟล์ไม่สามารถเขียนทับได้โดยผู้ใช้ภายนอก) จะเป็นการปลอดภัยที่สุด
ก่อนจะไปต่อ ผมมีอีกคำหนึ่งที่น่าสนใจกว่าคือ Owner หรือเจ้าของไฟล์ ซึ่งถ้าดูจากการตั้งค่าสิทธิ์ทั่วๆไปจะพบว่า Owner มักจะถูกกำหนดให้มีสิทธิ์สูงที่สุด (สามารถทำได้ทุกอย่าง) ซึ่งถ้าเราสามารถเป็น Owner ได้ หรือกำหนดให้คนที่สั่งประมวลผลไฟล์ได้เป็น Owner ก็จะไม่จำเป็นต้องให้สิทธิ์แก่ไฟล์หรือไดเร็คทอรี่นั้นเป้น 777 แต่อย่างใด

เกิดอะไรขึ้นเมื่อมีการเขียนไฟล์ หรือสร้างไดเร็คทอรี่ หรือ อัปโหลดไฟล์
  • เมื่อเราใช้ ftp ในการอัปโหลดไฟล์ ผู้ที่สร้างไฟล์ก็คือ user ที่เราใช้ login เข้า ftp และ user นั้นก็จะเป็นเจ้าของไฟล์
  • เมื่อเราใช้ php ในการสร้างไฟล์ เช่นการอัปโหลดไฟล์โดยการ submit ผ่านฟอร์ม หรือสร้างไฟล์ด้วย fopen() หรือคำสั่งอื่นๆของ php ก็จะได้ user เจ้าของไฟล์เป็นคนเดียวกันกับ php 
ถ้าสังเกตุจะเห็นว่า เจ้าของไฟล์ที่อัปโหลดผ่าน ftp และที่สร้างด้วย php อาจจะเป็นคนละคนกัน นั่นเป็นสาเหตุว่าทำไมเราถึงไม่สามารถอัปโหลดไฟล์ผ่านฟอร์ม php ไปยังไดเร็คทอรี่ที่เรามักจะสร้างด้วย ftp ตอนที่อัปโหลดไฟล์ขึ้นไปได้

การแก้ไข
  1. วิธีที่ง่ายที่สุดคือปรับ chmod ให้สามารถเขียนได้ (หรือต้องปรับให้ Public เป็น 7 นั่นเอง) เนื่องจากถ้าเป็นค่าอื่นจะไม่มีทางเขียนได้ ซึ่งวิธีนี้จะสามารถทำผ่าน ftp ได้ทุกคน (ไม่สอนวิธีปรับนะ มีสอนกันเยอะแยะแล้ว) หรือ
  2. วิธีที่สอง แก้ไขเจ้าของไฟล์ที่เราอัปโหลดผ่าน ftp ให้เป็นเจ้าของเดียวกันกับ php วิธีนี้ยุ่งยากมากที่สุดและอาจไม่สามารถทำได้ทุกคน เนื่องจากหาก Control Panel ที่ใช้ไม่สนับสนุน และไม่สามารถใช้ Command Line ได้ จะไม่สามารถทำได้เลย หลักการก็คือให้รันคำสั่ง chown เพื่อเปลี่ยนเจ้าของไฟล์
    chown username:username index.php
    chown -R username:username datas/
    • username คือ ชื่อ user เจ้าของไฟล์ ตัวแรกคือชื่อ user และตัวที่สองคือชื่อกลุ่ม ซึ่ง Server ส่วนใหญ่มักจะใช้ค่าเดียวกัน หากใครไม่รู้สามารถดูได้จาก Control Panel ของตัวเอง (เช่นที่ไดเร็คทอรี่ public_html ว่าเจ้าของเป็นใคร)
    • -R เป็นคำสั่งใช้กับไดเร็คทอรี่ หมายถึงไดเร็คทอรี่นั้นๆและไดเร็คทอรี่และไฟล์ทั้งหมดในไดเร็คทอรี่นั้นด้วย
    หมายเหตุใน Control Panel เช่น Direct Admin สามารถปรับ Owner ได้ที่ Control Panel นะครับ (DA ใช้คำว่า Reset Owner)
  3. วิธีสุดท้าย ที่ผมแนะนำ คือเมื่อเรารู้ว่าเจ้าของไฟล์เท่านั้นที่สามารถเขียนได้ และเราต้องการให้ php สามารถอัปโหลดไฟล์ได้ เราก็เขียนคำสั่งสร้างไฟล์หรือไดเร็คทอรี่ด้วย php มันซะเลย เพียงแค่นี้ เราก็จะสามารถอัปโหลดไฟล์ไปยังไดเร็ตทอรี่นั้นๆได้โดยไม่ต้องกังวลเรื่องสิทธิ์อีก ซึ่ง CMS รุ่นใหม่ๆในปัจจุบันใช้วิธีนี้

มาถึงคำถามที่หลายๆคนสงสัย chmod 777 ไม่ปลอดภัยจริงหรือ
คำตอบจากผมคือ มันมีความปลอดภัยต่ำที่สุด ก็อย่างที่อธิบายไป มันจะสามารถทำได้ทุกอย่าง แล้วมันจะไม่ปลอดภัยเมื่อไร (จริงๆแล้ว ตัวเลขที่ไม่ปลอดภัยที่สุดคือเลข 7 หลักสุดท้าย เพราะมันเป็นสิทธิ์ของคนทั่วไป หรือคนที่อยู่นอก Server)

เรามาลองดูกันนะครับว่าจะเกิดอะไรขึ้นได้บ้างเมื่อมีการปรับ chmod เป็น 777 หรือ xx7 (สองตัวแรกสามารถเป็นอะไรก็ได้) ลองทำตามนี้ดู

หนึ่ง สร้างไฟล์ PHP รายละเอียดตามนี้บน Server ของคุณเอง
<?php
$file = '/path/to/directory/test.php';
// เขียนไฟล์ลงบนปลายทาง
$f = fopen($file, 'wb');
fwrite($f, date('Y-m-d H:i:s').'<?php echo __FILE__;');
fclose($f);
// ตรวจสอบว่าสามารถสร้างไฟล์ได้หรือไม่
echo file_get_contents($file);

สอง แก้ไขตัวแปร $file ให้ชี้ไปยังไดเร็คทอรี่ของ Server อื่นๆ ภายในเครื่องเดียวกัน ที่ปรับ chmod ให้เป็น 777 แล้ว
สาม เรียกไฟล์นี้ ถ้าเห็นวันที่แสดงขึ้นมา แสดงว่าสามารถเขียนไฟล์นี้ลงบน Server ปลายทางได้สำเร็จ
สี่ ลองเรียกไฟล์ที่สร้างด้วย URL ปลายทางดู ถ้าสามารถประมวลผลไฟล์ที่เรียกได้ (แสดง path ของไฟล์) แสดงว่าโดนเข้าเรียบร้อยแล้ว
ลองปรับ chmod ของไดเร็คทอรี่ปลายทางเป็นค่าอื่นดูนะครับ และหลังจากลองเสร็จแล้ว อย่าลืมปรับ chmod กลับเป็นค่าเดิม และลบไฟล์ทั้งหมดที่สร้างด้วยนะครับ

จากตัวอย่างจะเห็นว่าความน่ากลัวสูงสุดมันจะอยู่ตรงที่ เราสามารถรันด้วยคำสั่งพื้นฐานง่ายๆของ PHP ได้เลย โดยไม่ต้องใช้ความรู้อะไรมาก แต่เงื่อนไขที่จะสำเร็จได้ก็มีอยู่
  1. เราต้องได้รับสิทธิ์ในการสร้างและประมวลผลไฟล์บน Server เดียวกัน (หรือ share Host ที่หมายถึงเว็บอื่นๆบน Server เดียวกันนั่นแหละครับ)
  2. เราจะต้องรู้ Path เต็มๆของไดเร็คทอรี่ปลายทาง และไดเร็คทอรี่นั้นต้องมีสิทธิ์เป็น xx7
  3. การตั้งค่า Server ที่ไม่ดีพอ
สามข้อนี้จะทำให้ Server ไม่ปลอดภัยสูงที่สุด เนื่องจากโดยปกติแล้วสิ่งที่ Hacker ทำได้มักจะทำได้แค่ข้อ 2 เท่านั้น (สร้างไฟล์ได้) แต่ถ้าไฟล์ที่สร้างได้เป็น index.html (ที่ไม่ต้องการประมวลผล) ก็สามารถสร้างความตกใจให้กับผู้ที่พบเจอได้เหมือนกัน ซึ่งในกรณีที่เป็นไฟล์ PHP ไฟล์มักจะไม่สามารถประมวลผลได้เมื่ออยู่นอก Server ของตัวเอง เนื่องจากไฟล์ที่สร้างจะมี Owner เป็นคนที่สร้างไฟล์ (user ของเราเอง) ซึ่งข้อมูลนี้เองที่ใช้บอกว่าใครเป็นคนแอบเจาะเว็บเรา และ เว็บเราโดนเจาะได้หรือไม่

ทำไมถึงยังมีการใช้คำว่า chmod 777 กันอยู่อีก .... จริงๆแล้วประโยคนี้เป็นคำอธิบายสั้นๆว่าต้องปรับไดเร็คทอรี่ให้สามารถเขียนได้ ซึ่งสำหรับผู้ใช้พื้นฐานทั่วไป การบอกให้ผู้ใช้เข้าใจว่าต้องทำอะไรบ้างที่ดูยุ่งยากมักจะไม่สำเร็จ เพราะก็อย่างที่เห็นกันอยู่ คนจำนวนมากจับเอาเฉพาะข้อความแค่ที่ตัวเองอยากจะสนใจ หรือไม่ก็ไม่ชอบอ่าน หรือ ไม่ชอบทำอะไรที่ดูยุ่งยาก ก็เลยไม่ค่อยจะใส่ใจที่จะทำความเข้าใจ ยกเว้นในกลุ่ม DEV ด้วยกันเอง ที่มักบอกต่อๆกันว่า 777 มันไม่ดี แต่ก็ไม่รู้ว่ามันไม่ดียังไง

สุดท้าย สำหรับคนที่มีปัญหาการปรับ chmod และต้องการตัวช่วย ผมแนะนำโปรแกรมนี้เลย https://github.com/goragod/filemanager เป็นโปรแกรมจัดการไฟล์บน Server คล้ายๆ FTP แต่เนื่องจากมันเป็น PHP base ดังนั้นการอัปโหลดหรือการสร้างไฟล์ใดๆจากโปรแกรมนี้จะสามารถเขียนได้แน่นอน แต่โปรแกรมนี้เป็นโปรแกรมค่อนข้างอันตรายนะครับ (เนื่องจากความสามารถของมัน) ทำให้ถูกใช้เป็นเครื่องมือของ Hacker และโปรแกรมตรวจสอบไวรัสบางตัวมองว่าเป็นไฟล์อันตราย เมื่อใช้เสร็จแล้วต้องลบทิ้งทันที
คำเตือน การละเลยเรื่องความปลอดภัยแม้เพียงเล็กน้อยก็ถือเป็นอันตรายอย่างยิ่ง เนื่องจากโลกปัจจุบัน Hacker ก็ฉลาดขึ้น เครื่องมือก็เยอะขึ้น ช่องโหว่ของ Server ก็ถูกค้นพบไม่เว้นแต่ละวัน การละเลยแม้แต่เรื่องเล็กน้อยในตอนนี้ ก็อาจก่อให้เกิดปัญหาใหญ่ตามมาในภายหลังได้
ผู้เขียน Goragod โพสต์เมื่อ 19 ก.ย. 2560 เปิดดู 2,767 ป้ายกำกับ PHP

เรื่องที่เกี่ยวข้อง

^