امن‌سازی Oracle Linux 9 (بخش دوم): پیکربندی پارتیشن‌ها و گزینه‌های اتصال (Mount Options)

در قسمت قبل

غیرفعال‌سازی ماژول‌های فایل‌سیستم غیرضروری

انجام شد.

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

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

  • 1.1.2.1 Configure /tmp (Separate partition, nodev, nosuid, noexec)
  • 1.1.2.2 Configure /dev/shm (Separate partition, nodev, nosuid, noexec)
  • 1.1.2.3 Configure /home (Separate partition, nodev, nosuid)
  • 1.1.2.4 Configure /var (Separate partition, nodev, nosuid)
  • 1.1.2.5 Configure /var/tmp (Separate partition, nodev, nosuid, noexec)
  • 1.1.2.6 Configure /var/log (Separate partition, nodev, nosuid, noexec)
  • 1.1.2.7 Configure /var/log/audit (Separate partition, nodev, nosuid, noexec)

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

چرا جداسازی پارتیشن‌ها؟

در استانداردهای امنیتی، مسیرهایی که کاربران عادی به آن‌ها دسترسی نوشتن دارند (مانند /tmp و /dev/shm) یا داده‌های متغیر سیستم در آن‌ها قرار دارد (مانند /var و /var/log) باید از پارتیشن ریشه (/) جدا شوند. این کار از پر شدن کل دیسک (Resource Exhaustion) که می‌تواند منجر به از کار افتادن سرویس‌ها شود، جلوگیری می‌کند.

نکته بسیار حیاتی: الزام «جدا بودن پارتیشن‌ها» حتماً باید در زمان نصب سیستم‌عامل (OS Installation) رعایت و پیاده‌سازی شود. جداسازی پارتیشن‌های کلیدی مانند /var پس از نصب لینوکس، فرآیندی پرریسک است که نیازمند بوت سیستم در Rescue Mode و انتقال دستی داده‌ها می‌باشد. اسکریپت‌های این مقاله تنها در صورتی کار می‌کنند که پارتیشن‌ها از پیش جدا شده باشند.

چرا محدودیت‌های Mount Options؟

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

  • nodev (No Devices): جلوگیری از ایجاد و استفاده از فایل‌های Character/Block Device مخرب در این پارتیشن‌ها.
  • nosuid (No SetUID): نادیده گرفتن بیت‌های SUID/SGID. جلوگیری از اجرای فایل‌ها با دسترسی کاربر مالک (پیشگیری از افزایش سطح دسترسی به Root).
  • noexec (No Execution): جلوگیری از اجرای مستقیم اسکریپت‌ها یا باینری‌ها. این گزینه برای جلوگیری از اجرای بدافزارها در پوشه‌های موقت بسیار مفید است.

۲. بررسی سازگاری با پایگاه داده Oracle (آپدیت‌شده)

تداخلات بالقوه و راهکار:

اعمال گزینه noexec روی پارتیشن‌های /tmp و /var/tmp، فرآیند نصب محصولات اوراکل (Database و Grid Infrastructure) و همچنین اعمال پچ‌ها (توسط ابزار OPatch) را مختل می‌کند؛ زیرا اوراکل اسکریپت‌های نصب، فایل‌های کتابخانه‌ای (.so) و باینری‌های موقت خود را در این مسیرها استخراج و اجرا می‌کند.

همچنین همان‌طور که پیش‌تر اشاره شد، اعمال noexec روی /dev/shm باعث قطعی کامل (Crash) دیتابیس و RAC به دلیل مکانیزم مدیریت حافظه (AMM/ASMM) می‌شود که استثنای آن به صورت دائمی در اسکریپت لحاظ شده است.

راهکار اجرایی برای DBAها (عملیات نصب و پچینگ):

در زمان نصب اولیه یا اعمال پچ‌های دوره‌ای (RU/RUR)، مدیر سیستم یا پایگاه داده باید موقتاً محدودیت اجرا را بردارد و پس از اتمام کار، مجدداً سرور را به حالت امن بازگرداند:

 

# Before Oracle Installation/Patching:
mount -o remount,exec /tmp
mount -o remount,exec /var/tmp

# After completion:
mount -o remount,noexec /tmp
mount -o remount,noexec /var/tmp

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

این اسکریپت وضعیت جدا بودن پارتیشن‌ها و اعمال Mount Options امنیتی را بررسی می‌کند:

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

modules/audit_02_Configure_Mount_Options.sh

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

Bash for Oracle DBAs

 

#!/bin/bash
# Script: audit_cis_1_1_2.sh
# Purpose: Audit Filesystem Partitions and Mount Options (CIS 1.1.2 - 1.1.8)

FAIL_COUNT=0

echo -e "\n=========================================================================="
echo -e "[+] AUDIT: CIS 1.1.2 to 1.1.8 - Partitions & Mount Options"
echo -e "--------------------------------------------------------------------------"
echo -e "CIS Requirement : Separate partitions for /tmp, /dev/shm, /home, /var,"
echo -e "                  /var/tmp, /var/log, /var/log/audit."
echo -e "                  Mount options: nodev, nosuid, noexec (where applicable)."
echo -e "Oracle Context  : CRITICAL EXCEPTION! /dev/shm MUST NOT have 'noexec'."
echo -e "                  Oracle DB/RAC requires execution rights on /dev/shm."
echo -e "                  /tmp also might need exec during Oracle installation,"
echo -e "                  but can be noexec post-install. Assuming post-install."
echo -e "==========================================================================\n"

