Tình Huống Thực Tế
2 giờ sáng. File config bị hỏng, deployment đang lỗi, và bạn chỉ cần ghi đè nó. Bạn là root. Bạn chạy:
rm: cannot remove 'config.conf': Operation not permitted
Bạn thử sudo rm -f. Vẫn lỗi đó. Bạn thử chmod 777. Cũng thất bại. Bạn kiểm tra ownership — root sở hữu file. Chẳng có gì hợp lý cả.
Hầu như luôn luôn, đây là immutable flag được đặt bởi chattr. Nó nằm bên dưới các permission POSIX — một lớp riêng biệt mà root không thể bỏ qua nếu không gỡ nó ra trước.
Tại Sao Điều Này Xảy Ra
Hãy xem permission của Linux như hai lớp. Các bit rwxrwxrwx quen thuộc là lớp ngoài — lớp mà ai cũng biết. Bên dưới là hệ thống extended attribute, và một trong số đó là +i. Khi file được gán flag này:
- Không ai có thể sửa đổi, xóa, đổi tên, hoặc tạo hard link tới file
- Kể cả root
- Kể cả với
-f
File trở nên immutable như thế nào? Thường là một trong những trường hợp sau:
- Sysadmin cố ý khóa nó — phổ biến với
/etc/resolv.confhoặc/etc/hosts - Một công cụ provisioning (Ansible, Chef, Puppet) đặt flag này như một phần của hardening
- Một installer hoặc script của package đã thêm vào
- Ai đó bảo vệ config khỏi bị ghi đè nhầm
- Hiếm gặp hơn: rootkit tự bảo vệ bản thân — nên ghi nhớ khả năng này
Chẩn Đoán: Kiểm Tra Immutable Flag
Chạy lsattr với file đó:
lsattr config.conf
File immutable sẽ hiển thị chữ i trong chuỗi attribute:
----i---------e-- config.conf
Chữ i đó chính là thủ phạm. Với cả một thư mục, quét đệ quy:
lsattr -R /etc/nginx/
Hệ thống chưa có lsattr? Cài đặt nó:
# Debian/Ubuntu
apt install e2fsprogs
# RHEL/CentOS
yum install e2fsprogs
Cách Sửa Nhanh: Gỡ Immutable Flag
Một lệnh là bạn được unblocked:
# Gỡ immutable flag khỏi một file đơn lẻ
sudo chattr -i config.conf
# Giờ xóa nó đi
rm config.conf
Muốn chỉnh sửa thay vì xóa? Bước đầu tiên vẫn như vậy:
sudo chattr -i config.conf
nano config.conf
Xử lý cả một cây thư mục:
sudo chattr -iR /path/to/directory/
Xác Nhận Đã Sửa Xong
# Xác nhận flag đã được gỡ
lsattr config.conf
# Không còn chữ 'i' trong attributes:
# ---------------e-- config.conf
# Giờ lệnh xóa sẽ hoạt động
rm config.conf
echo $? # Phải in ra 0
Nguyên Nhân Khác (Nếu chattr Không Phải Vấn Đề)
Vẫn gặp lỗi nhưng lsattr không hiện immutable flag? Một vài nghi phạm khác:
SELinux
Trên RHEL/CentOS/Fedora, SELinux áp dụng các quy tắc truy cập riêng của nó lên trên tất cả mọi thứ — và root cũng không được miễn:
# Kiểm tra xem SELinux có phải nguyên nhân không
audit2why -a | grep denied
# Kiểm tra SELinux context trên file
ls -Z config.conf
# Tạm thời chuyển sang permissive mode (chỉ để kiểm tra)
sudo setenforce 0
rm config.conf
sudo setenforce 1
Mount Options (Filesystem Read-Only)
# Kiểm tra mount flags
mount | grep "$(df config.conf | tail -1 | awk '{print $1}')"
# Tìm 'ro' trong các options
AppArmor (Ubuntu)
# Kiểm tra các lần AppArmor từ chối
dmesg | grep -i apparmor | tail -20
aa-status
NFS hoặc Remote Filesystem
File trên NFS hoạt động khác. Tùy chọn root_squash ánh xạ root thành một user không có quyền ở phía server — vì vậy dù bạn là root ở local, bạn thực tế là nobody trên remote. Kiểm tra /etc/exports trên NFS server. Bạn cần no_root_squash để khôi phục quyền truy cập root.
Sửa Triệt Để: Cân Nhắc Xem Flag Có Nên Giữ Lại Không
Trước khi gỡ flag và tiếp tục, hãy dành 30 giây suy nghĩ tại sao nó được đặt ở đó. Immutable flag trên hệ thống production thường được đặt vì một lý do cụ thể — một sự cố trước đây, yêu cầu compliance, hoặc một công cụ tự động sẽ đặt lại vào lần chạy tiếp theo.
Tìm xem ai đã đặt nó:
# Tìm kiếm các lời gọi chattr trong Ansible playbooks
grep -r "chattr" /etc/ansible/
# Kiểm tra shell history (nếu có)
grep chattr ~/.bash_history
Đặc biệt chú ý với các config được quản lý tự động. Nếu /etc/resolv.conf được đặt immutable để ngăn NetworkManager hoặc dhclient ghi đè cài đặt DNS của bạn, gỡ flag sẽ cho phép chúng ghi đè lại vào lần khởi động tiếp theo. Cách sửa thực sự là ngăn các service đó chạm vào file:
# Yêu cầu NetworkManager không ghi đè resolv.conf
echo -e "[main]\ndns=none" | sudo tee /etc/NetworkManager/conf.d/nodns.conf
sudo systemctl restart NetworkManager
Tham Chiếu Nhanh
# Xem attributes
lsattr filename
lsattr -R /directory/
# Đặt immutable
sudo chattr +i filename
# Gỡ immutable
sudo chattr -i filename
# Các flag hữu ích khác:
# +a append-only (có thể ghi nhưng không xóa/ghi đè)
# +u undeletable (dữ liệu được giữ lại để phục hồi)
sudo chattr -a filename # gỡ append-only
Mẹo Hay
Khi bạn đang debug permission và không nhớ rõ các bit của file có nghĩa gì, Unix Permissions Calculator trên ToolCraft là cách nhanh để giải mã các giá trị chmod — tiện lợi để xác nhận file nên có những quyền gì trước khi khôi phục sau khi gỡ immutable flag.

