Skip to main content

2.2. Essential Commands: Phân quyền file và permission đặc biệt

Mục lục​


1. User owner và group của file​

Muốn hiểu permission của file và directory trong Linux thì phải bắt đầu từ chuyện ai sở hữu chúng. Gõ ls -l:

ls -l

# Output (minh họa):
-r--rw---- 1 aaron family 24 Oct 24 10:12 family_dog.jpg
drwxr-xr-x 2 aaron aaron 4096 Oct 24 10:10 Pictures

Mọi file và directory đều được một user sở hữu. Ở đây family_dog.jpg thuộc user aaron. Chỉ owner của file hay directory mới đổi được permission của nó, trong trường hợp này là aaron. Ngoại lệ duy nhất là user root, đổi được permission trên bất kỳ file hay directory nào.

Ở field thứ hai còn một thông tin nữa: file này cũng gắn với một group, group family.

Đổi group bằng chgrp​

chgrp viết tắt của change group. Cú pháp là chgrp, tên group, rồi file hoặc directory:

chgrp sudo family_dog.jpg
ls -l

Sau lệnh trên, group của file đã thành sudo. Chỉ đổi được sang group mà user hiện tại là thành viên. Xem user hiện tại thuộc những group nào:

groups

# Output (minh họa):
aaron sudo family

Với kết quả đó, group của file đổi được sang aaron, sudo hoặc family. User root lại là ngoại lệ: đổi được group của file hay directory sang bất kỳ group nào tồn tại trên hệ thống.

Đổi user owner bằng chown​

chown viết tắt của change owner, cú pháp là chown, user, rồi file hoặc directory. Chỉ root đổi được user owner, nên lệnh phải chạy qua sudo để tạm thời có quyền root:

sudo chown jane family_dog.jpg
ls -l

User của file giờ là jane. chown còn một dạng cú pháp khác đổi được cả user owner và group trong một lệnh. Trả lại nguyên trạng ban đầu, user về aaron và group về family:

sudo chown aaron:family family_dog.jpg
ls -l

2. Đọc 10 ký tự permission trong output ls -l​

ls -l cũng in ra permission của mọi file và directory trong current directory. Chuỗi đầu dòng có 10 ký tự, chia thành 1 cộng 3 cộng 3 cộng 3.

Anatomy of the ls -l permission string-rw-r--r--Entry typedash: regular filed: directoryl: symbolic linkUser ownerr: readw: writex: executeGroupApplies to membersof the file groupdash: not grantedOthersEveryone who isneither the ownernor in the groupOn a directory: r lists the entries, w creates or deletes them,and x allows entering the directory with cd.

Ký tự đầu tiên là loại entry​

Ký tự đầu dòng cho biết entry này là loại gì: file thường, special file, directory... Bảng định danh ở đây gồm d cho directory, l cho symbolic link, và dấu gạch - cho file thường. Một số loại entry khác sẽ gặp ở các phần sau của khóa.

Chín ký tự tiếp theo là permission​

Ba ký tự đầu là permission cho user sở hữu file. Ba ký tự giữa là permission cho group của file. Ba ký tự cuối là permission cho other, tức mọi user không phải aaron và cũng không thuộc group family.

Ba chữ r, w, x mang nghĩa khác nhau tùy đối tượng là file hay directory.

Với file:

  • r nghĩa là user, group hoặc other đọc được nội dung file. Dấu gạch nghĩa là không đọc được.
  • w nghĩa là ghi được vào file và sửa được nội dung của nó.
  • x nghĩa là thực thi được file này. Một số file là program hoặc shell script, tức những chỉ thị có thể chạy. Muốn chạy program hay shell script đó thì phải có execute permission; dấu gạch ở vị trí này nghĩa là không chạy được.

