chmod 755, chmod 644, chmod 600 — những con số này xuất hiện trong mọi hướng dẫn cài đặt, và phần lớn người dùng gõ theo mà không thực sự hiểu chúng mã hoá điều gì. Hệ quả: đặt sai quyền làm script không chạy, khoá SSH bị từ chối, hoặc tệ hơn — để lộ file nhạy cảm. Bài này (phần 10 loạt Unix) chạy thật để giải mã hệ thống quyền: cách đọc chuỗi rwx, số bát phân, và hai điểm hay nhầm nhất — ý nghĩa của x trên thư mục, và umask quyết định quyền mặc định.
Đọc quyền: ba nhóm, ba bit
ls -l hiện quyền dưới dạng 10 ký tự, ví dụ -rwxr-xr--:
- Ký tự đầu: loại —
-file thường,dthư mục,lsymlink. - Ba nhóm 3 bit tiếp theo: quyền cho user (chủ sở hữu), group (nhóm), other (còn lại).
- Mỗi nhóm có
r(đọc),w(ghi),x(thực thi), hoặc-nếu không có.
- rwx r-x r--
user group other
Số bát phân: r=4, w=2, x=1
Cách viết số quen thuộc chỉ là tổng của các bit: r=4, w=2, x=1, cộng lại cho mỗi nhóm.
chmod 644 f # 6=rw- , 4=r-- , 4=r-- (file thường)
chmod 755 s # 7=rwx , 5=r-x , 5=r-x (script/thư mục)
chmod 600 k # 6=rw- , 0=--- , 0=--- (khoá riêng tư, chỉ chủ đọc/ghi)
Đo thật xác nhận ánh xạ: chmod 640 → -rw-r-----, chmod 600 → -rw-------, chmod 755 → -rwxr-xr-x. Dạng ký hiệu dễ đọc hơn khi chỉ muốn đổi tương đối: chmod u+x (thêm x cho user), chmod go-w (bỏ w cho group+other), chmod a-x (bỏ x cho tất cả).

Hình 1: Quyền gồm 3 nhóm (user/group/other) × 3 bit (r=4/w=2/x=1); đặt bằng số bát phân hoặc ký hiệu u/g/o +/- r/w/x; x trên thư mục khác trên file; umask = quyền gốc trừ mặt nạ.
Điểm hay nhầm nhất: x trên THƯ MỤC
x trên file nghĩa là "được chạy như chương trình" — dễ hiểu. Nhưng x trên thư mục mang nghĩa hoàn toàn khác: quyền đi vào / truy cập các mục bên trong. Đây là chỗ gây bối rối, nên mình chứng minh bằng cách chạy với user thường nobody (vì root bỏ qua mọi kiểm tra quyền):

Hình 2: Chạy thật — số bát phân ↔ chuỗi rwx; ký hiệu u+x,go-w; thư mục 755 → nobody đọc được file bên trong ("bi mat"), thư mục 644 (thiếu x) → Permission denied khi truy cập nội dung dù ls vẫn liệt kê tên; umask 022 → file 644, umask 077 → file 600.
Kết quả rõ ràng: cùng file secret.txt với quyền 644 (ai cũng đọc được), nhưng khi thư mục chứa nó bị bỏ x (còn 644), user nobody nhận Permission denied lúc cat — vì không có quyền đi vào thư mục. Thú vị: ls vẫn liệt kê được tên secret.txt (cần bit r của thư mục), nhưng không thể truy cập nội dung (cần bit x). Đây là lý do một thư mục thiếu x khoá chặt mọi thứ bên trong dù từng file được mở rộng — một cơ chế bảo mật quan trọng và hay bị hiểu sai.
umask: quyền mặc định của file mới
Vì sao file bạn touch ra tự có quyền 644 mà không phải 666? Vì umask — một "mặt nạ" trừ đi khỏi quyền gốc. File mới bắt đầu từ 666 (rw cho tất cả, không bao giờ tự có x), thư mục từ 777; rồi umask trừ các bit đi:
quyền mới = quyền_gốc − umask
Đo thật: umask mặc định 0022 → file mới 644 (666 − 022), thư mục 755. Đổi umask 077 → file mới 600 (chỉ chủ sở hữu đọc/ghi) — cấu hình phổ biến cho server nhạy cảm để file mới mặc định riêng tư.
Đánh đổi cần cân nhắc
Đừng dùng chmod 777 để "cho nhanh hết lỗi". 777 cho mọi người quyền ghi và thực thi — một lỗ hổng bảo mật nghiêm trọng, và thường không giải quyết đúng vấn đề (thường vấn đề là chủ sở hữu sai, cần chown, không phải quyền quá chặt). Xác định đúng ai cần quyền gì; 755/644 phủ hầu hết trường hợp, 700/600 cho thứ riêng tư.
Quyền khác với chủ sở hữu. chmod đổi quyền, chown đổi ai sở hữu. Một file 600 thuộc user A thì user B không đọc được dù có chmod thế nào (trừ khi B là chủ hoặc root). Khi "không có quyền" mà chmod không giúp, hãy kiểm ls -l xem chủ sở hữu có đúng không.
Khoá SSH và một số công cụ đòi quyền chặt. ssh từ chối dùng khoá riêng nếu nó không phải 600 (hoặc chặt hơn) — cố tình, để tránh khoá bị người khác đọc. Tương tự sudo đòi quyền đúng cho file cấu hình. Đây là lúc quyền "quá mở" gây lỗi khó hiểu; nhớ chmod 600 ~/.ssh/id_*.
Ba ý mang về
- Số bát phân là tổng r=4/w=2/x=1 cho ba nhóm: đo thật
chmod 644→-rw-r--r--,755→-rwxr-xr-x,600→-rw-------; dạng ký hiệuu/g/o +/- r/w/xtiện khi đổi tương đối. - x trên thư mục = quyền đi vào, không phải chạy: đo thật với user nobody, thư mục thiếu
xchoPermission deniedkhi đọc file bên trong (dùlsvẫn thấy tên) — thư mục thiếu x khoá chặt mọi thứ bên trong. - umask quyết định quyền mặc định: đo thật umask 022 → file mới 644, umask 077 → file mới 600 (666 trừ mặt nạ); đừng dùng
chmod 777, phân biệt quyền với chủ sở hữu (chown), và nhớ khoá SSH cần600.
Nguồn
- man7.org — chmod(1): https://man7.org/linux/man-pages/man1/chmod.1.html
- man7.org — umask(2) / chmod(2): https://man7.org/linux/man-pages/man2/umask.2.html
- Arch Wiki — File permissions and attributes: https://wiki.archlinux.org/title/File_permissions_and_attributes
Phần sau ta xem cách chạy tác vụ theo lịch với cron: cú pháp năm trường, vì sao job cron thường im lặng thất bại (PATH và môi trường tối giản), và cách bắt log để không mù.