Quyền hạn/Chế độ truy cập file trong Unix

Quyền sở hữu file là một thành phần quan trọng của Unix mà cung cấp phương thức bảo mật để lưu giữ file. Mọi file trong Unix có các thuộc tính sau để thể hiện quyền hạn truy cập tới nó (File Permission):

Quyền hạn truy cập của người sở hữu: Quyền hạn truy cập của chủ nhân quyết định những hành động gì mà người sở hữu có thể thực hiện trên file.

Quyền hạn truy cập nhóm: Quyền hạn truy cập của nhóm quyết định hành động gì mà người sử dụng, thành viên của nhóm mà sở hữu file, có thể thực hiện trên file.

Các quyền hạn truy cập khác: Chỉ hành động nào mà tất cả những người sử dụng có thể thực hiện trên file.

Các dấu hiệu về quyền hạn truy cập

Trong khi sử dụng lệnh ls -l, nó hiển thị các thông tin đa dạng liên quan đến quyền hạn truy cập trên file như sau:

$ls -l /home/amrood
-rwxr-xr--  1 amrood   users 1024  Nov 2 00:10  myfile
drwxr-xr--- 1 amrood   users 1024  Nov 2 00:10  mydir

Tại đây, cột đầu tiên đại diện cho các chế độ truy cập khác nhau, ví dụ như quyền hạn truy cập liên kết với một file hoặc thư mục.

Các quyền hạn truy cập được chia thành ba nhóm, mà mỗi vị trí trong nhóm biểu hiện một quyền hạn truy cập cụ thể, theo thứ tự: đọc (r), ghi (w) và thực thi (x):

Các ký tự đầu tiên từ 1 đến 3 (2-4 trong dãy kể cả dấu -) đại diện quyền hạn truy cập cho người sử hữu file. Ví dụ -rwxr-xr– biểu diễn rằng người sở hữu có cho phép đọc (r), ghi (w), và chạy chương trình (x).

Nhóm 3 ký tự tiếp theo từ 5-7 đại diện cho quyền hạn truy cập nhóm tới những file sở hữu. Ví dụ -rwxr-xr– đại diện rằng nhóm có cho phép đọc (r) và thực thi (x), nhưng không cho phép ghi (w)

Nhóm 3 ký tự cuối cùng từ 8-10 đại diện quyền hạn truy cập khác. Ví dụ -rwxr-xr– đại diện rằng ai đó trên thế giới chỉ cho phép đọc (r).

Chế độ truy cập vào file trong Unix/Linux

Quyền hạn truy cập của một file là dòng đầu tiên của sự bảo vệ trong hệ thống Unix. Các khối xây dựng cơ bản trong quyền hạn truy cập Unix là các quyền hạn truy cập đọc, ghi và thực thi được miêu tả dưới đây

1. Đọc:

Cho phép đọc nội dung của file.

2. Ghi:

Cho phép chỉnh sửa hoặc gỡ bỏ nội dung của file.

3. Thực thi:

Người sử dụng với quyền hạn truy cập thực thi có thể chạy một file như là một chương trình.

Chế độ truy cập vào thư mục

Các chế độ truy cập vào thư mục được liệt kê và tổ chức trong cùng một cách như trong bất kỳ một file nào. Có một vài điểm khác nhau mà bạn cần chú ý:

1. Đọc:

Truy cập vào một thư mục với nghĩa là người sử dụng có thể đọc các nội dung. Người sử dụng có thể xem tên các file bên trong một thư mục.

2. Ghi:

Cho phép người sử dụng có thể thêm hoặc xóa file nội dung của thư mục.

3. Thực thi:

Chạy một thư mục không thực sự mang nhiều ý nghĩa, vì thế bạn chỉ coi đó là giấy phép để ngang qua.

Một người sử dụng phải có quyền truy cập thực thi tới thư mục bin để chạy lệnh ls hoặc cd chẳng hạn.

Thay đổi các quyền hạn truy cập trong Unix/Linux

Để thay đổi quyền hạn truy cập của file hoặc thư mục, bạn sử dụng lệnh chmod (viết tắt của change mode). Có hai cách để sử dụng chmod là: chế độ tượng trưng (Symbolic Mode) và chế độ tuyệt đối (Absolute Mode).

Sử dụng chmode trong chế độ tượng trưng

Cách dễ nhất cho người mới bắt đầu để chỉnh sửa quyền hạn truy cập file hoặc thư mục là sử dụng chế độ tượng trưng. Với chế độ này bạn có thể thêm, xóa hoặc xác định tập hợp các cho phép mà bạn muốn bằng cách sử dụng các toán tử sau:

Toán tử chmod Miêu tả
+ Thêm quyền hạn truy cập được chỉ định tới một file hoặc tệp
Gỡ bỏ quyền hạn truy cập đã được chỉ định từ một file hoặc thư mục
= Thiết lập các quyền hạn truy cập được chỉ định.

Dưới đây là một ví dụ bằng cách sử dụng lệnh testfile. Chạy ls -1 trên testfile chỉ rằng quyền hạn truy cập của file là như sau:

$ls -l testfile
-rwxrwxr--  1 amrood   users 1024  Nov 2 00:10  testfile

Sau đó mỗi ví dụ lệnh chmod từ bảng trước được chạy trên testfile, theo sau bởi ls -l vì thế bạn có thể quan sát các thay đổi của quyền hạn truy cập.

$chmod o+wx testfile
$ls -l testfile
-rwxrwxrwx  1 amrood   users 1024  Nov 2 00:10  testfile
$chmod u-x testfile
$ls -l testfile
-rw-rwxrwx  1 amrood   users 1024  Nov 2 00:10  testfile
$chmod g=rx testfile
$ls -l testfile
-rw-r-xrwx  1 amrood   users 1024  Nov 2 00:10  testfile

Tại đây là cách bạn có thể kết nối những lệnh này trên một dòng đơn:

$chmod o+wx,u-x,g=rx testfile
$ls -l testfile
-rw-r-xrwx  1 amrood   users 1024  Nov 2 00:10  testfile

Sử dụng chmod với quyền hạn truy cập tuyệt đối trong Unix/Linux

Cách thứ hai để chỉnh sửa quyền hạn truy cập với lệnh chmod là sử dụng số để xác định các quyền hạn truy cập cho file.

Mỗi quyền hạn truy cập được ấn định bằng một giá trị, như trong bảng dưới, và tổng của mỗi quyền hạn truy cập cung cấp một số cho tập hợp thiết lập đó.

Số Đại diện cho quyền hạn truy cập trong hệ cơ số 8 Tham chiếu
0 Không cho phép
1 Cho phép thực thi –x
2 Cho phép ghi -w-
3 Cho phép thực thi và ghi: 1 (thực thi) + 2 (ghi) = 3 -wx
4 Cho phép đọc r–
5 Cho phép đọc và thực thi: 4(đọc) + 1 (thực thi) = 5 r-x
6 Cho phép đọc và ghi: 4 (đọc) + 2 (ghi) = 6 rw-
7 Cho phép tất cả: 4 (đọc) + 2 (ghi) + 1 (thực thi) = 7 rwx

Tại đây là một ví dụ sử dụng testfile. Chạy ls -1 trên testfile chỉ rằng các quyền hạn truy cập của file là như sau:

$ls -l testfile
-rwxrwxr--  1 amrood   users 1024  Nov 2 00:10  testfile

Mỗi ví dụ lệnh chmod từ bảng trước được chạy trên testfile, theo sau bởi ls -l vì thế bạn có thể quan sát các thay đổi của quyền hạn truy cập:

$ chmod 755 testfile
$ls -l testfile
-rwxr-xr-x  1 amrood   users 1024  Nov 2 00:10  testfile
$chmod 743 testfile
$ls -l testfile
-rwxr---wx  1 amrood   users 1024  Nov 2 00:10  testfile
$chmod 043 testfile
$ls -l testfile
----r---wx  1 amrood   users 1024  Nov 2 00:10  testfile

Thay đổi người sở hữu và nhóm trong Unix/Linux

Trong khi tạo một tài khoản trên Unix, nó gán một ID người sở hữu và một ID sở hữu nhóm cho mỗi người sử dụng. Tất cả các quyền hạn truy cập đề cập ở trên là cũng được gán dựa trên người sử hữu và nhóm.

