Tự động hóa kiểm tra và sửa lỗi cấu hình hệ thống CentOS 7

Giới thiệu

Tập lệnh shell này được thiết kế để thực hiện kiểm tra an ninh cơ bản và sửa chữa tự động trên các hệ thống CentOS 7.x (từ phiên bản 7.5 đến 7.9). Nó bao gồm việc kiểm tra và cấu hình các thông số hệ thống quan trọng như thông tin hệ điều hành, cài đặt SSH, chính sách mật khẩu, độ phức tạp mật khẩu, khóa tài khoản, quyền root, thời gian chờ phiên, lịch sử lệnh, đồng bộ hóa NTP, cấu hình hệ thống, phần mềm EDR, tường lửa và cài đặt đăng nhập người dùng.

I. Kiểm tra và sửa lỗi cấu hình hệ thống

1. Kiểm tra thông tin hệ thống

Tập lệnh hiển thị các thông tin cơ bản về hệ thống như phiên bản hệ điều hành, phiên bản kernel, số lượng CPU, loại CPU, dung lượng RAM và dung lượng đĩa.


echo " "
echo "############################ Thông tin hệ thống ############################"
Release=$(cat /etc/redhat-release 2>/dev/null)
Kernel=$(uname -r)
Virt_CPUs=$(grep "processor" /proc/cpuinfo | wc -l)
CPU_Type=$(grep "model name" /proc/cpuinfo | awk -F ': ' '{print $2}' | sort | uniq)
Mem_total=$(free -h  |grep Mem: |awk -F ' ' '{print $2}')
Disk_total=$(fdisk -l |grep "Disk /dev/sd" |awk -F ' ' '{print $2$3$4}' |cut -d ',' -f1)

echo "   Phiên bản phát hành: $Release"
echo "       Kernel: $Kernel"
echo "Số CPU logic: $Virt_CPUs"
echo "    Loại CPU: $CPU_Type"
echo "   Dung lượng RAM: $Mem_total"
echo "   Dung lượng đĩa: $Disk_total"

2. Kiểm tra và sửa lỗi cấu hình SSH

2.1. Kiểm tra cấu hình SSH

Tập lệnh kiểm tra các tham số sau trong tệp /etc/ssh/sshd_config:

  • MaxAuthTries: Số lần thử xác thực tối đa.
  • PasswordAuthentication: Cho phép xác thực bằng mật khẩu.
  • PubkeyAuthentication: Cho phép xác thực bằng khóa công khai.

Nếu các giá trị không đạt yêu cầu, tập lệnh sẽ báo cáo là "Kiểm tra không đạt".


echo " "
echo "## Kiểm tra cấu hình SSH ############################"
max_tries=$(cat /etc/ssh/sshd_config | grep '^MaxAuthTries' | awk '{print $2}')
pass_auth=$(cat /etc/ssh/sshd_config | grep '^PasswordAuthentication' | awk '{print $2}')
pubkey_auth=$(cat /etc/ssh/sshd_config | grep '^PubkeyAuthentication' | awk '{print $2}')

# Kiểm tra các giá trị mong muốn (ví dụ: MaxAuthTries = 5, các loại xác thực khác là yes)
if [ "$max_tries" -eq 5 ] && [ "$pass_auth" == "yes" ] && [ "$pubkey_auth" == "yes" ]; then
    echo ""
    echo "Kiểm tra đạt"
else
    echo ""
    echo "Kiểm tra không đạt"
fi

2.2. Sửa lỗi cấu hình SSH

Tập lệnh này sẽ sửa các tham số cấu hình SSH để tuân thủ các yêu cầu bảo mật:

  • Đặt MaxAuthTries thành 5.
  • Đảm bảo PasswordAuthentication được đặt thành yes.
  • Đảm bảo PubkeyAuthentication được đặt thành yes.

Sau khi sửa, dịch vụ SSH sẽ được khởi động lại.