Với directory thì phải nghĩ theo hướng khác. File có nội dung là text để đọc, sửa hay thực thi; directory không có nội dung kiểu đó. Nội dung của một directory là các file và subdirectory nó chứa. Nên r, w, x ở đây nói về các file và subdirectory bên trong:

  • r nghĩa là đọc được nội dung của directory này. Cần r để chạy được lệnh kiểu ls Pictures và xem bên trong có file và subdirectory nào.
  • w nghĩa là ghi được vào directory này. Cần w để tạo hoặc xóa entry trong đó: thêm hay xóa file, thêm hay xóa subdirectory, hoặc chạy mkdir.
  • x nghĩa là đi vào được directory này. Cần x để chạy được cd Pictures và bước vào bên trong.

Directory nào được thiết kế để truy cập vào thì thường thấy bật cả r và x.


3. Permission được duyệt tuần tự từ trái sang phải​

Bộ permission ở ví dụ trên được đặt một cách cố ý để làm rõ một chi tiết dễ hiểu sai. File family_dog.jpg đang là read-only cho owner, read-write cho group, và không có quyền gì cho other, tức r--rw----. Owner của file là aaron, và aaron là thành viên group family.

aaron có ghi được vào file này không, khi owner chỉ có quyền read? Nhìn thì tưởng là được, vì aaron thuộc group family và group đó có rw-. Nhưng thử thêm một dòng text vào file thì thất bại.

Lý do: permission được duyệt theo thứ tự tuyến tính, từ trái sang phải. Hệ điều hành đi qua một chuỗi logic như sau.

Permissions are evaluated left to rightWho is trying to access the file?Is this user the file owner?yesowner bits applystop herenoIs this user in the file group?yesgroup bits applystop herenoother bits applyThe first matching class wins. The next ones are never consulted.

Áp vào ví dụ: ai đang truy cập file, aaron. Ai sở hữu file, cũng aaron. Vậy owner permission được áp dụng, tức r--. aaron đọc được file nhưng không ghi được, nên quyền write bị từ chối ngay tại đó, không xét tiếp tới group.

Với jane thì khác. jane không phải owner, nên chuyển sang xét group: jane có trong group family không, có. Vậy group permission được áp dụng, jane có rw- nên đọc và ghi được vào file.

Còn một user vừa không phải owner vừa không thuộc group của file thì ba ký tự cuối được áp dụng, tức permission cho other.


4. Đổi permission bằng ký hiệu chữ​

Lệnh đổi permission là chmod. Cú pháp cơ bản là chmod, permission, rồi file hoặc directory. Permission chỉ định được theo nhiều cách, bắt đầu bằng cách dễ nhất.

Thêm permission với dấu cộng​

Để thêm permission lên trên những permission đã có, dùng dấu +. u là user owner, g là group, o là other:

chmod u+w family_dog.jpg
chmod u+rw family_dog.jpg
chmod u+rwx family_dog.jpg
chmod g+rw family_dog.jpg
chmod o+r family_dog.jpg

Quay lại vấn đề ở mục trước: owner aaron không ghi được vào file. Thêm quyền write cho user owner bằng chmod u+w, r-- cũ thành rw-, và aaron ghi được vào file.

Bỏ permission với dấu trừ​

chmod u-w family_dog.jpg
chmod u-rw family_dog.jpg
chmod u-wx family_dog.jpg
chmod g-rw family_dog.jpg
chmod o-r family_dog.jpg

Giả sử other đang có r--, nghĩa là bất kỳ ai trên hệ thống cũng đọc được family_dog.jpg. Muốn chỉ user owner và group đọc được, còn ẩn khỏi mọi người khác, thì bỏ quyền read của other bằng chmod o-r.

Đặt permission chính xác với dấu bằng​

Dấu + và - thao tác trên permission đã có sẵn: file có rwx mà bỏ x thì còn rw-, file có r-x mà bỏ x thì còn r--. Khi chỉ quan tâm tới việc tắt quyền execute và không quan tâm những quyền còn lại đang là gì, cách đó hợp lý.

