SSD Nodes Learn 🎉 VPS เริ่ม $5.50/เดือน
คู่มือ Matt Connorโดย Matt Connor · อัปเดตเมื่อ 2026-08-13

อธิบายสิทธิ์ drwxr-xr-x ใน Linux และการตั้งค่า chmod 755

เรียนรู้วิธีอ่านค่าสิทธิ์ drwxr-xr-x ทีละตัวอักษรพร้อมเทียบเป็นเลขฐานแปด 755 เข้าใจความหมายของ x ในไดเรกทอรี และเหตุผลว่าทำไมการใช้ chmod 777 ถึงเป็นวิธีแก้ปัญหาที่ผิดพลาด

ความหมายของ drwxr-xr-x

drwxr-xr-x อธิบายถึงไดเรกทอรีที่เจ้าของสามารถแก้ไขได้ และผู้ใช้คนอื่นทุกคนสามารถอ่านและเข้าถึงเพื่อผ่านเข้าไปได้โดยไม่สามารถแก้ไขสิ่งใดได้ ในรูปแบบเลขฐานแปด โหมดนี้คือ 755 ระบบ Linux จะแสดงอักขระ 10 ตัวนี้ที่จุดเริ่มต้นของทุกบรรทัดในผลลัพธ์ของ ls -l ซึ่งอักขระเหล่านี้มีความหมายเหมือนกันเสมอในลำดับเดิม ดังนั้นการเรียนรู้สตริงชุดเดียวจะช่วยให้คุณเข้าใจชุดอื่นทั้งหมดได้

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

อักขระทั้งสิบตัว ทีละตัว

สร้างไดเรกทอรีและไฟล์ขึ้นมาเพื่อตรวจสอบ ไม่มีสิ่งใดในที่นี้ส่งผลกระทบต่อไฟล์ภายนอกไดเรกทอรีใหม่นี้

mkdir -p ~/permdemo/inner
printf 'hello\n' > ~/permdemo/inner/notes.txt
ls -ld ~/permdemo ~/permdemo/inner ~/permdemo/inner/notes.txt

ด้วยค่า umask เริ่มต้นทั่วไปที่ 022 บรรทัดของไดเรกทอรีทั้งสองจะขึ้นต้นด้วย drwxr-xr-x และบรรทัดของไฟล์จะขึ้นต้นด้วย -rw-r--r--

อักขระตัวที่ 1 คือประเภทของไฟล์ ไม่ใช่สิทธิ์การเข้าถึง d คือไดเรกทอรี - คือไฟล์ปกติ l คือ symbolic link ส่วน c และ b คือ node ของอุปกรณ์แบบ character และ block s คือ socket และ p คือ named pipe อักขระตัวนี้อยู่นอกเหนือค่าเลขฐานแปด ซึ่งเป็นเหตุผลว่าทำไม drwxr-xr-x จึงกลายเป็น 755 แทนที่จะขึ้นต้นด้วย d

อักขระเก้าตัวหลังจากนั้นแบ่งเป็นสามกลุ่ม กลุ่มละสามตัว และลำดับจะไม่เปลี่ยนแปลง

  • อักขระตัวที่ 2 ถึง 4 คือกลุ่ม owner ซึ่งเป็นบิตที่ใช้กับผู้ใช้ที่เป็นเจ้าของไฟล์
  • อักขระตัวที่ 5 ถึง 7 คือกลุ่ม group ซึ่งเป็นบิตที่ใช้กับกลุ่มของไฟล์
  • อักขระตัวที่ 8 ถึง 10 คือกลุ่ม other ซึ่งเป็นบิตที่ใช้กับบุคคลอื่นทั้งหมด

ภายในกลุ่ม ตำแหน่งจะเป็น r ตามด้วย w และ x เสมอ โดยเครื่องหมายขีดหมายถึงบิตนั้นถูกปิดอยู่ ตัวอักษรจะไม่เปลี่ยนตำแหน่ง r-x คือการอ่านโดยไม่มีสิทธิ์เขียน -w- คือการเขียนโดยไม่มีสิทธิ์อ่าน ซึ่งเป็นสิ่งที่ทำได้แต่พบได้ยาก

