คู่มือ

สิทธิ์การเข้าถึงไฟล์ใน Linux: chmod, chown และ sudo พร้อมตัวอย่าง

อัปเดต: · Skillaria.Top

สิทธิ์การเข้าถึงไฟล์ใน Linux กำหนดด้วยสามชุด rwx สำหรับเจ้าของ กลุ่ม และผู้อื่น เปลี่ยนด้วย chmod ได้ทั้งแบบสัญลักษณ์ (chmod u+x) และแบบตัวเลข (chmod 755 โดย r=4, w=2, x=1) เจ้าของเปลี่ยนด้วย chown และการทำงานระดับผู้ดูแลระบบใช้ sudo ข้อความ Permission denied มักหมายความว่าผู้ใช้ไม่มีสิทธิ์ที่ต้องการบนไฟล์หรือบนไดเรกทอรีใดไดเรกทอรีหนึ่งในพาธ

สิทธิ์การเข้าถึงไฟล์ใน Linux ตอบคำถามว่า "ใครทำอะไรกับไฟล์นี้ได้บ้าง" ทุกไฟล์มีเจ้าของ กลุ่ม และสิทธิ์สามชุด ได้แก่ ของเจ้าของ ของกลุ่ม และของผู้อื่นทั้งหมด สิทธิ์เปลี่ยนได้ด้วย chmod เจ้าของเปลี่ยนด้วย chown และการทำงานในฐานะผู้ดูแลระบบใช้ sudo บทความนี้จะอธิบายวิธีอ่านสิทธิ์ วิธีเปลี่ยน และวิธีแก้ข้อผิดพลาด Permission denied

วิธีดูสิทธิ์ของไฟล์

สิทธิ์แสดงในผลลัพธ์ของ ls -l:

$ ls -l
-rw-r--r-- 1 alice developers  1204 Oct 10 14:02 notes.txt
-rwxr-xr-x 1 alice developers   356 Oct 10 14:05 deploy.sh
drwxr-x--- 2 alice developers  4096 Oct 10 13:50 secrets

ตัวอักษรสิบตัวแรกอ่านได้ดังนี้:

  • ตัวแรก — ชนิด: - คือไฟล์ปกติ d คือไดเรกทอรี l คือ symbolic link
  • ตัวที่ 2–4 — สิทธิ์ของเจ้าของ (user)
  • ตัวที่ 5–7 — สิทธิ์ของกลุ่ม (group)
  • ตัวที่ 8–10 — สิทธิ์ของผู้อื่น (others)

ถัดไปคือจำนวน hard link เจ้าของ (alice) กลุ่ม (developers) ขนาด วันที่ และชื่อ สำหรับไฟล์เดียว คำสั่ง stat สะดวกกว่า:

$ stat -c '%A %a %U:%G %n' deploy.sh
-rwxr-xr-x 755 alice:developers deploy.sh

ความหมายของ r, w และ x

ความหมายของสิทธิ์ต่างกันระหว่างไฟล์และไดเรกทอรี ซึ่งเป็นสาเหตุหลักของความสับสน

สิทธิ์สำหรับไฟล์สำหรับไดเรกทอรี
r (read)อ่านเนื้อหาดูรายชื่อไฟล์ (ls)
w (write)แก้ไขเนื้อหาสร้าง ลบ และเปลี่ยนชื่อไฟล์ข้างใน
x (execute)รันเป็นโปรแกรมเข้าไปในไดเรกทอรี (cd) และเข้าถึงไฟล์ด้วยพาธ

ข้อสังเกต: ผู้ที่มีสิทธิ์ w และ x บนไดเรกทอรี สามารถลบไฟล์ได้ แม้จะไม่มีสิทธิ์เขียนในตัวไฟล์นั้น และหากไดเรกทอรีไม่มี x จะเปิดไฟล์ข้างในไม่ได้ แม้ไฟล์จะอนุญาตให้อ่านก็ตาม

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

รูปแบบตัวเลขของสิทธิ์: 755, 644, 600

สิทธิ์แต่ละตัวมีค่าน้ำหนัก: r = 4, w = 2, x = 1 ผลรวมของค่าเหล่านี้ได้ตัวเลขตั้งแต่ 0 ถึง 7 สำหรับแต่ละชุดทั้งสามชุด

