Hướng dẫn

Quyền truy cập trong Linux: chmod, chown và sudo qua ví dụ

Cập nhật: · Skillaria.Top

Quyền truy cập trong Linux được xác định bởi ba nhóm rwx — cho chủ sở hữu, nhóm và những người khác; thay đổi bằng chmod ở dạng ký hiệu (chmod u+x) hoặc dạng số (chmod 755, trong đó r=4, w=2, x=1). Chủ sở hữu được đổi bằng chown, còn thao tác với quyền quản trị thực hiện qua sudo; lỗi Permission denied hầu như luôn có nghĩa là người dùng thiếu quyền cần thiết trên tệp hoặc trên một thư mục trong đường dẫn.

Quyền truy cập trong Linux trả lời câu hỏi "ai được làm gì với tệp này". Mỗi tệp có một chủ sở hữu, một nhóm và ba bộ quyền: cho chủ sở hữu, cho nhóm và cho tất cả những người khác. Quyền được thay đổi bằng lệnh chmod, chủ sở hữu bằng lệnh chown, còn thao tác với quyền quản trị thực hiện qua sudo. Bài này hướng dẫn cách đọc quyền, cách thay đổi và cách xử lý lỗi Permission denied.

Cách xem quyền của tệp

Quyền hiển thị trong kết quả của 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

Mười ký tự đầu tiên được đọc như sau:

  • Ký tự đầu — loại: - là tệp thông thường, d là thư mục, l là liên kết mềm.
  • Ký tự 2–4 — quyền của chủ sở hữu (user).
  • Ký tự 5–7 — quyền của nhóm (group).
  • Ký tự 8–10 — quyền của những người khác (others).

Tiếp theo là số liên kết cứng, chủ sở hữu (alice), nhóm (developers), kích thước, ngày giờ và tên. Với một tệp cụ thể, lệnh stat tiện hơn:

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

Ý nghĩa của r, w và x

Ý nghĩa của quyền khác nhau giữa tệp và thư mục — đây là nguyên nhân chính gây nhầm lẫn.

QuyềnVới tệpVới thư mục
r (read)đọc nội dungxem danh sách tệp (ls)
w (write)thay đổi nội dungtạo, xóa và đổi tên tệp bên trong
x (execute)chạy như chương trìnhđi vào thư mục (cd) và truy cập tệp qua đường dẫn

Lưu ý: người có quyền w và x trên thư mục có thể xóa một tệp ngay cả khi họ không được ghi vào chính tệp đó. Còn nếu thư mục thiếu x, bạn không thể mở tệp bên trong dù quyền của tệp cho phép đọc.

Hệ thống kiểm tra quyền theo thứ tự: nếu bạn là chủ sở hữu thì áp dụng quyền của chủ sở hữu; nếu không, nhưng bạn thuộc nhóm của tệp thì áp dụng quyền của nhóm; còn lại áp dụng quyền của những người khác. Người dùng root bỏ qua kiểm tra quyền đọc và ghi.

Dạng số của quyền: 755, 644, 600

Mỗi quyền có trọng số: r = 4, w = 2, x = 1. Tổng trọng số cho ra một chữ số từ 0 đến 7 cho mỗi nhóm trong ba nhóm.

Chữ sốQuyềnCách tính
7rwx4+2+1
6rw-4+2
5r-x4+1
4r--4
0---0

Các bộ quyền thông dụng nên ghi nhớ:

Chế độDạngDùng ở đâu
644rw-r--r--tệp thông thường, cấu hình, HTML
755rwxr-xr-xthư mục, script và chương trình
600rw-------khóa SSH riêng tư, tệp chứa mật khẩu
700rwx------thư mục ~/.ssh, thư mục cá nhân
640rw-r-----cấu hình mà nhóm của dịch vụ cần đọc
777rwxrwxrwxcho tất cả mọi thứ — hầu như không bao giờ cần

Lệnh chmod: thay đổi quyền

Dạng số

Dạng số đặt quyền một lần cho cả bộ:

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

Dạng ký hiệu

