امن‌سازی Oracle Linux 9 (بخش پنجم): امن‌سازی پیکربندی Bootloader (GRUB2)

در قسمت قبل:

پیکربندی و امن‌سازی SELinux

انجام شد.

۱. الزامات CIS Benchmark (بخش ۱.۴)

این مقاله به پوشش و پیاده‌سازی بندهای زیر از استاندارد CIS در خصوص امن‌سازی فرآیند بوت می‌پردازد:

  • 1.4.1 Ensure bootloader password is set (Automated)
  • 1.4.2 Ensure access to bootloader config is configured (Automated)

 

۲. مفهوم و دلیل (Concept & Rationale)

در سیستم‌عامل لینوکس، Bootloader (که در Oracle Linux 9 نسخه GRUB2 است) وظیفه بارگذاری کرنل را بر عهده دارد.

  • جلوگیری از تغییر پارامترهای کرنل: اگر روی GRUB رمز عبور تنظیم نشده باشد، هر شخصی (یا مهاجمی) که به کنسول فیزیکی یا مجازی (VNC/Console در مجازی‌سازها) دسترسی داشته باشد، می‌تواند در منوی بوت با فشردن کلید e پارامترهای کرنل را دستکاری کند. این کار به مهاجم اجازه می‌دهد تا SELinux را غیرفعال کند، سیستم را در حالت Single-user (یا با init=/bin/bash) بالا بیاورد و بدون نیاز به رمز عبور قبلی، پسورد root را تغییر داده و دسترسی کامل به سیستم پیدا کند.
  • محرمانگی پیکربندی: از آنجا که رمز عبور تنظیم شده به صورت هش‌شده (Hashed) در فایل‌های تنظیمات نگهداری می‌شود، دسترسی به خواندن این فایل‌ها باید کاملاً محدود شود. تنظیم صحیح سطح دسترسی (Permissions) تضمین می‌کند که کاربران عادی نتوانند هش را خوانده و برای حملات شکستن رمز عبور (Brute-force/Dictionary) به سیستم‌های خارج از شبکه منتقل کنند.

 

۳. بررسی سازگاری با پایگاه داده Oracle (RAC & Grid)

بدون تداخل:

تنظیم رمز عبور روی Bootloader هیچ‌گونه تداخلی با راه‌اندازی، Reboot شدن‌های خودکار، و کارکرد دیتابیس اوراکل یا سرویس‌های Oracle Clusterware (Grid Infrastructure) ندارد.

فرآیند بوت و راه‌اندازی سیستم‌عامل به‌صورت خودکار طی می‌شود و رمز عبور GRUB تنها در صورتی درخواست می‌شود که کاربری بخواهد تنظیمات خط بوت را به صورت دستی (Interactive) ویرایش کند. لذا هیچ تأثیر منفی بر در دسترس بودن (High Availability) سرویس‌های اوراکل نخواهد داشت.

 


۴. نحوه بررسی وضعیت فعلی (Audit Script)

این اسکریپت وضعیت تنظیم شدن رمز عبور و همچنین امن بودن مجوز فایل‌های پیکربندی GRUB2 را بررسی می‌کند:

لینک این اسکریپت در github:

modules/audit_05_Secure_Bootloader_GRUB2.sh

در صورتی که با bash script  آشنا نیستید، می توانید به آموزشی که برای دیتابیس ادمین ها در سایت گذاشته ام مراجعه کنید.

Bash for Oracle DBAs

#!/bin/bash
# Script: audit_cis_1_4.sh
# Purpose: Audit Bootloader Configuration (CIS 1.4)

echo "=========================================================================="
echo " CIS Requirement: 1.4 Secure Bootloader Configuration"
echo " - Ensure bootloader password is set."
echo " - Ensure bootloader config file permissions are secure."
echo " Oracle Context: Setting a GRUB password prevents unauthorized access to"
echo " single-user mode. It does NOT impact Oracle DB/RAC/Grid operations as"
echo " they run post-boot and do not interact with the bootloader."
echo "=========================================================================="

FAIL_COUNT=0