ตัวเลขสิทธิ์การคำนวณ
7rwx4+2+1
6rw-4+2
5r-x4+1
4r--4
0---0

ชุดสิทธิ์ที่ควรจำให้ได้:

โหมดรูปแบบใช้กับอะไร
644rw-r--r--ไฟล์ทั่วไป การตั้งค่า HTML
755rwxr-xr-xไดเรกทอรี script และโปรแกรม
600rw-------กุญแจ SSH ส่วนตัว ไฟล์ที่มีรหัสผ่าน
700rwx------ไดเรกทอรี ~/.ssh ไดเรกทอรีส่วนตัว
640rw-r-----การตั้งค่าที่กลุ่มของบริการต้องอ่าน
777rwxrwxrwxทุกคนทำได้ทุกอย่าง — แทบไม่จำเป็นต้องใช้

คำสั่ง chmod: เปลี่ยนสิทธิ์

แบบตัวเลข

รูปแบบตัวเลขกำหนดสิทธิ์ทั้งชุดในครั้งเดียว:

chmod 644 index.html
chmod 755 deploy.sh
chmod 600 ~/.ssh/id_ed25519

แบบสัญลักษณ์

รูปแบบสัญลักษณ์เปลี่ยนเฉพาะจุดโดยไม่กระทบส่วนอื่น ผู้รับผลกระทบ: u เจ้าของ g กลุ่ม o ผู้อื่น a ทุกคน การกระทำ: + เพิ่ม - ลบ = กำหนดให้ตรงตามที่ระบุ

chmod +x deploy.sh        # อนุญาตให้รัน
chmod u+x,g-w file        # เจ้าของรันได้ กลุ่มเขียนไม่ได้
chmod o-rwx secrets/      # ผู้อื่นไม่มีสิทธิ์ใดๆ
chmod g=rx app/           # กลุ่มอ่านและเข้าไปได้เท่านั้น

แบบเรียกซ้ำ: ไฟล์และไดเรกทอรีต่างกัน

ตัวเลือก -R ใช้สิทธิ์กับทั้งต้นไม้ไดเรกทอรี แต่ chmod -R 755 จะทำให้ทุกไฟล์รันได้ ซึ่งมักไม่ต้องการ วิธีที่ถูกต้องคือแยกไฟล์และไดเรกทอรีด้วย find:

find /srv/site -type d -exec chmod 755 {} +
find /srv/site -type f -exec chmod 644 {} +

มีอีกวิธีที่สั้นกว่า: อักษรพิมพ์ใหญ่ X เพิ่มสิทธิ์รันเฉพาะให้ไดเรกทอรี และไฟล์ที่มีสิทธิ์รันอยู่แล้ว

chmod -R u=rwX,go=rX /srv/site

คำสั่ง chown: เปลี่ยนเจ้าของและกลุ่ม

มีเพียง root เท่านั้นที่เปลี่ยนเจ้าของของไฟล์ได้ ดังนั้น chown มักรันผ่าน sudo เสมอ

sudo chown alice report.txt               # เจ้าของ
sudo chown alice:developers report.txt    # เจ้าของและกลุ่ม
sudo chown :www-data index.html           # เฉพาะกลุ่ม
sudo chown -R www-data:www-data /var/www/site

หากต้องการเปลี่ยนเฉพาะกลุ่มใช้คำสั่ง chgrp: sudo chgrp developers report.txt ดูกลุ่มของคุณได้ด้วย id หรือ groups

$ id
uid=1000(alice) gid=1000(alice) groups=1000(alice),27(sudo),1001(developers)

เพิ่มผู้ใช้เข้ากลุ่มด้วย sudo usermod -aG developers bob ตัวเลือก -a จำเป็นมาก หากไม่มี ผู้ใช้จะถูกลบออกจากกลุ่มเสริมอื่นทั้งหมด กลุ่มใหม่จะมีผลหลังจากล็อกอินอีกครั้ง

sudo: การทำงานในฐานะผู้ดูแลระบบ