ดังนั้น drwxr-xr-x จึงแบ่งได้ดังนี้: d สำหรับไดเรกทอรี ตามด้วย rwx สำหรับเจ้าของ ตามด้วย r-x สำหรับกลุ่ม และ r-x สำหรับบุคคลอื่น

บางระบบจะแสดงอักขระตัวที่สิบเอ็ด จุดที่ต่อท้าย drwxr-xr-x. หมายความว่าไฟล์นั้นมีบริบท SELinux (Security Enhanced Linux) ซึ่งการแจกจ่ายแบบ SELinux เช่น Fedora และ Rocky จะแสดงผลนี้เป็นค่าเริ่มต้น เครื่องหมายบวกที่ต่อท้าย drwxr-xr-x+ หมายความว่าไฟล์นั้นมี POSIX ACL (Access Control List) ซึ่งเป็นชุดกฎเพิ่มเติมที่นอกเหนือจากเก้าบิตนี้ คุณสามารถอ่านกฎเพิ่มเติมเหล่านั้นได้ด้วย getfacl <path>

สิทธิ์ r, w และ x ทำหน้าที่ต่างกันเมื่อใช้กับไดเรกทอรี

นี่คือกฎข้อแรกที่ผู้เริ่มต้นมักเข้าใจผิด ตัวอักษรเหล่านี้เหมือนกันทั้งบนไฟล์และไดเรกทอรี แต่สิทธิ์ที่ได้รับนั้นไม่เหมือนกัน

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

การผ่านเข้าไป (traverse) คือส่วนที่ทำให้คนส่วนใหญ่ประหลาดใจ สิทธิ์ x บนไดเรกทอรีไม่ได้เป็นการสั่งประมวลผลอะไร การเปิดไฟล์ /srv/site/index.html จำเป็นต้องมีสิทธิ์ x บน / จากนั้นต้องมี x บน /srv ต่อด้วย x บน /srv/site และสุดท้ายคือ r บนตัวไฟล์เอง หากไดเรกทอรีใดในสาย path นี้ขาดสิทธิ์ x สำหรับคุณ การค้นหาจะหยุดลงทันที และระบบจะแจ้งผู้เรียกใช้ว่า Permission denied สำหรับทั้ง path นั้น แม้ว่าไฟล์ปลายทางจะเปิดให้ทุกคนอ่านได้ก็ตาม คำสั่ง namei -l /srv/site/index.html จะแสดงทุกขั้นตอนของสาย path พร้อมโหมดและเจ้าของ เพื่อให้คุณตรวจสอบได้ว่าจุดเชื่อมต่อใดที่เป็นตัวขัดขวาง

ไดเรกทอรีที่มีสิทธิ์ r แต่ไม่มีสิทธิ์ x เป็นสถานะกึ่งกลางที่แปลกประหลาดซึ่งควรทำความเข้าใจ ผู้ใช้ทั่วไปสามารถแสดงรายการชื่อไฟล์ได้เพราะการแสดงรายการคือสิ่งที่ r มอบให้ แต่จะไม่สามารถตรวจสอบสถานะ (stat) ของไฟล์ใดๆ ได้ ดังนั้นคำสั่ง ls -l จะแสดงเครื่องหมายคำถามในคอลัมน์ขนาดและโหมด พร้อมกับพิมพ์ ls: cannot access ...: Permission denied สำหรับแต่ละรายการ

การเปลี่ยนสิทธิ์จากตัวอักษรเป็น 755

แต่ละกลุ่มสิทธิ์คือตัวเลข 3 บิต โดย r มีค่าเท่ากับ 4, w มีค่าเท่ากับ 2 และ x มีค่าเท่ากับ 1 ให้รวมค่าของบิตที่เปิดใช้งานอยู่

  • rwx คือ 4 + 2 + 1 = 7
  • rw- คือ 4 + 2 = 6
  • r-x คือ 4 + 1 = 5
  • r-- คือ 4
  • --- คือ 0

