LPI: Phân quyền trong linux (phần 1)


9 min read
LPI: Phân quyền trong linux (phần 1)

Hiện nay, Linux đang ngày càng trở nên phổ biến. Kể từ khi Linus Torvalds công khai mã nguồn của nhân Linux đến nay, càng ngày càng có nhiều lập trình viên trên thế giới quan tâm đến dòng hệ điều hành này. Nhiều công ty đã sử dụng các distro của Linux làm hệ điều hành mặc định cho nhân viên sử dụng.

Có thể kể đến các phiên bản đang phổ biến hiện nay như Ubuntu, Fedora, OpenSUSE (cho máy cá nhân), CentOS, RedHat, Debian (cho doanh nghiệp)... Một trong những ưu điểm của Linux là tính năng phân quyền sử dụng trên file. Một tính năng vô cùng mạnh mẽ nhưng cũng rất nguy hiểm nếu chúng ta không hiểu về nó.

1. Quyền hạn

Tất cả các tập tin và thư mục của Linux đều có quyền sở hữu và quyền truy cập. Bạn có thể thay đổi các tính chát này đối với tập tin hay thư mục. Quyền của tập tin còn cho phép xác định tập tin có phải là một chương trình hay không.

Ví dụ với lệnh ls -l:

Trong Linux có 3 nhóm phân quyền chính

Người sở hữu (owner)
Nhóm sở hữu (group owner)
Người khác (other users)

Quyền read cho phép đọc nội dung của tập tin. Đối với thư mục, quyền đọc cho phép bạn di chuyển vào thư mục và xem nội dung của thư mục.

Quyền write cho phép bạn thay đổi nội dung hay xóa tập tin. Đối với thư mục, quyền write cho phép tạo, xóa, thay đổi tên các tập tin trong thư mục không phục thuộc vào quyền cụ thể của tập tin trong thư mục. Như vậy, quyền write của thư mục sẽ vô hiểu hóa các quyền truy cập của tập tin trong thư mục.

Quyền execute cho phép gọi chương trình lên bộ nhớ bằng cách nhập từ bàn phím tên của tập tin. Đối với thư mục, bạn chỉ có thể vào thư mục bởi lệnh cd nếu bạn có quyền thực thi với thư mục.

  • Kí tự - đầu tiên là một cờ đặc biệt để chỉ loại file, - với file thông thường, d với thư mục, cvới thiết bị, l với liên kết (liên kết tới một file khác).
  • 3 kí tự rwx đầu tiên là quyền hạn của Owner, ở đây Owner sẽ có mọi quyền với file
  • 3 kí tự r-x ở giữa là quyền hạn của Group, ở đây Group sẽ có quyền đọc và quyền dùng lệnh cd
  • 3 kí tự --- cuối cùng là quyền hạn của Other, tương tự như Group ở trên sẽ có quyền đọc và dùng lệnh cd
  • Số nguyên đi sau quyền hạn để chỉ số lượng liên kết tới file, ở đây 1 có nghĩa là file này không có liên kết tượng trưng mà chỉ có một liên kết cứng duy nhất trỏ tới chính nó.
  • Cuối cùng là 2 thông tin nói về chủ sở hữu và nhóm sở hữu, ở đây là người dùng user và nhóm group

Vậy như hình trên, giá trị số sẽ là: 754 (r + w + x = 7,  r + x = 5,  r = 4)

Ngoài ra quyền hạn cho từng loại người dùng  sử dụng một số có 3 bit tương ứng cho 3 quyền read, write và execute. Theo đó nếu cấp quyền thì bit đó là 1, ngược lại là 0. Giá trị nhị phần của số 3 bit này xác định các quyền cho nhóm người đó.

Bit Giá trị
Bit 2 Read
Bit 1 Write
Bit 0 Execute

Ví dụ:

Chỉ có quyền read: 100 có giá trị là 4

Có quyền read và execute: 101 có giá trị là 5

Theo cách tính số thập phân, bạn cũng có thể xác định số quyền hạn bằng cách tính tổng giá trị của các quyền. Theo quy định trên ta có giá trị tương ứng như sau:

Quyền Giá trị
4 Read permisson
2 Write permisson
1 Execute permisson

Ví dụ: Nếu có quyền read và execute thì số của quyền là: 4+1 =5

read, write, execute: 4 + 2 + 1 = 7

Tổ hợp của 3 quyền trên có giá trị từ 0 đến 7.

Kí hiệu Mô tả
0 or - không có quyền
1 or –x execute
2 or -w- write
3 or -wx write và execute
4 or r– read
5 or r-x read và execute
6 or rw- read và write
7 or rwx read, write và execute

Như vậy khi cấp quyền trên một tập tin/thư mục, bạn có thể dùng số thập phân gồm 3 số. Số đầu tiên miêu tả quyền của owner, số thứ 2 cho group onwer và thứ 3 cho other users.

Ví dụ: Một tập tin với quyền 751 có nghĩa là owner có quyền read, write, execute bằng 4 + 2 + 1 =7. Group owner có quyền read và execute bằng 4 + 1 = 5 và những other users có quyền execute bằng 1.

2. Quyền mặc định (Default Permissions)

umask (user mask) được sử dụng để kiểm soát quyền mặc định của các files, thư mục mới khi nó được tạo ra.