sudo รันคำสั่งเดียวด้วยสิทธิ์ root (หรือผู้ใช้อื่น) และถามรหัสผ่านของคุณเอง ไม่ใช่รหัสผ่านของ root ทุกการเรียกถูกบันทึกในล็อก จึงรู้ได้ว่าใครทำอะไร

sudo apt update
sudo systemctl restart nginx
sudo -u postgres psql       # ในฐานะผู้ใช้ postgres
sudo -i                     # shell แบบโต้ตอบของ root
sudo -l                     # สิ่งที่ฉันได้รับอนุญาตให้ทำ

ใครทำอะไรได้ถูกกำหนดไว้ใน /etc/sudoers และในไฟล์ของไดเรกทอรี /etc/sudoers.d/ ควรแก้ไขเฉพาะด้วย sudo visudo เพราะคำสั่งนี้ตรวจไวยากรณ์ก่อนบันทึก ข้อผิดพลาดในไฟล์จึงไม่ทำให้คุณเสียสิทธิ์ sudo บน Ubuntu ให้สิทธิ์ sudo ผ่านการอยู่ในกลุ่ม sudo ส่วนระบบตระกูล RHEL ใช้กลุ่ม wheel

# /etc/sudoers.d/deploy — ผู้ใช้ deploy รีสตาร์ต nginx ได้เท่านั้น
deploy ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx

ทำไม sudo echo > file ไม่ทำงาน

กับดักที่พบบ่อย:

$ sudo echo "127.0.0.1 test.local" >> /etc/hosts
bash: /etc/hosts: Permission denied

การเปลี่ยนทิศทาง >> ทำโดย shell ของคุณ ไม่ใช่ sudo ไฟล์จึงถูกเปิดโดยไม่มีสิทธิ์ root วิธีที่ถูกคือใช้ tee:

echo "127.0.0.1 test.local" | sudo tee -a /etc/hosts

Permission denied: สาเหตุและวิธีแก้

ข้อผิดพลาด Permission denied หมายความว่า kernel ปฏิเสธการทำงานของโปรเซสของคุณ ขั้นตอนการวินิจฉัยเหมือนเดิมเสมอ: ฉันเป็นใคร (id) เจ้าของและสิทธิ์เป็นอย่างไร (ls -l) และสิทธิ์ของแต่ละไดเรกทอรีในพาธเป็นอย่างไร (namei -l)

$ namei -l /srv/app/config/app.env
f: /srv/app/config/app.env
drwxr-xr-x root  root  /
drwxr-xr-x root  root  srv
drwxr-x--- deploy deploy app
drwxr-xr-x deploy deploy config
-rw-r----- deploy deploy app.env

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

Script รันไม่ได้

$ ./deploy.sh
bash: ./deploy.sh: Permission denied

ไฟล์ยังไม่มีสิทธิ์รัน วิธีแก้คือ chmod +x deploy.sh หรือรันผ่านตัวแปลภาษา: bash deploy.sh หากพาร์ทิชันถูกเมานต์ด้วยตัวเลือก noexec (พบบ่อยกับ /tmp) จะรันไฟล์โดยตรงไม่ได้ ต้องใช้วิธีที่สองเท่านั้น

เขียนลงไดเรกทอรีของระบบไม่ได้

ไฟล์ใน /etc, /usr, /var/www เป็นของ root หรือผู้ใช้บริการของระบบ ใช้ sudo สำหรับการแก้ไขครั้งเดียว และสำหรับงานระยะยาวให้สิทธิ์แก่กลุ่ม ไม่ใช่แก่ทุกคน

เว็บเซิร์ฟเวอร์ตอบ 403

Nginx หรือ Apache ทำงานภายใต้ผู้ใช้ www-data (บน Debian และ Ubuntu) ผู้ใช้นี้ต้องมีสิทธิ์อ่านไฟล์และ x บนทุกไดเรกทอรีในพาธ วิธีแก้: sudo chown -R www-data:www-data /var/www/site หรือกำหนดสิทธิ์ 755 ให้ไดเรกทอรีและ 644 ให้ไฟล์

SSH ไม่ยอมรับกุญแจ