echo -e "\033[1;33mĐường dẫn tệp cấu hình: /etc/ssh/sshd_config \033[0m"
echo -e "\033[32m------------------------- Trước khi sửa -------------------------\033[0m"
grep -n "^MaxAuthTries" /etc/ssh/sshd_config
grep -n "^PasswordAuthentication" /etc/ssh/sshd_config
grep -n "^PubkeyAuthentication" /etc/ssh/sshd_config
echo -e "\033[32m------------------------- Trước khi sửa -------------------------\033[0m"
echo " "

# Hàm để sửa hoặc thêm cấu hình SSH
function set_ssh_config() {
    local config_key="$1"
    local config_value="$2"
    local config_file="/etc/ssh/sshd_config"

    # Kiểm tra xem dòng có tồn tại và không bị comment không
    if grep -qE "^${config_key}[[:space:]]+" "$config_file" && ! grep -qE "^#.*${config_key}[[:space:]]+" "$config_file"; then
        # Cập nhật giá trị nếu tồn tại
        sed -i "s/^${config_key}[[:space:]]\+.*/${config_key} ${config_value}/" "$config_file"
    else
        # Thêm mới nếu không tồn tại hoặc bị comment
        if grep -qE "^#.*${config_key}[[:space:]]+" "$config_file"; then
            # Bỏ comment và cập nhật
            sed -i "s/^#.*${config_key}[[:space:]]\+.*/${config_key} ${config_value}/" "$config_file"
        else
            # Thêm vào cuối tệp
            echo "${config_key} ${config_value}" >> "$config_file"
        fi
    fi
}

# Áp dụng các cấu hình
set_ssh_config "MaxAuthTries" "5"
set_ssh_config "PasswordAuthentication" "yes"
set_ssh_config "PubkeyAuthentication" "yes"

systemctl restart sshd
echo -e "\033[1;36m Sửa lỗi thành công, vui lòng kiểm tra lại! \033[0m"
echo " "
echo -e "\033[31m------------------------- Sau khi sửa -------------------------\033[0m"
grep -n "^MaxAuthTries" /etc/ssh/sshd_config
grep -n "^PasswordAuthentication" /etc/ssh/sshd_config
grep -n "^PubkeyAuthentication" /etc/ssh/sshd_config
echo -e "\033[31m------------------------- Sau khi sửa -------------------------\033[0m"

3. Kiểm tra và sửa lỗi chính sách tài khoản

3.1. Kiểm tra chính sách tài khoản

Kiểm tra các giá trị PASS_MIN_DAYSPASS_WARN_AGE trong /etc/login.defs. Nếu các giá trị này không đúng với yêu cầu (ví dụ: PASS_MIN_DAYS=2, PASS_WARN_AGE=5), thì báo cáo "Kiểm tra không đạt".


