Chắc mọi người đều biết trong Linux, chmod
, chown
, và chgrp
là bộ ba lệnh quen thuộc để quản lý quyền truy cập file. Tuy nhiên, chúng tồn tại một giới hạn là mỗi file chỉ có thể gán quyền cho 1 user, 1 group, và “others”. Trong quá trình mình làm việc thực tế với các hạ tầng mà cần cho đối tác có quyền tác động hay Trong môi trường hệ thống phức tạp đặc biệt là khi có nhiều người dùng hoặc tiến trình cần truy cập chung một tập tin theo cách khác nhau điều này là chưa đủ.
Đó là lúc mình đã đụng đến ACL (Access Control List) với hai công cụ khá mạnh mà chắc anh em chưa có nhiều exp cũng chưa chắc đã xài đến là setfacl
và getfacl
.
ACL là gì?
Access Control List (ACL) cho phép bạn:
- Cấp quyền truy cập chi tiết từng người dùng hoặc nhóm cụ thể.
- Thiết lập quyền mặc định cho file mới trong một thư mục.
- Tránh việc “lách luật” bằng cách
chmod 777
.
ACL không thay thế cho hệ thống phân quyền truyền thống, mà bổ sung tính linh hoạt trên nền tảng đã có.
Cách kiểm tra hệ thống hỗ trợ ACL
ACL được hỗ trợ trên các hệ thống file như ext3
, ext4
, xfs
,… nhưng cần bật từ đầu.
Kiểm tra mount options:
mount | grep acl
Nếu chưa thấy acl
, bạn có thể remount như sau:
mount -o remount,acl /
Hoặc thêm acl
vào /etc/fstab
.
1. Cú pháp cơ bản của setfacl và getfacl
Cấp quyền cho user cụ thể:
setfacl -m u:alice:rw file.txt
-m
: modify ACLu:alice:rw
: useralice
được quyền đọc/ghi
Cấp quyền cho group:
setfacl -m g:devops:r file.txt
Gỡ quyền ACL:
setfacl -x u:alice file.txt
Xem quyền ACL:
getfacl file.txt
2. Ví dụ thực tế: phân quyền theo vai trò
Giả sử bạn có một file log /var/log/deploy.log
, bạn muốn:
alice
có thể xem (read)bob
có thể sửa (write)charlie
không được đụng tới
Thực hiện như sau:
setfacl -m u:alice:r /var/log/deploy.log
setfacl -m u:bob:rw /var/log/deploy.log
setfacl -m u:charlie:--- /var/log/deploy.log
Dùng getfacl
để kiểm tra:
# file: deploy.log
# owner: root
# group: root
user::rw-
user:alice:r--
user:bob:rw-
user:charlie:---
group::r--
mask::rw-
other::r--
Chú ý:
mask
là quyền giới hạn tối đa mà mọi ACL entry có thể có. Nếumask
chỉ làr--
, thì dù bạn gánrw-
chobob
, người đó cũng chỉ được đọc.
Bạn có thể cập nhật mask:
setfacl -m m::rw file.txt
3. Thiết lập ACL mặc định cho thư mục
Đây là phần cực kỳ hữu ích trong DevOps hoặc CI/CD:
Bạn có thư mục /shared
mà mọi file tạo bên trong cần:
group:ci
có quyền ghiuser:deploy
có quyền đọc
setfacl -d -m g:ci:rwX /shared
setfacl -d -m u:deploy:r-- /shared
Flag -d
là để thiết lập ACL mặc định – áp dụng cho mọi file hoặc thư mục mới tạo bên trong.
4. Xóa toàn bộ ACL
setfacl -b file.txt
5. Dùng ACL để debug quyền phức tạp
Bạn có thể gặp tình huống:
chmod
đã đúngchown
đã chuẩn- nhưng user vẫn không đọc được file?
Hãy dùng:
getfacl file.txt
Có thể một entry ACL đang override quyền mặc định.
6. Lưu và khôi phục ACL từ backup
getfacl -R /project > acl.backup
setfacl --restore=acl.backup
Khi nào không nên dùng ACL?
Theo cá nhân mình thì thấy cái này xài thêm cũng hơi phức tạp nên không phải lúc nào cũng nên dùng ví dụ không nên:
- Khi có hệ thống đơn giản, ít người dùng.
- Khi backup/restore không hỗ trợ ACL (một số tool như
rsync
hoặctar
cần thêm flag--acls
). - Khi muốn giữ quyền file đơn giản và dễ nhìn bằng
ls -l
.
Tổng kết
ACL mang lại một lớp linh hoạt đáng kể cho hệ thống phân quyền truyền thống trên Linux khi anh em cần chia sẻ tài nguyên phức tạp giữa nhiều nhóm, vai trò, hoặc tiến trình thì có thể cân nhắc sử dụng nha.