Giới hạn của quyền hạn Linux tiêu chuẩn
Hầu hết quản trị viên hệ thống (sysadmin) đều dựa vào mô hình User-Group-Others (UGO) truyền thống. Mặc dù chmod và chown xử lý được 90% công việc hàng ngày, chúng thường gặp khó khăn trong môi trường đa người dùng phức tạp. Tôi từng quản lý một dự án mà lập trình viên cần quyền ghi vào một thư mục log cụ thể do www-data sở hữu. Việc thay đổi quyền sở hữu nhóm sẽ làm hỏng logic của ứng dụng, và cấp quyền 777 là một rủi ro bảo mật lớn mà tôi không sẵn lòng chấp nhận.
Access Control Lists (ACL) và File Attributes (Chattr) cung cấp độ chính xác cần thiết cho những kịch bản này. ACL cho phép bạn gán quyền cho các người dùng cụ thể mà không cần thay đổi quyền sở hữu chính. Mặt khác, chattr có thể làm cho một tệp trở nên bất biến (immutable), bảo vệ nó ngay cả khi người dùng root vô tình thực hiện lệnh rm -rf. Sau khi quản lý hơn 15 máy chủ VPS thực tế, tôi nhận thấy những công cụ này là thiết yếu để ngăn chặn sự thay đổi cấu hình ngoài ý muốn.
Chuẩn bị môi trường
Các bản phân phối hiện đại như Ubuntu 22.04, Debian 12 và AlmaLinux 9 thường đi kèm với hỗ trợ ACL được bật sẵn theo mặc định. Nếu bạn đang làm việc trên một hệ thống cũ hoặc một image container tối giản, bạn có thể cần cài đặt các tiện ích này thủ công. Đây là một gói phần mềm nhỏ chỉ khoảng 200KB nhưng mang lại khả năng kiểm soát cực kỳ mạnh mẽ.
Cài đặt công cụ ACL
Để bắt đầu quản lý các quyền này, hãy đảm bảo gói phần mềm acl đã có trên hệ thống của bạn:
# Cho người dùng Debian hoặc Ubuntu
sudo apt update && sudo apt install acl -y
# Cho người dùng RHEL, CentOS, hoặc AlmaLinux
sudo yum install acl -y
Kiểm tra tính tương thích của hệ thống tệp
Hệ thống tệp của bạn phải hỗ trợ ACL để sử dụng chúng. Mặc dù Ext4, XFS và Btrfs hỗ trợ mặc định, bạn có thể xác minh các tùy chọn mount bằng cách kiểm tra /etc/fstab hoặc chạy lệnh mount. Trên các kernel hiện đại, những tính năng này thường được tích hợp sẵn trong các flag mount mặc định, nên hiếm khi cần cấu hình thủ công.
Tinh chỉnh quyền truy cập với ACL
ACL mở rộng các bit quyền hạn truyền thống. Thay vì bị giới hạn ở một chủ sở hữu và một nhóm, bạn có thể tạo một danh sách chi tiết cho nhiều người dùng và nhóm, mỗi đối tượng có quyền đọc, ghi và thực thi riêng biệt.
Cấp quyền cho người dùng cụ thể
Hãy tưởng tượng kịch bản trong đó người dùng tên “jdoe” cần toàn quyền truy cập vào một tệp cấu hình do root sở hữu. Thay vì thay đổi chủ sở hữu tệp, hãy sử dụng lệnh setfacl:
sudo setfacl -m u:jdoe:rwx /var/www/html/config.php
Flag -m yêu cầu hệ thống sửa đổi danh sách. Khi bạn chạy ls -l, bạn sẽ thấy dấu + ở cuối chuỗi quyền hạn (ví dụ: -rw-rwxr--+). Biểu tượng này là dấu hiệu trực quan cho thấy ACL đang được kích hoạt trên tệp đó.
Tự động hóa quyền hạn với ACL mặc định
Một kỹ thuật mạnh mẽ khác là thiết lập ACL mặc định cho một thư mục. Điều này đảm bảo rằng mọi tệp mới được tạo bên trong thư mục đó sẽ tự động kế thừa một bộ quyền đã được xác định trước. Đây là một cách tiết kiệm thời gian đáng kể cho các môi trường làm việc nhóm và quy trình triển khai (deployment pipeline).
# Bắt buộc nhóm 'developers' có quyền rwx trên tất cả các tệp tạo mới trong tương lai
sudo setfacl -d -m g:developers:rwx /opt/project_files
Thu hồi quyền ACL
Bạn có thể dễ dàng loại bỏ các mục cụ thể hoặc xóa sạch toàn bộ. Sử dụng flag -x để xóa một người dùng duy nhất hoặc -b để xóa tất cả các quyền mở rộng và quay lại cài đặt UGO tiêu chuẩn.
# Xóa quyền truy cập của một người dùng cụ thể
sudo setfacl -x u:jdoe /var/www/html/config.php
# Xóa tất cả ACL khỏi tệp
sudo setfacl -b /var/www/html/config.php
Khóa tệp với thuộc tính Chattr
ACL xác định ai có thể tác động vào tệp, nhưng chattr xác định điều gì có thể được thực hiện đối với tệp đó. Các thuộc tính này nằm ở cấp độ hệ thống tệp. Chúng mạnh mẽ đến mức có thể ngăn cản cả người dùng root sửa đổi tệp cho đến khi thuộc tính đó được gỡ bỏ.
Bit bất biến (+i)
Đây là “cứu cánh” cho các tệp hệ thống quan trọng như /etc/resolv.conf. Việc thiết lập bit này ngăn chặn các script hoặc lệnh vô tình ghi đè lên cài đặt DNS của bạn trong quá trình khởi động lại.
# Khóa tệp để ngăn chặn mọi thay đổi
sudo chattr +i /etc/important_config.conf
Việc cố gắng xóa tệp này sẽ dẫn đến lỗi “Operation not permitted”, ngay cả khi dùng sudo. Để chỉnh sửa lại tệp, trước tiên bạn phải chạy lệnh sudo chattr -i một cách rõ ràng.
Bit chỉ cho phép ghi thêm (+a)
Thuộc tính này hoàn hảo cho các tệp nhật ký (log) bảo mật. Nó cho phép hệ thống thêm dữ liệu mới vào cuối tệp nhưng ngăn chặn bất kỳ ai xóa hoặc thay đổi các nội dung hiện có. Đây là một cách đơn giản để xây dựng hệ thống lưu trữ log chống giả mạo cơ bản.
sudo chattr +a /var/log/custom_audit.log
Xác minh và các thực hành tốt nhất
Các công cụ tiêu chuẩn như ls sẽ không cho bạn thấy toàn bộ bức tranh về cấu hình bảo mật. Bạn cần sử dụng các lệnh chuyên dụng để xem các lớp quyền hạn ẩn mà bạn đã áp dụng.
Kiểm tra với getfacl và lsattr
Để xem danh sách đầy đủ các người dùng và nhóm được gán cho một tệp, hãy sử dụng getfacl. Đối với các thuộc tính, hãy sử dụng lsattr. Nếu một tệp được bảo vệ, lsattr sẽ hiển thị chữ i hoặc a trong chuỗi đầu ra, báo hiệu rằng tệp đó đã được khóa ở cấp độ hệ thống tệp.
Kinh nghiệm thực tế
Tránh tình trạng “tràn lan quyền hạn” (permission sprawl). Nếu bạn áp dụng ACL riêng biệt cho hàng trăm tệp cá nhân, việc kiểm tra bảo mật sẽ trở thành một cơn ác mộng về quản trị. Tôi khuyên bạn nên ghi chép lại các ACL không tiêu chuẩn trong các script quản lý cấu hình như Ansible hoặc Chef.
Hãy lưu ý rằng chattr phụ thuộc vào hệ thống tệp. Mặc dù nó hoạt động hoàn hảo trên Ext4 và XFS, các bộ lưu trữ gắn qua mạng như NFS thường bỏ qua các thuộc tính này. Luôn kiểm tra hành vi trên hệ thống lưu trữ cụ thể của bạn trước khi đưa vào sử dụng thực tế. Kết hợp ACL với chattr sẽ mang lại cho bạn một hệ thống phòng thủ vững chắc mà chỉ riêng chmod không thể sánh kịp.