echo ""
echo "## Kiểm tra chính sách tài khoản ############################"
min_pass_days=$(cat /etc/login.defs | grep PASS_MIN_DAYS | grep -v ^# | awk '{print $2}')
warn_age=$(cat /etc/login.defs | grep PASS_WARN_AGE | grep -v ^# | awk '{print $2}')

if [ -n "$min_pass_days" ] && [ -n "$warn_age" ]; then
    if [ "$min_pass_days" -eq 2 ] && [ "$warn_age" -eq 5 ]; then
        echo ""
        echo "Kiểm tra đạt"
    else
        echo ""
        echo "Kiểm tra không đạt"
    fi
else
    echo ""
    echo "Kiểm tra không đạt (thiếu cấu hình)"
fi

3.2. Sửa lỗi chính sách tài khoản

Cập nhật PASS_MIN_DAYS thành 2 và PASS_WARN_AGE thành 5 trong tệp /etc/login.defs.


echo -e "\033[1;33mĐường dẫn tệp cấu hình: /etc/login.defs \033[0m"
echo -e "\033[32m------------------------- Trước khi sửa -------------------------\033[0m"
grep -n "^PASS_MAX_DAYS" /etc/login.defs
grep -n "^PASS_MIN_DAYS" /etc/login.defs
grep -n "^PASS_WARN_AGE" /etc/login.defs
echo -e "\033[32m------------------------- Trước khi sửa -------------------------\033[0m"
echo " "

# Hàm để sửa hoặc thêm cấu hình login.defs
function set_login_defs_config() {
    local config_key="$1"
    local config_value="$2"
    local config_file="/etc/login.defs"

    # Kiểm tra xem dòng có tồn tại và không bị comment không
    if grep -qE "^${config_key}[[:space:]]+" "$config_file" && ! grep -qE "^#.*${config_key}[[:space:]]+" "$config_file"; then
        # Cập nhật giá trị nếu tồn tại
        sed -i "s/^${config_key}[[:space:]]\+.*/${config_key} ${config_value}/" "$config_file"
    else
        # Thêm mới nếu không tồn tại hoặc bị comment
        if grep -qE "^#.*${config_key}[[:space:]]+" "$config_file"; then
            # Bỏ comment và cập nhật
            sed -i "s/^#.*${config_key}[[:space:]]\+.*/${config_key} ${config_value}/" "$config_file"
        else
            # Thêm vào cuối tệp
            echo "${config_key} ${config_value}" >> "$config_file"
        fi
    fi
}

# Áp dụng các cấu hình
set_login_defs_config "PASS_MIN_DAYS" "2"
set_login_defs_config "PASS_WARN_AGE" "5"

echo " "
echo -e "\033[31m------------------------- Sau khi sửa -------------------------\033[0m"
grep -n "^PASS_MAX_DAYS" /etc/login.defs
grep -n "^PASS_MIN_DAYS" /etc/login.defs
grep -n "^PASS_WARN_AGE" /etc/login.defs
echo -e "\033[31m------------------------- Sau khi sửa -------------------------\033[0m"

4. Kiểm tra và sửa lỗi độ phức tạp mật khẩu

4.1. Kiểm tra độ phức tạp mật khẩu

Kiểm tra sự tồn tại của các quy tắc độ phức tạp mật khẩu trong /etc/pam.d/system-auth, ví dụ như sử dụng pam_pwquality.so hoặc pam_cracklib.so với các tham số như minlen=10, dcredit=-1, ucredit=-1, lcredit=-1, ocredit=-1.


echo ""
echo "## Kiểm tra độ phức tạp mật khẩu ############################"
# Kiểm tra cấu hình bằng pam_pwquality.so
complexity_pwq=$(cat /etc/pam.d/system-auth | grep 'pam_pwquality.so' | grep 'minlen=10' | grep 'dcredit=-1' | grep 'ucredit=-1' | grep 'lcredit=-1' | grep 'ocredit=-1')
# Kiểm tra cấu hình bằng pam_cracklib.so
complexity_cracklib=$(cat /etc/pam.d/system-auth | grep 'pam_cracklib.so' | grep 'retry=3' | grep 'minlen=10' | grep 'dcredit=-1' | grep 'ucredit=-1' | grep 'lcredit=-1' | grep 'ocredit=-1')

if [ -n "$complexity_pwq" ] || [ -n "$complexity_cracklib" ]; then
    echo ""
    echo "Kiểm tra đạt"
else
    echo ""
    echo "Kiểm tra không đạt"
fi

4.2. Sửa lỗi độ phức tạp mật khẩu

Cập nhật hoặc thêm quy tắc độ phức tạp mật khẩu vào /etc/pam.d/system-auth, đảm bảo sử dụng pam_pwquality.so với các tham số yêu cầu.


echo -e "\033[1;33mĐường dẫn tệp cấu hình: /etc/pam.d/system-auth \033[0m"
echo -e "\033[32m------------------------- Trước khi sửa -------------------------\033[0m"
grep -n "^password" /etc/pam.d/system-auth
echo -e "\033[32m------------------------- Trước khi sửa -------------------------\033[0m"
echo " "

# Xác định dòng cần sửa hoặc thêm
line_num_pwq=$(grep -n 'pam_pwquality.so' /etc/pam.d/system-auth | cut -d: -f1)
line_num_cracklib=$(grep -n 'pam_cracklib.so' /etc/pam.d/system-auth | cut -d: -f1)
pam_line_index=4 # Vị trí mặc định để chèn nếu không tìm thấy

if [ -n "$line_num_pwq" ]; then
    sed -i "${line_num_pwq}c password    requisite     pam_pwquality.so minlen=10 dcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1 try_first_pass local_users_only retry=3" /etc/pam.d/system-auth
elif [ -n "$line_num_cracklib" ]; then
    sed -i "${line_num_cracklib}c password    requisite     pam_cracklib.so retry=3 minlen=10 dcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1" /etc/pam.d/system-auth
else
    # Chèn vào dòng thứ 4 nếu không tìm thấy module pam tương ứng
    sed -i "${pam_line_index}i password    requisite     pam_pwquality.so minlen=10 dcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1 try_first_pass local_users_only retry=3" /etc/pam.d/system-auth
fi

echo -e "\033[1;36m Sửa lỗi thành công, vui lòng kiểm tra lại! \033[0m"
echo " "
echo -e "\033[31m------------------------- Sau khi sửa -------------------------\033[0m"
grep -n "^password" /etc/pam.d/system-auth
echo -e "\033[31m------------------------- Sau khi sửa -------------------------\033[0m"

5. Kiểm tra và sửa lỗi khóa đăng nhập tài khoản

5.1. Kiểm tra khóa đăng nhập tài khoản

Kiểm tra cấu hình pam_tally2.so trong /etc/pam.d/sshd để đảm bảo các tham số như deny=5, unlock_time=300, even_deny_root=5, root_unlock_time=300 được đặt đúng.


echo ""
echo "## Kiểm tra khóa đăng nhập tài khoản ############################"
login_lock_config=$(cat /etc/pam.d/sshd | grep 'pam_tally2.so' | grep 'deny=5' | grep 'unlock_time=300' | grep 'even_deny_root=5' | grep 'root_unlock_time=300')

if [ -n "$login_lock_config" ]; then
    echo ""
    echo "Kiểm tra đạt"
else
    echo ""
    echo "Kiểm tra không đạt"
fi
echo "Xem số lần đăng nhập thất bại của người dùng: pam_tally2 --user root"
echo "Mở khóa người dùng chỉ định: pam_tally2 -r -u root"

5.2. Sửa lỗi khóa đăng nhập tài khoản

Cấu hình pam_tally2.so trong /etc/pam.d/sshd với các tham số yêu cầu để khóa tài khoản sau 5 lần đăng nhập sai và mở khóa sau 300 giây.


 echo -e "\033[1;33mĐường dẫn tệp cấu hình: /etc/pam.d/sshd \033[0m"
echo -e "\033[32m------------------------- Trước khi sửa -------------------------\033[0m"
grep -n "^auth" /etc/pam.d/sshd
echo -e "\033[32m------------------------- Trước khi sửa -------------------------\033[0m"
echo " "

# Tìm dòng có pam_tally2.so hoặc thêm mới
line_num_tally=$(grep -n 'pam_tally2.so' /etc/pam.d/sshd | cut -d: -f1)

if [ -n "$line_num_tally" ]; then
    # Sửa dòng hiện có
    sed -i "${line_num_tally}c auth       required     pam_tally2.so deny=5 unlock_time=300 even_deny_root=5 root_unlock_time=300" /etc/pam.d/sshd
else
    # Thêm dòng mới vào vị trí thứ 2
    sed -i '2i\auth       required     pam_tally2.so deny=5 unlock_time=300 even_deny_root=5 root_unlock_time=300' /etc/pam.d/sshd
fi
echo -e "\033[1;36m Sửa lỗi thành công, vui lòng kiểm tra lại! \033[0m"
echo " "
echo -e "\033[31m------------------------- Sau khi sửa -------------------------\033[0m"
grep -n "^auth" /etc/pam.d/sshd
echo -e "\033[31m------------------------- Sau khi sửa -------------------------\033[0m"

6. Kiểm tra và sửa lỗi quyền root

6.1. Kiểm tra quyền root

Kiểm tra xem có tài khoản nào khác ngoài root có UID bằng 0 hay không. Nếu có, báo cáo "Kiểm tra không đạt".


echo ""
echo "## Kiểm tra quyền root ############################"
uid_zero_check=0
for uid in $(awk -F[:] '$3 == 0 {print $3}' /etc/passwd); do
    if [ "$uid" = "0" ]; then
        echo ""
        echo "Kiểm tra không đạt (Có UID=0 khác ngoài root)"
        uid_zero_check=1
        break
    fi
done
if [ "$uid_zero_check" -eq 0 ]; then
    echo ""
    echo "Kiểm tra đạt"
fi

Lưu ý: Phần sửa lỗi cho mục này rất rủi ro và không được tự động hóa hoàn toàn trong ví dụ gốc. Cần thực hiện thủ công.

7. Kiểm tra và sửa lỗi thời gian chờ phiên

7.1. Kiểm tra thời gian chờ phiên

Kiểm tra biến môi trường TMOUT trong /etc/profile. Nếu TMOUT không được đặt hoặc có giá trị lớn hơn 600 giây, báo cáo "Kiểm tra không đạt".


echo ""
echo "## Kiểm tra thời gian chờ phiên ############################"
tmout_value=$(cat /etc/profile | grep '^export TMOUT=' | awk -F'=' '{print $2}')

if [ -n "$tmout_value" ]; then
    if [ "$tmout_value" -le 600 ]; then
        echo ""
        echo "Kiểm tra đạt"
    else
        echo ""
        echo "Kiểm tra không đạt (TMOUT quá lớn)"
    fi
else
    echo "Không tìm thấy cấu hình TMOUT tự động đăng xuất, không đáp ứng yêu cầu. Nên đặt là 600 giây."
    echo ""
    echo "Kiểm tra không đạt"
fi

7.2. Sửa lỗi thời gian chờ phiên

Thêm hoặc sửa đổi biến TMOUT trong /etc/profile để đặt thời gian chờ là 600 giây.


echo -e "\033[1;33mĐường dẫn tệp cấu hình: /etc/profile \033[0m"
echo -e "\033[32m------------------------- Trước khi sửa -------------------------\033[0m"
grep -n "^export TMOUT" /etc/profile
echo -e "\033[32m------------------------- Trước khi sửa -------------------------\033[0m"
echo " "
if grep -q '^export TMOUT=' /etc/profile; then
    sed -i 's/^export TMOUT=.*/export TMOUT=600/' /etc/profile
else
    echo "export TMOUT=600" >> /etc/profile
fi
source /etc/profile
echo -e "\033[1;36m Sửa lỗi thành công, vui lòng kiểm tra lại! \033[0m"
echo " "
echo -e "\033[31m------------------------- Sau khi sửa -------------------------\033[0m"
grep -n "^export TMOUT" /etc/profile
echo -e "\033[31m------------------------- Sau khi sửa -------------------------\033[0m"

8. Kiểm tra và sửa lỗi khóa người dùng mặc định

8.1. Kiểm tra khóa người dùng mặc định

Kiểm tra xem các tài khoản hệ thống không cần thiết (ví dụ: bin, daemon, adm...) có bị khóa tài khoản hay không.


echo ""
echo "## Kiểm tra khóa người dùng mặc định ############################"
flag=0
users_to_check="bin daemon adm lp mail operator games ftp nobody systemd-bus-proxy systemd-network dbus polkitd abrt unbound tss libstoragemgmt rpc colord usbmuxd saslauth geoclue rtkit radvd rpcuser nfsnobody qemu chrony setroubleshoot pulse gdm gnome-initial-setup sshd avahi postfix ntp tcpdump mysql gluster"
locked_users=""

for user in ${users_to_check}; do
    if id "$user" &>/dev/null; then # Kiểm tra xem user có tồn tại không
        if [ "$(passwd -S "$user" | awk '{print $2}')" != "LK" ]; then
            locked_users="$locked_users $user"
            flag=1
        fi
    fi
done

if [ "$flag" -eq 0 ]; then
    echo "Kiểm tra đạt"
else
    echo "Kiểm tra không đạt. Người dùng chưa khóa: $locked_users"
fi

8.2. Sửa lỗi khóa người dùng mặc định

Sử dụng lệnh passwd -l để khóa các tài khoản người dùng mặc định không cần thiết.


UserList="bin daemon adm lp mail operator games ftp nobody systemd-bus-proxy systemd-network dbus polkitd abrt unbound tss libstoragemgmt rpc colord usbmuxd saslauth geoclue rtkit radvd rpcuser nfsnobody qemu chrony setroubleshoot pulse gdm gnome-initial-setup sshd avahi postfix ntp tcpdump mysql gluster"
echo "Bắt đầu khóa các tài khoản người dùng mặc định..."
for _user in ${UserList}; do
    if id "$_user" &>/dev/null; then
        if [ "$(passwd -S "$_user" | awk '{print $2}')" != "LK" ]; then
            passwd -l "$_user"
            echo "Đã khóa tài khoản: $_user"
        fi
    fi
done
echo -e "\033[1;36mSửa lỗi thành công, vui lòng kiểm tra lại! \033[0m"

9. Kiểm tra và sửa lỗi đồng bộ hóa NTP

9.1. Kiểm tra đồng bộ hóa NTP

Kiểm tra sự tồn tại của cấu hình NTP trong /etc/hosts, /etc/ntp.conf/etc/sysconfig/ntpd.


echo ""
echo "## Kiểm tra đồng bộ hóa NTP ############################"
ntp_server_in_hosts=$(grep -c "ntpserver" /etc/hosts)
ntp_config_in_ntpconf=$(grep -c "server ntpserver minpoll" /etc/ntp.conf)
ntp_service_options=$(grep -c "OPTIONS=\"-x -p /var/run/ntpd.pid -g\"" /etc/sysconfig/ntpd)

if [ "$ntp_server_in_hosts" -eq 1 ] && [ "$ntp_config_in_ntpconf" -eq 1 ] && [ "$ntp_service_options" -eq 1 ]; then
    echo "Kiểm tra đạt"
else
    echo "Kiểm tra không đạt"
fi

9.2. Sửa lỗi đồng bộ hóa NTP

Cập nhật các tệp cấu hình NTP (/etc/hosts, /etc/ntp.conf, /etc/sysconfig/ntpd) và khởi động lại dịch vụ ntpd.


echo -e "\033[1;33mĐường dẫn tệp cấu hình: /etc/hosts \033[0m"
echo -e "\033[32m------------------------- Trước khi sửa -------------------------\033[0m"
cat /etc/hosts
echo -e "\033[32m------------------------- Trước khi sửa -------------------------\033[0m"
echo " "

# Cập nhật /etc/hosts
if grep -q "ntpserver" /etc/hosts; then
    sed -i '/ntpserver/d' /etc/hosts
fi
echo "10.14.1.11	ntpserver" >> /etc/hosts

# Cập nhật /etc/ntp.conf
cat <<EOF > /etc/ntp.conf
driftfile /var/lib/ntp/drift
server ntpserver minpoll 4 maxpoll 4 prefer
includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys
disable monitor
EOF

# Cập nhật /etc/sysconfig/ntpd
if grep -q "OPTIONS=" /etc/sysconfig/ntpd; then
    sed -i 's/^OPTIONS=.*/OPTIONS="-x -p /var/run/ntpd.pid -g"/' /etc/sysconfig/ntpd
else
    echo 'OPTIONS="-x -p /var/run/ntpd.pid -g"' >> /etc/sysconfig/ntpd
fi

systemctl restart ntpd.service
systemctl enable ntpd.service
echo -e "\033[1;36mSửa lỗi thành công, dịch vụ ntpd đã được khởi động lại. Vui lòng sử dụng 'ntpq -p' để xác minh, sau đó kiểm tra lại! \033[0m"
echo " "
echo -e "\033[31m------------------------- Sau khi sửa -------------------------\033[0m"
cat /etc/hosts
echo -e "\033[31m------------------------- Sau khi sửa -------------------------\033[0m"

10. Kiểm tra và sửa lỗi cấu hình hệ thống (MOTD)

Tập lệnh kiểm tra xem tệp /etc/motd có chứa các thông báo chào mừng hệ thống theo định dạng quy định hay không. Nếu không, nó sẽ thêm vào.


echo ""
echo "## Kiểm tra cấu hình hệ thống (MOTD) ############################"
if grep -q 'SYSTEM-A:' /etc/motd; then
    echo "Kiểm tra đạt"
else
    echo "Kiểm tra không đạt"
fi

echo -e "\033[1;33mĐường dẫn tệp cấu hình: /etc/motd \033[0m"
echo -e "\033[32m------------------------- Trước khi sửa -------------------------\033[0m"
cat /etc/motd
echo -e "\033[32m------------------------- Trước khi sửa -------------------------\033[0m"
echo " "

if ! grep -q 'SYSTEM-A:' /etc/motd; then
cat << EOF >> /etc/motd
#####################################
#  APPSYSTEM: Tên hệ thống
#   SYSTEM-A: Quản trị viên hệ thống A
#   SYSTEM-B: Quản trị viên hệ thống B
#DESCRIPTION: Mô tả chức năng của máy chủ này
#####################################
EOF
echo -e "\033[1;36mSửa lỗi thành công, vui lòng kiểm tra lại! \033[0m"
fi

echo " "
echo -e "\033[31m------------------------- Sau khi sửa -------------------------\033[0m"
cat /etc/motd
echo -e "\033[31m------------------------- Sau khi sửa -------------------------\033[0m"

11. Kiểm tra và sửa lỗi trạng thái EDR

Kiểm tra xem tiến trình liên quan đến EDR (Endpoint Detection and Response) có đang chạy hay không. Nếu không, nó sẽ cung cấp hướng dẫn cài đặt.


echo ""
echo "## Kiểm tra trạng thái EDR ############################"
if ps aux | grep -q 'edr'; then
    echo "Kiểm tra đạt (EDR đang chạy)"
else
    echo "Kiểm tra không đạt (EDR không chạy)"
    echo -e "\033[1;33mLệnh cài đặt EDR:\033[0m"
    echo -e "\033[1;33mwget --no-check-certificate https://10.15.32.15:4430/download_installer_linux.php -O linux_edr_installer.tar.gz && tar -xzvf linux_edr_installer.tar.gz && ./agent_installer.sh -c\033[0m"
fi

12. Kiểm tra và sửa lỗi trạng thái tường lửa

Kiểm tra xem dịch vụ tường lửa (firewalld) có đang chạy hay không. Phần sửa lỗi yêu cầu can thiệp thủ công tùy thuộc vào các cổng cần mở.


echo ""
echo "## Kiểm tra trạng thái tường lửa ############################"
if systemctl is-active --quiet firewalld; then
    echo "Kiểm tra đạt (Firewall đang chạy)"
else
    echo "Kiểm tra không đạt (Firewall không chạy)"
fi
echo -e "\e[1;31mDựa trên việc mở cổng, vui lòng sửa lỗi thủ công!\e[0m"

13. Kiểm tra và sửa lỗi cấu hình đăng nhập người dùng

Kiểm tra biến môi trường PS1 để đảm bảo cấu hình prompt cho người dùng root và người dùng thường.


echo ""
echo "## Kiểm tra cấu hình đăng nhập người dùng ############################"
if su - root -c 'env | grep PS1' &>/dev/null; then
    echo "Kiểm tra đạt"
else
    echo "Kiểm tra không đạt"
fi

echo -e "\033[1;33mĐường dẫn tệp cấu hình: /etc/profile\033[0m"
if grep -q 'export PS1=' /etc/profile; then
    echo -e "\033[1;31mCấu hình PS1 đã tồn tại, không cần sửa lại!\033[0m"
else
    cat <<EOF >> /etc/profile
user_id=\`id -u\`
if [ "\$user_id" = "0" ]; then
	export PS1='\$LOGNAME@\$(hostname):\$PWD#'
else
	export PS1='\$LOGNAME@\$(hostname):\$PWD\$'
fi
EOF
    source /etc/profile
    echo -e "\033[1;36mSửa lỗi thành công, vui lòng kiểm tra lại! \033[0m"
fi

II. Các chức năng khác

Hợp nhất các kiểm tra và sửa lỗi

Tập lệnh chính cho phép người dùng chọn thực hiện kiểm tra toàn bộ hệ thống bằng lệnh check hoặc sửa lỗi cho một mục cụ thể bằng lệnh repair theo số thứ tự.


#!/bin/sh
# ... (Các định nghĩa hàm kiểm tra và sửa lỗi ở trên) ...

##################
#   Kiểm tra tất cả
##################
function checkBaseLine(){
	echo "--- Bắt đầu kiểm tra an ninh cơ bản ---"
	# Gọi các hàm kiểm tra ở đây
	checkSystemStatus 1 "Thông tin hệ thống"
	checkSshConfig 2 "Cấu hình SSH"
	checkAccountPolicy 3 "Chính sách tài khoản"
	checkPasswordComplexity 4 "Độ phức tạp mật khẩu"
	checkLoginLock 5 "Khóa đăng nhập tài khoản"
	checkRootUid 6 "Quyền root"
	checkSessionTimeout 7 "Thời gian chờ phiên"
	checkHistorySize 8 "Kích thước lịch sử lệnh"
	checkNtpSync 9 "Đồng bộ hóa NTP"
	checkSysConfigSet 10 "Cấu hình hệ thống (MOTD)"
	checkEdrStatus 11 "Trạng thái EDR"
	checkFirewallStatus 12 "Trạng thái tường lửa"
	checkUserLoginConfig 13 "Cấu hình đăng nhập người dùng"
	checkDefaultLockedUsers 14 "Khóa người dùng mặc định"
	echo "--- Kết thúc kiểm tra an ninh cơ bản ---"
}

#############################################
#                 Main
#############################################
if [ "$#" -lt 1 ] || [ "$1" == "-h" ]; then
	echo "Sử dụng: sh $0 [check | repair num]"
	echo "Ví dụ: sh $0 check"
	echo "Ví dụ: sh $0 repair 3"
else
	if [ "$1" == "check" ]; then
		checkBaseLine
	elif [ "$1" == "repair" ]; then
		case $2 in
			1) repairSystemStatus 1 ;;
			2) repairSshConfig 2 ;;
			3) repairAccountPolicy 3 ;;
			4) repairPasswordComplexity 4 ;;
			5) repairLoginLock 5 ;;
			6) repairRootUid 6 ;; # Cần can thiệp thủ công
			7) repairSessionTimeout 7 ;;
			8) repairHistorySize 8 ;;
			9) repairNtpSync 9 ;;
			10) repairSysConfigSet 10 ;;
			11) repairEdr 11 ;; # Cần can thiệp thủ công
			12) repairFirewall 12 ;; # Cần can thiệp thủ công
			13) repairUserLoginConfig 13 ;;
			14) repairDefaultLockedUsers 14 ;;
			all) echo "Chức năng sửa tất cả chưa được hỗ trợ đầy đủ để tránh rủi ro." ;;
			*) echo -e "\e[31mSố mục sửa lỗi không hợp lệ!\e[0m" ;;
		esac
	fi
fi

III. Lưu ý

  • Tập lệnh này được thiết kế cho CentOS 7.x và có thể không tương thích với các phiên bản khác.
  • Luôn sao lưu các tệp cấu hình trước khi chạy tập lệnh sửa lỗi.
  • Một số bước sửa lỗi (như quyền root, tường lửa, EDR) yêu cầu sự can thiệp thủ công hoặc kiến thức chuyên môn.
  • Thực hiện kiểm tra kỹ lưỡng sau khi áp dụng các thay đổi.

Thẻ: CentOS Bash Security hardening ssh

Đăng vào ngày 3 tháng 6 lúc 01:05