ดังนั้น drwxr-xr-x จึงเท่ากับ 7 สำหรับเจ้าของ, 5 สำหรับกลุ่ม และ 5 สำหรับผู้อื่น: 755 ส่วน -rw-r--r-- คือ 6, 4, 4: 644 และ drwxrwxr-x คือ 7, 7, 5: 775 ซึ่งก็คือ 755 ที่เพิ่มสิทธิ์การเขียนให้กับกลุ่ม คุณไม่จำเป็นต้องนับตัวอักษรด้วยมือ เพราะ stat จะแสดงผลทั้งสองรูปแบบพร้อมกัน

stat -c '%A %a %U %G %n' ~/permdemo ~/permdemo/inner/notes.txt

%A คือรูปแบบตัวอักษร, %a คือรูปแบบเลขฐานแปด และ %U กับ %G คือชื่อของผู้ใช้ที่เป็นเจ้าของและกลุ่มที่เป็นเจ้าของตามลำดับ

สตริงสิทธิ์การเข้าถึงที่พบบ่อย

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

  • -rw-r--r-- คือ 644: ไฟล์ทั่วไปที่บริการทำได้เพียงอ่าน เช่น ไฟล์คอนฟิกูเรชันหรือหน้า HTML
  • -rw------- คือ 600: ข้อมูลลับ เช่น SSH private key หรือไฟล์ .env ของแอปพลิเคชัน
  • -rw-rw-r-- คือ 664: ไฟล์ในไดเรกทอรีที่แชร์ร่วมกันในกลุ่ม ซึ่งสมาชิกในทีมจำเป็นต้องเขียนข้อมูลได้
  • -rwxr-xr-x คือ 755: สคริปต์และไฟล์ไบนารี เช่น /usr/local/bin/backup.sh และไฟล์ส่วนใหญ่ใน /usr/bin
  • -rwx------ คือ 700: สคริปต์ส่วนตัวที่อนุญาตให้เฉพาะเจ้าของไฟล์เรียกใช้งานได้เท่านั้น
  • drwxr-xr-x คือ 755: ไดเรกทอรีระบบเกือบทั้งหมด และ document root ของเว็บไซต์
  • drwx------ คือ 700: ~/.ssh และโฮมไดเรกทอรีบนเครื่องที่จำกัดสิทธิ์การเข้าถึงอย่างเข้มงวด
  • drwxrwxr-x คือ 775: ไดเรกทอรีที่กลุ่มของเจ้าของไฟล์สามารถเขียนข้อมูลลงไปได้
  • drwxrwsr-x คือ 2775: เช่นเดียวกับข้างต้น แต่เพิ่ม setgid bit เพื่อให้ไฟล์ใหม่ที่สร้างขึ้นภายในสืบทอดกลุ่มของไดเรกทอรีนั้น
  • drwxrwxrwt คือ 1777: /tmp โดยที่ t ต่อท้ายคือ sticky bit ซึ่งอนุญาตให้ผู้ใช้ลบได้เฉพาะไฟล์ของตนเองเท่านั้น
  • -rwsr-xr-x คือ 4755: ไฟล์ไบนารีแบบ setuid ที่ทำงานด้วยสิทธิ์ของเจ้าของไฟล์ เช่น /usr/bin/passwd และ /usr/bin/sudo
  • -rw-rw-rw- คือ 666 และ drwxrwxrwx คือ 777: สิทธิ์ที่ทุกคนเขียนได้ (world writable) ซึ่งบนเซิร์ฟเวอร์มักเป็นข้อผิดพลาดเกือบทุกกรณี
  • lrwxrwxrwx คือสิ่งที่ symbolic link ทุกตัวแสดงผล เนื่องจาก Linux จะเพิกเฉยต่อบิตโหมดบนตัวลิงก์และตรวจสอบที่ไฟล์ปลายทางแทน สตริงนี้จึงไม่มีความหมายใดๆ ในทางปฏิบัติ

ชุดสิทธิ์ใดที่ใช้กับคุณ

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

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

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

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

id
stat -c '%U %G %A %n' ~/permdemo/inner/notes.txt

id จะแสดงผู้ใช้ของคุณและทุกกลุ่มที่คุณสังกัดอยู่ stat จะแสดงเจ้าของและกลุ่มของไฟล์ เมื่อเปรียบเทียบทั้งสองค่า คุณจะทราบว่าเคอร์เนลจะใช้ชุดสิทธิ์ใดกับคุณ

