Linux tập 2: Permission - Đặc trưng đầy QUYỀN năng của Linux.

Trong bài viết trước, tôi đã trình bày về cấu trúc cây thư mục của hệ điều hành Linux cũng như sự khoa học trong cách bố trí các thư mục con. Trong bài này, tôi sẽ tiếp tục trình bày về 1 đặc trưng có thể nói là bá đạo nhất của Linux so với các hệ điều hành khác, đó chính là Permission (phân quyền).

3 loại User trong hệ thống Linux.

Với mỗi file (tệp tin), Linux sẽ phân chia tập hợp tất cả các User trong hệ thống (trừ ROOT) thành 3 nhóm đôi một ko giao nhau:
  • Own: Đây là tập hợp các User là chủ sở hữu của file đó.
  • Group: Đây là tập hợp các User tuy ko sở hữu file đó, nhưng lại thuộc cùng một Group với chủ sở hữu của file đó. 
  • Other: Đây là tập hợp toàn bộ các User khác ko thuộc 2 nhóm trên.
Lưu ý rằng danh sách trên tuy gọi là danh sách các User, nhưng thực tế thì ngay cả các Service, Daemon, Process, ... khác trong Linux cũng được liệt vào thành các User khác nhau khi thực hiện tương tác với một file.

Ví dụ bạn tạo ra 1 file, bạn chính là chủ sở hữu của file đó. Do đó bạn nằm trong tập hợp Own mà Linux xác định với file đó của bạn. Trong khi đó, 1 User khác thuộc cùng Group của bạn (ví dụ cùng nhóm Student chẳng hạn) sẽ nằm trong tập hợp Group. Một User khác nữa ko thuộc cùng Group của bạn thì sẽ được Linux xác định nằm trong tập hợp Other với file đó.

Mỗi tập hợp trên sẽ có được những đặc quyền riêng được tương tác với file đó. Việc thiết lập các đặc quyền này với mỗi file có thể được thực hiện bởi chủ sở hữu Own của file đó; hoặc bởi ROOT. Ví dụ bạn chỉ cho phép các người dùng khác trong cùng Group của bạn có thể đọc và ghi vào file bạn sở hữu; nhưng lại chỉ cho phép những người khác đọc thôi, ko cho quyền ghi.

3 loại Permission của File trong Linux.

Với mỗi file trong hệ thống, Linux xác định 3 đặc quyền mà các User có thể tương tác với file:
  • Read: khi quyền này được kích hoạt, User có thể được phép đọc nội dung file.
  • Write: khi quyền này được kích hoạt, User có thể được phép ghi vào nội dung file.
  • Execute: khi quyền này được kích hoạt, User có thể được phép thực thi file.
Về mặt ký hiệu dưới dạng chữ và số:
  • Read: ký hiệu chữ là "r", giá trị số là 4.
  • Write: ký hiệu chữ là "w", giá trị số là 2.
  • Execute: ký hiệu chữ là "x", giá trị số là 1.
Ví dụ, nếu bạn nhìn thấy file nào đó với permission chỉ định là 6, mà 6 = 4 + 2, tức là bạn có quyền 4 ("r" - read) và quyền 2 ("w" - write) với file đó; bạn có thể xem và ghi đè nội dung vào file đó. Nếu bạn có quyền 5 (5 = 4 + 1), tức là bạn chỉ có thể đọc (4 - "r") và thực thi (1 - "x") với file đó, mà ko được phép thay đổi nội dung bên trong nó. Nếu bạn có quyền 7 = 4 + 2 + 1 với file đó, có nghĩa là bạn có full quyền với file đó.

Bạn có thể tham khảo hình ảnh mô tả trực quan này mình tìm thấy ngay trên Google:

Image result for permission trong Linux

Linux sẽ xác định các giá trị thể hiện permission của toàn bộ các User thuộc 3 nhóm User trên với từng file. Cụ thể, bạn có thể xem chi tiết Permission của từng file trong thư mục hiện tại bằng lệnh "ls -la" rất nhanh. Ngoài ra, nếu bạn chỉ muốn xem Permission của 1 file cụ thể nào đó chẳng hạn, ví dụ như file ".bashrc", bạn có thể "ls -l $FILENAME" hoặc "grep" bằng lệnh "ls -la | grep bashrc".


