Quản lý quyền truy cập linh hoạt hơn với setfacl và getfacl trên Linux

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à setfaclgetfacl.

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 ACL
  • u:alice:rw: user alice đượ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ếu mask chỉ là r--, thì dù bạn gán rw- cho bob, 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 ghi
  • user: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 đã đúng
  • chown đã 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ặc tar 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.

Bài viết khác

Chia sẻ bài viết:
Theo dõi
Thông báo của
0 Góp ý
Được bỏ phiếu nhiều nhất
Mới nhất Cũ nhất
Phản hồi nội tuyến
Xem tất cả bình luận

Có thể bạn quan tâm