นี่คือเหตุผลว่าทำไมไดเรกทอรีที่ใช้ร่วมกันมักจะถูกกำหนดกลุ่มและตั้งค่า setgid bit ไว้ sudo chmod 2775 /srv/shared จะแสดงผลเป็น drwxrwsr-x ซึ่งส่งผลให้ไฟล์ที่ถูกสร้างขึ้นภายในไดเรกทอรีนั้นสืบทอดกลุ่มของไดเรกทอรีแทนที่จะเป็นกลุ่มส่วนตัวของผู้สร้าง เพื่อให้บุคคลถัดไปสามารถเขียนไฟล์เหล่านั้นได้ การกำหนดบัญชีผู้ใช้แยกสำหรับแต่ละบริการเป็นอีกส่วนหนึ่งของแนวทางนี้ ซึ่งได้อธิบายไว้ใน ผู้ใช้ Linux หนึ่งบัญชีต่อหนึ่งบริการบน VPS

umask เป็นตัวกำหนดโหมดของไฟล์ใหม่ทุกไฟล์

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

การแจกจ่ายส่วนใหญ่ใช้ค่า 022 โปรแกรมที่สร้างไฟล์ปกติจะร้องขอโหมด 0666 และโปรแกรมที่สร้างไดเรกทอรีจะร้องขอโหมด 0777 โดย umask จะลบค่า 022 ออกจากทั้งสองคำขอนั้น คุณจึงได้ไฟล์โหมด 644 และไดเรกทอรีโหมด 755 ซึ่งเป็นคู่ค่าที่คุณพบเห็นได้ทั่วไปใน VPS ที่เพิ่งติดตั้งใหม่

umask
umask -S
touch ~/permdemo/new.txt && mkdir -p ~/permdemo/newdir
ls -ld ~/permdemo/new.txt ~/permdemo/newdir

umask -S จะแสดงค่าเดียวกันในรูปแบบตัวอักษร ซึ่งอ่านง่ายกว่า 0022 ให้ตั้งค่า umask 027 ใน ~/.profile เพื่อกำหนดค่าเริ่มต้นที่เข้มงวดขึ้นเป็น 640 สำหรับไฟล์ และ 750 สำหรับไดเรกทอรี เพื่อให้กลุ่มของคุณสามารถอ่านงานของคุณได้ แต่ผู้อื่นไม่สามารถเข้าถึงได้

มีข้อจำกัดสำคัญสองประการ umask สามารถลบได้เฉพาะบิตเท่านั้น ไม่สามารถเพิ่มบิตได้ นี่คือเหตุผลว่าทำไมไฟล์ที่สร้างขึ้นใหม่จึงไม่สามารถรันเป็นโปรแกรมได้ไม่ว่าคุณจะตั้งค่าอย่างไรก็ตาม และเนื่องจาก service ของ systemd ไม่เคยอ่าน shell profile ของคุณ คุณจึงควรตั้งค่านี้ไว้ใน unit file แทน

[Service]
UMask=0027

เหตุผลที่ไฟล์เว็บต้องเป็น 644 และไดเรกทอรีเว็บต้องเป็น 755

เว็บเซิร์ฟเวอร์ทำงานภายใต้บัญชีผู้ใช้ของตนเอง คือ www-data บน Debian และ Ubuntu หรือ nginx บน Rocky และ Alma กระบวนการดังกล่าวจำเป็นต้องมีสิทธิ์อ่านไฟล์ที่ให้บริการและสิทธิ์เข้าถึง (traverse) ไดเรกทอรีที่อยู่เหนือไฟล์เหล่านั้น เว็บเซิร์ฟเวอร์ไม่มีความจำเป็นต้องเขียนไฟล์เหล่านี้ และเว็บไซต์แบบ static ไม่ควรอนุญาตให้ทำเช่นนั้นได้

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

กฎเรื่องการเข้าถึงไดเรกทอรีมีความสำคัญในจุดนี้ หากเว็บไซต์ตั้งอยู่ใน /home/deploy/site และ /home/deploy มีสิทธิ์เป็น 750 เว็บเซิร์ฟเวอร์จะไม่สามารถเข้าถึงไดเรกทอรี home ได้เลย และคำขอจะจบลงด้วย HTTP 403 พร้อมข้อความใน /var/log/nginx/error.log ดังนี้:

