امن‌سازی Oracle Linux 9 (مقاله پانزدهم): پیکربندی و امن‌سازی فایروال (Host Based Firewall)

در قسمت قبل 

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

انجام شد.

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

  • 4.1 Configure a firewall utility
    • 4.1.1 Ensure nftables is installed (Automated)
    • 4.1.2 Ensure a single firewall configuration utility is in use (Automated)
  • 4.2 Configure FirewallD
    • 4.2.1 Ensure firewalld drops unnecessary services and ports (Manual)
    • 4.2.2 Ensure firewalld loopback traffic is configured (Automated)

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

  • مفهوم: استاندارد CIS تأکید دارد که سیستم باید دارای یک فایروال مبتنی بر میزبان (Host-Based Firewall) باشد و برای جلوگیری از تداخل قوانین، فقط یک ابزار مدیریت فایروال باید فعال باشد. در Oracle Linux 9، سرویس firewalld ابزار پیش‌فرض است که از nftables به عنوان موتور پردازش (Backend) استفاده می‌کند.
  • دلیل امنیتی: بستن پورت‌های غیرضروری و تنظیم ترافیک Loopback (مسدودسازی درخواست‌های جعلی 127.0.0.0/8 از بیرون) سیستم را در برابر حملات جعل آدرس (Spoofing) و دسترسی‌های غیرمجاز شبکه‌ای محافظت می‌کند.

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

وضعیت تداخل: ندارد (مشروط بر پیکربندی دقیق پورت‌های شبکه‌ی Public و Trust کردنِ شبکه‌ی Private).

توضیحات و الزامات اوراکل:

سرویس فایروال (firewalld) به‌طور پیش‌فرض تمامی ارتباطات ورودی را مسدود می‌کند. برای کارکرد پایدار دیتابیس، زیرساخت Grid، ارتباط کلاینت‌ها و ابزارهای مانیتورینگ، رعایت الزامات زیر در تنظیمات فایروال کاملاً حیاتی است:

۱. شبکه‌ی عمومی (Public Network): پورت‌های زیر باید در فایروال باز (Allow) شوند:

  • پورت‌های SSH: پورت استاندارد 22 و پورت‌های سفارشی (مانند 22022)
  • پورت‌های Listener: مربوط به Local Listener و SCAN Listener (پورت‌های پیش‌فرض 1521 و 1522، یا پورت‌های سفارشی نظیر 7654)
  • پورت سرویس ONS: مربوط به Oracle Notification Service (معمولاً پورت 6200)
  • پورت OEM Agent: مربوط به Oracle Enterprise Manager (معمولاً پورت 3872)

۲. شبکه‌ی خصوصی کلاستر (RAC Private Interconnect):

اوراکل برای ارتباطات داخلی بین نودهای کلاستر (Interconnect) از محدوده‌ی وسیع و داینامیکی از پورت‌های TCP و UDP استفاده می‌کند. در محیط‌های RAC، الزامی است که اینترفیس شبکه‌ی خصوصی (مانند eth1 یا ens192) در زون trusted فایروال قرار گیرد. این کار باعث می‌شود ترافیک کلاستر بدون محدودیت بین نودها رد و بدل شود؛ در غیر این صورت، نودها دچار قطعی ارتباط شده (Node Eviction) و کلاستر از کار خواهد افتاد.

۳. نحوه بررسی (Audit Script)

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

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

modules/audit_15_Host_Based_Firewall.sh

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

Bash for Oracle DBAs

#!/bin/bash
# Script: audit15.sh
# Purpose: Audit Script for Firewall (CIS 4)

echo "=========================================================================="
echo " CIS Requirement: 4 Firewall Configuration"
echo " - Ensure firewalld is active and using nftables backend."
echo " Oracle Context:"
echo " - CRITICAL: Oracle RAC requires specific public ports (1521, 1522, 6200)."
echo " - CRITICAL: RAC Private Interconnect interface MUST be trusted."
echo "=========================================================================="

FAIL_COUNT=0

echo -e "\n[*] Checking firewalld service status..."
if systemctl is-active firewalld.service &>/dev/null; then
    echo -e "  \e[32m[PASS]\e[0m firewalld is active and running."
else
    echo -e "  \e[31m[FAIL]\e[0m firewalld is not active."
    FAIL_COUNT=$((FAIL_COUNT + 1))
fi

