ACL Linux: Cách phân quyền ‘siêu chi tiết’ cho từng User (Thay thế chmod 777)

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

Khi chmod truyền thống không còn đủ ‘đô’

2 giờ sáng. Điện thoại mình rung liên hồi với 15 cuộc gọi lỡ. Đầu dây bên kia, cậu Lead Dev hốt hoảng: “Anh ơi, folder source code đang bị loạn. Dev mới không vào sửa được file, mà nếu em chmod 777 cho nó thì bên Marketing lại thấy hết cả file .env chứa pass database. Giờ cứu em với!”

Tình huống này chắc anh em làm hệ thống gặp như cơm bữa. Phân quyền truyền thống (Owner – Group – Others) của Linux cực kỳ mạnh nhưng lại thiếu linh hoạt. Bạn chỉ có đúng một nhóm để cấp quyền. Nhưng thực tế thì khác: User A cần đọc/ghi, User B chỉ được đọc, Group QC cần xem log nhưng tuyệt đối không được xóa, còn người lạ thì không được thấy gì.

Hồi mới vào nghề, mình từng loay hoay cả buổi với chownchgrp nhưng vẫn bế tắc. Đó là lúc mình nhận ra: Muốn chuyên nghiệp, phải dùng Access Control Lists (ACL).

Hãy coi chmod là chiếc vé vào cổng đại trà, còn ACL là danh sách khách mời VIP. Ai có tên trong danh sách thì vào, và mỗi người sẽ có một quyền hạn riêng biệt, không ai đụng chạm ai. Bạn không cần tạo thêm hàng chục group lồng nhau chỉ để phục vụ một nhu cầu truy cập tạm thời nữa.

Kiểm tra ‘vũ khí’ trước khi ra trận

Đa số các distro hiện đại (Ubuntu 22.04+, CentOS 8+, AlmaLinux) đều kích hoạt ACL mặc định. Tuy nhiên, đừng chủ quan. Hãy dành 10 giây kiểm tra để tránh lỗi ‘Command not found’.

Cài đặt gói công cụ acl chỉ với một lệnh:

# Với Ubuntu/Debian
sudo apt update && sudo apt install acl -y

# Với RHEL/CentOS/AlmaLinux
sudo dnf install acl -y

Một mẹo nhỏ: Hãy dùng mount | grep -i acl để chắc chắn phân vùng ổ cứng đã hỗ trợ option này. Với các hệ thống dùng định dạng EXT4 hay XFS hiện nay, ACL thường được tích hợp sẵn vào kernel nên anh em cứ yên tâm mà quẩy.

Cấu hình ACL: Những câu lệnh ‘cứu mạng’

Quay lại folder /data/project_X đang bị lỗi phân quyền. Chúng ta sẽ dùng hai công cụ chính: getfacl (để soi) và setfacl (để áp quyền).

Cấp quyền cho từng cá nhân

Giả sử bạn tuan_anh cần sửa file config.php. Bình thường bạn phải đổi Owner file sang tuan_anh, nhưng như vậy sẽ làm hỏng quyền chạy của www-data (Web server). Với ACL, mọi thứ gọn hơn nhiều:

# Cấp quyền đọc và ghi (rw-) cho riêng user tuan_anh
sudo setfacl -m u:tuan_anh:rw /data/project_X/config.php

Trong đó, -m là modify (chỉnh sửa), còn u:tuan_anh:rw nghĩa là: User tên tuan_anh có quyền read/write. Xong! File vẫn thuộc root, Web server vẫn chạy, mà tuan_anh vẫn làm việc ngon lành.

Cấp quyền cho một Group riêng biệt

Ví dụ team Marketing (group mkt_team) muốn vào xem tài liệu trong /data/docs để lấy tư liệu viết bài. Họ chỉ cần quyền đọc, không được sửa hay xóa:

sudo setfacl -m g:mkt_team:r /data/docs

Lệnh này giúp bạn giữ hệ thống sạch sẽ, không phải tạo Group lồng Group cực kỳ nhức đầu.

Default ACL: Bí kíp ‘set một lần, dùng mãi mãi’

Đây là phần mình thích nhất. Bình thường khi tuan_anh tạo file mới, các member khác sẽ không có quyền vào xem. Để xử lý triệt để, chúng ta dùng Default ACL:

# File/folder con sinh ra sau này sẽ tự động có quyền cho dev_team
sudo setfacl -d -m g:dev_team:rwx /data/project_X

Option -d (default) đảm bảo mọi file mới tạo trong project_X sẽ tự thừa hưởng quyền của group dev_team. Bạn sẽ không còn phải nhận những cuộc gọi than phiền về quyền truy cập mỗi sáng thứ Hai nữa.

Monitoring: Đừng để dấu “+” đánh lừa bạn

Sau khi gõ lệnh, nếu bạn dùng ls -l, hãy để ý kỹ cuối chuỗi permission:

-rw-rw-r--+ 1 root root 1024 Apr 24 02:15 config.php

Thấy dấu + nhỏ xíu đó không? Nó báo hiệu file này đang chạy ACL. Đừng tin hoàn toàn vào những gì ls -l hiển thị lúc này vì nó có thể không phản ánh đúng quyền thực tế. Hãy dùng getfacl để xem bức tranh toàn cảnh:

getfacl /data/project_X/config.php

Kết quả sẽ liệt kê rõ mồn một ai có quyền gì. Đặc biệt hãy chú ý dòng mask. Đây là quyền tối đa (ceiling) mà ACL cho phép. Nếu bạn set mask là r--, thì dù bạn cấp cho user quyền rwx, họ thực tế cũng chỉ đọc được file thôi. Đây là chốt chặn bảo mật cuối cùng để tránh cấp quyền quá tay.

Nếu muốn xóa sạch ACL để bắt đầu lại từ đầu, hãy dùng:

# Xóa sạch mọi ACL, đưa file về trạng thái Linux thuần túy
sudo setfacl -b /data/project_X/config.php

Lời kết

ACL không phải là kiến thức quá cao siêu, nhưng nó là ranh giới giữa một sysadmin nghiệp dư và một người quản trị hệ thống chuyên nghiệp. Thay vì cứ loay hoay với chmod 777 đầy rủi ro, hãy dành 5 phút thiết lập ACL. Nó giúp hệ thống an toàn hơn và quan trọng nhất là giúp bạn ngủ ngon hơn mỗi đêm.

Share: