Phần lớn các hệ điều hành đều có các phương thức để gán quyền hạn cho người hay nhóm người dùng. Những quyền hạn đó điều khiển khả năng duyệt, xem, thay đổi, và thực thi nội dung của các tập tin. Tập các phương thức đó được gọi là Hệ Thống Phân Quyền.
Hiện tại có hai dòng hệ thống phân quyền phổ dụng. Đầu tiên là Hệ thống phân quyền truyền thống của *nix System, được đề ra rất sớm từ những ngày đầu của Unix, được sử dụng trên hầu hết tất cả các hệ điều hành Unix và Linux (gọi tắt là *nix) hiện tại. Còn lại là hệ thống Access Control Lists (ACLs) mới xuất hiện trên những phiên bản hệ điều hành Windows gần đây.
Hệ thống phân quyền *nix là một trong những phần cốt lõi của các hệ điều hành *nix. Hệ thống này theo đó có sức ảnh hưởng sâu rộng đến kỹ nghệ phần mềm, và là đối tượng nói tới của bài viết này.
Ba bit định quyền hạn
Quyền hạn mà mỗi process có thể nhận khi thao tác với file bao gồm execution (thực thi), write (sửa) và read (đọc). Một process có thể không được nhận quyền hạn nào, nhận một, hay một tập các quyền hạn trong số ba quyền này, khi thao tác với một file xác định.
Khi cần trực quan hóa, một tập quyền hạn có thể được biểu diễn bởi ba chữ cái trong số các chữ cái -
, x
, w
, và r
. Ví dụ --r
hay -wr
, x-r
…
Hệ thống *nix lưu trữ thông tin về tập quyền hạn bằng ba bit. Sự xuất hiện của bit 1
ở vị trí đầu tiên đại diện cho quyền execution, bit 1
ở vị trí thứ hai đại diện cho quyền write, và 1
ở vị trí thứ ba mô tả quyền read. Chẳng hạn, 000
nghĩa là không có quyền gì, 111
thì có tất cả các quyền và 011
đại diện cho quyền đọc và sửa nhưng không được phép thực thi.
Cuối cùng, ba bit này thường được dịch thành một số thập phân từ 0
đến 7
để dễ dàng nhận diện và cài đặt bởi con người. Theo đó, khi thực hiện các thao tác liên quan đến quyền hạn của file, chúng ta sẽ thường thấy những thông tin trong bảng dưới đây:
| 000 | 0 | --- | None |
| 001 | 1 | --r | Read |
| 010 | 2 | -w- | Write |
| 011 | 3 | -wr | Write + Read |
| 100 | 4 | x-- | Execute |
| 101 | 5 | x-r | Execute + Read |
| 110 | 6 | xw- | Execute + Write |
| 111 | 7 | xwr | Execute + Write + Read |
3 bit đủ để lưu giữ một số bát phân (octal). Trong các tài liệu tiếng Anh, các chữ số từ
0
đến7
dùng để mô tả quyền hạn được gọi là Octal Notation. Còn các chữ cái-
,x
,w
,r
được gọi là Symbolic Notation.
Ba phạm vi người dùng
Trong hệ thống *nix, các phạm vi người dùng khác nhau thì có tập quyền hạn khác nhau trên một file, và có ba phạm vi người dùng như thế:
- Phạm vi owner: là người dùng mà sở hữu file
- Phạm vi group: là group người dùng mà có người dùng sở hữu file
- Phạm vi others: là những người dùng còn lại
Bởi thế, cần đến chín bit mới có thể mô tả đầy đủ cấu hình quyền hạn của một file. Ba bit đầu tiên sẽ mô tả quyền hạn được áp dụng cho owner, ba bit tiếp theo áp dụng cho group và ba bit cuối cùng được áp dụng cho others. Hệ thống *nix sẽ khớp user phát lệnh thực hiện process vào một trong ba phạm vi người dùng ở trên theo thứ tự để xác định 3 bit nào sẽ được sử dụng.
Cấu hình quyền hạn của một file có thể được hiển thị bằng lệnh ls
với cờ -l
, và có thể được đặt lại bởi lệnh chmod
. Owner của file có thể được đặt lại bởi lệnh chown
. Lưu ý trong kết quá dưới đây, cấu hình quyền hạn đang được hiển thị bởi 10 bit, bạn có thể bỏ qua sự tồn tại của bit đầu tiên:
$ ls -l /etc
total 492
-rw-r--r-- 1 root root 4468 Nov 19 2009 DIR_COLORS
-rw-r--r-- 1 root root 10 Jun 30 03:29 adjtime
drwxr-xr-x 4 root root 4096 Jun 30 03:44 apache2
drwxr-xr-x 2 root root 4096 Nov 19 2009 bash
drwxr-xr-x 3 root root 4096 Nov 19 2009 ca-certificates
-rw-r--r-- 1 root root 5955 Nov 19 2009 ca-certificates.conf
drwxr-xr-x 2 root root 4096 Jul 5 20:37 conf.d
drwxr-xr-x 2 root root 4096 Dec 3 2009 cron.d
drwxr-x--- 2 root root 4096 Dec 3 2009 cron.daily
-rw-r--r-- 1 root root 220 Dec 3 2009 cron.deny
drwxr-x--- 2 root root 4096 Dec 3 2009 cron.hourly
drwxr-x--- 2 root root 4096 Dec 3 2009 cron.monthly
drwxr-x--- 2 root root 4096 Dec 3 2009 cron.weekly
-rw-r--r-- 1 root root 611 Dec 3 2009 crontab
...
Lưu ý: trong hệ thống *nix, cả tập tin và thư mục đều được coi là file
Base Permission và Umask
Khi một file được tạo mới, quyền hạn của một nhóm người dùng đối với file đó được xác định bởi công thức: lấy base-permission (quyền cơ sở) của file trừ đi một số-trừ của nhóm người dùng đó. Chẳng hạn nếu base permission có giá trị nhị phân là 111
, và số-trừ là 100
thì sau phép trừ, nhóm người dùng đó sẽ nhận được quyền 011
.
BASE PERMISSION 111 7 Execute + Write + Read
-
SUBTRAHEND 100 4 Execute
---------------------------------------------------------
PERMISSION 011 3 Write + Read
Base Permission
Hệ thống *nix không cho phép một tập tin được mang quyền x
một cách mặc định, do đó base permission của tập tin là 666
.
Vấn đề về quyền thực thi không tồn tại trên các thư mục, do đó base permission của thư mục là 777
.
Đến cuối cùng thì quyền hạn mà một nhóm người dùng nhận được sẽ phụ thuộc vào số-trừ, do đó base permission không cần có khả năng cấu hình.
Umask
Mỗi process lưu giữ một tập hợp ba bit cho mỗi phạm vi người dùng để đóng vai trò cấu hình số-trừ. Có ba nhóm người dùng, tương ứng với chín bit. Bộ chín bit này được gọi là umask. Trong thực tế, umask được sử dụng dưới dạng thức là số bát phân nhiều hơn. Ví dụ dưới đây hiển thị umask đang hiệu dụng:
$ umask
022
$ umask -S
u=rwx,g=rwx,o=rx
Nếu một process trong session ở trên tạo ra một tập tin mới, thì tập tin đó sẽ có cấu hình quyền hạn là 666 - 022 = 644
.
$ touch afile
$ ls -l afile
-rw-r--r-- 1 _ wheel 0 Aug 17 09:04 afile
Umask có thể được hiển thị hay sửa đổi bằng lệnh umask
.
$ umask 077
Sử dụng của umask
Umask kết hợp với base permission tạo ra một giải pháp uyển chuyển để giới hạn quyền hạn của các process nhằm đảm bảo an toàn cho hệ thống mà không cần phải can thiệp vào cấu hình quyền hạn của file.
Umask có quan hệ chặt chẽ với tất cả các tiến trình liên quan đến việc tạo file mới, chẳng hạn:
- Khi copy file bằng
cp
, tiến trìnhcp
thực chất tạo ra một file mới, cấu hình quyền hạn của file mới được xác định bởi umask của tiến trìnhcp
và có thể sẽ không giống với file cũ. Để file mới có cấu hình quyền giống với file nguồn thì cần phải yêu cầu trìnhcp
copy cả cấu hình quyền hạn, bằng cờ-p
hay--permission
. - Lệnh
tar
, trái lại, được thiết kế để cố gắng giữ nguyên cấu hình quyền của file cũ khi giải nén.
Umask cũng thể hiện một đặc điểm của các hệ thống *nix đó là quyền hạn không được kế thừa. Một tập tin được tạo ra trong một thư mục không nhất thiết có cấu hình quyền hạn giống với thư mục cha. Điều này khác biệt với các hệ thống phân quyền khác, chẳng hạn ACL (Access Control Lists) trên các hệ điều hành Windows.
Tổng kết
Hệ thống phân quyền *nix đã chứng tỏ sự đơn giản, mạnh mẽ, tin cậy, ổn định và hiệu quả của nó trong một thời gian rất dài. Về cơ bản, bài viết này đã mô tả tổng quan về nó. Cần lưu ý rằng có một số chi tiết vượt ra khỏi phạm vi “cơ bản” đã được tránh nhắc tới, ví dụ như thông tin về các bit đại diện cho các chế độ SUID, SGID, và Sticky; hay thông tin về cách sử dụng cụ thể của các câu lệnh cài đặt cấu hình phân quyền.