echo -e "\n[*] Checking FirewallBackend in firewalld.conf..."
BACKEND=$(grep -i '^FirewallBackend' /etc/firewalld/firewalld.conf | cut -d= -f2)
if [ "$BACKEND" == "nftables" ]; then
    echo -e "  \e[32m[PASS]\e[0m FirewallBackend is set to nftables."
else
    echo -e "  \e[31m[FAIL]\e[0m FirewallBackend is set to $BACKEND (Expected: nftables)."
    FAIL_COUNT=$((FAIL_COUNT + 1))
fi

echo -e "\n[*] Checking currently open ports (Public Zone)..."
PORTS=$(firewall-cmd --list-ports 2>/dev/null)
if [ -n "$PORTS" ]; then
    echo -e "  \e[34m[INFO]\e[0m Open ports: $PORTS"
else
    echo -e "  \e[34m[INFO]\e[0m No ports explicitly opened in default zone."
fi

echo -e "\n[*] Checking Trusted Interfaces (For RAC Private Interconnect)..."
TRUSTED_IFACES=$(firewall-cmd --zone=trusted --list-interfaces 2>/dev/null)
if [ -n "$TRUSTED_IFACES" ]; then
    echo -e "  \e[32m[PASS]\e[0m Trusted interfaces found: $TRUSTED_IFACES"
else
    echo -e "  \e[33m[WARN]\e[0m No interfaces in 'trusted' zone. (Ensure RAC interconnect is trusted!)"
fi

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

۴. نحوه اعمال با Bash (Remediation Script)

اسکریپت زیر سرویس firewalld را تنظیم کرده، Backend آن را تثبیت می‌کند و پورت‌های مورد نیاز اوراکل و مدیریت سیستم را باز می‌کند.

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

modules/remediate_15_Host_Based_Firewall.sh

#!/bin/bash
# Script: remediation15.sh
# Purpose: Configure firewalld with nftables and Oracle RAC Rules (CIS 4)

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

echo "=========================================================================="
echo " Applying Remediation for CIS 4 (Firewall)"
echo " Oracle Context: Setting nftables, opening RAC Public ports,"
echo " and prompting for RAC Private Interconnect setup."
echo "=========================================================================="

echo -e "\n[*] Configuring firewalld..."

# 1. Ensure firewalld is running
systemctl unmask firewalld >/dev/null 2>&1
systemctl enable --now firewalld >/dev/null 2>&1
echo -e "  \e[32m[OK]\e[0m Enabled and started firewalld."

# 2. Enforce FirewallBackend=nftables
sed -i 's/^FirewallBackend=.*/FirewallBackend=nftables/' /etc/firewalld/firewalld.conf
systemctl restart firewalld
echo -e "  \e[32m[OK]\e[0m FirewallBackend set to nftables."

# 3. Add Required Oracle RAC/Grid and SSH ports
# 1521 (Listener), 1522 (SCAN), 6200 (ONS), 3872 (OEM), 7654 (Custom), 22/22022 (SSH)
PORTS=("22/tcp" "22022/tcp" "1521/tcp" "1522/tcp" "6200/tcp" "7654/tcp" "3872/tcp")

for PORT in "${PORTS[@]}"; do
    firewall-cmd --permanent --add-port="$PORT" >/dev/null 2>&1
done
echo -e "  \e[32m[OK]\e[0m Added standard Oracle RAC and admin ports."

# 4. RAC Private Interconnect Handling
echo -e "\n\e[33m[?] Do you want to add a Private Interface (Interconnect) to the 'trusted' zone for RAC? (y/n)\e[0m"
read -r add_trusted
if [[ "$add_trusted" =~ ^[Yy]$ ]]; then
    echo -e "Enter the private interface name (e.g., eth1, ens192):"
    read -r priv_iface
    if [ -n "$priv_iface" ]; then
        firewall-cmd --permanent --zone=trusted --add-interface="$priv_iface" >/dev/null 2>&1
        echo -e "  \e[32m[OK]\e[0m Added $priv_iface to trusted zone."
    fi
fi

# 5. Reload and Show
firewall-cmd --reload >/dev/null 2>&1
echo -e "\n\e[32m[+] REMEDIATION APPLIED SUCCESSFULLY\e[0m"

echo -e "\nActive Ports in default zone:"
firewall-cmd --list-ports
echo "Trusted Interfaces:"
firewall-cmd --zone=trusted --list-interfaces

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

پیکربندی و امن‌سازی سرویس SSH (CIS 5.1)

می رویم.