Kiểm Tra và Đánh Giá Quyền File trên Linux Server
Giới Thiệu
Việc quản lý và audit quyền truy cập file trên Linux server là một yếu tố cực kỳ quan trọng trong việc đảm bảo an ninh hệ thống. Quyền file được cấu hình sai có thể dẫn đến các lỗ hổng bảo mật nghiêm trọng, cho phép người dùng trái phép xem, sửa đổi hoặc xóa dữ liệu nhạy cảm, thậm chí thực thi mã độc. Bài hướng dẫn này sẽ trang bị cho bạn các công cụ và kỹ thuật cần thiết để kiểm tra, đánh giá và khắc phục các vấn đề về quyền file trên server Linux của mình.
📋 Thời gian: 20-30 phút | Độ khó: Trung bình
Yêu Cầu
Để thực hiện bài hướng dẫn này, bạn cần:
- Truy cập SSH vào server Linux của bạn.
- Quyền
sudohoặcrootđể thực hiện các lệnh kiểm tra sâu và sửa đổi quyền. - Hiểu biết cơ bản về lệnh terminal Linux (như
ls,cd,grep).
Các Bước Thực Hiện
Bước 1: Hiểu về Quyền File Cơ Bản trên Linux
Trước khi audit, hãy ôn lại cách Linux quản lý quyền. Mỗi file và thư mục có ba loại quyền cơ bản (đọc r, ghi w, thực thi x) và ba đối tượng áp dụng quyền (người dùng sở hữu u, nhóm sở hữu g, và những người khác o).
Khi bạn dùng lệnh ls -l, bạn sẽ thấy một chuỗi như drwxr-xr--.
- Ký tự đầu tiên (
dhoặc-): Cho biết đó là thư mục (d) hay file (-). - Ba ký tự tiếp theo (
rwx): Quyền của người dùng sở hữu. - Ba ký tự tiếp theo (
r-x): Quyền của nhóm sở hữu. - Ba ký tự cuối cùng (
r--): Quyền của những người khác.
💡 Mẹo: Quyền thực thi (x) trên thư mục cho phép người dùng đi vào thư mục đó.
Bước 2: Xác Định Các Khu Vực Cần Audit
Không phải tất cả các file và thư mục đều có mức độ nhạy cảm như nhau. Tập trung vào các khu vực quan trọng trước:
- Thư mục cấu hình hệ thống:
/etc - Thư mục chứa dữ liệu ứng dụng web:
/var/www,/srv - Thư mục người dùng:
/home - Thư mục ứng dụng cài đặt:
/opt - Thư mục chứa log:
/var/log - Thư mục tạm thời:
/tmp,/var/tmp
Bước 3: Sử Dụng Lệnh ls để Kiểm Tra Quyền
Lệnh ls -l là công cụ cơ bản nhất để xem quyền file. Để kiểm tra quyền của một thư mục cụ thể và các nội dung bên trong, bạn có thể sử dụng tùy chọn -R (đệ quy).
# Kiểm tra quyền của một file cụ thể
ls -l /etc/passwd
# Kiểm tra quyền của một thư mục và các file/thư mục con (không đệ quy)
ls -l /var/www/html
# Kiểm tra quyền của một thư mục và tất cả nội dung bên trong (đệ quy)
# ⚠️ Cẩn thận khi chạy trên thư mục lớn, có thể mất nhiều thời gian
ls -lR /var/www/html
Bước 4: Tìm File/Thư Mục Có Quyền Rộng Mở (World-Writable)
File hoặc thư mục mà mọi người dùng trên hệ thống đều có quyền ghi (world-writable) là một lỗ hổng bảo mật nghiêm trọng. Kẻ tấn công có thể sửa đổi hoặc xóa nội dung của chúng.
# Tìm tất cả các file world-writable trong một đường dẫn cụ thể
# -perm -o+w : tìm file có quyền ghi cho "others"
# -type f : chỉ tìm file
find /path/to/check -perm -o+w -type f 2>/dev/null
# Tìm tất cả các thư mục world-writable trong một đường dẫn cụ thể
# -type d : chỉ tìm thư mục
find /path/to/check -perm -o+w -type d 2>/dev/null
# Tìm các file/thư mục có quyền 777 (rwx cho tất cả)
find /path/to/check -perm 777 2>/dev/null
⚠️ Cẩn trọng: Thay /path/to/check bằng đường dẫn bạn muốn audit, ví dụ /var/www hoặc /home. Để audit toàn bộ hệ thống, bạn có thể dùng /.
Nếu tìm thấy, bạn cần xem xét và thay đổi quyền bằng chmod. Ví dụ: chmod o-w /path/to/file để xóa quyền ghi của "others".
Bước 5: Tìm File/Thư Mục Thuộc Về Người Dùng/Nhóm Không Tồn Tại (Orphaned Files)
Khi một người dùng hoặc nhóm bị xóa khỏi hệ thống nhưng các file mà họ sở hữu vẫn còn, các file đó trở thành "orphaned" (mồ côi). Điều này có thể gây nhầm lẫn và tiềm ẩn rủi ro bảo mật nếu một người dùng mới được tạo với cùng ID (UID/GID) cũ.
# Tìm các file/thư mục không có chủ sở hữu (user) hợp lệ
find /path/to/check -nouser 2>/dev/null
# Tìm các file/thư mục không có nhóm sở hữu (group) hợp lệ
find /path/to/check -nogroup 2>/dev/null
Nếu tìm thấy, bạn nên gán lại quyền sở hữu cho một người dùng hoặc nhóm hợp lệ (ví dụ: root) hoặc xóa chúng nếu chúng không còn cần thiết.
# Ví dụ: Gán lại quyền sở hữu cho root:root
sudo chown root:root /path/to/orphaned_file
Bước 6: Kiểm Tra Quyền SUID/SGID Bit
SUID (Set User ID) và SGID (Set Group ID) là các bit quyền đặc biệt.
- SUID: Khi một file thực thi có SUID bit, nó sẽ chạy với quyền của chủ sở hữu file đó (thường là
root), bất kể ai đang thực thi nó. - SGID: Tương tự SUID, nhưng áp dụng cho nhóm. Trên thư mục, SGID bit khiến các file mới tạo trong thư mục đó kế thừa nhóm của thư mục cha.
Việc lạm dụng SUID/SGID có thể tạo ra các lỗ hổng leo thang đặc quyền.
# Tìm các file có SUID bit được đặt
find /path/to/check -perm -4000 -type f 2>/dev/null
# Tìm các file có SGID bit được đặt
find /path/to/check -perm -2000 -type f 2>/dev/null
⚠️ Cảnh báo: Hãy rất cẩn thận khi thay đổi hoặc xóa SUID/SGID bit, vì một số chương trình hệ thống cần chúng để hoạt động đúng cách (ví dụ: passwd, sudo). Chỉ thay đổi nếu bạn chắc chắn về mục đích của file đó.
Bước 7: Sử Dụng getfacl để Kiểm Tra ACLs (Access Control Lists)
Ngoài các quyền cơ bản (rwx), Linux còn hỗ trợ ACLs, cho phép quản lý quyền truy cập chi tiết hơn cho nhiều người dùng và nhóm khác nhau. Nếu bạn đã từng cấu hình ACLs, bạn cần kiểm tra chúng.
# Lấy ACLs của một file hoặc thư mục
getfacl /path/to/file_or_directory
# Lấy ACLs đệ quy cho một thư mục
getfacl -R /path/to/directory
Nếu getfacl báo lỗi "Operation not supported", có thể filesystem của bạn không hỗ trợ ACLs hoặc chưa được mount với tùy chọn ACL.
Bước 8: Tự Động Hóa Quá Trình Audit (Script Đơn Giản)
Để thực hiện audit định kỳ, bạn có thể tạo một script đơn giản.
#!/bin/bash
LOG_FILE="/var/log/file_permission_audit.log"
AUDIT_PATHS="/etc /var/www /home /opt"
echo "--- Bắt đầu Audit Quyền File: $(date) ---" > "$LOG_FILE"
echo "1. Tìm kiếm file/thư mục world-writable:" | tee -a "$LOG_FILE"
for path in $AUDIT_PATHS; do
echo " Kiểm tra trong $path..." | tee -a "$LOG_FILE"
find "$path" -perm -o+w \( -type f -o -type d \) 2>/dev/null | tee -a "$LOG_FILE"
done
echo " | tee -a "$LOG_FILE"
echo "2. Tìm kiếm file/thư mục không có chủ sở hữu hợp lệ:" | tee -a "$LOG_FILE"
for path in $AUDIT_PATHS; do
echo " Kiểm tra trong $path..." | tee -a "$LOG_FILE"
find "$path" \( -nouser -o -nogroup \) 2>/dev/null | tee -a "$LOG_FILE"
done
echo " | tee -a "$LOG_FILE"
echo "3. Tìm kiếm file có SUID/SGID bit:" | tee -a "$LOG_FILE"
for path in $AUDIT_PATHS; do
echo " Kiểm tra trong $path..." | tee -a "$LOG_FILE"
find "$path" \( -perm -4000 -o -perm -2000 \) -type f 2>/dev/null | tee -a "$LOG_FILE"
done
echo "--- Kết thúc Audit Quyền File: $(date) ---" | tee -a "$LOG_FILE"
echo "Kết quả audit đã được lưu vào $LOG_FILE"
Lưu script này thành một file (ví dụ: audit_perms.sh), cấp quyền thực thi (chmod +x audit_perms.sh), và chạy nó.
Troubleshooting
-
Lỗi
Permission denied:- Nguyên nhân: Bạn đang cố gắng truy cập một thư mục hoặc file mà người dùng hiện tại không có quyền đọc/thực thi.
- Cách xử lý: Sử dụng
sudotrước lệnh của bạn (ví dụ:sudo find /root -perm -o+w). Đảm bảo bạn có quyềnsudo.
-
Kết quả quá nhiều, khó đọc:
- Nguyên nhân: Chạy lệnh
findtrên một phạm vi quá rộng (ví dụ:/) có thể trả về hàng nghìn kết quả. - Cách xử lý:
- Giới hạn phạm vi tìm kiếm vào các thư mục cụ thể (ví dụ:
/var/www,/etc). - Sử dụng
grepđể lọc kết quả theo tên file hoặc đường dẫn cụ thể. - Chuyển hướng output vào một file để xem xét sau:
find /path -perm -o+w > bad_perms.txt.
- Giới hạn phạm vi tìm kiếm vào các thư mục cụ thể (ví dụ:
- Nguyên nhân: Chạy lệnh
-
Không hiểu output của
ls -l:- Nguyên nhân: Chưa nắm vững cấu trúc quyền cơ bản của Linux.
- Cách xử lý: Đọc lại Bước 1 và tìm kiếm thêm tài liệu về
chmodvàchownđể củng cố kiến thức.
Kết Luận
Việc audit quyền file trên Linux server là một phần không thể thiếu của chiến lược bảo mật toàn diện. Bằng cách định kỳ kiểm tra và điều chỉnh quyền file, bạn có thể giảm thiểu đáng kể nguy cơ bị tấn công, đảm bảo tính toàn vẹn và bảo mật cho dữ liệu của mình.
✅ Best Practices:
- Nguyên tắc ít đặc quyền nhất (Least Privilege): Chỉ cấp quyền tối thiểu cần thiết cho người dùng và ứng dụng để thực hiện công việc của họ.
- Audit định kỳ: Lên lịch chạy các lệnh audit quyền file thường xuyên, đặc biệt sau khi có thay đổi lớn trên hệ thống hoặc cài đặt ứng dụng mới.
- Sử dụng công cụ quản lý cấu hình: Đối với các môi trường lớn, hãy xem xét sử dụng các công cụ như Ansible, Puppet hoặc Chef để quản lý và chuẩn hóa quyền file trên nhiều server.
- Sao lưu trước khi thay đổi: Luôn sao lưu dữ liệu hoặc tạo snapshot của server trước khi thực hiện các thay đổi quyền file lớn.