Quyền truy cập file trong Linux là một khái niệm cốt lõi giúp đảm bảo an toàn và tổ chức trong hệ thống đa người dùng. Việc hiểu và thiết lập đúng quyền cho file và thư mục không chỉ bảo vệ và bảo mật hệ thống mà còn giúp ngăn chặn truy cập trái phép vào dữ liệu quan trọng. Đây là kiến thức bắt buộc đối với người mới học Linux, quản trị hệ thống (#SysAdmin), devops và lập trình viên, cũng như những ai đang chuẩn bị cho các kỳ thi chứng chỉ Linux (#ITCertification). Bài viết này sẽ cung cấp cho bạn một cái nhìn toàn diện về #LinuxPermissions, với văn phong thân thiện, nhiều ví dụ minh họa thực tế, giúp bạn dễ dàng nắm bắt các khái niệm mà không bị sa đà quá vào lý thuyết hàn lâm.
Chúng ta sẽ lần lượt tìm hiểu: mô hình phân quyền của Linux với ba cấp user/owner (chủ sở hữu), group (nhóm), others (người dùng khác); ý nghĩa các quyền cơ bản đọc (r), ghi (w), thực thi (x) trên tập tin và thư mục; cách xem quyền hiện tại bằng lệnh ls -l và stat; cách thiết lập quyền mặc định khi tạo mới tập tin/thư mục bằng umask; cách thay đổi quyền với lệnh chmod (#chmod) ở dạng số (octal) và dạng ký hiệu (symbolic); cách thay đổi chủ sở hữu tập tin với lệnh chown (#chown) và chgrp; và cuối cùng là các quyền đặc biệt gồm SUID, SGID và sticky bit. Hãy cùng bắt đầu hành trình khám phá thế giới phân quyền trong Linux nào các bạn!
Contents
- 1 Kiến thức cơ bản về quyền file và thư mục trong Linux
- 2 Cách xem quyền của file và thư mục
- 3 Thiết lập quyền mặc định khi tạo file/thư mục với umask
- 4 Thay đổi quyền truy cập với lệnh chmod
- 5 Thay đổi chủ sở hữu và nhóm với chown và chgrp
- 6 Quyền đặc biệt: SUID, SGID và Sticky Bit
- 7 Ví dụ thực tế: Thư mục chỉ có quyền thực thi
- 8 Kết luận
Kiến thức cơ bản về quyền file và thư mục trong Linux
Mỗi file hoặc thư mục trong Linux đều gắn liền với một người dùng sở hữu (owner) và một nhóm sở hữu (group). Đồng thời, hệ thống quy định ba loại đối tượng có thể tương tác với file/thư mục đó:
-
Owner (Chủ sở hữu) – Thường là người dùng tạo ra file hoặc thư mục. Chủ sở hữu có thể thiết lập quyền cho chính mình và những người khác.
-
Group (Nhóm) – Mỗi file thuộc về một nhóm người dùng. Các thành viên trong nhóm đó sẽ có quyền hạn nhất định trên file.
-
Others (Người khác) – Bao gồm tất cả những người dùng còn lại không phải chủ sở hữu và cũng không thuộc nhóm sở hữu file.
Với mỗi loại đối tượng trên, Linux định nghĩa ba quyền cơ bản có thể cấp hoặc không cấp, ký hiệu lần lượt bởi các chữ cái: r, w, x. Cụ thể:
-
r (read – quyền đọc): Cho phép đọc nội dung file. Đối với thư mục, quyền đọc cho phép liệt kê danh sách các file/thư mục con bên trong (xem tên các mục trong thư mục).
-
w (write – quyền ghi): Cho phép sửa đổi nội dung tập tin (ví dụ: ghi thêm, chỉnh sửa hoặc xóa nội dung). Đối với thư mục, quyền ghi cho phép tạo mới hoặc xóa các mục con trong thư mục đó (thêm/xóa file hoặc thư mục con).
-
x (execute – quyền thực thi): Cho phép thực thi file (nếu nó là file nhị phân hoặc script). Đối với thư mục, quyền thực thi cho phép truy cập vào bên trong thư mục – tức là quyền
cdvào thư mục đó và truy xuất nội dung khi biết tên đối tượng. Nói cách khác,xtrên thư mục cho phép bạn đi vào thư mục (traverse), cònrmới cho phép nhìn thấy nội dung thư mục.
Lưu ý: Trên thư mục, để liệt kê nội dung bạn cần có quyền
rvàx. Quyềnxcho phép truy cập thư mục nhưng nếu không córthì bạn không thể xem được danh sách bên trong. Ngược lại, nếu chỉ córmà không cóx, bạn sẽ không thể truy cập vào thư mục để đọc nội dung (do thiếu quyền traverse). Tương tự, để tạo hoặc xóa file trong thư mục, bạn cần có quyềnwvàxtrên thư mục đó.
Linux sử dụng mô hình kết hợp các quyền này cho cả ba đối tượng (owner, group, others) tạo thành một chuỗi 9 ký tự mô tả quyền. Ví dụ: một file có chuỗi quyền là rwxr-xr-- có nghĩa là: chủ sở hữu có đầy đủ quyền đọc/ghi/thực thi (rwx), nhóm sở hữu có quyền đọc và thực thi (r-x), còn những người khác chỉ có quyền đọc (r--). Nếu một quyền nào đó không được cấp thì vị trí tương ứng sẽ là dấu gạch ngang - (ví dụ r-x nghĩa là có quyền đọc, không có quyền ghi, có quyền thực thi).
Bên cạnh các quyền, Linux còn có khái niệm loại file thể hiện qua ký tự đầu tiên khi liệt kê. Khi dùng lệnh ls -l, mỗi dòng sẽ bắt đầu bằng 10 ký tự, ví dụ: -rw-r--r--. Trong đó ký tự đầu tiên cho biết loại đối tượng:
-
-: file thông thường. -
d: thư mục (directory). -
l: liên kết tượng trưng (symbolic link). -
c: thiết bị ký tự (character device). -
b: thiết bị khối (block device). -
p: pipe . -
s: socket.
Như vậy, chuỗi -rw-r--r-- thực ra cho ta biết: đây là file thường (dấu - đầu tiên), với quyền của owner là rw- (đọc + ghi), quyền của group là r-- (chỉ đọc), và quyền của others là r-- (chỉ đọc). Trong phần tiếp theo, chúng ta sẽ học cách xem những thông tin này bằng các lệnh cụ thể.

Cách xem quyền của file và thư mục
Để xem quyền truy cập của các file và thư mục, lệnh thông dụng nhất là ls (list). Cụ thể, ls -l sẽ hiển thị danh sách file kèm thông tin chi tiết, bao gồm quyền, số liên kết, chủ sở hữu, nhóm, dung lượng, thời gian sửa đổi và tên file. Hãy thử ví dụ sau trên một hệ thống Linux:
Kết quả trên cho thấy:
-
Ký tự đầu tiên là
-, nghĩa là /etc/passwd là một file thường (không phải thư mục hay loại đặc biệt khác). -
Tiếp theo là chuỗi
rw-r--r--gồm 9 ký tự phân thành 3 nhóm:-
rw-: Chủ sở hữu (ở đây là người dùng root) có quyền đọc và ghi đối với file (r = đọc, w = ghi, dấu-ở vị trí thứ ba nghĩa là không có quyền thực thi). -
r--: Nhóm sở hữu (ở đây là nhóm root) có quyền đọc, không có quyền ghi, không có quyền thực thi. -
r--: Những người dùng khác có quyền đọc, không có quyền ghi, không có quyền thực thi.
-
-
Số 1 tiếp theo là số liên kết cứng tới file (số này cho biết có bao nhiêu tên đường dẫn cùng trỏ tới inode của file – chi tiết này ngoài phạm vi bài viết nên bạn không cần quan tâm).
-
Tiếp đến,
root rootlần lượt là tên chủ sở hữu và nhóm sở hữu của file. Ở đây file này do user root sở hữu và thuộc nhóm root. -
1973 là dung lượng file (tính bằng byte). Thay vì 2012 byte, bạn có thể dùng
ls -lhđể hiển thị dung lượng ở đơn vị thân thiện (KB, MB…). -
May 8 07:58là thời điểm file được sửa đổi lần cuối. -
Cuối cùng,
/etc/passwdlà tên (đường dẫn) của file.
Tiếp theo, hãy xem một ví dụ khác với một thiết bị đặc biệt. Thử liệt kê thiết bị đầu cuối (tty) hiện bạn đang sử dụng:
Giải thích các thông tin chính trong kết quả trên:
-
Ký tự đầu dòng là
c, cho biết đối tượng này là một thiết bị ký tự (character device). Trong Linux, mọi thứ đều là file – bao gồm cả thiết bị phần cứng;cđại diện cho thiết bị kiểu ký tự (ví dụ cổng serial, terminal…), cònbđại diện cho thiết bị khối (như ổ đĩa). -
Chuỗi quyền
rw--w----cho biết: user sở hữu có quyền đọc và ghi (rw-), group sở hữu có quyền ghi nhưng không có quyền đọc (-w-), và others không có quyền gì (---). Trường hợp này đặc biệt: thiết bị tty do người dùng phuonglh sở hữu, group sở hữu là tty, cho phép chủ sở hữu đọc/ghi (ví dụ user có thể nhập xuất trên terminal), nhóm tty có thể ghi (hạn chế), và người khác thì không được truy cập. -
Phần
4, 2thay cho dung lượng file là thông số thiết bị (major, minor number) – chi tiết này dùng để hệ điều hành nhận diện thiết bị vật lý, không phải dung lượng dữ liệu. -
Các thông tin còn lại như thời gian và tên thiết bị (
/dev/pts/0) tương tự như đã mô tả.
Tương tự, nếu liệt kê một thiết bị khối (block device) chẳng hạn ổ đĩa, chúng ta sẽ thấy ký tự đầu là b. Ví dụ:
Ở đây b cho biết /dev/nvme0n1 là một thiết bị khối (có thể là một ổ đĩa NVMe). Chủ sở hữu là root, nhóm sở hữu là disk. Quyền trên thiết bị này là rw- đối với root (đọc/ghi được), r-- đối với nhóm disk (chỉ đọc được), và --- với others (không được truy cập).
Ngoài lệnh ls, chúng ta còn có thể dùng lệnh stat để xem thông tin chi tiết về file. Lệnh stat -c %A <tên file> sẽ hiển thị chuỗi quyền tương tự ls -l, còn stat -c %a <tên file> sẽ hiển thị giá trị quyền dưới dạng số octal. ví dụ:
Kết quả cho thấy thư mục /etc có chuỗi quyền rwxr-xr-x tương ứng với giá trị octal 755. Ở dạng octal:
-
Chữ số đầu (7) biểu thị quyền của owner,
-
Chữ số thứ hai (5) cho group,
-
Chữ số thứ ba (5) cho others.
Trong hệ bát phân này, mỗi quyền được gán một giá trị: 4 cho read, 2 cho write, 1 cho execute. Các giá trị cộng dồn tạo thành một quyền cụ thể:
-
7 = 4+2+1 nghĩa là rwx (đủ cả các quyền gồm: đọc, ghi, thực thi),
-
6 = 4+2 nghĩa là rw- (đọc và ghi),
-
5 = 4+1 nghĩa là r-x (đọc và thực thi),
-
4 = 4+0+0 nghĩa là r– (chỉ đọc), v.v.
Như ví dụ trên, 755 nghĩa là owner có 7 (rwx: đọc/ghi/x), group có 5 (r-x: đọc/x), others có 5 (r-x: đọc/x). Quả thật, rwxr-xr-x khớp với 755. Việc hiểu được biểu diễn octal của quyền rất hữu ích khi chúng ta sử dụng lệnh chmod để đặt quyền (sẽ nói chi tiết ở phần sau).
Tóm lại: Hãy nhớ rằng ls -l cho bạn biết loại file và quyền chi tiết theo ký hiệu chữ, còn stat -c %a cho bạn giá trị số. Bạn có thể dùng kết hợp để hiểu rõ hơn về quyền của một đối tượng trong Linux file system.
Thiết lập quyền mặc định khi tạo file/thư mục với umask
Khi bạn tạo một file hoặc thư mục mới, hệ thống sẽ gán cho nó những quyền truy cập mặc định. Tuy nhiên, các quyền mặc định này không phải luôn cố định là 777 hay 666, mà còn phụ thuộc vào umask của hệ thống.
Umask (viết tắt của User file creation mask) là một giá trị dùng để loại bỏ bớt quyền mặc định khi tạo mới đối tượng. Hiểu đơn giản, hệ thống có quyền gốc ban đầu và umask sẽ khấu trừ đi những quyền không muốn cấp.
Trên hầu hết các bản Linux, quyền tối đa mặc định (trước khi áp dụng umask) là 777 đối với thư mục và 666 đối với file. Sở dĩ file mặc định là 666 (rw-rw-rw-) thay vì 777 là để tránh file mới có thể thực thi một cách ngẫu nhiên. Trong khi đó, thư mục mặc định cần x để có thể truy cập, nên để tối đa 777.
Giá trị umask thường được thiết lập hệ thống là 022 hoặc 002. Chúng ta có thể xem umask hiện tại bằng lệnh umask:
Giả sử umask là 002 (như ví dụ trên). Hãy bỏ qua chữ số 0 đầu tiên vì umask thường được ghi với 4 chữ số octal nhưng chữ số đầu ít được sử dụng trong hầu hết trường hợp thông thường. Lấy 002 áp dụng cho quyền mặc định:
-
Đối với thư mục: lấy 777 trừ đi 002. Phép tính octal: 777 – 002 = 775. Kết quả 775 nghĩa là thư mục mới sẽ có quyền
rwxrwxr-x(owner: rwx, group: rwx, others: r-x). Bạn có thể kiểm chứng: 775 trong ký hiệu là rwx (7) cho owner, rwx (7) cho group, r-x (5) cho others. -
Đối với file: lấy 666 trừ đi 002 = 664. Kết quả 664 tương ứng
rw-rw-r--(owner: rw-, group: rw-, others: r–). Thật vậy, umask 002 thường thấy trên hệ thống có nghĩa là “loại bỏ quyền ghi của others”, do đó file mới sẽ không cho others ghi vào.
Chúng ta thử nghiệm nhanh để chứng minh điều này. Giả sử umask hiện tại là 002, thực hiện:
Đúng như phân tích, file employees.txt mới tạo có quyền 664 và thư mục hr có quyền 775.

Bây giờ, hãy thử thay đổi umask và quan sát sự khác biệt. Nếu đặt umask thành một giá trị “mạnh” như 777:
Umask 777 nghĩa là loại bỏ toàn bộ các quyền của tất cả mọi người. Khi tạo file hay thư mục lúc này:
Kết quả cho thấy cả file departments.txt và thư mục sales đều có quyền ---------- (mười ký tự gồm dấu -, trong đó ký tự đầu xác định loại đối tượng: - cho file và d cho thư mục, và chín ký tự sau đều là - nghĩa là không ai có quyền gì). Lý do: đối với thư mục, 777 trừ 777 bằng 000; đối với file, 666 trừ 777 cho kết quả âm nên hệ thống cũng hiểu là 000. Như vậy umask 777 khiến mọi thứ tạo ra không ai có quyền truy cập (trừ root vẫn có thể can thiệp bằng cách đổi quyền sau đó).
Tình huống umask 777 thường không dùng trong thực tế, nhưng nó giúp chúng ta hiểu rõ cách umask vận hành.

Hãy thử một ví dụ thực tiễn hơn: umask 007. Thiết lập:
Umask 007 sẽ loại bỏ mọi quyền của others (số 7 ở hàng đơn vị tương ứng quyền r w x của others đều bị loại bỏ), nhưng owner và group không bị ảnh hưởng (hai chữ số đầu là 0). Kết quả:
-
Thư mục mới: 777 – 007 = 770 (
rwxrwx---) – owner và group có đủ quyền, others không có quyền nào. -
File mới: 666 – 007 = 660 (
rw-rw----) – owner và group đọc/ghi được, others không được quyền gì.
Kiểm tra nhanh:
Đúng như dự đoán, file jobs.txt có quyền 660 và thư mục marketing có quyền 770.

Cuối cùng, bạn có thể đặt lại umask về giá trị mặc định ban đầu (thường 002 hoặc 022 tùy hệ thống Linux):
Như vậy, umask là một công cụ hữu ích để định nghĩa tập quyền cho các file/thư mục tạo mới. Ví dụ, trên hệ thống Ubuntu giá trị umask mặc định là 002 nhằm khuyến khích mô hình chia sẻ theo group riêng (private group: mỗi user có một group trùng tên, và các file mới tạo ra thuộc group của chính user đó, cho phép user khác cùng group có quyền tương tự owner – thường là không ai khác trong cùng group trừ chính user đó). Trên các hệ thống linux khác có thể dùng 022 (loại bỏ cả quyền ghi của group và others, khiến file mới thuộc group nhưng group không có quyền ghi). Bạn có thể điều chỉnh umask trong profile shell hoặc script khởi động nếu muốn thay đổi chính sách quyền mặc định cho phù hợp nhu cầu.
Thay đổi quyền truy cập với lệnh chmod
Sau khi đã xem và hiểu được các quyền hiện có, bước tiếp theo bạn cần nắm vững là thay đổi quyền của file/thư mục. Đây là công việc thường xuyên của một system admin khi setup hệ thống hoặc khắc phục sự cố. Lệnh dùng để thay đổi quyền là chmod (viết tắt của “change mode” – thay đổi chế độ truy cập).
Có hai cách để sử dụng chmod: dùng mã số octal hoặc dùng ký hiệu r,w,x kèm toán tử. Chúng ta sẽ lần lượt xem cả hai cách này.
Sử dụng chmod với số (octal mode)
Phương pháp octal sử dụng bộ 3 chữ số (từ 0 đến 7) tương ứng với owner, group, others như đã giải thích ở trên. Ví dụ, để đặt quyền rwx cho owner, r-x cho group, r-x cho others, ta dùng chmod 755 tên_file. Tương tự:
-
chmod 644 file.txtsẽ đặt quyền rw- cho owner (6), r– cho group (4), r– cho others (4), tức là file.txt sẽ có quyềnrw-r--r--. -
chmod 600 file.txtđặt quyền rw- cho owner, — cho group và others (chỉ owner đọc/ghi, không ai khác có quyền gì). -
chmod 444 file.txtđặt thành r–r–r– (mọi người chỉ được đọc, không được ghi, không thực thi). -
chmod 700 file.txtđặt rwx—— (chỉ owner có đầy đủ quyền, người khác không được làm gì). -
v.v.
Để hiểu rõ hơn, hãy thử một tình huống nhỏ: Bạn có file emps.txt hiện tại có quyền mặc định là rw-rw-r-- (664) – giả sử nó vừa được tạo và umask của hệ thống linux là 002. Tức là owner và group đều có quyền đọc/ghi, còn others chỉ đọc. Bây giờ, giả sử vì lý do nào đó bạn muốn tước bỏ quyền ghi của chính mình (owner) và nhóm, đồng thời cấp quyền ghi cho others (một tình huống oái oăm nhưng chúng ta cứ thử để thấy tác dụng của lệnh):
Chúng ta đã dùng các số 446:
-
Owner: 4 ->
r--(mất quyền ghi, chỉ còn đọc). -
Group: 4 ->
r--(mất quyền ghi, chỉ đọc). -
Others: 6 ->
rw-(được đọc và ghi).
Tùy chọn -v (verbose) của chmod sẽ hiện thông tin chi tiết về sự thay đổi: dòng trên cho thấy quyền của emps.txt đã đổi từ rw-rw-r-- thành r--r--rw-. Cuối chuỗi mới, bạn có thể thấy owner và group giờ chỉ có r-- (đọc), trong khi others có rw- (đọc/ghi). Nếu bây giờ bạn – với tư cách chủ file – thử ghi vào file, sẽ thất bại vì bạn đã tự tước bỏ quyền ghi của mình:
Quả nhiên lệnh trên báo lỗi Permission denied do user owner không còn quyền ghi.
Tình huống trong thực tế thường không ai làm vậy trên file của mình , nhưng ví dụ này minh họa rõ tác dụng của chmod với mã số. Để khôi phục lại quyền ghi cho owner và group, bạn có thể dùng các số tương ứng (ví dụ chmod 664 emps.txt để trở về lại trạng thái cũ). Hoặc chúng ta cùng nhân dịp này chuyển sang cách thứ hai: dùng ký hiệu chữ.
Sử dụng chmod với ký hiệu (symbolic mode)
Cú pháp dạng ký hiệu cho phép bạn thêm, bớt hoặc đặt quyền cụ thể cho từng loại đối tượng (owner, group, others, all). Cú pháp tổng quát:
-
Đối tượng có thể là:
u(user – chủ sở hữu),g(group),o(others), hoặca(all – tất cả các loại trên). -
Toán tử:
+để thêm quyền,-để bỏ quyền, và=để gán quyền tuyệt đối (thay thế hoàn toàn). -
Quyền: sử dụng các chữ cái
r,w,xtương ứng quyền đọc, ghi, thực thi. Có thêm các ký tự đặc biệt cho quyền đặc biệt (sẽ nói sau) và trường hợpX(viết hoa) mà chúng ta sẽ thấy ngay dưới đây.
Quay lại ví dụ với emps.txt đang có quyền r--r--rw-. Để cấp lại quyền ghi cho owner và group, chúng ta có thể làm:

Biểu thức u+w,g+w nghĩa là: u+w (thêm quyền ghi cho user/owner), g+w (thêm quyền ghi cho group). Sau lệnh này, emps.txt chuyển thành rw-rw-rw- (666) – owner, group, others đều có quyền đọc và ghi. Thực tế để đạt kết quả 666 bạn cũng có thể dùng chmod 666 emps.txt. Tuy nhiên cách ký hiệu chữ giúp chúng ta linh hoạt thay đổi từng phần mà không ảnh hưởng các quyền khác.
Tiếp tục, giả sử bây giờ chúng ta bỏ quyền ghi của others để trở về chế độ an toàn hơn:

Biểu thức o-w có nghĩa là others trừ đi quyền ghi. Kết quả file trở lại rw-rw-r-- – owner và group có rw, others chỉ r. Đây cũng chính là quyền mặc định ban đầu của file (664). Chúng ta đã thực hành đủ các phép +, – với u, g, o.
Thay đổi quyền cho thư mục
Lệnh chmod áp dụng tương tự cho thư mục. Lưu ý rằng ý nghĩa của r, w, x trên thư mục khác một chút như đã trình bày ở phần trước. Hãy thử ví dụ: tạo một thư mục sales và đặt quyền thật “ngặt nghèo”:

Tham số -m 000 khi tạo thư mục có tác dụng giống chmod 000 ngay lúc tạo, tức là sales được sinh ra với quyền --------- (không cho owner, group, hay others bất cứ quyền gì). Kết quả ls -ld sales (liệt kê chính thư mục) cho thấy: d nghĩa là đây là directory, còn 9 ký tự sau đều - (0 quyền cho tất cả).
Điều gì xảy ra khi thư mục không có quyền? Hãy thử truy cập nó:
-
Liệt kê nội dung thư mục sales:
Bị từ chối quyền – vì để
lsđược, thư mục cần quyềnx(traverse) vàr(đọc nội dung). Ở đây không có quyền nào nên tất nhiên không xem được. -
Thử vào thư mục:
Cũng không được – vì muốn
cdvào thư mục cần quyềnx. Thư mục sales không cấp quyền đó cho ai nên không ai (ngoài root) vào được cả.

Bây giờ chúng ta cấp quyền lại để có thể sử dụng thư mục. Giả sử ta muốn owner và group có toàn quyền (rwx), còn others vẫn không được gì (0):

Biểu thức ug=rwx đặt quyền cho u (owner) và g (group) bằng rwx. Ký hiệu = thay vì + hay - nghĩa là gán tuyệt đối, xóa hết các quyền cũ (nếu có) rồi đặt bằng đúng rwx. Kết quả thư mục sales đã có quyền rwxrwx--- (770) – owner và group toàn quyền, others vẫn không có quyền gì.
Giờ kiểm tra lại việc truy cập:
Lệnh ls sales giờ không báo lỗi (dù thư mục rỗng nên không có output gì), và cd sales thành công (chúng ta đã vào được thư mục). Như vậy, với rwx cho owner và group, chúng ta có thể vào và đọc thư mục bình thường.

Thêm về chmod symbolic: +x vs +X
Khi dùng kiểu ký hiệu, có một chi tiết thú vị là tùy chọn X (viết hoa). Tùy chọn này đại diện cho “execute chỉ khi thích hợp”. Cụ thể, +X sẽ thêm quyền thực thi chỉ với những đối tượng nào đã có sẵn ít nhất một quyền thực thi, hoặc nếu đối tượng đó là thư mục. Điều này hữu ích khi bạn muốn thêm quyền x có chọn lọc.
Hãy thử kịch bản sau để hiểu rõ sự khác biệt giữa +x và +X. Trước tiên, tạo một file mới và tắt hết quyền của nó:
Lệnh chmod ugo= xóa (gán bằng rỗng) tất cả các quyền của user, group, others trên depts.txt. Kết quả file không còn quyền gì: ---------- (10 dấu -, trong đó dấu đầu biểu thị file thường, còn lại 9 dấu là không có r, w, x cho cả 3 đối tượng).

Bây giờ, thử cấp quyền thực thi bằng +x thông thường:

Khi không chỉ định đối tượng (u/g/o), mặc định chmod +x sẽ áp dụng cho tất cả (tương đương a+x). Do đó, file depts.txt từ không có quyền gì đã thành --x--x--x: owner, group, others đều có x (và vẫn không có r, w). Chúng ta nhận thấy +x luôn cấp quyền thực thi cho cả ba loại.
Bây giờ hãy tắt x đi để quay về trạng thái không quyền:
Giờ file lại trở về ----------. Thử dùng +X (viết hoa):
Lần này không có gì thay đổi – depts.txt vẫn không được cấp quyền thực thi. Lý do là vì không có bất kỳ user/group/others nào hiện đang có x, và file depts.txt cũng không phải là thư mục, nên +X không thêm x cho ai cả. Quy tắc +X đòi hỏi “ít nhất một trong các đối tượng đã có x trước đó” mới tiến hành thêm.

Để kiểm chứng, hãy bật sẵn một bit thực thi cho file. Thử bật thực thi cho others bằng mã số:
Chúng ta vừa đặt quyền 001 cho file, kết quả ---------x nghĩa là chỉ others có x.

Bây giờ file depts.txt đã thỏa điều kiện “ít nhất một đối tượng có x”. Thử lại +X:
Lần này, do đã có một x (ở others), lệnh +X sẽ thêm x cho tất cả các đối tượng còn lại. Kết quả file trở thành --x--x--x (owner, group, others đều có x). Bạn có thể thấy +X hữu ích khi cấp quyền thực thi hàng loạt cho nhiều file nhưng muốn tránh cấp thực thi cho file không cần thiết.

Ví dụ, khi dùng chmod -R a+X * trong một thư mục, lệnh sẽ đặt x cho tất cả thư mục (vì thư mục cần x để truy cập), nhưng chỉ đặt x cho các file nào mà ban đầu có ít nhất một x (thường là các file đã có x hoặc script có shebang được tạo với x). Các file văn bản không có x sẵn sẽ không bị gán x. Đây là một mẹo hay trong quản trị file của Linux (#LinuxTips).
Tổng kết nhanh: Dùng chmod với mã số octal phù hợp khi bạn muốn đặt chính xác quyền cho một file (biết rõ 3 chữ số cần thiết). Dùng dạng ký hiệu linh hoạt khi bạn muốn điều chỉnh tương đối (thêm hoặc bớt quyền) mà không ảnh hưởng các quyền khác. Cả hai có thể đạt được kết quả như nhau, tuỳ theo thói quen và ngữ cảnh mà bạn chọn cách nào.
Thay đổi chủ sở hữu và nhóm với chown và chgrp
Bên cạnh việc thiết lập quyền, một khía cạnh khác của quản lý file là quản lý quyền sở hữu. Mỗi file/thư mục có một user sở hữu và một group sở hữu, như chúng ta đã thấy trong mục liệt kê. Thông thường, user nào tạo ra file sẽ là owner, và group sở hữu mặc định sẽ là group riêng của user đó (trên các hệ thống như Ubuntu, mỗi user được tạo một nhóm riêng trùng tên – gọi là private group). Quyền truy cập file hiệu lực ra sao phụ thuộc vào việc bạn đang là owner, hay thuộc group, hay chỉ là others.
Để thay đổi chủ sở hữu (owner) của một file, chúng ta dùng lệnh chown (change owner). Tương tự, để thay đổi nhóm sở hữu (group), dùng lệnh chgrp (change group). Cú pháp cơ bản:
-
chown <user_mới> <tên_file>– chuyển chủ sở hữu file sang user_mới. -
chgrp <group_mới> <tên_file>– chuyển nhóm sở hữu file sang group_mới. -
Hoặc kết hợp trong một lệnh:
chown <user_mới>:<group_mới> <tên_file>có thể đổi cả user và group cùng lúc (phần user hoặc group có thể để trống nếu chỉ muốn đổi một trong hai, ví dụchown :<group_mới> file.txtchỉ đổi group).
Lưu ý quan trọng: Chỉ có root (quản trị hệ thống) hoặc người dùng có quyền tương đương (sudo) mới được phép tùy ý thay đổi chủ sở hữu của file . Một user thường không thể tự ý chuyển quyền sở hữu file của mình cho user khác, và cũng không thể chiếm hữu file của user khác, trừ khi có đặc quyền. Tuy nhiên, user có thể dùng chgrp để đổi nhóm sở hữu của file của mình nếu người đó là thành viên của nhóm đích.
Hãy xem một ví dụ để rõ hơn. Giả sử bạn đang đăng nhập với tài khoản phuonglh. Kiểm tra nhanh:
User phuonglh thuộc các nhóm phuonglh (nhóm riêng, cũng là nhóm mặc định), wheel .

Bây giờ tạo một file mới và xem chủ sở hữu của nó:

File radio.txt có owner là phuonglh, group là phuonglh (nhóm riêng). Quyền hiện tại rw-rw-r-- cho biết owner và group có quyền đọc/ghi, others chỉ đọc (điều này do umask 002 như chúng ta đã biết). Vì chúng ta đang là owner và cũng thuộc group sở hữu, chúng ta có toàn quyền đọc ghi file.
Thử ghi nội dung và đọc lại để xác nhận quyền:
Không vấn đề gì – “Alpha” đã được ghi vào file và đọc ra thành công.

Bây giờ, giả sử chúng ta muốn chuyển quyền sở hữu file này sang người dùng khác, chẳng hạn user root (tài khoản quản trị cao nhất). Thử lệnh chown thông thường:

Lệnh bị từ chối với lỗi Operation not permitted. Đó là vì một user thường không thể thay đổi chủ sở hữu thành user khác (đặc biệt là đổi thành root). Để làm điều này, chúng ta cần có quyền sudo:

Với quyền sudo, lệnh đã thực hiện thành công: owner của radio.txt đổi từ phuonglh thành root. Nhóm sở hữu vẫn đang là phuonglh (do ta chưa đổi nhóm).
Tiếp tục, đổi nhóm sở hữu thành nhóm root luôn cho đồng bộ:
(Ngoài ra, có thể gộp bước này vào lệnh chown trước đó bằng cách: sudo chown root:root radio.txt để đổi cả owner lẫn group một lần).

Bây giờ xem lại thuộc tính file:

File radio.txt hiện có owner là root, group là root. Quyền vẫn hiển thị là rw-rw-r--, nhưng hãy cẩn thận: chuỗi quyền này được đọc theo ngữ cảnh mới. Trước đây khi owner là phuonglh, chuỗi rw-rw-r-- có nghĩa là phuonglh (owner) có rw, nhóm phuonglh có rw, others có r. Bây giờ owner là root, nhóm là root, nên đối với phuonglh thì phuonglh không còn là owner hay thuộc nhóm root (trừ khi user phuonglh cũng thuộc group root, mà không phải trong trường hợp này). Vậy phuonglh bây giờ cho vào loại others đối với file này.
Theo quyền rw-rw-r--:
-
Owner (root) có rw
-
Group (root) có rw
-
Others có r.
phuonglh thuộc nhóm “others” ở đây, nên phuonglh chỉ còn quyền đọc (r--). Hãy kiểm chứng:

Đúng như dự đoán, lệnh cat để đọc file vẫn hoạt động (phuonglh có quyền đọc), nhưng khi cố ghi “Bravo” vào file thì bị từ chối (phuonglh không có quyền ghi, vì với file này phuonglh chỉ là others).
Kết quả ví dụ trên cho thấy: khi chuyển chủ sở hữu một file, bạn có thể vô tình tước bỏ quyền của chính mình nếu bạn không còn nằm trong diện được cấp phép sau khi đổi. Đây là một điều quan trọng: quyền truy cập phụ thuộc vào việc bạn là owner, thuộc group, hay others đối với file. Thay đổi owner/group có thể thay đổi hoàn toàn phạm vi quyền của người dùng.
Thông thường, lệnh chown và chgrp được dùng bởi system admin để sắp xếp quyền sở hữu cho đúng (ví dụ gán file cho user tương ứng, hoặc chuyển đổi file sang nhóm chung để chia sẻ). Còn người dùng thường ít khi cần dùng chown, trừ phi thông qua sudo để thay mặt system admin.
(Mẹo: Trong ví dụ trên, chúng ta dùng cú pháp sudo !! để chạy lại lệnh trước đó với quyền root – đây là một mẹo dòng lệnh hữu ích, giúp bạn không phải gõ lại toàn bộ lệnh khi quên có sudo vào đầu dòng lệnh. #LinuxCommands)
Quyền đặc biệt: SUID, SGID và Sticky Bit
Ngoài các quyền thông thường r, w, x đã đề cập, Linux còn có các quyền đặc biệt gọi là SUID, SGID và Sticky Bit. Chúng mở rộng mô hình phân quyền để đáp ứng những nhu cầu quản trị đặc thù. Những quyền này thường được đặt bằng cách thêm một chữ số đặc biệt ở đầu khi dùng kiểu octal (ví dụ 4755, 2770, 1777…) hoặc dùng ký hiệu s và t trong lệnh chmod. Dưới đây là giải thích khái quát:
-
SUID (Set User ID): Áp dụng cho file thực thi. Khi một file được đặt SUID, quá trình thực thi file đó sẽ mang quyền của chủ sở hữu file, thay vì quyền của user thực thi. Nói cách khác, một user bình thường chạy chương trình có SUID=root sẽ tạm thời có quyền của root trong phạm vi chương trình đó. Cơ chế này thường dùng cho các chương trình cần đặc quyền hệ thống để thực hiện nhiệm vụ mà người dùng thường không có quyền. Ví dụ: chương trình đổi mật khẩu
/usr/bin/passwdtrên Linux có SUID root, do đó khi người dùng chạypasswd, nó có thể chỉnh sửa file/etc/shadow(chứa mật khẩu băm) vốn chỉ root mới ghi được vào file. Khi liệt kê, bạn sẽ thấy bit SUID qua ký tựsở vị trí quyền thực thi của chủ sở hữu. Ví dụ:Chữ
s(nhỏ) thay thế choxcủa owner (rws thay vì rwx) báo hiệu SUID được đặt và owner (root) có x. Nếu ký tự hiện làS(chữ S hoa) nghĩa là SUID bật nhưng owner không có quyền execute. (Trường hợp đó hiếm vì SUID chỉ có ý nghĩa với file thực thi). Giá trị octal để đặt SUID là 4 (ví dụ 4xxx, x là các số quyền thường). Bạn có thể đặt bằng lệnh:chmod u+s fileđể bật SUID, hoặcchmod u-s fileđể tắt.
-
SGID (Set Group ID): Tương tự SUID nhưng áp dụng cho quyền nhóm. Có hai trường hợp:
-
Đối với file thực thi: Nếu file được đặt SGID, khi chạy file đó, tiến trình sẽ mang quyền của group sở hữu file thay vì group của user thực thi. Cách hoạt động giống SUID nhưng thay vì nâng quyền user thì nâng quyền group. Tính năng này ít dùng hơn SUID trên file, nhưng vẫn có trường hợp hữu ích trong các chương trình cần quyền nhóm đặc biệt.
-
Đối với thư mục: Đây là trường hợp phổ biến của SGID. Khi một thư mục đặt SGID, tất cả các file/ thư mục con được tạo bên trong sẽ tự động thuộc về cùng group với thư mục cha, thay vì group mặc định của người tạo. Điều này rất hữu ích trong thiết lập thư mục chia sẻ nhóm: đảm bảo mọi thành viên nhóm khi tạo file đều giữ file chung một group, thuận tiện cho việc cộng tác và chia sẻ. Ngoài ra, nếu thư mục có SGID, các thư mục con tạo bên trong cũng kế thừa cờ SGID (tính đệ quy).
Ký hiệu: SGID hiển thị bằng
sở vị trí quyền thực thi của nhóm. Thí dụ một thư mục có SGID:
Ở đây thư mục /shared có r-sở phần group, chữscho biết SGID bật (nhóm team cóxvìsviết thường, đồng thời có SGID). Nếu làShoa nghĩa là SGID bật nhưng nhóm không cóx. Để bật SGID:chmod g+s <thư mục>; tắt:chmod g-s <thư mục>. Giá trị octal cho SGID là 2 (ví dụ 2755 tương đương chmod u=rwx, g=rsx, o=rx). -
-
Sticky Bit: Đây là một quyền đặc biệt chủ yếu áp dụng cho thư mục public dùng chung. Khi một thư mục có sticky bit, các file bên trong chỉ có thể bị xóa hoặc đổi tên bởi chủ sở hữu của chúng (hoặc bởi root), ngay cả khi người dùng khác có quyền ghi trên thư mục. Nói cách khác, sticky bit ngăn chặn việc một user xóa file của user khác trong cùng thư mục dùng chung. Quyền này thường được bật trên thư mục như
/tmp– nơi mọi user đều có quyền tạo file. Nếu không có sticky, bất kỳ ai cũng có thể xóa file của người khác trong /tmp (do /tmp cho phép ghi tất cả). Nhờ sticky, dù /tmp mở quyền ghi, user chỉ xóa được file của chính mình. Sticky bit được hiển thị bằng ký tựtở vị trí others execute trên thư mục. Ví dụ:
Chữ tở cuối cho thấy sticky bit đang bật trên /tmp (kèm theo others cóx). Nếu làThoa, nghĩa là sticky bật nhưng others không cóx(trường hợp hiếm, vì thường thư mục chia sẻ cũng cho phép execute). Để bật sticky:chmod +t <thư mục>; tắt:chmod -t <thư mục>. Giá trị octal cho sticky là 1 (ví dụ 1777 cho thư mục cho phép mọi người rwx và sticky, như /tmp).
Tóm lại, SUID/SGID/Sticky mở ra những cơ chế kiểm soát nâng cao:
-
SUID: Chạy chương trình với quyền user chủ file.
-
SGID: Chạy chương trình với quyền group chủ file, hoặc tự động kế thừa group trên thư mục.
-
Sticky: Bảo vệ file trong thư mục public dùng chung chỉ chủ nhân mới xóa được.
Bạn nên sử dụng các quyền đặc biệt này cẩn thận, bởi chúng có thể ảnh hưởng đến bảo mật hệ thống nếu bị lạm dụng. Thông thường, các bit đặc biệt đã được thiết lập hợp lý trên hệ thống (ví dụ các file hệ thống như passwd có SUID, các thư mục như /tmp có sticky). Khi quản trị, nếu cần chia sẻ file theo nhóm, hãy nhớ đến SGID trên thư mục; nếu cần cho phép user chạy lệnh đặc quyền, hãy cân nhắc SUID (hoặc phương án an toàn hơn như sudo), và luôn đảm bảo sticky bit trên thư mục chia sẻ chung để tránh rủi ro.
Ví dụ thực tế: Thư mục chỉ có quyền thực thi
Đến đây, chúng ta đã thảo luận về quyền trên file và thư mục, cũng như các bit đặc biệt. Để kết thúc bài viết này, hãy xem một tình huống thực tế thú vị nhằm củng cố hiểu biết của bạn, liên quan đến quyền trên thư mục. Giả sử chúng ta có một thư mục chứa dữ liệu nhạy cảm mà chúng ta muốn người khác có thể truy cập nội dung nếu biết tên, nhưng không thể liệt kê hay tạo/xóa file. Điều này nghĩa là chúng ta muốn thư mục đó chỉ cấp quyền x (thực thi), không cấp r và w.
Hãy tạo một thư mục ví dụ và thử nghiệm:

Chúng ta tạo thư mục forbes và một file people.txt trong đó, rồi ghi vào file này một vài cái tên. Hiện tại, do umask mặc định, thư mục forbes có thể đang là 775 và file people.txt là 664 (owner: phuonglh có rw, group có rw với file, etc.). Kiểm tra nhanh:

Thư mục forbes hiện cho owner và group rwx, others r-x. File people.txt cho owner và group rw, others r. Điều đó có nghĩa: người khác có thể vào thư mục (x) và liệt kê (r) nên có thể thấy file people.txt, và thậm chí đọc được nội dung file (vì file cho phép others đọc). Bây giờ ta muốn khóa thư mục lại, chỉ chừa quyền x cho mọi người.
Thực hiện:

Quyền 111 (octal) tương ứng --x--x--x – nghĩa là owner, group, others đều chỉ có bit thực thi trên thư mục forbes, không có read, không có write. Kết quả xác nhận: d--x--x--x.
Hãy xem hệ quả:
-
Liệt kê thư mục (ls):
Bị từ chối – vì liệt kê cần quyền đọc thư mục mà chúng ta đã bỏ. -
Tạo file mới trong thư mục (ghi vào thư mục):
Không tạo file được – vì tạo file đòi hỏi quyền ghi trên thư mục, chúng ta cũng đã bỏ nốt quyền w. -
Truy cập vào thư mục (cd):
Thành công! Mặc dù không list được và không tạo mới được, nhưng xcho phép chúng ta vào thư mục forbes. -
Truy cập file biết sẵn tên: Giả sử ta biết có file people.txt trong đó, thử đọc hoặc ghi:

Lệnh
catthành công in ra nội dung file. Vì sao? Bởi vìcat forbes/people.txtyêu cầu:-
Quyền
xtrên forbes để truy cập file bên trong (có, chúng ta đã cấp). -
Quyền đọc trên chính file people.txt (file này quyền là 664, phuonglh là owner nên có quyền read, hoặc nếu phuonglh là others thì file cũng cho quyền read others).
Do đó, chúng ta vẫn đọc được file nếu biết tên.
Thử ghi thêm vào file:

Ngạc nhiên chưa – lệnh echo đã chạy không lỗi và “warren buffet” được thêm vào file. Chuyện gì xảy ra?
-
Để ghi vào file hiện có, bạn cần quyền ghi trên chính file đó (file people.txt thuộc phuonglh và phuonglh có quyền ghi vì owner có
w). -
Bạn không cần quyền ghi trên thư mục để sửa file đã tồn tại. Quyền thư mục chỉ kiểm soát việc tạo/xóa/đổi tên file, chứ không kiểm soát việc chỉnh sửa nội dung file (việc này do quyền của file quyết định). Chúng ta thấy dù thư mục forbes không cho ghi, nhưng file bên trong nếu người dùng có quyền ghi thì vẫn chỉnh sửa được.
-
Qua ví dụ trên, chúng ta rút ra những điểm quan trọng về quyền trên thư mục (cũng là kết luận cho phần này):
-
Bạn cần quyền đọc (r) trên thư mục để liệt kê nội dung thư mục (xem danh sách các file).
-
Bạn cần quyền thực thi (x) trên thư mục để truy cập (vào thư mục hoặc mở file bên trong nếu biết tên). Không có
x, bạn khôngcdvào được và cũng không thể mở file bên trong ngay cả khi biết tên file. -
Bạn cần quyền ghi (w) trên thư mục để tạo mới, xóa hoặc đổi tên các file/thư mục con bên trong. (Không có
wthì không thể tạo file như thử nghiệm trên). -
Việc đọc/ghi nội dung của bản thân file vẫn phụ thuộc vào quyền của chính file đó, độc lập với quyền thư mục chứa nó (miễn là bạn đã có
xtrên thư mục để truy cập file).
Tóm lại, đối với thư mục: r cho phép nhìn, x cho phép vào, w cho phép thay đổi cấu trúc bên trong. Ghi nhớ nguyên tắc này sẽ giúp bạn thiết lập quyền chính xác tùy tình huống thực tế.
Kết luận
Quyền truy cập file trong Linux là một chủ đề rộng nhưng vô cùng quan trọng, ảnh hưởng trực tiếp đến bảo mật và vận hành của hệ thống. Trong bài viết này, chúng ta đã đi qua mọi khía cạnh cơ bản: từ cách đọc hiểu ký hiệu quyền, sử dụng ls/stat để kiểm tra, đến cách dùng chmod (cả dạng số và ký hiệu) để thay đổi quyền, cũng như vai trò của umask trong việc quy định quyền mặc định. Chúng ta cũng không quên tìm hiểu cách chuyển chủ sở hữu file (chown, chgrp) và các bit đặc biệt SUID, SGID, sticky để quản lý các trường hợp nâng cao.
Hy vọng rằng với hướng dẫn từng bước và có nhiều các ví dụ minh họa thực tế ở trên, bạn – dù là người mới học Linux hay một system admin, devops & developer – đều cảm thấy tự tin hơn khi làm việc với quyền của file và thư mục trên Linux. Hãy luôn ghi nhớ rằng thiết lập quyền phù hợp là chìa khóa để bảo vệ hệ thống Linux (#LinuxSecurity) và duy trì một môi trường làm việc an toàn, hiệu quả.
Happy learning and happy admin-ing! Hãy tiếp tục khám phá thêm các #LinuxCommands thú vị và thực hành thường xuyên để thành thạo kỹ năng này. Chúc bạn thành công trên hành trình #LearnLinux và đạt được mục tiêu có chứng chỉ LPIC cũng như sự chuyên nghiệp trong công việc.
#LinuxPermissions #chmod #chown #LinuxSecurity #LinuxFileSystem #SysAdmin #LearnLinux #LinuxTips #LinuxCommands #ITCertification







