Phân quyền trên Linux: SUID và SGID

Chia sẻ

Phân quyền trên Linux đôi khi có thể khiến bạn thấy hơi “rắc rối”. Cùng học xem làm như thế nào để phân quyền một cách thích hợp, kể cả trong những trường hợp đặc biệt
Phân quyền trên Linux là một vấn đề mà bất cứ người dùng nào cũng sẽ phải gặp phải ngay từ khi họ bắt đầu sử dụng Linux. Chúng ta cần thực thi các đoạn scripts, chỉnh sửa files, thực thi các tiến trình để quản lí hệ thống một cách hiệu quả hơn. Nhưng điều gì sẽ xảy ra khi chúng ta thấy thông báo Permission Denied? Bạn muốn hiểu tại sao lại có chuyện này xảy ra? Và giải pháp cần thực hiện để khắc phục tình trạng đó
Tôi sẽ trình bày nhanh về một số cách chúng ta thường sử dụng để tính toán quyền hạn, và sau đó chúng ta sẽ tập trung vào những quyền hạn đặc biệt trong Linux.

Phương thức Symbolic

Phương thức Symbolic sử dụng cú pháp như sau

[cloudzone@server ~]$ chmod WhoWhatWhich file | directory

Trong đó

  • Who: Tham số về định danh. Có 1 trong 4 giá trị u, g, o, a (user, group, other, all)
  • What: Tham số về hành động. Có 1 trong 3 giá trị +, -, = (add, remove, set exact)
  • Which: Tham số về quyền hạn. Có 1 trong 3 giá trị r, w, x (read, write, execute)

An example of this is if I want to add the read and write permissions to a file named test.txt for user and group, I use the following command:
Một ví dụ là nếu tôi muốn thêm quyền read và write vào một files tên là test.txt cho user và group. Tôi sẽ sử dụng câu lệnh sau

[cloudzone@server ~]$ chmod ug+rw test.txt

Phương thức Numeric

Phương thức Numeric, theo kinh nghiệm cá nhân của tôi, đây là cách tốt nhất để học và luyện tập về phân quyền. Nó dựa trên cú pháp sau

[cloudzone@server ~]$ chmod ### file | directory

Ở đây, từ trái sang phải, kí tự # nói về một level truy cập. Có 3 level: user, group, and others. Và giá trị của mỗi level được đặt như sau

  • Bắt đầu bằng 0
  • Nếu có quyền read: Cộng thêm 4
  • Nếu có quyền write: Cộng thêm 2
  • Nếu có quyền Execute: Cộng thêm 1

Ví dụ quyền hạn sau

-rw-r-x---

Sẽ được chuyển thành 650. Giải thích như sau

  • Quyền hạn của user là rw- hay 4+2=6
  • Quyền hạn của group là r-x hay 4+1=5
  • Quyền hạn của others là — hay 0

Đưa vào cú pháp sẽ là như sau

[cloudzone@server ~]$ chmod 650 test.txt

Giải thích các quyền đặc biệt

Quyền hạn đặc biệt tạo ra level truy cập thứ 4 bên cạnh user, group và other. Quyền hạn đặc biệt cho phép thêm một đặc quyền vượt lên những quyền hạn thông thường. Mỗi level có một quyền hạn đặc biệt riêng cho nó. Hãy phân tích từng trường hợp

user + s (pecial)

Còn được nói tới là SUID, một quyền đặc biệt cho user access level có một chắc năng duy nhất. Một file với SUID luôn được thực thi với user sở hữu files đó, không quan tâm tới user nào đang thực thi câu lệnh. Nếu chủ sở hữu file không có quyền execute, bạn có thể dùng một chữ S in hoa ở đây
Để thấy rõ hơn vấn đề này, hãy nhìn vào câu lệnh /usr/bin/passwd. Câu lệnh này, mặc định có quyền SUID được gán

[cloudzone@server ~]$ ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 33544 Dec 13 2019 /usr/bin/passwd

group + s (pecial)

Còn được biét tới là SGID, quyền hạn đặc biệt này có một số chức năng như sau

  • Nếu được đặt trên một files, nó cho phép files ày được thực thi như group sở hữu files đó (Tương tự SUID)
  • Nếu được đặt trên một thư mục, bất cứ files nào tạo trong thư mục đó sẽ được cấp quyền cho group sở hữu
[cloudzone@server article_submissions]$ ls -l
total 0
drwxrws---. 2 cloudzone cloudzone 69 Apr 7 11:31 my_articles

Điều này khá hữu ích cho thư mục được chia sẻ để làm việc chung giữa các thành viên của group. Bất cứ member nào trong group có thể truy cập vào bất cứ file mới nào tạo ra. Điều này cũng tương tự cho quyền thực thi các files này. SGID thực sự rất mạnh khi được sử dụng đúng cách
Lưu ý nếu group sở hữu không có quyền thực thi, thì chúng ta sẽ dùng chữ S in hoa ở đây

other + t (sticky)

Quyền hạn đặc biệt cuối cùng có thể hơi rối một chút. Quyền hạn này không ảnh hưởng tới các files riêng lẻ. Nhưng ở cấp độ thư mục, nó ngăn chặn việc xoá files. Chỉ có người sở hữu (và root) của file này có thể xoá file/và thư mục. Một ví dụ ở thư mục /tmp

[tcarrigan@server article_submissions]$ ls -ld /tmp/
drwxrwxrwt. 15 root root 4096 Sep 22 15:28 /tmp/

Quyền hạn này được ghi lại với chữ t

Gán các quyền hạn đặc biệt

Để gán các quyền hạn đặc biệt, bạn có thể dùng 1 trong 2 phương thức phân quyền được nói ở trên. Symbolic hay numerical
Hãy thử gán SGID cho thư mục community_content
Để sử dụng phương thức symbolic, bạn có thể làm như sau

[cloudzone@server article_submissions]$ chmod g+s community_content/

Nếu dùng phương thức numerical bạn sẽ thêm chữ số thứ 4 vào dãy số ở trên câu lệnh chmod.

  • Bắt đầu bằng 0
  • SUID=4
  • SGID=2
  • Sticky=1

Cú pháp là

[cloudzone@server ~]$ chmod X### file | directory

Trong X là chữ số thứ 4 được nhắc tới ở trên
Đây là câu lệnh để gán SGID vào thư mục community_content sử dụng phương thức numerical

[cloudzone@server article_submissions]$ chmod 2770 community_content/
[cloudzone@server article_submissions]$ ls -ld community_content/
drwxrws---. 2 cloudzone cloudzone 113 Apr 7 11:32 community_content/
Chia sẻ