open() "/home/deploy/site/index.html" failed (13: Permission denied), client: 203.0.113.5

เลข 13 คือ EACCES ซึ่งเป็นรหัสการปฏิเสธสิทธิ์จาก kernel ไม่มีสิ่งใดผิดปกติกับระบบเครือข่าย พอร์ตเปิดใช้งานอยู่และคำขอมาถึงแล้ว ซึ่งเป็นจุดที่ทำให้เกิดความสับสนในขณะที่คุณกำลังเรียนรู้ วิธีการทำงานของพอร์ตที่เปิดใช้งานบน Linux ให้รันคำสั่ง namei -l /home/deploy/site/index.html แล้วไล่ตรวจสอบตามลำดับชั้นเพื่อหาไดเรกทอรีแรกที่ไม่มีสิทธิ์ x สำหรับผู้อื่น (other)

ไดเรกทอรีที่แอปพลิเคชันต้องเขียนข้อมูลลงไป เช่น เส้นทางสำหรับอัปโหลดไฟล์ ถือเป็นข้อยกเว้น ให้จัดการด้วยการเปลี่ยนความเป็นเจ้าของ (ownership) แทนการขยายสิทธิ์ในโหมดที่กว้างเกินไป: ใช้ sudo chown -R www-data:www-data /srv/site/uploads และคงโหมดไว้ที่ 755 ให้สิทธิ์การเขียนเฉพาะไดเรกทอรีที่จำเป็นต้องใช้เท่านั้น

การใช้ chmod โดยไม่กระทบโครงสร้างไฟล์ทั้งหมด

chmod สามารถใช้งานได้สองรูปแบบ รูปแบบเลขฐานแปด (octal) จะกำหนดบิตทั้ง 9 บิตพร้อมกัน เช่น chmod 644 notes.txt ส่วนรูปแบบสัญลักษณ์ (symbolic) จะเปลี่ยนเฉพาะส่วนที่คุณระบุและคงค่าเดิมไว้ เช่น chmod u+x deploy.sh เป็นการเพิ่มสิทธิ์การรัน (execute) ให้กับเจ้าของไฟล์ และ chmod go-w notes.txt เป็นการลบสิทธิ์การเขียน (write) ออกจากกลุ่ม (group) และผู้อื่น (other)

การใช้คำสั่งแบบเรียกซ้ำ (recursion) มักทำให้โครงสร้างไฟล์เสียหายได้ การใช้ chmod -R 755 . จะทำให้ไฟล์รูปภาพและไฟล์ตั้งค่าทุกไฟล์กลายเป็นไฟล์ที่รันได้ เนื่องจาก chmod ไม่สามารถแยกแยะความแตกต่างระหว่างสคริปต์กับไฟล์ JPEG ได้ ให้ใช้ตัวเลือก X แบบตัวพิมพ์ใหญ่แทน

chmod -R u=rwX,go=rX ~/permdemo
stat -c '%a %n' ~/permdemo ~/permdemo/inner/notes.txt

การใช้ X แบบตัวพิมพ์ใหญ่จะกำหนดสิทธิ์การรันให้กับไดเรกทอรี และไฟล์ที่มีสิทธิ์การรันอยู่ก่อนแล้วเท่านั้น ไดเรกทอรีจะได้สิทธิ์เป็น 755 ไฟล์ทั่วไปจะได้เป็น 644 และสคริปต์ที่เคยรันได้จะยังคงรันได้เหมือนเดิม ในกรณีที่คุณมีไฟล์ต้นแบบที่เชื่อถือได้อยู่แล้ว คุณสามารถใช้ chmod --reference=good.sh other.sh เพื่อคัดลอกสิทธิ์จากไฟล์นั้นไปใช้กับไฟล์อื่นได้

ข้อความที่คุณพบเมื่อบิตสิทธิ์ไม่ถูกต้อง

bash: ./deploy.sh: Permission denied หมายความว่าสคริปต์ไม่มีบิต x ในชุดสิทธิ์ที่เกี่ยวข้องกับคุณ หรือไดเรกทอรีในพาธนั้นไม่มีบิต x การใช้ chmod u+x deploy.sh จะแก้ไขกรณีแรกได้