echo -e "\n[*] 1. Checking GRUB password configuration..."
if [ -s /boot/grub2/user.cfg ] && grep -q "^GRUB2_PASSWORD=" /boot/grub2/user.cfg; then
    echo -e "  \e[32m[PASS]\e[0m GRUB password is set in /boot/grub2/user.cfg."
else
    echo -e "  \e[31m[FAIL]\e[0m GRUB password is NOT configured (/boot/grub2/user.cfg missing or empty)."
    FAIL_COUNT=$((FAIL_COUNT + 1))
fi

echo -e "\n[*] 2. Checking permissions of GRUB config files..."
for file in /boot/grub2/grub.cfg /boot/grub2/user.cfg; do
    if [ -e "$file" ]; then
        PERM=$(stat -c "%a %U %G" "$file")
        if [[ "$PERM" == "400 root root" || "$PERM" == "600 root root" ]]; then
            echo -e "  \e[32m[PASS]\e[0m $file permissions are secure ($PERM)."
        else
            echo -e "  \e[31m[FAIL]\e[0m $file has insecure permissions ($PERM). Expected 400 or 600 root root."
            FAIL_COUNT=$((FAIL_COUNT + 1))
        fi
    else
        # Only fail if it's grub.cfg, since missing user.cfg is already caught in step 1
        if [ "$file" == "/boot/grub2/grub.cfg" ]; then
            echo -e "  \e[31m[FAIL]\e[0m $file does not exist."
            FAIL_COUNT=$((FAIL_COUNT + 1))
        fi
    fi
done

if [ "$FAIL_COUNT" -eq 0 ]; then
    echo -e "\n\e[32m[+] AUDIT RESULT: PASS\e[0m"
else
    echo -e "\n\e[31m[-] AUDIT RESULT: FAIL ($FAIL_COUNT issues found)\e[0m"
fi

(نکته: در نسخه‌های قدیمی‌تر Oracle Linux و محیط‌های UEFI، مسیر فایل‌ها متفاوت بود، اما در Oracle Linux 9 فایل اصلی در همان مسیر استاندارد /boot/grub2/ قرار دارد.)


۵. نحوه اعمال تنظیمات (Remediation Bash Script)

این اسکریپت با استفاده از ابزار استاندارد سیستم‌عامل، یک رمز عبور پیش‌فرض ایجاد کرده و سپس سطح دسترسی‌ها را محدود می‌کند.

لینک این اسکریپت در github:

modules/remediate_05_Secure_Bootloader_GRUB2.sh

#!/bin/bash
# Script: remediate_cis_1_4.sh
# Purpose: Secure Bootloader Configuration (CIS 1.4)

if [ "$EUID" -ne 0 ]; then echo "Please run as root"; exit 1; fi

echo -e "\n[+] Applying Remediation for Bootloader (CIS 1.4)..."

# 1. Set GRUB Password (CIS 1.4.1)
echo "[*] Configuring GRUB2 password..."
if [ ! -s /boot/grub2/user.cfg ]; then
    echo "  [!] Please enter a strong password for the GRUB bootloader:"
    # Calling it directly allows interactive hidden input without stty errors
    grub2-setpassword
    
    if [ $? -eq 0 ]; then
        echo "  [+] GRUB password set successfully."
    else
        echo "  [-] Failed to set GRUB password."
    fi
else
    echo "  [-] GRUB password is already configured. Skipping to prevent overwrite."
fi

# 2. Set strict permissions (CIS 1.4.2)
echo -e "\n[*] Restricting permissions on GRUB configuration files..."

if [ -f /boot/grub2/grub.cfg ]; then
    chown root:root /boot/grub2/grub.cfg
    chmod 0400 /boot/grub2/grub.cfg
    echo "  [+] Secured /boot/grub2/grub.cfg (set to 400 root root)"
fi

if [ -f /boot/grub2/user.cfg ]; then
    chown root:root /boot/grub2/user.cfg
    chmod 0400 /boot/grub2/user.cfg
    echo "  [+] Secured /boot/grub2/user.cfg (set to 400 root root)"
fi

echo -e "\n[+] Bootloader secured successfully."

در قسمت بعد به سراغ

امن‌سازی پردازش‌ها (Process Hardening) و مدیریت Core Dump

می رویم