Hai lệnh có sẵn để thay đổi sở hữu cá nhân và sở hữu nhóm của file là:

  1. chown: Lệnh này đại diện cho thay đổi sở hữu cá nhân (change owner).
  2. chgrp: Lệnh này đại diện cho thay đổi sở hữu nhóm (change group).

Thay đổi quyền sở hữu trong Unix/Linux

Lệnh chown thay đổi quyền sở hữu của một file. Cú pháp cơ bản là:

$ chown user filelist

Giá trị của user có thể là tên hoặc ID của người sử dụng trên hệ thống. Ví dụ:

Ví dụ:

$ chown amrood testfile
$

Thay đổi người sở hữu của file đã cho tới người sở hữu amrood.

Ghi chú: Người sở hữu gốc có quyền không bị hạn chế để thay đổi quyền sở hữu của bất kỳ file nào nhưng người sở hữu thông thường chỉ có thể thay đổi quyền sở hữu của những file mà họ sở hữu.

Thay đổi quyền sở hữu nhóm trong Unix/Linux

Lệnh chrgp thay đổi sở hữu nhóm của file. Cú pháp đơn giản là:

$ chgrp group filelist

Giá trị của group có thể là tên hoặc ID của nhóm trên hệ thống. Ví dụ:

Ví dụ:

$ chgrp special testfile
$

Thay đổi sở hữu nhóm đã chọn tới nhóm special.

Quyền hạn truy cập SUID và SGID (thiết lập ID cá nhân và nhóm) trong Unix/Linux

Thông thường khi một lệnh được chạy, nó sẽ phải chạy cùng với các đặc quyền đặc biệt để thực hiện nhiệm vụ của nó.

Như một ví dụ, khi bạn thay đổi mật khẩu với lệnh passwd, mật khẩu mới được giữ trong tệp /etc/shadow.

Khi là một người sử dụng thường, bạn không có được quyền truy cập để đọc hoặc ghi tới File này do các lý do bảo mật, nhưng khi bạn thay đổi mật khẩu, bạn cần có quyền ghi tới File này. Điều này có nghĩa là chương trình passwd phải cung cấp cho bạn các quyền thêm để bạn có thể ghi etc/shadow.

Các quyền thêm vào được cung cấp tới chương trình thông qua một kỹ thuật được biết đến là Thiết lập ID người sử dụng (Set User ID – SUID bit) và Thiết lập ID nhóm (Set Group ID – SGID bit).

Khi bạn chạy một chương trình mà có quyền hạn truy cập SUID, bạn sử dụng nó để thay đổi sở hữu của chương trình đó. Các chương trình mà không thiết lập SUID thì đang chạy với quyền hạn truy cập của người sử dụng mà khởi động chương trình.

Điều này là đúng với SGID. Các chương trình thông thường chạy với quyền hạn truy cập nhóm, nhưng thay vào đó, nó chỉ thay đổi sở hữu nhóm cho chương trình đang chạy chứ không thay đổi cho chương trình khác của nhóm.

Các bit SUID bit và SGID bit sẽ xuất hiện bằng ký tự “s” nếu quyền hạn truy cập là có sẵn. SUID “s” bit sẽ được đặt trong các permission bit, nơi mà người sở hữu thực thi sẽ có thẩm quyền. Ví dụ, lệnh sau:

$ ls -l /usr/bin/passwd
-r-sr-xr-x  1   root   bin  19031 Feb 7 13:47  /usr/bin/passwd*
$

Điều này chỉ rằng SUID bit được thiết lập và lệnh được sở hữu bởi sở hữu gốc. Ký tự viết hoa S trong vị trí thực thi thay cho chữ thường s chỉ rằng bit của thực thi không được thiết lập.

Nếu sticky bit được cho phép trên thư mục, các file chỉ có thể được gỡ bỏ nếu bạn là một trong những người sử dụng sau:

Người sở hữu của thư mục sticky;

Người sở hữu của các file bị gỡ bỏ;

Người sở hữu gốc

Để thiết lập các SUID bit và SGID bit cho bất kỳ thư mục, bạn thử cú pháp sau:

$ ls -l /usr/bin/passwd
-r-sr-xr-x  1   root   bin  19031 Feb 7 13:47  /usr/bin/passwd*
$