Lời mở đầu

Trong bài viết Cơ bản về phân quyền cho file trong Linux (phần 1) mình đã giới thiệu sơ qua về phân quyền cũng như cách xem chi tiết phân quyền của một file bất kỳ trong hệ thống Linux. Ở bài viết này mình sẽ tiếp tục nói về các phương pháp phân quyền và một vài lưu ý phân quyền hiệu quả.

Nhắc lại một chút về phân quyền

Trong phần 1, mình đã nói phân quyền bao gồm 3 nhóm: Owner (chủ sở hữu), Group (nhóm sở hữu), Other (người dùng và nhóm khác) và 3 loại: Read (quyền đọc), Write (quyền ghi), Execute (quyền thực thi). Mỗi nhóm và loại phân quyền này đều có tác dụng riêng, không phụ thuộc lẫn nhau nhưng có thể phối hợp với nhau để giúp cho việc quản lý hệ thống trở nên dễ dàng.
Người dùng khi sở hữu một file thì mới có khả năng phân quyền cho file đó, những người dùng khác và nhóm kể cả có quyền read, write lẫn execute thì vẫn không được phép thay đổi quyền của file. Ngoại lệ duy nhất là siêu người dùng root, cho dù là bất cứ file nào thì root cũng có thể phân quyền được, không quan trọng ai là người sở hữu.
Để tiện cho việc theo dõi, mình sẽ trình bày song song các phương pháp phân quyền cũng như các lưu ý. Sau đây mình xin trình bày.

Quyền hạn mặc định

Do Linux được tạo ra nhằm mục đích cho nhiều người sử dụng nên cũng sẽ có các thiết lập mặc định dành cho người dùng bình thường, những người mà không quan tâm hoặc ít quan tâm đến vấn đề cài đặt hoặc cấu hình.
Không nằm ngoài quy luật này, với các file được tạo ra bởi người dùng thì luôn có những giá trị mặc định được thiết lập sẵn. Cụ thể trong bảng dưới đây:

TypeOwnerGroupOther
Filerw- (đọc và ghi)r-- (chỉ đọc)r-- (chỉ đọc)
Directoryrwx (đọc, ghi và truy cập)r-x (đọc và truy cập)r-x (đọc và truy cập)

Như vậy, khi tạo một file mới, quyền cao nhất luôn luôn thuộc về người tạo ra nó, bao gồm đọc, sửa, xóa ..., nhóm và người dùng khác chỉ có quyền xem.
Với thư mục, mặc dù vẫn dùng chung các kí hiệu r, w, x như file thông thường nhưng quyền hạn thì có một chút khác biệt, cụ thể là:

  • r (read): quyền xem danh sách file và thư mục con (dùng lệnh ls)
  • w (write): quyền tạo file và thư mục con (dùng lệnh touch và mkdir)
  • x (execute): quyền chuyển vào thư mục (dùng lệnh cd)

Phân quyền sử dụng chmod

Nếu nói tới phân quyền trong Linux, không thể không nhắc tới chmod. Đây là câu lệnh cơ bản nhất dùng để phân quyền file, chức năng chính của nó thì như tên gọi - change file mode bits.
Hai cú pháp cơ bản của chmod là:

chmod MODE[,MODE] ... FILE ... # Dùng symbolic

VD: chmod u+rw file_1, chmod g+x,o= file_2, chmod u=g,g=o file_3 ....

chmod OCTAL-MODE FILE ... # Dùng octal number

VD: chmod 0755 file_4, chmod 4700 file_5 ...

Cách thứ nhất dùng để phân quyền một cách rõ ràng cho từng nhóm phân quyền (owner, group, other hoặc all), còn cách thứ hai sẽ giúp người sử dụng thao tác nhanh hơn nếu đã làm quen với lệnh.
Về cách thứ nhất, format chung của mode sẽ như sau: chmod [group_permisssion] [operator] [permisssion].
Bảng Group Permission

Group PermisionSymbolicDescription
OwneruChủ sở hữu
GroupgNhóm sở hữu
OtheroNgười dùng và nhóm khác
AllaToàn bộ người dùng và nhóm

Bảng Operator