bash: ./deploy.sh: cannot execute: required file not found เป็นข้อผิดพลาดที่ต่างออกไปและมีชื่อที่ชวนให้สับสน บิต x นั้นถูกต้องแล้ว แต่ตัวแปลภาษา (interpreter) ที่ระบุไว้ในบรรทัดแรกนั้นหาไม่พบ สาเหตุทั่วไปคือการใช้รูปแบบการขึ้นบรรทัดใหม่แบบ Windows ทำให้เคอร์เนลพยายามค้นหาตัวแปลภาษาที่ชื่อว่า /bin/bash\r ให้แก้ไขด้วยคำสั่ง sed -i 's/\r$//' deploy.sh

Permissions 0644 for '/home/deploy/.ssh/id_ed25519' are too open. มาจาก SSH client ซึ่งปฏิเสธที่จะใช้ private key ที่บัญชีอื่นสามารถอ่านได้ ไฟล์ key ต้องการสิทธิ์ 600 และไดเรกทอรี ~/.ssh ต้องการสิทธิ์ 700 รายละเอียดการจัดการ key ทั้งหมดอยู่ใน การจัดการ SSH keys และสิทธิ์ของไฟล์

Authentication refused: bad ownership or modes for directory /home/deploy/.ssh จะปรากฏใน journal ของเซิร์ฟเวอร์เมื่อโฮมไดเรกทอรีหรือไดเรกทอรี .ssh ของผู้ใช้เปิดสิทธิ์ให้กลุ่มเขียนได้ การตั้งค่า StrictModes ของ sshd จะปฏิเสธ key ดังกล่าว ซึ่งในฝั่งไคลเอนต์จะดูเหมือนการถามรหัสผ่านโดยไม่คาดคิดและไม่มีคำอธิบายใดๆ

sudo: /etc/sudoers is world writable ตามด้วย sudo: no valid sudoers sources found, quitting หมายความว่า sudo ตรวจสอบโหมดของไฟล์คอนฟิกของตัวเองแล้วปฏิเสธที่จะทำงาน ไฟล์นั้นต้องมีสิทธิ์เป็น 0440 นี่เป็นผลลัพธ์คลาสสิกจากการใช้คำสั่ง chmod แบบ recursive ในวงกว้าง และอาจเกิดขึ้นพร้อมกับข้อความของ sshd ข้างต้น ซึ่งจะทำให้คอนโซลของผู้ให้บริการเป็นช่องทางเดียวที่เหลืออยู่ในการเข้าถึงระบบ

เหตุผลที่ 777 ไม่ใช่วิธีแก้ไขปัญหา

การตั้งค่า 777 จะให้สิทธิ์การเขียนแก่ทุกบัญชีบนเครื่อง รวมถึงทุกกระบวนการ (process) ที่ทำงานภายใต้บัญชีเหล่านั้น เซิร์ฟเวอร์จะรันบริการต่างๆ ด้วยผู้ใช้ของตนเอง ดังนั้นคำว่า "ทุกคน" (everyone) บน VPS จึงครอบคลุมขอบเขตที่กว้างกว่าบนแล็ปท็อปมาก หากบริการใดถูกบุกรุก ผู้บุกรุกจะสามารถเขียนข้อมูลลงในที่ใดก็ตามที่สิทธิ์ 777 อนุญาต

ภายใต้ web root ความเสียหายจะเกิดขึ้นโดยตรง ไดเรกทอรีที่ทุกคนเขียนได้และเซิร์ฟเวอร์ยังให้บริการไฟล์ในนั้น หมายความว่าช่องโหว่จากการอัปโหลดไฟล์จะกลายเป็นช่องทางในการฝัง script และเรียกใช้งานได้ในภายหลัง