Dạng ký hiệu thay đổi từng phần mà không động đến các phần khác. Đối tượng: u chủ sở hữu, g nhóm, o những người khác, a tất cả. Thao tác: + thêm, - bỏ, = đặt đúng như vậy.

chmod +x deploy.sh        # cho phép chạy
chmod u+x,g-w file        # chủ sở hữu được chạy, nhóm bỏ quyền ghi
chmod o-rwx secrets/      # những người khác không có quyền gì
chmod g=rx app/           # nhóm chỉ được đọc và đi vào

Đệ quy: tệp và thư mục khác nhau

Tùy chọn -R áp dụng quyền cho toàn bộ cây thư mục. Nhưng chmod -R 755 sẽ làm mọi tệp thành có thể thực thi, thường không cần thiết. Cách đúng là tách tệp và thư mục bằng find:

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

Còn có cách ngắn hơn: ký tự viết hoa X chỉ thêm quyền thực thi cho thư mục và những tệp đã có sẵn quyền đó.

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

Lệnh chown: đổi chủ sở hữu và nhóm

Chỉ root mới đổi được chủ sở hữu của tệp, nên chown hầu như luôn chạy qua sudo.

sudo chown alice report.txt               # chủ sở hữu
sudo chown alice:developers report.txt    # chủ sở hữu và nhóm
sudo chown :www-data index.html           # chỉ nhóm
sudo chown -R www-data:www-data /var/www/site

Để chỉ đổi nhóm có lệnh riêng chgrp: sudo chgrp developers report.txt. Các nhóm của bạn xem bằng id hoặc groups.

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

Thêm người dùng vào nhóm: sudo usermod -aG developers bob. Tùy chọn -a là bắt buộc: thiếu nó, người dùng sẽ bị xóa khỏi tất cả các nhóm phụ khác. Nhóm mới có hiệu lực sau khi đăng nhập lại.

sudo: thao tác với quyền quản trị

sudo chạy một lệnh với quyền root (hoặc người dùng khác) và hỏi mật khẩu của chính bạn, không phải mật khẩu root. Mọi lần gọi đều được ghi vào nhật ký, nên có thể biết ai đã làm gì.

sudo apt update
sudo systemctl restart nginx
sudo -u postgres psql       # với tư cách người dùng postgres
sudo -i                     # shell tương tác của root
sudo -l                     # những gì tôi được phép làm

Ai được làm gì được mô tả trong /etc/sudoers và các tệp trong thư mục /etc/sudoers.d/. Chỉ nên sửa các tệp này bằng sudo visudo: lệnh kiểm tra cú pháp trước khi lưu, nên lỗi trong tệp không làm bạn mất quyền sudo. Trên Ubuntu, quyền sudo được cấp bằng cách thêm vào nhóm sudo; trên họ RHEL là nhóm wheel.

# /etc/sudoers.d/deploy — người dùng deploy chỉ được khởi động lại nginx
deploy ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx

Vì sao sudo echo > file không hoạt động

Một cái bẫy phổ biến:

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

Toán tử chuyển hướng >> do shell của bạn thực hiện, không phải sudo, nên tệp được mở mà không có quyền root. Cách đúng là dùng tee:

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

Permission denied: nguyên nhân và cách khắc phục

