Files
audit-web/audit_check_script/check_failed_conditions.sh
T
2026-08-26 14:11:37 +07:00

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 "=============================================================================="