Bài 9. Quyền truy cập tệp
Quyền là thuộc tính của tệp
và thư mục. Nó cho biết từng đối tượng người dùng (chủ sở hữu - owner, người cùng nhóm - group, người dùng khác - other) có quyền gì (đọc - read, ghi - write, thực thi - execute)
trên tệp và thư mục. Linux sử dụng 9 bit cho việc này, trong đó 3 bit đầu cho
biết quyền đọc, ghi, thực thi của owner, 3 bit tiếp theo cho biết quyền của
group, 3 bit cuối cho biết quyền của other. Ví dụ, 111110100 hay rwxrw-r-- cho biết owner có cả ba quyền, group có thể
đọc và ghi nhưng không được thực thi, other chỉ được đọc. Trong các lệnh, 3 bit
xác định quyền cho một đối tượng người dùng được biểu diễn bằng một số nguyên
(có giá trị từ 0 đến 7), quyền được biểu diễn bằng ba số nguyên liên tiếp. Ví
dụ, 764 là biểu diễn của rwxrw-r-- ở trên.
Với các tệp và thu mục được
tạo mới, quyền được xác định dựa trên quyền cơ sở (base permission) và mặt nạ người dùng (user mask).
Base permission được thiết lập sẵn, không
thể thay đổi
·
Đối với file thông thường giá trị BS là 666 (rw-rw-rw-)
·
Đối với thư mục (file đặc biệt) giá trị BS là 777 (rwxrwxrwx)
User mask sẽ “che đi” một số bit trong
Base Permission để tạo ra quyền truy cập chính thức cho file (tương tự như cơ
chế của subnet mask). Cụ thể, quyền truy cập được tính bằng “Base
permission” & “biểu diễn bù 1 của user mask”. Ví dụ, Base Permission là 666 (tức 110110110 khi chuyển sang dạng nhị phân), nên nếu giá trị user mask
là 022 (có dạng nhị phân là 000010010 => dạng bù 1 của nó thì
chuyển 1->0, 0->1 nên ta được 111101101)
thì quyền truy nhập chính thức của file sẽ là:
110 110 110 &
111 101 101 = 110 100 100 = 644 (rw-r–r–)
Có thể tính nhanh quyền truy xuất tệp và thư mục
theo các công thức sau:
Permit of
file = 777 - umask – {x}
Permit of
directory = 777 - umask
Giá trị user mask mặc định cho
người dùng thông thường là 002
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ị mask mặc định cho root
là 022
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
Sử dụng chương trình umask
để thay đổi user mask. Các
tệp và thư mục được tạo ra sau lệnh umask sẽ chịu tác động của giá trị mask
mới.
Có thể sử dụng chương trình umask để thay đổi user mask, sau đó
dùng chương trình touch để cập nhật quyền của tệp theo user mask mới . Dưới đây là một ví dụ
minh họa việc giá trị user mask quyết định các quyền hạn trên file.txt như thế
nào.
umask 077
touch file.txt
ls -l file.txt
Output:
-rw——- 1 uit uit 0 2010-02-01 11:10
file.txt
Ghi chú: Cơ chế làm việc của umask khiến chúng
ta không thể tạo ra các file với quyền execute. Vì Base permission của file
luôn là 666, tức các bit ứng với
quyền execute đều bằng 0, nên bất kể giá trị mask bằng bao nhiêu thì quyền của
file đều không có execute.
Cách khác để thay đổi quyền của tệp và thư mục đã
tồn tại là sử dụng chmod. Sử dụng chmod có thể thêm quyền thực thi cho
tệp và thư mục.
chmod [OPTION] MODE FILE
trong đó, MODE cho biết đối tượng người dùng nào (ugoa)
được cấp/thu hồi/gán (+-=)
quyền gì (rwxXst
hoặc [0-7]+)
Ví dụ, thêm quyền ghi tệp files1.txt cho người
dùng hiện tại
chmod u+w file1.txt
Thêm đủ các quyền cho tất cả các đối tượng người
dùng
chmod a+rwx file1.txt
hoặc
chmod +777 file1.txt
Thu cả ba quyền của người dùng khác
chmod 770 file1.tx
Thu quyền thực thi của người dùng nhóm
chmod g-x file1.txt
OPTION hay được dùng nhất là -R hoặc --recursive
(đệ quy) khi muốn áp dụng quyền cho tất cả tệp và các thư mục con.
Người tạo ra tệp hay thư mục là chủ sở hữu (owner)
mặc định của tệp hay thư mục. Quyền sở hữu của tệp hay thư mục còn thuộc owning
group. Owner hoặc root có thể thay đổi chủ sở hữu của tệp và thư mục bằng
dùng chương trình chown.
chown [OPTION]
[OWNER][:[GROUP]] FILE
Ví dụ, thay owner của /lab cho root
chown root /lab
Thay owner của /lab cho root, đồng thời chuyển
quyền sở hữu về nhóm staff
chown root:staff /lab
Thay owner của /lab cùng các tệp và thư mục con
cho root
chown -hR root /lab
II.4. SUID, SGID, Sticky bit
Ngoài 9 bits
cơ bản xác định các quyền rwx của owner, group và other, Linux sử dụng 3 bit
khác để định nghĩa quyền trên tệp và thư mục. Các bit này lần lượt là SUID,
SGID, Sticky. Trong các lệnh, một số nguyên nữa có giá trị từ 0 đến 7 được dùng
để xác định ba quyền này. Ví dụ, trong lệnh
chmod 6750 file1.txt
số 6 (nhị
phân là 110) đầu tiên trong quyền xác định SUID, SGID được bật, sticky không
được bật.
Ý nghĩa của
ba bit SUID, SGID, Sticky được giải
thích lần lượt như sau.
SUID (Set owner User ID up on
execution)
Thông thường, khi một chương trình/tệp/lệnh chạy,
nó sử dụng các quyền của người dùng hiện tại, hay người dùng chạy nó. Nếu SUID
được đặt, chương trình sẽ sử dụng quyền của owner chứ không phải quyền của
người dùng hiện tại. Ví dụ, owner của /etc/passwd, /etc/shadow là root. Người
dùng thông thường không có quyền ghi các tệp này. Nếu các tệp này không được
đặt quyền SUID, khi người dùng chạy lệnh passwd sẽ xuất hiện lỗi do không mở và
ghi vào tệp /etc/shadow được. Ngược lại,
khi các tệp này được đặt quyền SUID, người dùng thông thường cũng có thể chạy
lệnh passwd.
Ví dụ, đặt quyền SUID của tệp cho người dùng hiện
tại:
chmod
u+s file1.txt hoặc chmod 4750 file1.txt
Bỏ quyền
SUID trên tệp đối với người dùng hiện tại:
chmod
u-s file1.txt
Để tìm các
tệp có quyền SUID, chạy lệnh
find /
-perm +4000
Kiểm tra bit SUID được bật hay không bằng cách
chạy
ls -l
files.txt
Khi SUID được bật, bit x của owner được hiển thị
là s nếu owner có quyền thực thi . Nếu owner không có quyền thực thi, bit x của
owner được hiển thị là S. Ví dụ, -rwSrw-r-- có nghĩa là bit SUID đã được bật
nhưng bit x của owner không được bật, -rwsrw-r-- có nghĩa là bit SUID đã được
bật và bit x của owner được bật, rwxrw-r-- nghĩa là bit SUID không được bật và owner có
quyền thực thi.
SGID (Set Group ID up
on execution)
Tương tự
SUID, nhưng thay owner là group. Nếu SGID được
đặt, chương trình sẽ sử dụng quyền của group, chứ không phải quyền của người
dùng hiện tại.
Sử dụng chmod để đặt quyền SGID cho tệp như các ví
dụ sau:
chmod
g+s file1.txt
hoặc
chmod
2750 file1.txt
Bỏ quyền
SGID, như ví dụ sau
chmod
g-s file1.txt
Để tìm các
tệp có quyền SGID, chạy lệnh
find /
-perm +2000
Kiểm tra bit SGID được bật hay không bằng cách
chạy
ls -l
files.txt
Khi SGID được bật, bit x của group được hiển thị
là s nếu group có quyền thực thi. Nếu group không có quyền thực thi, bit x của
group được hiển thị là S. Ví dụ, -rwxrwSr-- có nghĩa là bit SGID đã được bật
nhưng bit x của group không được bật, -rwxrwsr-- có nghĩa là bit SGID đã được
bật và bit x của group được bật,
rwxrwxr-- nghĩa là bit SGID không được
bật và owner có quyền thực thi.
Sticky bit
Sticky bit áp dụng cho thư mục. Nếu bit này được
bật, chỉ owner và root có thể xóa nội dung của thư mục. Sử dụng bit này để
thiết lập cấu hình ngăn người dùng xóa dữ liệu của người khác.
Ví dụ, bật sticky bit trên thư mục /lab
chmod
o+t /lab
hoặc
chmod +t /lab
hoặc
chmod 1757 /lab
Tắt sticky bit trên thư mục /lab
chmod
o-t /lab
Để tìm các
tệp có quyền sticky, chạy lệnh
find /
-perm +1000
Kiểm tra bit sticky được bật hay không bằng cách
chạy
ls -l
files.txt
Khi sticky
được bật, bit x của other được hiển thị là t nếu other có quyền thực thi. Nếu
other không có quyền thực thi, bit x của other được hiển thị là T. Ví dụ,
-rwxrw-r-T có nghĩa là sticky đã được bật nhưng bit x của other không được bật.
ACLs là cách
khác để xác định quyên trên tệp và thư mục. Chúng cho phép gán quyền cho một
người dùng hoặc một nhóm bất kỳ, thậm chí không tương ứng với owner hoặc owning
group. ACLs hỗ trợ các hệ thống file ReiserFS, Ext2, Ext3, JFS, XFS. Một tệp
hoặc thư mục có thể có nhiều ACL.
Dùng ls -dl để kiểm tra quyền:
$ ls -dl mydir/
drwxr-xr-x 2 quanta quanta 4096 2007-12-29 22:53 mydir/
Kiểm tra trạng thái khởi đầu
của ACL:
$ getfacl mydir/
# file: mydir
# owner: quanta
# group: quanta
user::rwx
group::r-x
other::---
Gán quyền đọc, ghi, thi hành cho user kitty và group friends:
$ setfacl -m user:kitty:rwx,group:friends:rwx mydir/
Tuỳ chọn -m
sẽ nhắc setfacl chỉnh sửa một ACL đã
tồn tại.
Xem lại ACL với lệnh getfacl:
$ getfacl mydir/
# file: mydir
# owner: quanta
# group: quanta
user::rwx
user:kitty:rwx
group::r-x
group:friends:rwx
mask::rwx
other::---
Ngoài các mục (entries) cho user kitty và group friends, mask entry cũng được tạo ra. mask định nghĩa quyền truy
cập có hiệu lực lớn nhất cho tất cả các entries của group.
Bây giờ thử dùng chmod
để bỏ quyền write của group, output của lệnh ls cho thấy mask bits đã được điều
chỉnh với chmod:
$ sudo chmod g-w mydir/
$ getfacl mydir/
# file: mydir
# owner: quanta
# group: quanta
user::rwx
user:kitty:rwx #effective:r-x
group::r-x
group:friends:rwx #effective:r-x
mask::r-x
other::---
Default ACLs
default ACL ảnh hưởng đến các thư mục con cũng như
là các files. Nói cách khác, các thư mục con và tệp kế thừa default ACL của thư
mục cha.
Xét ví dụ sau:
Thêm một default ACLs vào một thư mục mydir:
$ setfacl -d -m group:friends:r-x mydir/
Tuỳ chọn -d
sẽ nhắc setfacl thực hiện một "chỉnh sửa" trên default ACLs
Xem
kết quả:
$ getfacl mydir/
# file: mydir
# owner: quanta
# group: quanta
user::rwx
user:kitty:rwx #effective:r-x
group::r-x
group:friends:rwx #effective:r-x
mask::r-x
other::---
default:user::rwx
default:group::r-x
default:group:friends:r-x
default:mask::r-x
default:other::---
getfacl sẽ trả về cả access ACL và default ACL.
Nếu
tạo một thư mục con trong mydir, thư mục con này kế thừa default ACL từ mydir:
$ mkdir mydir/mysubdir
$ getfacl mydir/mysubdir/
# file: mydir/mysubdir
# owner: quanta
# group: quanta
user::rwx
group::r-x
group:friends:r-x
mask::r-x
other::---
default:user::rwx
default:group::r-x
default:group:friends:r-x
default:mask::r-x
default:other::---
access ACL của mysubdir phản ánh chính xác default ACL của mydir.
Nếu
tạo một tệp trong mydir, tệp này kế thừa default
ACL từ mydir:
$ touch mydir/myfile
$ ls -l mydir/myfile
-rw-r-----+ 1 quanta quanta 0 2008-01-07 00:59 mydir/myfile
$ getfacl mydir/myfile
# file: mydir/myfile
# owner: quanta
# group: quanta
user::rw-
group::r-x #effective:r--
group:friends:r-x #effective:r--
mask::r--
other::---
Ví dụ khác, giả sử /public là thư mục dùng chung cho mọi người trong công ty, hãy
thiết lập để sao cho bất kỳ ai thuộc bất kỳ nhóm nào cũng có khả năng đọc file
va chuyển vào trong thư mục này nhưng chỉ có người dùng trong nhóm quantri mới có thể ghi vào các file
trong thư mục này.
mkdir /public
chmod
777 /public
groupadd
quantri
setfacl
-d --set u::rx,g::rx,o::rx,g:quantri:rwx,m:rwx /public
getfacl
/public
useradd
user1; useradd user2; usermod -G quantri user1
su
user2
cd /public
touch user2_file.txt
echo "Them noi dung" > user2_file.tx
exit
su user1
cd /public
echo "Them noi dung" > user2_file.txt -> permit denie
Ví dụ khác, giả sử file mark.doc nằm trong thư mục
/data đã được thiết lập quyền truy xuất chuẩn nhưng người quản trị cần thêm hai
quyền ACL nữa cho file này (người dùng k50c có quyền đọc ghi và nhóm k50d có
quyền đọc). Hãy thiết lập chính xác hai quyền trên cho file mark.doc. Nếu muốn
việc thiết lập quyền ACL luôn sẵn sàng khi khởi động máy trên phân vùng
/dev/hda1 thì phải làm gì?
useradd k50c
useradd k50d
setfacl
-m u:k50c:rw,g:k50d:r,m:rwx /public/mark.doc
getfacl
/public/mark.doc
su
k50
echo "Them noi dung" > /public/mark.doc
exit
su
k50d
cat /public/mark.doc
echo "Them noi dung" > /public/mark.doc
exit
CHÚ Ý: Nếu trường hợp muốn
sử dụng ACL trên ổ đĩa có sử dụng QUOTA thì ta phải bổ xung thêm trong file /etc/fstab
như sau:
/dev/md0 /mnt/md1 ext3 defaults,usrquota,acl 0 0
-
Lệnh
cp: Khi được sao chép sang vị trí
mới, quyền truy cập chính thức của file được tính theo công thức trình bày ở
trên với giá trị mask tại vị trí đích. Trong trường hợp trùng tên file và bạn
quyết định ghi đè thì quyền truy cập của file ở vị trí đích sẽ được bảo lưu. Sử
dụng tùy chọn –p trong lệnh cp để lấy quyền truy cập của file nguồn.
-
Lệnh
tar: Khi giải nén các file, lệnh tar
lấy quyền truy cập của từng file làm quyền truy nhập cơ sở cho file đó.
Tạo 4 group:
-
Group 1 là g1 gồm các user: a1, a2, a3
-
Group 2 là g2 gồm các user: b1, b2, b3
-
Group 3 là g3 gồm các user: c1, c2, c3
-
Group 4 là g4 gồm các user: d1, d2, d3
Tạo 3 folder: f1 , f2, f3
Yêu cầu phân quyền đơn giản như sau:
-
Các user thuộc g1 có quyền write trên folder f1, read
trên folder f2, cấm truy cập f3
-
Các user thuộc g2 có quyền write trên folder f2, read
trên folder f3, cấm truy cập f1
-
Các user thuộc g3 có quyền read trên cả 3 folder: f1,
f2 ,f3
-
Các user thuộc g4 có quyền write trên cả 3 folder: f1,
f2 ,f3