Bạn có thể gán umask mặc định trong /etc/bash.bashrc hoặc /etc/profile cho tất cả các users. Phần lớn các distro đều gán là 0022 hoặc 0002. Để gán umask cho một user xác định nào đó, bạn có thể chỉnh sửa ~/.bashrc của user đó và thêm vào dòng sau:

umask 022

Trong Linux, khi một file hay một thư mục được tạo ra thì các quyền hạn truy cập đối với chúng là (read, write, execute) cho các chủ thể (owner, group, other) sẽ được xác định dựa trên hai giá trị là quyền truy nhập cơ sở (base permission) và mặt nạ (mask).. Đối với thư mục, quyền truy cập cơ sở là 0777 (rwxrwxrwx), còn đối với files là 0666 (rw-rw-rw).

Giá trị “mask” được thiết lập nhờ lệnh umask. Tất cả các file và thư mục được tạo ra sau đó sẽ chịu ảnh hưởng của giá trị mask mới.

Quyền truy cập chính thức được tính bằng cách lấy “giá trị nhị phân của Base permission ”AND“ dạng biểu diễn bù 1 của mask”

"quyền truy cập mặc định" AND (NOT (Giá trị umask))

Ví dụ:

Bash permission của file: 666 = 110110110

umask: 022 = 000010010

NOT (umask) = NOT (000010010 ) = 111101101

110 110 110 AND 111 101 101 = 110 100 100 = 644 Cũng có thể tính quyền truy cập chính thức đơn giản hơn bằng cách lấy Bash permission – umask (666 – 022 = 644). Nhưng chỉ đúng với thư mục.

Với file thì  Bash permission – umask. Sau đó số nào chẵn giữ nguyên, số nào lẻ thì giảm đi 1.

Giá trị umask mặc định cho user thường là 0002

Với mask này thì quyền hạn truy cập mặc định cho thư mục là 775 và file là 664

Giá trị umask mặc định cho user thường là 0022

Với mask này thì quyền hạn truy cập mặc định cho thư mục là 755 và file là 644

3. Các lệnh sử dụng:

a. chmod

Đây là lệnh được sử dụng rất phổ biến, dùng cấp phép quyền hạn truy cập của tập tin hay thư mục. Chỉ có chủ sở hữu và superuser mới có quyền thực hiện lệnh này.

Cú pháp: # chmod [nhóm_người_dùng] [thao_tác] [quyền_hạn] [tên_tập_tin]

Bảng Group Permission

Group Permision Symbolic Description
Owner u Chủ sở hữu
Group g Nhóm sở hữu
Other o Người dùng và nhóm khác
All a Toàn bộ người dùng và nhóm

Bảng Operator

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

Bảng Permission

Operator Symbolic Description
Read r Quyền đọc
Write w Quyền ghi
Execute x Quyền thực thi
Setuid/Setgid s Người thực thi là người sở hữu thay vì người sử dụng lệnh
S Tương tự với Setuid/Setgid nhưng file không thể thực thi
Sticky t chủ sở hữu (hoặc root) mới được phép xóa hoặc thay đổi tên file

Operator Symbolic Description
Giá trị Cột thứ nhất Cột thứ 2, 3, 4
0 Không có quyền (---)
1 Sticky Quyền thực thi (--x)
2 Setgid Quyền ghi (-w-)
3 Sticky và Setgid Quyền ghi và thực thi (-wx)
4 Setuid Quyền đọc (r--)
5 Sticky và Setuid Quyền đọc và thực thi (r-x)
6 Setgid và Setuid Quyền đọc và ghi (rw-)
7 Sticky, Setgid và Setuid Quyền đọc, ghi và thực thi (rwx)

Ví dụ: Gán quyền trên tập tin test

Gán thêm quyền write cho group:
[root@localhost ~]# chmod g+w test

Xóa quyền read trên group và other:
[root@localhost ~]# chmod go-r test

Gán ngang quyền group và other bằng onwer:
[root@localhost ~]# chmod go=u test

Ngoài cách gán quyền trên, chúng ta cũng có thể gán quyền trực tiếp thông qua 3 chữ số xác định quyền như sau:

# chmod [giá_tri_quyền] [tên_tập_tin/thư_mục]

Quyền -wrx-r-xr-x
[root@localhost ~]# chmod 755 test
Quyền -r-x-r–r–
[root@localhost ~]# chmod 544 test
Quyền -rwxrwxrwx
[root@localhost ~]# chmod 777 test

b. chown

Lệnh chown dùng để thay đổi người sở hữu trên tập tin, thư mục

Cú pháp: # chown [tên_user:tên_nhóm] [tên_tập_tin/thư_mục]

Ta có thể thêm tùy chọn -R để thay đổi người sở hữu của thư mục và tất cả các thư mục con của nó. Cũng có thể sử dũng với lệnh chmod, chgrp.

Đổi owner tập tin test thành b1
[root@localhost ~]# chown b1 test
Đổi owner tập tin test thành b1 và group owner thành b2
[root@localhost ~]# chown b1:b2 test

c. chgrp

Lệnh chgrp dùng để thay đổi group owner của tập tin, thư mục

Cú pháp: # chgrp [nhóm_sở_hữu] [tên_tập_tin/thư_mục]

Đổi group owner tập tin test thành root

[root@localhost ~]# chgrp root test

Trong phần 2 chúng ta sẽ tìm hiểu về cách phân quyền nâng cao như: SUID, SGID, Sticky bit

GO TOP

🎉 You've successfully subscribed to itplusX!
OK
]