Nhưng có lúc yêu cầu là đặt permission thành đúng một giá trị xác định. Lúc đó dùng dấu =:

chmod g=r family_dog.jpg
chmod g=rw family_dog.jpg

Với g=r, group permission trước đó là rw- sẽ thành đúng r--. Lệnh không hề nói "bỏ quyền w", nó nói "group permission bằng đúng r", và chmod tự tắt những chữ không được liệt kê. Thao tác này chỉ ảnh hưởng group permission, không đụng tới user hay other. Với g=rw, group đọc và ghi được nhưng không thực thi được, vì không có chữ x trong danh sách.

Bỏ hết các chữ thì sao? Không r, không w, không x:

chmod g= family_dog.jpg

Lệnh này tắt toàn bộ permission của group, tương đương câu "đặt group permission thành rỗng". Một lệnh khác cho ra cùng kết quả nhưng theo logic ngược lại là chmod g-rwx, đọc là "bỏ cả ba quyền read, write, execute khỏi group".

Gộp nhiều chỉ định trong một lệnh​

Các chỉ định cho user, group và other gộp được vào một lệnh, phân cách bằng dấu phẩy. Ví dụ yêu cầu: user đọc và ghi được (không quan tâm execute bật hay tắt), group chỉ đọc được và đúng như vậy, other không có quyền gì:

chmod u+rw,g=r,o= family_dog.jpg

Yêu cầu khác: user chỉ đọc và ghi được, bỏ quyền write của group nhưng giữ nguyên các quyền khác của group, và không quan tâm permission của other:

chmod u=rw,g-w family_dog.jpg

5. Đổi permission bằng giá trị octal​

chmod còn một cách nữa để đặt và sửa permission: dùng giá trị octal. Lệnh stat hiển thị permission ở dạng này:

stat family_dog.jpg

# Output (rút gọn):
Access: (0640/-rw-r-----) Uid: ( 1000/ aaron) Gid: ( 1000/ family)

Chuỗi rw-r----- tương ứng giá trị octal 640. Bỏ qua số 0 đầu tiên, vì số đó dành cho special permission như setuid, setgid và sticky bit, bàn ở mục dưới.

Tách 640 ra: user owner permission là 6, group permission là 4, other permission là 0.

Tính bằng nhị phân​

Mỗi permission được biểu diễn bằng một bit: bật thì bit là 1, không bật thì bit là 0.

Với rw-r-----: phần đầu là 110, phần giữa là 100, phần cuối là 000. Đổi nhị phân sang thập phân cho ra 6, 4 và 0.

Ví dụ khác, rwxr-xr-x: nhị phân là 111, 101, 101, thập phân là 7, 5, 5.

Ví dụ cuối, read, write và execute cho cả ba nhóm: cả chín bit đều là 1, nên giá trị là 777.

Tính bằng bảng octal​

Nếu nhị phân khó hình dung thì có cách khác đơn giản hơn: mỗi permission được gán một giá trị octal.

PermissionGiá trị
r read4
w write2
x execute1
không bật0

Permission nào được bật thì lấy giá trị tương ứng của nó, permission nào không bật thì tính là 0, rồi cộng các số trong từng nhóm ba ký tự.

  • rw-r-----: nhóm một là 4 cộng 2 bằng 6, nhóm hai là 4 cộng 0 cộng 0 bằng 4, nhóm ba là 0. Kết quả 640.
  • rwxr-xr-x: 4 cộng 2 cộng 1 bằng 7, rồi 4 cộng 0 cộng 1 bằng 5, rồi 4 cộng 0 cộng 1 bằng 5. Kết quả 755.
  • rwxrwxrwx: cả ba nhóm đều là 7. Kết quả 777.

Có con số rồi thì đưa thẳng vào chmod, thay vì chỉ định permission cho từng nhóm:

chmod 640 family_dog.jpg
chmod 755 family_dog.jpg
chmod 777 family_dog.jpg

6. SUID SGID và sticky bit​

Emily viết một application đọc report từ một folder chứa report. Cô truy cập và tạo được report cùng các file nằm trong /usr/local/reports. Giờ cô muốn John giúp một tay việc làm report, nhưng không muốn cho John toàn quyền vào folder mà application của cô đang đọc.

SUID là special permission cho phép user chạy một executable với permission của chính owner của executable đó. Với SUID bit được set, John chạy được application file-reports và application đó mang permission của Emily để đọc file trong folder. John chạy được executable bằng permission của Emily mà bản thân không hề có permission của Emily trong folder đó.

Cơ chế này hữu ích khi cần cho phép user làm một số hành động cụ thể đòi quyền cao hơn, mà không muốn trao cho họ toàn quyền vào account của owner. Hai ví dụ có sẵn trong hệ thống: lệnh su để chuyển user, và lệnh passwd khi một user thường đổi password của mình thì lệnh đó chạy dưới quyền root.

SGID là permission tương tự nhưng áp dụng cho cả executable lẫn directory. Trong ví dụ trên, file file-reports thuộc group reports, nên cả John và Emily chạy được application và application mang permission của group reports. Nếu họ tạo file mới trong directory này, các file đó cũng thuộc group reports. Cách này phù hợp khi nhiều người cùng cộng tác trên file và cần giữ group ownership của những file đó.

Sticky bit là special permission đặt trên directory, và nó giới hạn việc xóa file trong directory đó. Nếu Emily tạo một file trong /usr/local/reports và directory đó có sticky bit, John không vào xóa file ấy được. Chỉ owner của file, owner của directory, hoặc superuser root xóa được. Dù permission trên directory là gì, chỉ ba đối tượng đó xóa được. Cách này dùng cho những shared directory nơi nhiều user tạo được file nhưng không được xóa hay sửa file của người khác.

The fourth octal digitSUIDleading digit 4chmod 4664 suidfilechmod 4764 suidfile-rwSrw-r--capital S: no execute bit-rwsrw-r--small s: execute bit tooSGIDleading digit 2chmod 2664 sgidfilechmod 2674 sgidfile-rw-rwSr--capital S: no execute bit-rw-rwsr--small s: execute bit tooSticky bitleading digit 1chmod +t stickydirchmod 1777 stickydirdrwxrwxrwtsmall t: execute bit toodrwxrwxrwTcapital T: no execute bitfind . -perm 4000 or 2000 or 6000 locates files carrying these bits.

Set và nhận ra SUID​

Tạo một file test rồi xem permission mặc định của nó:

touch suidfile
ls -l suidfile

# Output (minh họa):
-rw-rw-r-- 1 jeremy jeremy 0 Oct 24 10:20 suidfile

File có read và write cho user và group, read-only cho nhóm other.

Trước đây permission octal chỉ dùng ba chữ số. Giờ thêm chữ số thứ tư vào trước, và chữ số đầu này là chữ số SUID, giá trị 4. Đặt 4 vào vị trí đó, ba chữ số sau vẫn là permission thường muốn đặt:

chmod 4664 suidfile
ls -l suidfile

# Output (minh họa):
-rwSrw-r-- 1 jeremy jeremy 0 Oct 24 10:20 suidfile

Ở vị trí của execute bit cho user có một chữ S hoa. Chữ đó cho biết SUID bit đang bật trên file này. Nếu người khác chạy file, file sẽ chạy dưới user jeremy thay vì user đã gọi nó.

Đặt bộ permission có execute cho user owner thì hình dạng khác đi:

chmod 4764 suidfile
ls -l suidfile

# Output (minh họa):
-rwsrw-r-- 1 jeremy jeremy 0 Oct 24 10:20 suidfile