777 เกือบจะเป็นคำตอบที่ผิดเสมอสำหรับปัญหาเรื่องความเป็นเจ้าของไฟล์ อาการที่พบคือ "แอปพลิเคชันไม่สามารถเขียนข้อมูลลงในไดเรกทอรีนี้ได้" สาเหตุที่แท้จริงคือไดเรกทอรีนั้นเป็นของผู้ใช้ที่ไม่ถูกต้อง การใช้ sudo chown -R appuser:appuser /srv/app/storage ร่วมกับโหมด 755 จะช่วยแก้ไขปัญหานี้และป้องกันไม่ให้บัญชีอื่นเข้าถึงได้ การสร้างบัญชีเหล่านั้นก่อนเริ่มติดตั้งใช้งานเป็นขั้นตอนที่อยู่ใน สิบนาทีแรกบน VPS เครื่องใหม่

สิทธิ์การเขียนแบบสาธารณะ (world write) เป็นสิ่งที่ยอมรับได้ในที่เดียวที่คุ้นเคย คือ /tmp ซึ่งเขียนด้วยสิทธิ์ drwxrwxrwt โดยที่ t ต่อท้ายคือ sticky bit ซึ่งหมายความว่าไดเรกทอรีนี้ทุกคนสามารถเขียนได้ แต่ผู้ใช้จะลบได้เฉพาะไฟล์ที่ตนเองเป็นเจ้าของเท่านั้น หากไม่มี bit นี้ บัญชีใดก็ตามจะสามารถลบไฟล์ชั่วคราวของบัญชีอื่นได้

อ่านโหมดก่อนทำการเปลี่ยนแปลง

คำสั่งเหล่านี้ทำหน้าที่เพียงอ่านสถานะเท่านั้น จึงปลอดภัยที่จะเรียกใช้งานในทุกที่

id
umask
stat -c '%A %a %U %G %n' ~/permdemo ~/permdemo/inner/notes.txt
namei -l ~/permdemo/inner/notes.txt
find ~/permdemo -perm -0002

find <path> -perm -0002 จะแสดงรายการทุกอย่างภายใต้ path ที่มีการตั้งค่า world write bit ไว้ ซึ่งเป็นวิธีที่รวดเร็วที่สุดในการตรวจสอบระบบหลังจากที่มีการแก้ไขสิ่งต่างๆ ด้วย chmod 777

หากต้องการตรวจสอบว่า service account ใดสามารถเข้าถึง directory ได้หรือไม่ ให้เรียกใช้คำสั่งในฐานะบัญชีผู้ใช้นั้น sudo -u www-data test -x /srv/site && echo yes || echo no จะแสดงผล yes เมื่อผู้ใช้นั้นมีสิทธิ์ traverse ใน directory ดังกล่าว และแสดง no เมื่อไม่มีสิทธิ์ การตรวจสอบในฐานะ root จะไม่สามารถพิสูจน์อะไรได้ เนื่องจาก root จะข้ามการตรวจสอบสิทธิ์นี้และได้คำตอบเป็น yes เสมอ

FAQ

d drwxr-xr-x ใน Linux หมายความว่าอย่างไร

มันคือไดเรกทอรี ซึ่งระบุโดย d ที่อยู่ตำแหน่งแรก โดยมีโหมดเป็น 755 กลุ่มสิทธิ์ของเจ้าของคือ rwx ดังนั้นเจ้าของจึงมีสิทธิ์ทุกอย่างบนไดเรกทอรีนี้ กลุ่มสิทธิ์ของกลุ่มผู้ใช้คือ r-x และกลุ่มสิทธิ์ของผู้อื่นคือ r-x ดังนั้นทุกคนสามารถแสดงรายการไฟล์ภายในและเข้าถึงไดเรกทอรีนี้ได้ แต่ไม่มีใครนอกจากเจ้าของที่สามารถเพิ่มหรือลบไฟล์ใดๆ ได้ คุณสามารถตรวจสอบสิทธิ์ของ path ใดๆ ได้ด้วย stat -c '%A %a %U %G %n' <path> ซึ่งจะแสดงรูปแบบตัวอักษรและรูปแบบเลขฐานแปดควบคู่กันไป

ทำไมไฟล์บนเว็บถึงต้องเป็น 644 และไดเรกทอรีบนเว็บถึงต้องเป็น 755