OperatorSymbolicDescription
Add-Loại bỏ quyền
Remove+Cấp thêm quyền
Assign=Chỉ định quyền cụ thể

Bảng Permission

PermissionSymbolicDescription
ReadrQuyền đọc
WritewQuyền ghi
ExecutexQuyền thực thi
Setuid/SetgidsNgười thực thi là người sở hữu thay vì người sử dụng lệnh
STương tự với Setuid/Setgid nhưng file không thể thực thi
Stickytchủ sở hữu (hoặc root) mới được phép xóa hoặc thay đổi tên file

Cách thứ hai sẽ khó sử dụng hơn cách thứ nhất do dùng chữ số nhưng nếu quen rồi thì khi thao tác sẽ nhanh hơn rất nhiều. Cụ thể phân quyền bằng cách này sẽ sử dụng một dãy tối đa 4 chữ số để phân quyền. Chữ số nào bị thiếu thì mặc định sẽ coi như bằng 0. VD: 7 tương đương với 0007. Các giá trị cho phép sẽ là một số octal (hệ 8) trong khoảng từ 0 đến 7777.
Bảng sau sẽ trình bày cụ thể các giá trị

Giá trịHàng thứ nhấtHàng thứ 2, 3, 4
0Không có quyền (---)
1StickyQuyền thực thi (--x)
2SetgidQuyền ghi (-w-)
3Sticky và SetgidQuyền ghi và thực thi (-wx)
4SetuidQuyền đọc (r--)
5Sticky và SetuidQuyền đọc và thực thi (r-x)
6Setgid và SetuidQuyền đọc và ghi (rw-)
7Sticky, Setgid và SetuidQuyền đọc, ghi và thực thi (rwx)

Thông thường với một file văn bản, hình ảnh ... thì ta nên sử dụng mode rw-r--r-- hay 644, bất cứ ai cũng có thể đọc nhưng chỉ chủ sở hữu mới có quyền ghi. Tuy nhiên ta cũng có thể dùng mode rw-rw---- hay 660 vì có thể có một file nào đó cần chia sẻ với người dùng trong nhóm cụ thể nhưng lại không muốn người dùng ngoài nhóm được quyền xem nội dung hay chỉnh sửa file đó. Còn với những file cần giữ bí mật thì tốt hơn hết là để mode rw------- hay 600. Mode 600 nên sử dụng với những file như secret key của gpg hoặc ssh. Với thư mục hoặc file cần thực thi thì ta có thể cấp quyền thực thi, nhưng phải chú ý công năng của file và hạn chế cấp quyền cho Other hoặc thậm chí cả Group nếu không cần thiết.

Phân quyền sử dụng chown và chgrp

Lệnh chmod chỉ có khả năng thay đổi quyền truy xuất tới file (đọc, ghi, thực thi ...) Còn nếu ta muốn thay đổi chủ sở hữu hoặc nhóm sở hữu thì phải dùng đến 2 lệnh là chownchgrp.
chown là lệnh dùng để thay đổi chủ sở hữu (có thể thay đổi nhóm sở hữu) còn chgrp thì chỉ cho phép thay đổi nhóm sở hữu của file.
VD: chown john:admin file_a sẽ chuyển quyền sở hữu của file_a sang cho người dùng john và nhóm admin, chmod video file_b sẽ chuyển nhóm sở hữu cho file_b sang nhóm video ...
Đặc biệt ta có thể thêm tùy chọn -R (hoặc --recursive) để chuyển quyền cho toàn bộ cây thư mục (file và thư mục con), tùy chọn này sẽ hữu ích khi ta muốn thay đổi chủ sở hữu hoặc nhóm trên tất cả file trong thư mục nào đó mà không muốn lặp đi lặp lại một thao tác.

Lời kết

Trên đây chỉ là các cách cơ bản để phân quyền cho file trong Linux, tuy cơ bản nhưng cũng khá hiệu quả với người dùng bình thường hoặc người dùng không quan trọng lắm về phân quyền. Với hiểu biết có hạn nên bài viết này có thể còn sai sót hoặc chưa đầy đủ. Hy vọng mọi người có thể góp ý để mình hoàn thiện bài viết hơn.
Xin cảm ơn mọi người đã đọc bài viết.

References