Chuyển đến nội dung chính (Skip to content)
Mục lục bài viết
Linux Essentials

Linux Essentials 5.3: Quản lý Quyền và Quyền sở hữu Tệp

Linux Essentials 5.3: Quản lý Quyền và Quyền sở hữu Tệp

Đọc quyền tệp Linux, owner và group; thử chmod, chown, search thư mục và umask bằng tài khoản không root, phân biệt ghi nội dung với xóa tên tệp.

Một lỗi Permission denied cần được đặt đúng câu hỏi

Một người dùng đọc được báo cáo nhưng không sửa được. Người khác không đọc được tệp, song vẫn xóa được nó trong thư mục được cấp quyền. Hai hiện tượng này có thể phù hợp với cơ chế quyền Linux. Muốn giải thích, cần tách nội dung tệp khỏi mục tên tệp nằm trong thư mục.

Sau bài học, bạn có thể đọc chủ sở hữu và mode, giải thích rwx cho tệp và thư mục, dùng chmod và chown có phạm vi, rồi kiểm chứng bằng tài khoản không phải root. Bài dựa trên 010-160 mục 5.3, trang in 391–415, trang PDF 400–424; đối chiếu 015.3 của 010-200. Cần biết UID/GID, tạo tài khoản và đường dẫn.

Mốc cập nhật: 23/10/2026. Lab chạy trên Ubuntu 26.04.1 LTS ARM64 trong container dùng một lần, không mạng ngoài, không volume host. chmod, chown, stat thực tế thuộc uutils coreutils 0.10.0. Tài liệu uutils hiện mô tả bản khác; manual GNU được dẫn để giải thích cú pháp tương ứng; các thao tác trong bài được thử riêng với binary của lab. Chưa kiểm thử ACL, filesystem mạng hay policy SELinux/AppArmor.

Đọc danh tính và đối tượng trước khi thay đổi

Dùng các lệnh chỉ đọc để bắt đầu:

id
ls -ld /duong/dan/thu-muc
ls -l /duong/dan/thu-muc/tep.txt
ls -la /duong/dan/thu-muc

Thay đường dẫn ví dụ bằng đối tượng thực sự cần kiểm tra. -d xem chính thư mục, thay vì liệt kê nội dung. -a hiển thị cả tên bắt đầu bằng dấu chấm; tên ẩn không tạo lớp bảo mật riêng. Một tệp .secret vẫn phải được bảo vệ bằng quyền và cơ chế phù hợp.

Ví dụ giả lập -rw-r----- bắt đầu bằng -, nghĩa là tệp thông thường. Ba nhóm tiếp theo là owner rw-, group r--, other ---. Các cột khác cho biết chủ sở hữu, nhóm, kích thước và thông tin thời gian. Đừng dùng tên người đang đăng nhập để đoán owner: hãy đọc đối tượng thực tế.

Với mô hình mode cơ bản không có ACL mở rộng, hệ thống chọn lớp phù hợp cho danh tính tiến trình. Owner không được “rơi xuống” lấy quyền other khi quyền owner thiếu. Nhóm xét theo nhóm hiệu lực và nhóm bổ sung liên quan. Quyền root/capability và các policy khác có thể làm kết quả khác phép thử người dùng thường.

rwx của tệp và thư mục có ý nghĩa khác nhau; unlink còn phụ thuộc thư mục cha.
Hình 2. rwx của tệp và thư mục có ý nghĩa khác nhau; unlink còn phụ thuộc thư mục cha. Mở hình để xem chi tiết.

rwx trên tệp khác rwx trên thư mục

Quyền Tệp thông thường Thư mục
r Đọc nội dung Đọc danh sách tên bên trong
w Thay đổi nội dung theo cách mở tệp được phép Thay đổi mục tên, thường cần đi cùng quyền search
x Cho phép thực thi theo điều kiện hệ thống Search/traverse để tra cứu đối tượng theo tên

Theo tài liệu path_resolution của Linux, thiếu quyền search trên thành phần thư mục của đường dẫn có thể dẫn đến EACCES. Vì vậy, một tệp có mode cho phép đọc vẫn có thể không mở được khi thư mục cha chặn đường đi. Cần xem từng cấp liên quan, không chỉ dòng ls -l cuối cùng.