เว็บเซิร์ฟเวอร์ทำงานภายใต้บัญชีผู้ใช้ที่แตกต่างกัน เช่น www-data บน Ubuntu มันต้องการสิทธิ์อ่านไฟล์ที่ให้บริการและสิทธิ์เข้าถึง (traverse) ไดเรกทอรีทุกชั้นที่อยู่เหนือไฟล์เหล่านั้น โดยไม่มีความจำเป็นต้องเขียนข้อมูลใดๆ สิทธิ์ 644 ให้สิทธิ์เจ้าของในการเขียนและให้ผู้อื่นอ่านได้ สิทธิ์ 755 ให้สิทธิ์เจ้าของในการเขียนและให้ผู้อื่นเข้าถึงได้ ไดเรกทอรีที่แอปพลิเคชันจำเป็นต้องเขียนข้อมูลลงไปจริงๆ ควรเปลี่ยนความเป็นเจ้าของด้วย chown ให้เป็นของผู้ใช้ที่รันแอปพลิเคชันนั้น แทนที่จะขยายสิทธิ์ให้ทุกคน

บิต x หมายความว่าฉันสามารถรันไดเรกทอรีได้หรือไม่

ไม่ บิต x บนไดเรกทอรีหมายถึงการเข้าถึง (traverse) ซึ่งเป็นสิทธิ์ในการระบุชื่อไฟล์ภายในไดเรกทอรีขณะที่เคอร์เนลไล่ตาม path cd จำเป็นต้องใช้สิทธิ์นี้ รวมถึงการเปิดไฟล์ทุกครั้งที่อยู่ภายใต้ไดเรกทอรีนั้น ไดเรกทอรีทุกชั้นตลอด path จำเป็นต้องมี x ดังนั้นไฟล์ที่มีโหมด 644 จึงยังคงไม่สามารถเข้าถึงได้หากไดเรกทอรีที่อยู่เหนือขึ้นไปขาดสิทธิ์ x สำหรับคุณ namei -l /path/to/file จะแสดงโหมดของทุกไดเรกทอรีในลำดับชั้น ซึ่งจะแสดงให้เห็นว่าการค้นหาหยุดลงที่จุดใด

การใช้ chmod 777 เป็นวิธีแก้ไขที่ถูกต้องหรือไม่

แทบจะไม่เคยเลยบนเซิร์ฟเวอร์ มันเป็นการให้สิทธิ์เขียนแก่ทุกบัญชีบนเครื่อง รวมถึงบัญชีที่บริการต่างๆ ใช้งานอยู่ ดังนั้นหากบริการหนึ่งถูกเจาะระบบ ก็สามารถเขียนทับไฟล์นั้นได้ เมื่อแอปพลิเคชันไม่สามารถเขียนไดเรกทอรีได้ ปัญหาที่แท้จริงมักจะเป็นเรื่องความเป็นเจ้าของ การใช้ sudo chown -R appuser:appuser /srv/app/storage ร่วมกับโหมด 755 จะให้สิ่งที่แอปพลิเคชันต้องการโดยไม่เปิดช่องว่างให้ผู้อื่น ข้อยกเว้นที่คุ้นเคยคือ /tmp ที่โหมด 1777 ซึ่งทำงานได้เพราะ sticky bit ช่วยป้องกันไม่ให้ผู้ใช้ลบไฟล์ของกันและกัน

ทำไม ls ถึงแสดงจุดหรือเครื่องหมายบวกหลังสิทธิ์

อักขระตัวที่สิบเอ็ดนั้นอธิบายกฎที่นอกเหนือไปจากบิตสิทธิ์ทั้งเก้า จุดอย่างเช่นใน drwxr-xr-x. หมายความว่ามีการแนบ SELinux security context ไว้ ซึ่งเป็นเรื่องปกติบน Fedora และ Rocky เครื่องหมายบวกอย่างเช่นใน drwxr-xr-x+ หมายความว่ามีการตั้งค่า POSIX ACL (access control list) ไว้ ดังนั้นผู้ใช้หรือกลุ่มบางกลุ่มจึงมีสิทธิ์ที่กลุ่มสิทธิ์ทั้งสามไม่ได้แสดงไว้ ให้รัน getfacl <path> เพื่อแสดงรายการสิทธิ์เพิ่มเติมเหล่านั้น

#permissions#ls#chmod#linux-basics#octal