Giới thiệu
Chắc bạn đã biết trong một phần mềm quản lý nhân viên, mỗi nhóm người hay một một người sẽ có một quyền hạn nhất định. Ví dụ như quản lý sẽ có quyền chia công việc, quản lý nhân viên của mình, còn giám đốc thì có thể thay đổi, thêm hoặc bớt các bộ phân trong công ty. Việc phân chia như vậy sẽ giúp cho việc quản lý dễ dàng và bảo mật hơn.
Điều đấy cũng sẽ đúng trong phân quyền trên Linux. Vì Linux là một bản sao được phát triển từ UNIX nên nó có khả năng chạy đa người dùng và ta có thể sử dụng việc phân quyền để đặt ra các giới hạn nhất định cho mỗi người. Trong bài này chúng ta sẽ đi qua một số khái niệm cũng như cách xem về phân quyền trên Linux nhé.
User
Đầu tiên, User (hay còn gọi là người dùng) là tài khoản dùng để đăng nhập vào hệ thống. Mỗi User sẽ chứa một mã UID (Unique identification number) hay mã xác định danh tính duy nhất, từ đó hệ thống có thể phân biệt được các người dùng với nhau.
Tất cả các thông tin về các User trong hệ thống được lưu tại địa chỉ /etc/passwd
còn mật khẩu thì sẽ được hash (mã băm - mã hoá một chiều) và lưu tại /etc/shadow
Dựa vào quyền hạn truy cập thì User được chia theo 2 loại chính:
- Superuser/root/administrator : Loại User có quyền hạn cao nhất. Có khả năng truy cập vào mọi file có trong hệ thống.
- Normal user: Là loại User thường, bị giới hạn một số quyền (Ta có thể tuỳ chọn các quyền mà user này có thể làm).
Superuser
Theo như ở trên thì bạn đã biết Superuser (hay còn được gọi là root) là một User hệ thống. Ta sử dụng Superuser khi muốn sử dụng các đặc quyền mà chỉ Superuser làm được còn User thường thì không.
Thông tin: UID của Superuser/ root/ administrator trong các hệ điều hành tương tự Unix sẽ là 0 bất kể nó có tên gì.
Các đặc quyền mà Superuser có thể làm:
- Đặc quyền thay đổi read/write/exectue
- Tạo, tải file hay phần mềm
- Sửa đổi files và cài đặt
- Xoá thông tin User và data
Chú ý: Bạn phải cẩn trọng khi sử dụng Superuser vì lúc này bạn có thể thay đổi ở cấp cao nhất. Nếu bạn không biết mình đang làm gì thì không nên sử dụng.
Để đăng nhập với Superuser (root user) có 2 cách:
Cách 1. su [command]
: Cho phép bạn tạm thời chuyển sang Superuser.
Lệnh này sẽ cho phép bạn đăng nhập vào Superuser. Điều đó cũng đồng nghĩa với việc tất cả các lệnh bạn nhập vào đều chạy bằng quyền cao nhất - root. Sau khi hoàn thành các câu lệnh, bạn sẽ phải đăng xuất bằng lệnh logout
. Đó cũng chính là lý do su
ít được sử dụng. Hãy thử tưởng tượng vào một ngày tồi tệ, bạn quên đăng xuất và vô tình thực hiện câu lệnh xoá file hệ thống. Kết cục, hệ điều hành không thể boot và data quan trọng bị xoá. Rất tệ đúng không nào. Thế nên, mình sẽ giới thiệu bạn cách thứ 2 mang tính "an toàn" hơn.
Cách 2. sudo [command]
: Cho phép bạn thực thi câu lệnh dưới quyền Superuser. (Khuyên dùng)
Khác với su
thì sudo
không yêu cầu đăng nhập mà thay vào đó, cứ mỗi lần bạn muốn thực thi một câu lệnh bằng đặc quyền của root thì bạn phải để tiền tố sudo
trước đó. Điều này giúp bạn kiểm soát được mình đang xài user nào và tránh các hậu quả đáng tiếc.
Dưới đây là 2 ví dụ tải package bằng sudo
và su
:
Sử dụng sudo để tải package python3-pip
:
Đầu tiên xem mình là user nào bằng whoami
(tuỳ vào mỗi người thì Normal User sẽ có một tên khác nhau tuỳ vào bạn đặt gì vào lúc tạo).
Sử dụng sudo
cài package:
Bạn chỉ cần nhập mật khẩu của User hiện tại (normalUser
) là câu lệnh sẽ được thực thi.
Sử dụng su để tải package pip
:
Đầu tiên xem mình là user nào bằng whoami
.
Chuyển sang Superuser bằng su
:
Lúc này bạn cần nhập mật khẩu của root (Đối với một số hệ điều hành, Superuser sẽ bị khoá). Sau khi nhập xong bạn sẽ thấy Terminal của bạn sẽ chuyển tiền tố $
sang #
(đây cũng là một dấu hiệu nhận biết mình đang ở user thường hay root).
Bây giờ ta sẽ tải package, nhưng lần này sẽ không cần tiền tố sudo
nữa.
Sau khi tải xong, hay nhớ đăng xuất nhé.
Linux Group
Trong Linux, Group (nhóm) là một tập hợp các user. Trong Linux, theo mặc định thì Normal User thường được xếp vào Default Group. Mục đính chính của Group là phân quyền của một hay nhiều tài nguyên cho các thành viên trong Group. Ta có thể thêm, bớt thành viên trong Group để phù hợp với mục đích. Có 2 loại group chính:
- Primary/ Login group (Nhóm chính/ Nhóm đăng nhập): Là nhóm được gán cho files được tạo bởi User. Thông thường, tên của nhóm chính giống với tên của người dùng. Người dùng bắt buộc phải nằm trong một nhóm chính nào đó.
- Secondary/ Supplementary group (Nhóm phụ/ nhóm bổ sung): Được sử dụng để cung cấp các đặc quyền nhất định cho một nhóm người dùng. Các User có thể là thành viên của không hoặc nhiều nhóm phụ.
Nhóm của người dùng chính được lưu trữ trong tệp /etc/passwd
và các nhóm bổ sung (nếu có) sẽ được liệt kê trong tệp /etc/group
.
Ví dụ: Bạn có một file
helloworld.txt
và 5 User (A, B, C, D, E
). Bạn muốn phân quyền choA, B, C
được đọc nội dung, cònB, C, D
được thay đổi nội dung. Lúc này phương pháp Group sẽ vô cùng hiệu quả. Ta sẽ choA, B, C
vào nhóm 1 cònB, C, D
vào nhóm 2 sau đó thực hiện phân quyền. Nếu tương lai bạn muốnE
cũng có khả năng đọc nội dung thì bạn chỉ cần thêmE
vào nhóm 1 là xong. Rất tiện lợi và hiệu quả!
Read, write, execute trong phân quyền file
Trong linux, tất cả các file, tài nguyên đều có 3 loại quyền chính:
- READ (Đọc): Quyền đọc cho phép bạn mở file và xem nội dung của nó. Trong trường hợp thư mục thì bạn có thể xem các thành phần con trong nó.
- WRITE (Viết): Quyền viết hay ghi cho phép bạn thay đổi nội dung của file. Trong trường hợp thư mục thì bạn có thể thay đổi vị trí, xoá, thêm các thành phần con trong nó
- EXECUTE (Thực thi): Quyền thực thi cho phép bạn chạy file.
Lưu ý rằng, bạn có quyền viết thư mục nhưng không có nghĩa là bạn có thể thay đổi các nội dung file con của nó và ngược lại. Ví dụ bạn có quyền viết một file /abc/bbc/helloworld.txt
nhưng chỉ có quyền đọc thư mục /abc/bbc/
, lúc đó bạn chỉ có thể thay đổi nội dung file helloworld.txt
nhưng không thể thay đổi vị trí, xoá hay đổi tên của nó được.
Xem phân quyền của một file
Xem thông tin phân quyền của một file hay thư mục bạn có thể sử dụng lệnh ls
. Để biết thêm các thông số khác thì thêm -l
ở phía sau, lúc này thông tin sẽ thể hiện dưới dạng long format như sau:
Ta sẽ thu được kết quả theo định dạng sau:
Trong đó:
- Permission: Các quyền của file.
- Owner: Chủ sở hữu của file.
- Group: Nhóm mà chủ sở hữu thuộc vào.
- Date created: Ngày tạo file
Ở trong Permission sẽ là chi tiết các quyền của các loại user khác nhau:
- File Type (loại têp): Có ba loại là
Tệp thông thường (-)/ Thư mục (d)/ Liên kết (i).
- User: Quyền đối với người dùng (chủ sở hữu)
- Group: Quyền đối với nhóm của chủ sở hữu
- Other: Quyền đối với những người dùng khác
Ở ví dụ trên ta có thể thấy User và Group có quyền
read, write
còn Other chỉ có quyềnread
.
Để hiểu thêm thì chúng ta cùng xem thêm một vài ví dụ:
- - rw- --- --- : File thường, User
read, write
. - - rwx r-x r-x : File thường, User
read,write, execute
, Groupread, execute
, Otherread,execute
. - d rw- r-x --- : Thư mục, User
read, write
, Groupread, execute
. - i rwx r-- r-- : Link, User
read,write, execute
, Groupread
, Otherread
.
Các mode (chế độ) chỉnh sửa phân quyền
Để thay đổi phân quyền của một file hay một thư mục ta có thể sử dụng lệnh chmod
. Dựa vào cách trình bày thì ta có thể chia thành 2 chế độ
- Symbolic Mode: Sử dụng ký tự để phân puyền.
- Numeric Mode: Sử dụng mã bát phân để phân quyền
2 mode này hoạt động khác nhau nhưng đều sử dụng chung một syntax:
SYMBOLIC MODE
Đây là một mode rất được ưa thích cho người mới sử dụng vì cách trình bày rất dễ học. Symbolic sử dụng các ký tự để quy ước loại user.:
- User (u)
- Group (g)
- Other (o)
- All (a)
Và các quyền hạn:
- Read (r)
- Write (w)
- Execute (x)
Ngoài ra ta còn có thêm các signs (biểu thị toán học) + - =
để phục vụ cho mục đích tinh chỉnh theo ý muốn từng loại quyền với từng loại user khác nhau:
- (+): Thêm quyền lên đầu các quyền hiện có.
- (-): Xoá quyền khỏi các quyền hiện có.
- (=): Ghi đè lên các quyền hiện có
Bây giờ ta sẽ đi qua các ví dụ để hiểu hơn cách Symbolic mode hoạt động nhé:
Ví dụ 1: u+w,o-r
Đầu tiên sẽ là User kí hiệu là (u
) thêm quyền write (+w
), sau đó Other kí hiệu là (o
) bị xoá quyền read (-r
).
Ví dụ 2: a=rwx
All User(a
) được ghi đè (=
) quyền read(r
), write(w
), execute(x
).
Thực hành: Để thực hiện thay đổi các quyền trên Linux bằng chế độ Symbolic thì ta sử sụng cú pháp sau:
Ví dụ bạn muốn thay đổi quyền file helloworld.txt
như ví dụ 1 (u+w,o-r : User thêm write
, Other xoá read
.):
NUMERIC MODE
Tiếp theo ta sẽ được tiếp xúc với một chế độ nâng cao hơn là Numeric mode. Vì sử dụng 3 chữ số bát phân thay vì ký tự như Symbolic nên chế độ này khá khó cho người mới. Tuy nhiên đây là cách khá nhanh khi chỉ sử dụng 3 chữ số để phân quyền trong khi đó Symbolic phải ghi đầy đủ ra. Nếu không có nhu cầu thêm hay xoá quyền thì mình khuyến khích các bạn sử dụng chế độ này, tuy khó nhưng sử dụng nhiều bạn sẽ quen mà thôi.
Đây là bảng thể hiện các phân quyền trên Linux trong chế độ Numeric:
Hoặc đơn giản hơn bạn có thể nhớ như sau:
- Read (r) = 4
- Write (w)=2
- Execute (x)=1
Ta thử nhé Read + Wite = 6
, Read + Write + Execute = 4 + 2 + 1=7
,... kết quả thu được sẽ giống như trên bảng đúng không nào.
Việc phân quyền trên Linux cho các loại user sẽ được thể hiện dưới dạng 3 chữ số XXX
thứ tự là User, Group, Other
.
Bây giờ mình sẽ cho các bạn một số ví dụ:
Ví dụ 1: Owner read, write, execute
, group read
- User: Read + write + execute = 4 + 2 + 1 = 7
- Group: Read = 4
- Other: =0
- Ta thu được: 740
Ví dụ 2: Owner read, write
, group read, execute
, other read
- User: Read + write = 4 + 2 = 6
- Group: Read + execute = 4 + 1 = 5
- Other: Read = 4
- Ta thu được: 654
Thực hành: Để thực hiện thay đổi các quyền bằng chế độ Numeric thì ta sử sụng syntax sau:
Bây giờ giả sử bạn muốn thay đổi quyền file helloworld.txt
như Ví dụ 1 (Owner read, write, execute
, group read
), bạn nhập như sau:
Special Permission
Ngoài 3 permission cơ bản là read, write, execute thì file/ thư mực còn có thêm 3 Special Permission (Quyền đặc biệt) khác đó là: SUID, SGID và sticky bits
SUID (Set user id):
- Sử dụng trên các file (thường là các file thực thi - executable files) .
- Cung cấp các đặc quyền của Owner cho User hiện tại khi thực thi file.
- Kí hiệu của SUID là
s
theo Symbolic và số4
theo Numeric.
Ví dụ: Một file có chủ sở hữu là root và được set SUID bit, lúc này nếu một user khác thực thi file này thì nó luôn được chạy với đặc quyền root. Cụ thể dưới đây là file passwd
sở hữu bởi root, khi thực thi lệnh ls -l
, bạn có thể dễ dàng thấy kí tự s
, dấu hiệu của SUID.
Có 2 cách để gán SUID vào file:
- Sybolic mode:
chmod u+s [file name]
- Numeric mode:
chmod 4555 [file name]
( thêm 4 vào trước permissons)
Nếu file chưa có quyền thực thi (executing file as program), SUID sẽ là chữ S (S in hoa). Để thay đổi S thành s (s in thường) bạn phải cấp quyền thực thi cho file bằng lệnh dưới đây:
chmod u+x [file name]
.
SGID (Set group id):
Theo như tên gọi thì quyền này giống như SUID chỉ khác nó cung cấp các đặc quyền của Group Owner.
Kí hiệu của SUID là
s
theo Symbolic và số2
theo Numeric.
Ví dụ: Một file có nhóm chủ sở hữu là STAFF và được set SGID bit, lúc này nếu một user khác thực thi file này thì nó luôn được chạy với đặc quyền của group STAFF.
Có 2 cách để gán SGID vào file:
- Sybolic mode:
chmod g+s [file name]
- Numeric mode:
chmod 2555 [file name]
( thêm 2 vào trước permissons)
Sticky bit:
- Chỉ cho phép Owner và root thay đổi tên, xoá file/ thư mục.
- Sticky bit thường được sử dụng trong các file/ thư mục chia sẽ.
- Kí hiệu của Sticky bit là
t
theo Symbolic và số1
theo Numeric.
Ví dụ 1: Thông thường trong hệ thống có một thư mục /tmp
.
Theo như output phía trên, bạn sẽ thấy kí hiệu t
của Stickybit ở cuối cùng của phần other
. Tiếp theo, ở cột 3 chính là Owner của thư mục là root
. Điều đó có nghĩa bạn chỉ có thể đổi tên, xoá file khi và chỉ khi bạn đang trong trạng thái Superuser.
Ví dụ 2: Một file test.txt
sỡ hữu bởi ubuntu
và chia sẽ cho user normal_user
. Sau khi set Sticky bit ta được:
Bây giờ normal_user
cố gắng xoá file sẽ bị chặn lại (Permission denied
). Mặc dù other
có toàn bộ quyền write.
Có 2 cách để gán Sticky bit vào file:
- Sybolic mode:
chmod o+t [file name]
- Numeric mode:
chmod 1555 [file name]
( thêm 1 vào trước permissons)
Thông tin: Để xoá special permission bạn thay đổi dấu + thành dấu -
Tổng kết
Phân quyền trên Linux là một kiến thức căn bản mà ai làm việc trên Linux cũng nên biết. Qua bài này mình mong các bạn sẽ hiểu thêm các quyền của file/thư mục cũng như biết cách 2 chế độ Numeric và Symboric hoạt động. Sử dụng User root khá đơn giản và mạnh mẽ tuy nhiên nó cũng tiềm tàng nhiều nguy cơ nên các bạn hãy lưu ý nhé. Hẹn các bạn vào các bài sau.
Tính năng đang được phát triển