คำตอบสั้น ๆ: อ่านสิทธิ์ไฟล์แบบ rwx และตัวเลข 644, 755 ให้เข้าใจ แล้วใช้ chmod และ chown กำหนดสิทธิ์ไฟล์เว็บไซต์ให้ทำงานได้และปลอดภัย โดยไม่ต้องพึ่ง 777
คู่มือนี้อธิบาย chmod ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
ทุกไฟล์และโฟลเดอร์บน Linux มีเจ้าของ (User) กลุ่ม (Group) และชุดสิทธิ์ที่กำหนดว่าใครอ่าน เขียน หรือรันได้ ปัญหาหน้าเว็บขึ้น 403 Forbidden, WordPress อัปโหลดรูปไม่ได้ หรือ SSH Key ใช้ไม่ได้ ส่วนใหญ่มีต้นเหตุจากสิทธิ์ไฟล์ที่ไม่ถูกต้อง บทความนี้อธิบายวิธีอ่านสิทธิ์และวิธีแก้ด้วย chmod และ chown อย่างปลอดภัย
สิ่งที่ต้องเตรียม
- เซิร์ฟเวอร์ Ubuntu 22.04/24.04 หรือ AlmaLinux/Rocky Linux 8-9 ที่เข้าผ่าน SSH ได้
- ผู้ใช้ที่มีสิทธิ์ sudo (การเปลี่ยนเจ้าของไฟล์ต้องใช้สิทธิ์ root)
- รู้ว่า Web Server ของเครื่องรันด้วยผู้ใช้อะไร: Ubuntu มักเป็น
www-dataส่วน AlmaLinux/Rocky เป็นapacheหรือnginx
ขั้นตอนที่ 1: อ่านสิทธิ์จากคำสั่ง ls -l
ls -l /var/www/example.com
ผลลัพธ์จะมีลักษณะดังนี้
-rw-r--r-- 1 deploy www-data 4120 Sep 10 10:12 index.php
drwxr-xr-x 5 deploy www-data 4096 Sep 10 10:12 wp-content
ตัวอักษรตัวแรกบอกชนิด (- คือไฟล์ d คือโฟลเดอร์ l คือ Symbolic Link) จากนั้นเป็น 9 ตัวอักษรแบ่งเป็น 3 ชุด ชุดละ 3 ตัว คือสิทธิ์ของเจ้าของ (u) กลุ่ม (g) และคนอื่น (o) ตามลำดับ ถัดมาคือชื่อเจ้าของ (deploy) และกลุ่ม (www-data)
| ตัวอักษร | กับไฟล์ | กับโฟลเดอร์ | ค่าตัวเลข |
|---|---|---|---|
r | อ่านเนื้อหาได้ | ดูรายชื่อไฟล์ข้างในได้ | 4 |
w | แก้ไขเนื้อหาได้ | สร้าง ลบ เปลี่ยนชื่อไฟล์ข้างในได้ | 2 |
x | รันเป็นโปรแกรมได้ | เข้าไปในโฟลเดอร์ (cd) และเข้าถึงไฟล์ข้างในได้ | 1 |
จุดที่คนมักพลาดคือสิทธิ์ x ของโฟลเดอร์ ถ้าโฟลเดอร์ไม่มี x แม้ไฟล์ข้างในจะอ่านได้ Web Server ก็เข้าไม่ถึง และสิทธิ์ลบไฟล์ขึ้นกับสิทธิ์ w ของโฟลเดอร์ที่เก็บไฟล์ ไม่ใช่ของตัวไฟล์
ขั้นตอนที่ 2: แปลงสิทธิ์เป็นตัวเลข
นำค่าตัวเลขของแต่ละชุดมาบวกกัน เช่น rw- คือ 4+2+0 = 6 และ r-x คือ 4+0+1 = 5 ดังนั้น rw-r--r-- คือ 644 และ rwxr-xr-x คือ 755 ค่าที่พบบ่อยมีดังนี้
| ค่า | สัญลักษณ์ | ใช้กับ |
|---|---|---|
| 644 | rw-r--r-- | ไฟล์เว็บทั่วไป (PHP, HTML, CSS, รูป) |
| 755 | rwxr-xr-x | โฟลเดอร์ และสคริปต์ที่ต้องรันได้ |
| 640 | rw-r----- | ไฟล์ Config ที่มีรหัสผ่าน ให้กลุ่มของ Web Server อ่านได้เท่านั้น |
| 600 | rw------- | Private Key, ~/.ssh/authorized_keys, ไฟล์ .env ที่เจ้าของอ่านคนเดียว |
| 700 | rwx------ | โฟลเดอร์ ~/.ssh และโฟลเดอร์ส่วนตัว |
| 775 | rwxrwxr-x | โฟลเดอร์ที่ทั้งเจ้าของและกลุ่มต้องเขียนได้ เช่น โฟลเดอร์อัปโหลด |
ขั้นตอนที่ 3: เปลี่ยนสิทธิ์ด้วย chmod
ใช้ได้ทั้งแบบตัวเลขและแบบสัญลักษณ์
chmod 644 index.php
chmod 600 ~/.ssh/authorized_keys
chmod u+x deploy.sh
chmod g+w uploads
chmod o-rwx config.php
แบบสัญลักษณ์ใช้ u, g, o, a (ทั้งหมด) ตามด้วย + เพิ่ม - ลบ หรือ = กำหนดทับ เหมาะเมื่อต้องการเปลี่ยนเพียงบิตเดียวโดยไม่กระทบส่วนอื่น
เมื่อต้องแก้ทั้งเว็บไซต์ อย่าใช้ chmod -R 755 เพราะจะทำให้ไฟล์ทุกไฟล์รันได้ด้วย ให้แยกไฟล์กับโฟลเดอร์ด้วย find
sudo find /var/www/example.com -type d -exec chmod 755 {} +
sudo find /var/www/example.com -type f -exec chmod 644 {} +
ขั้นตอนที่ 4: เปลี่ยนเจ้าของด้วย chown
sudo chown deploy index.php
sudo chown deploy:www-data index.php
sudo chown -R deploy:www-data /var/www/example.com
sudo chgrp www-data config.php
รูปแบบคือ ผู้ใช้:กลุ่ม และ -R ทำทั้งโฟลเดอร์ ก่อนใช้ -R ให้ตรวจ Path ให้แน่ใจ เพราะการรัน chown -R กับ / หรือ /var ผิดพลาดอาจทำให้ Service หลายตัวเสียและต้องกู้ระบบ ควรมีข้อมูลสำรองก่อน (ดู การ Backup Server บน Cloud ของ TDC)