Quy ước đọc: chữ S hoa nghĩa là SUID bật nhưng không có execute permission; chữ s thường ở vị trí này nghĩa là cả execute bit và SUID bit đều được set.

Tiện thể, gõ vài chữ đầu của tên file rồi nhấn Tab là shell tự điền phần còn lại, đỡ phải gõ hết.

Set và nhận ra SGID​

Set group ID gần như giống set user ID, chỉ khác là nó áp dụng cho group của file. Chữ số dẫn đầu là 2 thay vì 4:

touch sgidfile
chmod 2664 sgidfile
ls -l sgidfile

# Output (minh họa):
-rw-rwSr-- 1 jeremy jeremy 0 Oct 24 10:22 sgidfile

Chữ S hoa xuất hiện ở vị trí execute của group permission, vì ở đây execute bit không được set. Muốn set cả group execute bit thì đổi chữ số thứ ba thành 7:

chmod 2674 sgidfile
ls -l sgidfile

# Output (minh họa):
-rw-rwsr-- 1 jeremy jeremy 0 Oct 24 10:22 sgidfile

Chữ S hoa thành s thường, nhận ra set GID theo đúng quy ước như SUID.

Tìm file có SUID hoặc SGID​

Đề thi có thể yêu cầu tìm file đang bật SUID bit hoặc SGID bit. Dùng find với flag -perm, đặt 4 ở chữ số đầu và phần còn lại là số 0 vì không quan tâm các permission khác:

find . -perm 4000

# Output (minh họa):
./suidfile

Tìm file SGID thì dùng 2:

find . -perm 2000

Hai bit này set được cùng lúc trên một file: 4 cộng 2 bằng 6, nên chữ số dẫn đầu là 6:

touch both
chmod 6664 both
ls -l both

# Output (minh họa):
-rwSrwSr-- 1 jeremy jeremy 0 Oct 24 10:24 both

Cả SUID và SGID đều đang set. Với find . -perm 6000, kết quả gồm mọi file có SUID, có SGID, hoặc có cả hai:

find . -perm 6000

Set và nhận ra sticky bit​

Sticky bit thường được set trên directory dùng chung giữa nhiều người, và nó chỉ cho user sở hữu file bên trong directory đó, cùng user root, được xóa file khỏi directory.

mkdir stickydir
ls -ld stickydir

# Output (minh họa):
drwxrwxr-x 2 jeremy jeremy 4096 Oct 24 10:26 stickydir

Có một cách viết tắt để set sticky bit:

chmod +t stickydir

Muốn kiểm soát chi tiết hơn thì đặt số 1 ở vị trí dẫn đầu, kèm ba chữ số permission mong muốn:

chmod 1777 stickydir
ls -ld stickydir

# Output (minh họa):
drwxrwxrwt 2 jeremy jeremy 4096 Oct 24 10:26 stickydir

Chú ý chữ t ở cuối chuỗi. Chữ t thường vì sticky bit được set và execute bit cũng được set. Tắt execute bit đi thì hình dạng đổi:

chmod 1666 stickydir
ls -ld stickydir

# Output (minh họa):
drw-rw-rwT 2 jeremy jeremy 4096 Oct 24 10:26 stickydir

Chữ T hoa, theo đúng quy ước hoa và thường đã gặp ở SUID và SGID.

Ba special permission này đều liên quan tới cách find lọc theo permission, chi tiết về -perm và các dạng -perm -664, -perm /664 nằm ở Part 2.3: Tìm file, xử lý text stream và vi.


Nguồn tham khảo​

Nguồn gốc: Khóa "Prep Course - Linux Foundation Certified System Administrator (LFCS) Certification" — phần "Essential Commands" (chủ sở hữu file và group, chgrp, chown, đọc và đặt standard file permission bằng chmod ở dạng chữ và dạng octal, cùng demo SUID, SGID và sticky bit), nền tảng KodeKloud. Giảng viên: Jeremy Morgan và Alexandru Andrei.