Lỗi Permission denied có nghĩa là kernel từ chối thao tác của tiến trình bạn. Quy trình chẩn đoán luôn giống nhau: tôi là ai (id), chủ sở hữu và quyền là gì (ls -l), và quyền trên từng thư mục của đường dẫn ra sao (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

Ở đây có thể thấy thư mục app đóng với những người khác — người dùng không thuộc nhóm deploy không thể đi qua, bất kể quyền của chính tệp là gì.

Script không chạy được

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

Tệp chưa có quyền thực thi. Cách xử lý: chmod +x deploy.sh, hoặc chạy qua trình thông dịch: bash deploy.sh. Nếu phân vùng được gắn với tùy chọn noexec (thường gặp với /tmp), không thể chạy trực tiếp tệp, chỉ có cách thứ hai là khả thi.

Không ghi được vào thư mục hệ thống

Các tệp trong /etc, /usr, /var/www thuộc về root hoặc người dùng dịch vụ. Với chỉnh sửa một lần, hãy dùng sudo; với công việc lâu dài, hãy cấp quyền cho một nhóm, không phải cho tất cả mọi người.

Web server trả về 403

Nginx hoặc Apache chạy dưới người dùng www-data (trên Debian và Ubuntu). Người dùng này cần quyền đọc tệp và x trên mọi thư mục trong đường dẫn. Cách sửa: sudo chown -R www-data:www-data /var/www/site, hoặc đặt quyền 755 cho thư mục và 644 cho tệp.

SSH không chấp nhận khóa

SSH từ chối dùng khóa có quyền quá rộng. Khóa riêng tư phải có quyền 600, thư mục ~/.ssh là 700, tệp authorized_keys trên máy chủ là 600.

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

Không có quyền truy cập Docker

Thông báo permission denied while trying to connect to the Docker daemon socket cho biết bạn không thuộc nhóm docker. Chạy sudo usermod -aG docker $USER rồi đăng nhập lại. Lưu ý rằng thành viên nhóm này thực tế có quyền tương đương root.

Vì sao chmod 777 là ý tồi

Lời khuyên "cứ chmod 777 là xong" giải quyết được lỗi nhưng mở tệp cho mọi người dùng và mọi tiến trình trong hệ thống cùng ghi. Nếu ứng dụng web bị tấn công, kẻ xấu có thể thay thế những tệp như vậy. Cách đúng là xác định người dùng nào thực sự cần truy cập và cấp quyền cho đúng người đó, qua chủ sở hữu hoặc nhóm.

umask: quyền mặc định

Tệp mới nhận quyền theo mặt nạ umask. Với giá trị thông thường 022, tệp được tạo với quyền 644, còn thư mục với quyền 755.

$ umask
0022

Tóm lại

Quyền truy cập trong Linux gồm ba bộ rwx cho chủ sở hữu, nhóm và những người khác. chmod thay đổi quyền ở dạng số (755, 644, 600) hoặc ký hiệu, chown đổi chủ sở hữu, còn sudo cho phép chạy một lệnh riêng lẻ với quyền root. Khi gặp Permission denied, hãy kiểm tra người dùng, quyền của tệp và của từng thư mục trong đường dẫn, và đừng giải quyết bằng 777. Người dùng, nhóm, quyền và sudo đều được hướng dẫn chi tiết trong khóa học Linux.

Câu hỏi thường gặp

Lệnh chmod 755 nghĩa là gì?

Chủ sở hữu có quyền đọc, ghi và thực thi (7), còn nhóm và những người khác có quyền đọc và thực thi (5). Đây là bộ quyền tiêu chuẩn cho thư mục và script.

chmod khác chown ở điểm nào?

chmod thay đổi quyền (ai được làm gì với tệp), còn chown thay đổi chủ sở hữu và nhóm (quyền thuộc về ai).

Làm sao cấp quyền sudo cho một người dùng?

Trên Ubuntu và Debian, thêm người đó vào nhóm sudo bằng sudo usermod -aG sudo tên-người-dùng; trên họ RHEL, thêm vào nhóm wheel. Thay đổi có hiệu lực sau khi đăng nhập lại.

Quyền 4755 và bit SUID là gì?

Chữ số 4 đầu tiên bật SUID: chương trình chạy với quyền của chủ sở hữu tệp, không phải của người khởi chạy. Ví dụ passwd hoạt động như vậy; trong kết quả ls, vị trí x của chủ sở hữu hiển thị ký tự s.

Vì sao root vẫn đọc được tệp có quyền 000?

Kernel không kiểm tra quyền đọc và ghi thông thường đối với root. Có thể giới hạn root bằng các cơ chế khác như SELinux, AppArmor hoặc thuộc tính bất biến chattr +i.

Học chủ đề này qua video

Chủ đề này được giảng chi tiết kèm thực hành trong khóa học “Linux: с нуля до уверенного администрирования”.

Đến khóa học