SSH ปฏิเสธการใช้กุญแจที่มีสิทธิ์เปิดกว้างเกินไป กุญแจส่วนตัวต้องมีสิทธิ์ 600 ไดเรกทอรี ~/.ssh ต้องเป็น 700 และไฟล์ authorized_keys บนเซิร์ฟเวอร์ต้องเป็น 600

chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519 ~/.ssh/authorized_keys

ไม่มีสิทธิ์เข้าถึง Docker

ข้อความ permission denied while trying to connect to the Docker daemon socket หมายความว่าคุณไม่ได้อยู่ในกลุ่ม docker ให้รัน sudo usermod -aG docker $USER แล้วล็อกอินใหม่ โปรดทราบว่าการเป็นสมาชิกของกลุ่มนี้เทียบเท่ากับสิทธิ์ root โดยพฤตินัย

ทำไม chmod 777 จึงเป็นความคิดที่ไม่ดี

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

umask: สิทธิ์เริ่มต้น

ไฟล์ใหม่ได้รับสิทธิ์โดยพิจารณาจากค่ามาสก์ umask ด้วยค่าปกติ 022 ไฟล์จะถูกสร้างด้วยสิทธิ์ 644 และไดเรกทอรีด้วย 755

$ umask
0022

สรุป

สิทธิ์การเข้าถึงใน Linux คือชุด rwx สามชุดสำหรับเจ้าของ กลุ่ม และผู้อื่น chmod เปลี่ยนสิทธิ์ด้วยรูปแบบตัวเลข (755, 644, 600) หรือสัญลักษณ์ chown เปลี่ยนเจ้าของ และ sudo ให้รันคำสั่งเดียวด้วยสิทธิ์ root เมื่อพบ Permission denied ให้ตรวจผู้ใช้ สิทธิ์ของไฟล์และของทุกไดเรกทอรีในพาธ และอย่าแก้ด้วย 777 การใช้ผู้ใช้ กลุ่ม สิทธิ์ และ sudo ถูกสอนอย่างละเอียดในหลักสูตร Linux

คำถามที่พบบ่อย

คำสั่ง chmod 755 หมายความว่าอย่างไร?

เจ้าของอ่าน เขียน และรันได้ (7) ส่วนกลุ่มและผู้อื่นอ่านและรันได้ (5) นี่คือชุดสิทธิ์มาตรฐานสำหรับไดเรกทอรีและ script

chmod ต่างจาก chown อย่างไร?

chmod เปลี่ยนสิทธิ์ (ใครทำอะไรกับไฟล์ได้) ส่วน chown เปลี่ยนเจ้าของและกลุ่ม (สิทธิ์นั้นเป็นของใคร)

จะให้สิทธิ์ sudo แก่ผู้ใช้ได้อย่างไร?

บน Ubuntu และ Debian เพิ่มเข้ากลุ่ม sudo ด้วย sudo usermod -aG sudo ชื่อผู้ใช้ ส่วนระบบตระกูล RHEL เพิ่มเข้ากลุ่ม wheel การเปลี่ยนแปลงมีผลหลังจากล็อกอินอีกครั้ง

สิทธิ์ 4755 และบิต SUID คืออะไร?

เลข 4 ตัวแรกเปิด SUID ทำให้โปรแกรมรันด้วยสิทธิ์ของเจ้าของไฟล์ ไม่ใช่ของผู้ที่สั่งรัน passwd ทำงานแบบนี้ และในผลลัพธ์ของ ls ตำแหน่ง x ของเจ้าของจะแสดงเป็น s

ทำไม root จึงอ่านไฟล์ที่มีสิทธิ์ 000 ได้?

kernel ไม่ตรวจสิทธิ์อ่านและเขียนทั่วไปสำหรับ root สามารถจำกัด root ได้ด้วยกลไกอื่น เช่น SELinux, AppArmor หรือแอตทริบิวต์ไม่เปลี่ยนแปลง chattr +i

เรียนหัวข้อนี้ผ่านวิดีโอ

หัวข้อนี้สอนอย่างละเอียดพร้อมฝึกปฏิบัติในคอร์ส “Linux: с нуля до уверенного администрирования”

ไปที่คอร์ส