Ví dụ như với file ".bashrc" ở hình trên chẳng hạn, cột đầu tiên là 1 chuỗi "-rw-r--r--", đây chính là các giá trị kiểm soát permission của file này; cột thứ 3 chính là tên của Own (tức là mình - "cuongbv"), cột thứ 4 chính là tên Group của "cuongbv"; mấy cột sau là các thông tin thêm. Đi vào cụ thể cột đầu tiên, chuỗi giá trị "-rw-r--r--" có cấu trúc là:
  • "-": dấu gạch đầu tiên ám chỉ rằng đây là 1 tệp tin, ko phải 1 thư mục. Nếu là 1 thư mục, nó sẽ có giá trị là "d" chứ ko phải "-".
  • "rw-": 3 ký tự đầu tương ứng với quyền mà Own có thể tương tác với file này. Cụ thể trong trường hợp này, "cuongbv" có thể đọc ("r") và ghi ("w") vào file này; ko có quyền thực thi file này vì ký tự thứ 3 là "-", ko phải "x".
  • "r--": 3 ký tự tiếp theo tương ứng với quyền mà Group của "cuongbv" có thể tương tác với file này. Cụ thể, các User khác thuộc cùng Group với "cuongbv" chỉ có thể đọc ("r") file này thôi, ko có quyền ghi hay thực thi, vì giá trị tương ứng với 2 trường này đều là "-".
  • Tương tự với 3 ký tự cuối, mọi User khác chỉ có quyền đọc.
Về mặt ký hiệu là vậy, mỗi file sẽ sử dụng 10 bytes để lưu trữ giá trị về Permission. Byte đầu tiên xác định xem file đó là FILE ("-") hay DIRECTORY ("d"); 3 bytes tiếp theo xác định quyền của Own với file đó; 3 bytes giữa xác định quyền của Group với file đó; 3 bytes cuối xác định quyền của Other với file đó. Ta thấy khá là khoa học.

Thay đổi đặc quyền.

Khi ta thấy 1 file có quyền là 751, thực hiện phân tích, ta thấy rằng:
  • 7 = 4 + 2 + 1: tức là Own có full quyền với file đó.
  • 5 = 4 + 1: tức là Group chỉ có thể đọc và thực thi, ko đc phép ghi vào file đó.
  • 1 = 1: tức là Other chỉ có quyền thực thi file đó, ko thể đọc nội dung cũng như ghi đè file đó.
Giá trị số gồm 3 chữ số này chính là giá trị Permission của từng file. Các giá trị này quy định mức độ mà mọi User có thể tương tác với file đó. Linux cung cấp cho ta 3 command để có thể thay đổi giá trị Permission này, cụ thể:
  • chmod: thay đổi permisson của file.
  • chown: thay đổi chủ sở hữu (own) cũng như group của file.
  • chgrp: thay đổi group của file, ko thay đổi own.
Trong 3 command trên, thông dụng nhất là "chmod". Để sử dụng các lệnh này, bạn phải là ROOT hoặc thêm "sudo" vào đầu để nâng quyền lên ROOT. Bạn có thể thêm quyền Execute vào 1 file bằng lệnh "chmod +x $FILENAME". Trong khi đó, 1 số bạn cục xúc hơn sẽ thực thi lệnh "chmod 777 $FILENAME" chẳng hạn. Mình sẽ ko hướng dẫn cách dùng từng command, vì ta có thể xem cách dùng bằng lệnh "man $TÊN_COMMAND".

Leo thang đặc quyền.

Leo thang đặc quyền có thể hiểu là phương thức tấn công mà các User có quyền hạn thấp có thể tự nâng quyền hạn của mình lên tương đương các User có quyền hạn cao hơn, hoặc thậm chí là lên ROOT. Để làm được điều này, tin tặc sẽ phải tìm kiếm và khai thác các lỗ hổng trong hệ thống. Cách làm thông thường hay được sử dụng là "crack password" hoặc "buffer - overflow".

Nhận xét

Bài đăng phổ biến từ blog này

Trên con đường tu đạo luôn cực kỳ theo đuổi!

C++ Con trỏ (Pointer) toàn thư: Phần 4: Con trỏ "đa cấp". Đánh nhau bằng con trỏ.

Vừa ngộ ra sự vi diệu của Padding Oracle Attack thì được tin crush hồi lớp 12 sắp cưới.