207 lines
10 KiB
Bash
207 lines
10 KiB
Bash
#!/bin/bash
|
|
##############################################################################
|
|
# SCRIPT CHẨN ĐOÁN CHI TIẾT NGUYÊN NHÂN FAILED CÁC TIÊU CHÍ CIS RHEL
|
|
# Tiêu chí: 1.3.1, 1.3.2, 5.1.6, 5.1.8
|
|
##############################################################################
|
|
|
|
# Màu sắc hiển thị
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
CYAN='\033[0;36m'
|
|
NC='\033[0m' # No Color
|
|
|
|
echo "=============================================================================="
|
|
echo " KIỂM TRA & CHẨN ĐOÁN CHI TIẾT CÁC ĐIỀU KIỆN FAILED"
|
|
echo "=============================================================================="
|
|
echo -e "Thời gian kiểm tra : $(date)"
|
|
echo -e "Hostname : $(hostname)"
|
|
echo -e "Hệ điều hành : $(cat /etc/redhat-release 2>/dev/null || cat /etc/os-release 2>/dev/null | grep PRETTY_NAME | cut -d= -f2 | tr -d '"')"
|
|
echo "=============================================================================="
|
|
echo ""
|
|
|
|
##############################################################################
|
|
# 1. KIỂM TRA TIÊU CHÍ 1.3.1: Cài đặt AIDE
|
|
##############################################################################
|
|
echo -e "${CYAN}--- [TIÊU CHÍ 1.3.1] Kiểm tra cài đặt gói AIDE ---${NC}"
|
|
echo "Lệnh thực hiện: rpm -q aide"
|
|
|
|
aide_pkg=$(rpm -q aide 2>&1)
|
|
if rpm -q aide >/dev/null 2>&1 || rpm -qa | grep -qi "^aide"; then
|
|
echo -e "Kết quả: ${GREEN}[PASSED]${NC} Gói AIDE đã được cài đặt ($aide_pkg)."
|
|
aide_installed=1
|
|
else
|
|
echo -e "Kết quả: ${RED}[FAILED]${NC} Gói AIDE chưa được cài đặt trên hệ thống."
|
|
echo -e "${YELLOW}-> Lý do FAILED:${NC} Lệnh 'rpm -q aide' trả về: $aide_pkg"
|
|
echo -e "${YELLOW}-> Cách khắc phục:${NC}"
|
|
echo " yum install aide # (hoặc dnf install aide)"
|
|
aide_installed=0
|
|
fi
|
|
echo ""
|
|
|
|
##############################################################################
|
|
# 2. KIỂM TRA TIÊU CHÍ 1.3.2: Cấu hình lịch chạy kiểm tra tính toàn vẹn (AIDE cron)
|
|
##############################################################################
|
|
echo -e "${CYAN}--- [TIÊU CHÍ 1.3.2] Cấu hình kiểm tra tính toàn vẹn filesystem ---${NC}"
|
|
echo "Yêu cầu: Gói AIDE phải được cài đặt VÀ có cấu hình crontab hoặc systemd timer chạy 'aide --check'."
|
|
|
|
cron_check=0
|
|
timer_check=0
|
|
|
|
# Kiểm tra crontab của root và file hệ thống
|
|
cron_matches=$(crontab -l 2>/dev/null | grep -E '^\s*[^#].*\baide\b.*--check')
|
|
sys_cron_matches=$(grep -rsE '^\s*[^#].*\baide\b.*--check' /etc/cron* /var/spool/cron 2>/dev/null)
|
|
|
|
if [ -n "$cron_matches" ] || [ -n "$sys_cron_matches" ]; then
|
|
cron_check=1
|
|
fi
|
|
|
|
# Kiểm tra systemd timer
|
|
if systemctl is-enabled aidecheck.timer 2>/dev/null | grep -q "^enabled" || \
|
|
systemctl is-enabled aide-check.timer 2>/dev/null | grep -q "^enabled"; then
|
|
timer_check=1
|
|
fi
|
|
|
|
if [ $aide_installed -eq 1 ] && { [ $cron_check -eq 1 ] || [ $timer_check -eq 1 ]; }; then
|
|
echo -e "Kết quả: ${GREEN}[PASSED]${NC} Đã cấu hình lịch kiểm tra AIDE định kỳ."
|
|
else
|
|
echo -e "Kết quả: ${RED}[FAILED]${NC} Chưa thỏa mãn yêu cầu tiêu chí 1.3.2."
|
|
echo -e "${YELLOW}-> Chi tiết chẩn đoán:${NC}"
|
|
if [ $aide_installed -eq 0 ]; then
|
|
echo " [X] Gói AIDE chưa được cài đặt (Tiền đề bắt buộc)."
|
|
else
|
|
echo " [V] Gói AIDE đã được cài đặt."
|
|
fi
|
|
|
|
if [ $cron_check -eq 1 ]; then
|
|
echo " [V] Tìm thấy lệnh chạy trong cron:"
|
|
[ -n "$cron_matches" ] && echo " + crontab: $cron_matches"
|
|
[ -n "$sys_cron_matches" ] && echo " + system cron: $sys_cron_matches"
|
|
else
|
|
echo " [X] Không tìm thấy dòng lệnh 'aide --check' trong crontab hoặc /etc/cron*."
|
|
fi
|
|
|
|
if [ $timer_check -eq 1 ]; then
|
|
echo " [V] Systemd timer aidecheck.timer đang enabled."
|
|
else
|
|
echo " [X] Systemd timer aidecheck.timer không được enable."
|
|
fi
|
|
|
|
echo -e "${YELLOW}-> Cách khắc phục:${NC}"
|
|
echo " 1. Cài đặt và khởi tạo AIDE:"
|
|
echo " yum install aide"
|
|
echo " aide --init"
|
|
echo " mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz"
|
|
echo " 2. Thêm lịch chạy vào crontab (chạy lúc 5h sáng mỗi ngày):"
|
|
echo " crontab -u root -e"
|
|
echo " # Thêm dòng sau:"
|
|
echo " 0 5 * * * /usr/sbin/aide --check"
|
|
fi
|
|
echo ""
|
|
|
|
##############################################################################
|
|
# 3. KIỂM TRA TIÊU CHÍ 5.1.6: Phân quyền file /etc/cron.monthly
|
|
##############################################################################
|
|
echo -e "${CYAN}--- [TIÊU CHÍ 5.1.6] Cấu hình phân quyền cho file /etc/cron.monthly ---${NC}"
|
|
target_file="/etc/cron.monthly"
|
|
|
|
if [ ! -e "$target_file" ]; then
|
|
echo -e "Kết quả: ${GREEN}[PASSED]${NC} Thư mục/file $target_file không tồn tại (Không bị đánh giá lỗi)."
|
|
else
|
|
file_stat=$(stat -c "%a:%u:%g" "$target_file" 2>/dev/null)
|
|
file_mode=$(stat -c "%a" "$target_file" 2>/dev/null)
|
|
file_owner=$(stat -c "%U (%u)" "$target_file" 2>/dev/null)
|
|
file_group=$(stat -c "%G (%g)" "$target_file" 2>/dev/null)
|
|
ls_info=$(ls -ld "$target_file" 2>/dev/null)
|
|
|
|
echo "Thông tin hiện tại của $target_file:"
|
|
echo " + Quyền (Permissions): $file_mode (Yêu cầu: Group và Other KHÔNG được có quyền write - tối đa 755 hoặc 700)"
|
|
echo " + Chủ sở hữu (Owner) : $file_owner (Yêu cầu: root / 0)"
|
|
echo " + Nhóm (Group) : $file_group (Yêu cầu: root / 0)"
|
|
echo " + Chi tiết ls -ld : $ls_info"
|
|
|
|
if echo "$file_stat" | grep -qE "^[0-7][0-5][0-5]:0:0$"; then
|
|
echo -e "Kết quả: ${GREEN}[PASSED]${NC} Phân quyền thỏa mãn điều kiện chuẩn CIS."
|
|
else
|
|
echo -e "Kết quả: ${RED}[FAILED]${NC} Phân quyền hoặc chủ sở hữu chưa đạt chuẩn."
|
|
echo -e "${YELLOW}-> Lý do FAILED:${NC}"
|
|
if ! echo "$file_mode" | grep -qE "^[0-7][0-5][0-5]$"; then
|
|
echo " [X] Quyền $file_mode đang cho phép Group hoặc Other có quyền ghi (write)."
|
|
fi
|
|
if [ "$(stat -c "%u" "$target_file")" != "0" ] || [ "$(stat -c "%g" "$target_file")" != "0" ]; then
|
|
echo " [X] Owner hoặc Group không phải là root (0:0)."
|
|
fi
|
|
echo -e "${YELLOW}-> Cách khắc phục:${NC}"
|
|
echo " chown root:root $target_file"
|
|
echo " chmod og-rwx $target_file # (Đưa về 700 hoặc 750/755 tùy hệ thống)"
|
|
fi
|
|
fi
|
|
echo ""
|
|
|
|
##############################################################################
|
|
# 4. KIỂM TRA TIÊU CHÍ 5.1.8: Giới hạn truy cập at/cron (cron.allow, cron.deny...)
|
|
##############################################################################
|
|
echo -e "${CYAN}--- [TIÊU CHÍ 5.1.8] Cấu hình at/cron hạn chế chỉ cho người dùng được ủy quyền ---${NC}"
|
|
echo "Yêu cầu CIS: /etc/cron.allow & /etc/at.allow PHẢI TỒN TẠI | /etc/cron.deny & /etc/at.deny KHÔNG ĐƯỢC TỒN TẠI."
|
|
|
|
cron_allow_exist=0
|
|
cron_deny_exist=0
|
|
at_allow_exist=0
|
|
at_deny_exist=0
|
|
|
|
[ -f /etc/cron.allow ] && cron_allow_exist=1
|
|
[ -f /etc/cron.deny ] && cron_deny_exist=1
|
|
[ -f /etc/at.allow ] && at_allow_exist=1
|
|
[ -f /etc/at.deny ] && at_deny_exist=1
|
|
|
|
echo "Trạng thái các file trên hệ thống:"
|
|
if [ $cron_allow_exist -eq 1 ]; then
|
|
echo -e " + /etc/cron.allow : ${GREEN}Tồn tại${NC} ($(ls -l /etc/cron.allow 2>/dev/null | awk '{print $1, $3":"$4}'))"
|
|
else
|
|
echo -e " + /etc/cron.allow : ${RED}KHÔNG tồn tại (Bắt buộc phải có)${NC}"
|
|
fi
|
|
|
|
if [ $cron_deny_exist -eq 1 ]; then
|
|
echo -e " + /etc/cron.deny : ${RED}ĐANG TỒN TẠI (Bắt buộc phải XÓA bỏ)${NC} ($(ls -l /etc/cron.deny 2>/dev/null | awk '{print $1, $5" bytes"}'))"
|
|
else
|
|
echo -e " + /etc/cron.deny : ${GREEN}Không tồn tại (Đúng)${NC}"
|
|
fi
|
|
|
|
if [ $at_allow_exist -eq 1 ]; then
|
|
echo -e " + /etc/at.allow : ${GREEN}Tồn tại${NC} ($(ls -l /etc/at.allow 2>/dev/null | awk '{print $1, $3":"$4}'))"
|
|
else
|
|
echo -e " + /etc/at.allow : ${RED}KHÔNG tồn tại (Bắt buộc phải có)${NC}"
|
|
fi
|
|
|
|
if [ $at_deny_exist -eq 1 ]; then
|
|
echo -e " + /etc/at.deny : ${RED}ĐANG TỒN TẠI (Bắt buộc phải XÓA bỏ)${NC} ($(ls -l /etc/at.deny 2>/dev/null | awk '{print $1, $5" bytes"}'))"
|
|
else
|
|
echo -e " + /etc/at.deny : ${GREEN}Không tồn tại (Đúng)${NC}"
|
|
fi
|
|
|
|
if [ $cron_allow_exist -eq 1 ] && [ $cron_deny_exist -eq 0 ] && [ $at_allow_exist -eq 1 ] && [ $at_deny_exist -eq 0 ]; then
|
|
echo -e "Kết quả: ${GREEN}[PASSED]${NC} Cấu hình giới hạn at/cron hoàn toàn tuân thủ CIS."
|
|
else
|
|
echo -e "Kết quả: ${RED}[FAILED]${NC} Cấu hình at/cron chưa đạt chuẩn CIS."
|
|
echo -e "${YELLOW}-> Nguyên nhân chính khiến bạn FAILED:${NC}"
|
|
[ $cron_deny_exist -eq 1 ] && echo " [X] File /etc/cron.deny vẫn đang tồn tại (dù là file 0 bytes thì CIS vẫn đánh giá FAILED)."
|
|
[ $at_deny_exist -eq 1 ] && echo " [X] File /etc/at.deny vẫn đang tồn tại."
|
|
[ $cron_allow_exist -eq 0 ] && echo " [X] Thiếu file /etc/cron.allow."
|
|
[ $at_allow_exist -eq 0 ] && echo " [X] Thiếu file /etc/at.allow."
|
|
|
|
echo -e "${YELLOW}-> Cách khắc phục triệt để:${NC}"
|
|
echo " # Xóa file deny (Bắt buộc):"
|
|
echo " rm -f /etc/cron.deny /etc/at.deny"
|
|
echo " # Tạo file allow (Bắt buộc):"
|
|
echo " touch /etc/cron.allow /etc/at.allow"
|
|
echo " # Phân quyền chuẩn 600 root:root:"
|
|
echo " chown root:root /etc/cron.allow /etc/at.allow"
|
|
echo " chmod 600 /etc/cron.allow /etc/at.allow"
|
|
fi
|
|
echo ""
|
|
echo "=============================================================================="
|
|
echo "LƯU Ý QUAN TRỌNG VỀ CÔNG CỤ AUDIT:"
|
|
echo "Nếu bạn chạy script audit được mã hóa (.enc), hãy chắc chắn rằng file mã hóa"
|
|
echo "đã được tạo lại từ file .sh mới nhất sau khi sửa mã nguồn."
|
|
echo "=============================================================================="
|