Theo unlink(2), xóa tác động một tên trong filesystem. Quyền ghi nội dung tệp không phải quyền xóa tên tệp. Xóa thường tác động mục trong thư mục cha, nên quyền của cha có vai trò quyết định cùng các điều kiện khác như sticky bit. Đây là điểm cần cải biên khi gặp tài liệu diễn đạt gộp “ghi hoặc xóa tệp”. Bài sau sẽ thử sticky bit riêng.

Quyền x trên script cũng không giống đọc script bằng trình thông dịch. bash demo.sh yêu cầu Bash đọc nội dung theo quyền truy cập; chạy trực tiếp ./demo.sh còn cần điều kiện thực thi. Shebang, mount noexec và định dạng tệp có thể tạo lỗi khác. Thêm x không tự sửa một script sai cú pháp.

Lab 1: tạo fixture trong môi trường dùng một lần

Chỉ chạy phần chuẩn bị bằng root trong container lab trống. Nếu hai tên đã tồn tại, dừng kiểm tra thay vì sửa hoặc xóa tài khoản đó. Lab không được dùng trên máy làm việc:

useradd -m -U -s /bin/bash lpi_owner
useradd -m -U -s /bin/bash lpi_other
work=$(mktemp -d)
chmod 755 "$work"
printf '%s\n' 'LPI permission fixture' > "$work/report.txt"
chown lpi_owner:lpi_owner "$work/report.txt"
chmod u=rw,go= "$work/report.txt"
ls -l "$work/report.txt"

chown đổi người và nhóm sở hữu; nó không đồng nghĩa thêm quyền đọc cho tất cả. chmod đổi mode. Theo manual chown GNU, dạng OWNER:GROUP chọn cả hai; trong lab, kết quả được xác nhận bằng UID thực tế và phép đọc với người đích.

Mong đợi mode 600, owner và group thuộc lpi_owner. Shell quản trị vẫn giữ biến work trỏ vào fixture. Không copy tên thư mục tạm từ lần chạy khác; mỗi lần mktemp tạo đường dẫn mới. Hai tài khoản chỉ dùng để kiểm chứng, không được cấp mật khẩu hay quyền sudo.

Lab 2: thử quyền bằng đúng người dùng

runuser -u lpi_owner -- cat "$work/report.txt"
runuser -u lpi_other -- cat "$work/report.txt"

Lệnh đầu phải đọc được fixture; lệnh sau bị từ chối. runuser ở đây do root lab dùng để khởi tạo tiến trình với danh tính đích, không phải cách người dùng thường tự nâng quyền. Kiểm tra chỉ bằng root sẽ che mất lỗi quyền mà người dùng thực sự gặp.

Một phép thử có chủ đích tiếp theo cho thấy owner không lấy quyền other thay thế:

chmod 004 "$work/report.txt"
runuser -u lpi_owner -- cat "$work/report.txt"
runuser -u lpi_other -- cat "$work/report.txt"

Với fixture không ACL, owner bị từ chối còn người khác đọc được. Đây là trạng thái thử nghiệm khác thường để hiểu cơ chế, không phải khuyến nghị bảo vệ báo cáo. Sau quan sát, khôi phục ngay mode đã chọn cho lab:

chmod 600 "$work/report.txt"

Trong công việc thật, ghi owner, group và mode ban đầu trước thay đổi. Nếu có ACL hoặc nhãn bảo mật, chỉ ghi ba thuộc tính này chưa đủ làm bản phục hồi toàn bộ. Không nhận bài lab là hướng dẫn sao lưu mọi lớp policy.

Kiểm tra danh tính, đường dẫn, mode và policy trước khi thay quyền.
Hình 1. Kiểm tra danh tính, đường dẫn, mode và policy trước khi thay quyền. Mở hình để xem chi tiết.

Lab 3: biết tên tệp chưa cần đọc danh sách thư mục

Chuẩn bị thư mục cho phép người khác search nhưng không liệt kê:

mkdir "$work/search"
printf '%s\n' 'known' > "$work/search/known.txt"
chmod 644 "$work/search/known.txt"
chmod 711 "$work/search"
runuser -u lpi_other -- cat "$work/search/known.txt"
runuser -u lpi_other -- ls "$work/search"

Người thử đọc được tên đã biết known.txt, nhưng không liệt kê được thư mục. Điều này phân biệt quyền search với quyền đọc danh sách. Không dùng việc ẩn danh sách như một cơ chế bảo vệ nội dung đã có đường dẫn và quyền đọc công khai.

Trong một phép thử riêng, bộ kiểm thử đặt tệp không có quyền đọc/ghi trong thư mục owner có wx, rồi xóa tệp bằng owner của thư mục. Thao tác thành công vì thay đổi mục tên ở cha. Phép thử không dùng sticky bit, immutable flag hoặc filesystem chỉ đọc; thêm những điều kiện đó có thể làm kết quả khác.

Khi ticket là “không xóa được tệp”, hãy đọc quyền cha và điều kiện thực tế trước khi đổi mode của chính tệp. Đừng bật ghi cho mọi người bằng chmod 777 để thử. Nó mở quyền ngoài nhu cầu và có thể không giải quyết đúng lớp đang chặn.

Cú pháp số, cú pháp ký hiệu và umask

Với ba nhóm quyền cơ bản, r=4, w=2, x=1. 640 tương ứng owner đọc/ghi, group đọc, other không có quyền. 750 trên thư mục cho owner toàn bộ, group đọc/search, other bị chặn theo mode. Các bit đặc biệt ở chữ số đầu sẽ học ở bài 22.

Theo manual chmod GNU, ký hiệu chọn lớp u, g, o, a, toán tử +, -, = và quyền cần tác động. Trong lab, u=rw,go= đặt rõ ba lớp cơ bản; u+x thêm thực thi cho owner. Viết rõ lớp giúp tránh phụ thuộc cách umask ảnh hưởng trường hợp bỏ phần chọn người dùng.

umask(2) mô tả việc che các bit quyền khi tạo đối tượng theo mode mà ứng dụng yêu cầu, không phải phép trừ thập phân. Nó không sửa ngược các tệp đã tồn tại. Lab dùng subshell để thay umask riêng:

(
  umask 0027
  touch "$work/new.txt"
  mkdir "$work/new-dir"
  stat -c '%a %n' "$work/new.txt" "$work/new-dir"
)

Với fixture thông thường không default ACL, kết quả là 640 cho tệp mới và 750 cho thư mục mới. Đừng suy ra umask tự cấp x cho mọi tệp; ứng dụng có thể yêu cầu mode hạn chế hơn. Subshell kết thúc thì umask của shell cha không bị đổi bởi khối này.

Khi mode trông đúng nhưng vẫn lỗi

Xác nhận đúng máy, đường dẫn, danh tính tiến trình và thư mục cha. Sau đó mới xem ACL, mount chỉ đọc, filesystem mạng hoặc policy bảo mật. Một dịch vụ có thể chạy với danh tính khác người đang mở terminal; thử đọc bằng tài khoản cá nhân không nghiệm thu được dịch vụ ấy.

Tránh chmod -R hoặc chown -R trên cây dữ liệu lớn khi chưa kiểm kê symlink, phạm vi mount và nhu cầu của từng loại tệp. Đặt cùng mode cho thư mục và tệp có thể làm mất search hoặc biến dữ liệu thành executable. Nếu thay đổi phục vụ khắc phục sự cố, giới hạn đúng đối tượng và kiểm tra chức năng sau đó.

Tự kiểm tra và phạm vi nghiệm thu

  1. Tệp 600 có luôn ngăn xóa không? Chưa, cần xét quyền thư mục cha và điều kiện khác.
  2. Owner thiếu quyền có lấy quyền other cao hơn không? Không trong mô hình mode cơ bản của phép thử.
  3. Directory x nghĩa là chạy thư mục? Không, nó là search/traverse.
  4. Vì sao kiểm tra bằng root chưa đủ? Root hoặc capability có thể vượt kiểm tra mà người đích phải chịu.

Lab đã xác nhận các trường hợp owner/other, search không listing, unlink fixture, script và umask bằng tiến trình không root. Nội dung và hình được biên soạn độc lập; giáo trình là khung tham chiếu. Các nguồn dự án được dẫn tại phần tương ứng; chưa nghiệm thu quyền trên production, ACL hoặc hệ thống lưu trữ từ xa.

Bài liên quan trong bộ LPI

Tìm hiểu thêm