در این مجموعه تلاش کردهام فرآیند امنسازی Oracle Linux 9.7 بر اساس استانداردهای CIS Benchmark را بهصورت عملی و قابل استفاده برای مدیران پایگاهداده اوراکل ارائه کنم. این مجموعه شامل ۲۹ مقاله است که در هر کدام یک کنترل امنیتی بررسی شده و برای آن دو بخش اصلی ارائه شده است:
- یک اسکریپت Audit با Bash برای بررسی وضعیت سیستم
- یک Remediation برای اعمال اصلاح در صورت نیاز
برای اینکه استفاده از این اسکریپتها سادهتر باشد، در GitHub یک ماژول مرکزی قرار دادهام که میتواند تمام اسکریپتها را فراخوانی کند. با استفاده از آن میتوانید:
- هر اسکریپت را بهصورت جداگانه اجرا کنید
- یا همه کنترلها را بهصورت یکجا اجرا کنید
از آنجا که ممکن است بعضی از مدیران پایگاهداده با Bash آشنایی نداشته باشند، یک آموزش مقدماتی Bash ویژه Oracle DBAها نیز در این مجموعه قرار داده شده تا درک و استفاده از اسکریپتها سادهتر باشد.
تمام این اسکریپتها در یک محیط Oracle Linux 9.7 خام آزمایش شدهاند. در این محیط ابتدا Oracle ASM نصب شده و سپس Oracle Database روی سیستم پیادهسازی شده است تا رفتار اسکریپتها در شرایط نزدیک به یک محیط واقعی دیتابیس بررسی شود.
با توجه به اینکه این پروژه بهصورت متنباز (Open Source) منتشر شده است، توصیه میشود قبل از استفاده، محتوای هر بخش و اسکریپتها را بهدقت مطالعه کنید و پس از اطمینان از سازگاری با محیط خود، آنها را اجرا کنید. مسئولیت استفاده از این اسکریپتها بر عهده کاربر است و بهتر است ابتدا در محیطهای آزمایشی مورد بررسی قرار گیرند.
الزامات CIS Benchmark (بخش ۱.۱.۱)
این مقاله به پوشش و پیادهسازی بندهای زیر از استاندارد CIS (نسخه Oracle Linux 9) میپردازد:
- 1.1.1 Configure Filesystem Kernel Modules
- 1.1.1.1 Ensure cramfs kernel module is not available (Automated)
- 1.1.1.2 Ensure freevxfs kernel module is not available (Automated)
- 1.1.1.3 Ensure hfs kernel module is not available (Automated)
- 1.1.1.4 Ensure hfsplus kernel module is not available (Automated)
- 1.1.1.5 Ensure jffs2 kernel module is not available (Automated)
- 1.1.1.6 Ensure squashfs kernel module is not available (Automated)
- 1.1.1.7 Ensure udf kernel module is not available (Automated)
- 1.1.1.8 Ensure usb-storage kernel module is not available (Automated)
- 1.1.1.9 Ensure unused filesystems kernel modules are not available (Manual)
۱. مفهوم و دلیل (Concept & Rationale)
استاندارد CIS از ما چه میخواهد؟
سیستمعامل لینوکس به صورت پیشفرض شامل درایورها (ماژولهای کرنل) برای پشتیبانی از دهها نوع فایلسیستم مختلف است. CIS الزام میکند که ماژولهای مربوط به فایلسیستمهای قدیمی، غیرکاربردی در سرورها، و رسانههای ذخیرهسازی قابل حمل (مانند USB و DVD) به طور کامل غیرفعال (Blacklist) شوند.
خطرات عدم انجام (Risk of Ignoring):
ماژولهای فایلسیستمهای کمتر استفاده شده (مثل cramfs یا hfsplus) معمولاً به اندازه فایلسیستمهای اصلی (مثل ext4 یا xfs) تست و بررسی امنیتی نمیشوند. در نتیجه، تاریخچه نشان داده است که این ماژولها دارای آسیبپذیریهای متعددی در سطح کرنل هستند.
یک مهاجم میتواند با متصل کردن یک USB مخرب به سرور فیزیکی، یا از راه دور با آپلود و Mount کردن یک فایل Image دستکاریشده (Crafted Image File)، باعث Buffer Overflow یا اجرای کد مخرب در سطح دسترسی Kernel (Privilege Escalation) شود.
چگونه سیستم امنتر میشود؟
با غیرفعال کردن این ماژولها، ما اصلِ کاهش سطح حمله (Attack Surface Reduction) را پیادهسازی میکنیم. حتی اگر کاربر یا برنامهای سعی کند این فایلسیستمها را فراخوانی کند، سیستمعامل به جای بارگذاری ماژول آسیبپذیر، دستور /bin/true (عملیات پوچ و موفق) را اجرا کرده و مسیر نفوذ را مسدود میکند.
۲. بررسی سازگاری با پایگاه داده Oracle و Oracle RAC
در محیطهای Enterprise، تغییرات سطح کرنل باید با حساسیت بالایی انجام شود.
- دیتابیس تک نود (Single Instance): دیتابیس اوراکل برای ذخیرهسازی فایلهای خود تنها به فایلسیستمهای استاندارد لینوکس (XFS یا ext4) و یا Oracle ASM (Automatic Storage Management) نیاز دارد. هیچ نیازی به فایلسیستمهای مک (hfs)، دیویدی (udf) یا فلشها (usb-storage و jffs2) وجود ندارد.
- کلاستر اوراکل (Oracle RAC & Grid Infrastructure): در پیچیدهترین سناریو یعنی Oracle RAC، ارتباطات نودها و فضای ذخیرهسازی اشتراکی از طریق شبکه (Private Interconnect) و دیسکهای RAW یا ASM تامین میشود. همچنین در صورت استفاده از فایلسیستم کلاستر اوراکل (ACFS)، ماژولهای اختصاصی خود اوراکل بارگذاری میشوند. غیرفعال کردن فایلسیستمهای فشرده (squashfs, cramfs) هیچگونه خللی در مکانیزمهای Clusterware، Voting Diskها یا OCR ایجاد نمیکند.
نتیجهگیری سازگاری:
کاملاً ایمن و بدون تداخل. پیادهسازی این بخش روی سرورهای دیتابیس اوراکل (حتی در محیط RAC) صد در صد امن بوده و هیچ مشکلی در عملکرد زیرساخت ایجاد نمیکند.
۳. نحوه بررسی وضعیت فعلی (Audit Script)
این اسکریپت ماژولار طراحی شده تا به عنوان بخشی از یک سیستم مانیتورینگ بزرگتر نیز قابل استفاده باشد. اسکریپت بررسی میکند که آیا ماژول در فایلهای پیکربندی مسدود شده است و آیا در کرنل در حال اجراست یا خیر.
لینک این اسکریپت در github:
modules/audit_01_Disable_Unused_Filesystems.sh
در صورتی که با bash script آشنا نیستید، می توانید به آموزشی که برای دیتابیس ادمین ها در سایت گذاشته ام مراجعه کنید.
Bash for Oracle DBAs
#!/bin/bash
# Script: audit_cis_1_1_1.sh
# Purpose: Audit Filesystem Kernel Modules (CIS 1.1.1)
MODULES=("cramfs" "freevxfs" "hfs" "hfsplus" "jffs2" "squashfs" "udf" "usb-storage")
FAIL_COUNT=0
# --- Audit Description Header ---
echo -e "\n=========================================================================="
echo -e "[+] AUDIT: CIS 1.1.1 - Filesystem Kernel Modules"
echo -e "--------------------------------------------------------------------------"
echo -e "CIS Requirement : Disable loading of unnecessary filesystem kernel modules"
echo -e " (cramfs, freevxfs, hfs, hfsplus, jffs2, squashfs, udf)"
echo -e " to reduce the attack surface."
echo -e "Oracle Context : Fully compatible. No exceptions required for Oracle DB/RAC."
echo -e "==========================================================================\n"
for mod in "${MODULES[@]}"; do
# Check if module loading is disabled
LOAD_CHECK=$(modprobe -n -v "$mod" 2>/dev/null | grep -E "(install /bin/true|install /bin/false)")
# Check if module is currently loaded in memory
MEM_CHECK=$(lsmod | grep "^$mod ")
if [[ -n "$LOAD_CHECK" ]] && [[ -z "$MEM_CHECK" ]]; then
echo -e " [PASS] Module '$mod' is securely disabled and not loaded."
else
echo -e " [FAIL] Module '$mod' is NOT properly disabled or is currently loaded."
FAIL_COUNT=$((FAIL_COUNT + 1))
fi
done
echo -e "--------------------------------------------------------------------------"
if [ "$FAIL_COUNT" -eq 0 ]; then
echo -e "[+] AUDIT RESULT: PASSED (All unnecessary filesystem modules are disabled.)\n"
exit 0
else
echo -e "[-] AUDIT RESULT: FAILED ($FAIL_COUNT module(s) require remediation.)\n"
exit 1
fi
۴. نحوه اعمال تنظیمات (Remediation Bash Script)
این اسکریپت به گونهای نوشته شده است که هم به صورت تکی قابل اجرا باشد و هم بتوانید آن را در فایل main.sh خود (برای اعمال کلی تنظیمات CIS) فراخوانی (Source) کنید.
لینک این اسکریپت در github:
modules/remediate_01_Disable_Unused_Filesystems.sh
#!/bin/bash
# Script: remediate_cis_1_1_1.sh
# Purpose: Remediate Filesystem Kernel Modules (CIS 1.1.1)
# Ensure script is run as root
if [ "$EUID" -ne 0 ]; then
echo "Please run as root"
exit 1
fi
MODULES=("cramfs" "freevxfs" "hfs" "hfsplus" "jffs2" "squashfs" "udf" "usb-storage")
CONF_DIR="/etc/modprobe.d"
echo -e "\n[+] Applying Remediation for CIS 1.1.1: Filesystem Kernel Modules..."
for mod in "${MODULES[@]}"; do
CONF_FILE="$CONF_DIR/cis_1_1_1_${mod}.conf"
# Create configuration file to disable module
echo "install $mod /bin/true" > "$CONF_FILE"
echo "blacklist $mod" >> "$CONF_FILE"
chmod 644 "$CONF_FILE"
# Unload the module if it is currently loaded in the kernel
if lsmod | grep -q "^$mod "; then
rmmod "$mod" 2>/dev/null || modprobe -r "$mod" 2>/dev/null
echo " [*] Unloaded active module: $mod"
fi
echo " [+] Disabled and blacklisted: $mod"
done
echo -e "[+] Remediation applied successfully. (Run audit script to verify)\n"
در قسمت بعد به سراغ
پیکربندی پارتیشنها و گزینههای اتصال (Mount Options)
می رویم.