# Format: "Partition:Required_Options"
declare -A PART_REQS=(
    ["/tmp"]="nodev,nosuid,noexec"
    ["/dev/shm"]="nodev,nosuid"  # EXCEPTION: noexec is omitted for Oracle
    ["/home"]="nodev,nosuid"
    ["/var"]="nodev,nosuid"
    ["/var/tmp"]="nodev,nosuid,noexec"
    ["/var/log"]="nodev,nosuid,noexec"
    ["/var/log/audit"]="nodev,nosuid,noexec"
)

for part in "${!PART_REQS[@]}"; do
    req_opts="${PART_REQS[$part]}"
    MOUNT_INFO=$(findmnt -n -o OPTIONS "$part" 2>/dev/null)

    if [ -z "$MOUNT_INFO" ]; then
        echo -e "  [FAIL] $part is NOT a separate partition!"
        FAIL_COUNT=$((FAIL_COUNT + 1))
    else
        # Check each required option
        IFS=',' read -ra OPTS <<< "$req_opts"
        MISSING_OPTS=""
        for opt in "${OPTS[@]}"; do
            if ! echo "$MOUNT_INFO" | grep -qw "$opt"; then
                MISSING_OPTS="$MISSING_OPTS $opt"
            fi
        done

        if [ -n "$MISSING_OPTS" ]; then
            echo -e "  [FAIL] $part exists but missing options:$MISSING_OPTS (Current: $MOUNT_INFO)"
            FAIL_COUNT=$((FAIL_COUNT + 1))
        else
            echo -e "  [PASS] $part exists with secure options ($req_opts)"
        fi
    fi
done

echo -e "--------------------------------------------------------------------------"
if [ "$FAIL_COUNT" -eq 0 ]; then
    echo -e "[+] AUDIT RESULT: PASSED (All partitions and mount options are secure.)\n"
    exit 0
else
    echo -e "[-] AUDIT RESULT: FAILED ($FAIL_COUNT issue(s) detected.)\n"
    exit 1
fi

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

این اسکریپت، گزینه‌های امنیتی را به /etc/fstab اضافه کرده و برای /tmp از پیکربندی systemd در Oracle Linux 9 استفاده می‌کند. (فرض بر این است که پارتیشن‌ها قبلاً ساخته شده‌اند).

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

modules/remediate_02_Configure_Mount_Options.sh

#!/bin/bash
# Script: remediate_cis_1_1_2.sh
# Purpose: Apply Secure Mount Options (CIS 1.1.2 - 1.1.8)

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

echo -e "\n[+] Applying Remediation for Partitions & Mount Options..."
echo -e "[!] Note: Skipping 'noexec' on /dev/shm for Oracle compatibility.\n"

# 3. Function to update /etc/fstab safely
update_fstab() {
    local mount_point=$1
    local options=$2

    if grep -q "^[^#].*[[:space:]]${mount_point}[[:space:]]" /etc/fstab; then
        for opt in $(echo "$options" | tr ',' ' '); do
            sed -i "/^[[:space:]]*[^#].*[[:space:]]${mount_point//\//\\/}[[:space:]]/ s/\([ \t]*[^\t ]*[ \t]*[^\t ]*[ \t]*[^\t ]*[ \t]*\)\([^ \t]*\)/\1\2,$opt/" /etc/fstab
        done
        sed -i "/^[[:space:]]*[^#].*[[:space:]]${mount_point//\//\\/}[[:space:]]/ s/,\{2,\}/,/g" /etc/fstab
        sed -i "/^[[:space:]]*[^#].*[[:space:]]${mount_point//\//\\/}[[:space:]]/ s/,[ \t]/ /g" /etc/fstab
        mount -o remount "$mount_point" 2>/dev/null
        echo "  [+] Updated options for $mount_point"
    else
        echo "  [-] WARNING: $mount_point is not in /etc/fstab (requires architectural change)."
    fi
}

# 1. Configure /tmp (Check fstab first, fallback to systemd)
echo "  [*] Configuring /tmp..."
if grep -q "^[^#].*[[:space:]]/tmp[[:space:]]" /etc/fstab; then
    update_fstab "/tmp" "nodev,nosuid,noexec"
else
    echo "      Using systemd (tmpfs) for /tmp..."
    cp /usr/lib/systemd/system/tmp.mount /etc/systemd/system/ 2>/dev/null
    sed -i 's/^Options=.*/Options=mode=1777,strictatime,noexec,nodev,nosuid/' /etc/systemd/system/tmp.mount
    systemctl daemon-reload
    systemctl enable tmp.mount --now
    mount -o remount /tmp 2>/dev/null
fi

# 2. Fix /dev/shm (Add to fstab explicitly for Oracle)
echo "  [*] Configuring /dev/shm explicitly for Oracle..."
if ! grep -q "^tmpfs[[:space:]]*/dev/shm" /etc/fstab; then
    echo "tmpfs   /dev/shm    tmpfs   defaults,nodev,nosuid,seclabel   0 0" >> /etc/fstab
else
    sed -i -E 's|^(tmpfs[[:space:]]+/dev/shm[[:space:]]+tmpfs[[:space:]]+)([^[:space:]]+)|\1defaults,nodev,nosuid,seclabel|' /etc/fstab
fi
mount -o remount /dev/shm 2>/dev/null


# Update other partitions
update_fstab "/home" "nodev,nosuid"
update_fstab "/var" "nodev,nosuid"
update_fstab "/var/tmp" "nodev,nosuid,noexec"
update_fstab "/var/log" "nodev,nosuid,noexec"
update_fstab "/var/log/audit" "nodev,nosuid,noexec"

echo -e "\n[+] Mount options hardening completed."

 

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

امن‌سازی مدیریت بسته‌ها و مخازن محلی

می رویم.