امن‌سازی Oracle Linux 9 (بخش چهارم): پیکربندی و امن‌سازی SELinux

در قسمت قبل

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

انجام شد.

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

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

  • 1.3.1.1 Ensure SELinux is installed (Automated)
  • 1.3.1.2 Ensure SELinux is not disabled in bootloader configuration (Automated)
  • 1.3.1.3 Ensure SELinux policy is configured (Automated)
  • 1.3.1.4 Ensure the SELinux mode is not disabled (Automated)
  • 1.3.1.5 Ensure the SELinux mode is enforcing (Automated)
  • 1.3.1.6 Ensure no unconfined services exist (Manual)
  • 1.3.1.7 Ensure the MCS Translation Service (mcstrans) is not installed (Automated)
  • 1.3.1.8 Ensure SETroubleshoot is not installed (Automated)

 

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

سیستم SELinux (Security-Enhanced Linux) یک لایه کنترل دسترسی اجباری (MAC) در کرنل لینوکس است. برخلاف مدل سنتی DAC (Discretionary Access Control) که در آن کاربر root دسترسی نامحدود دارد، SELinux بر اساس سیاست‌ها (Policies) تعیین می‌کند که هر پردازش (Process) دقیقاً به چه فایل‌ها و پورت‌هایی می‌تواند دسترسی داشته باشد.

  • کاهش سطح حمله (Attack Surface): فعال بودن SELinux تضمین می‌کند که حتی در صورت نفوذ مهاجم به یک سرویس (مانند وب‌سرور یا دیتابیس) و اجرای کد مخرب، مهاجم نتواند از محدوده آن سرویس خارج شده و کل سیستم را در دست بگیرد (جلوگیری از Privilege Escalation).
  • حذف پکیج‌های ناامن: بسته‌های mcstrans (سیستم ترجمه لیبل‌ها) و setroubleshoot (نمایش هشدارهای امنیتی به صورت کاربرپسند) دارای سوابق آسیب‌پذیری هستند و اطلاعات حساسی از سیستم را افشا می‌کنند، لذا وجود آن‌ها در سرورهای Production ممنوع است.

 

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

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

  • پشتیبانی رسمی: برخلاف باورهای قدیمی، نسخه‌های جدید Oracle Database (مانند 19c و 23ai) روی Oracle Linux به طور کامل از SELinux در حالت Enforcing و با سیاست targeted پشتیبانی می‌کنند.
  • Oracle Grid Infrastructure و ASM: در محیط‌های کلاستر (Oracle RAC)، گاهی اوقات اسکریپت‌های مدیریت Clusterware ممکن است به دلیل نبود Labelهای مناسب در فایل‌های موقت، توسط SELinux مسدود (Block) شوند.
  • توصیه عملیاتی: در صورت نصب اوراکل، ابتدا سیستم را در حالت Permissive قرار دهید، نصب را کامل کنید، لاگ‌های /var/log/audit/audit.log را بررسی کرده و در صورت نیاز با استفاده از ابزار audit2allow ماژول‌های اختصاصی بسازید. پس از اطمینان از عملکرد صحیح کلاستر، حالت را به Enforcing تغییر دهید.

 

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

این اسکریپت وضعیت نصب، تنظیمات Bootloader، و سرویس‌های بدون محدودیت را به صورت خودکار بررسی می‌کند:

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

modules/audit_04_Configure_SELinux.sh

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

Bash for Oracle DBAs

 

#!/bin/bash
# Script: audit_cis_1_3_1.sh
# Purpose: Audit SELinux Configurations (CIS 1.3.1)

echo "=========================================================================="
echo " CIS Requirement: 1.3.1 Configure SELinux"
echo " - Ensure SELinux is installed, enforcing, and targeted."
echo " - Ensure mcstrans and setroubleshoot are not installed."
echo " - Ensure bootloader has no selinux=0 or enforcing=0."
echo " Oracle Context: Oracle Database (19c/23ai) fully supports SELinux in"
echo " 'Enforcing' and 'Targeted' mode. In Oracle RAC/Grid, some Clusterware"
echo " temp files may need proper labels, but disabling SELinux is NOT required."
echo "=========================================================================="

FAIL_COUNT=0

echo -e "\n[*] 1. Checking SELinux Packages..."
if rpm -q libselinux >/dev/null 2>&1; then
    echo -e "  \e[32m[PASS]\e[0m libselinux is installed."
else
    echo -e "  \e[31m[FAIL]\e[0m libselinux is NOT installed."
    FAIL_COUNT=$((FAIL_COUNT + 1))
fi

if rpm -q mcstrans setroubleshoot >/dev/null 2>&1; then
    echo -e "  \e[31m[FAIL]\e[0m Unsafe packages (mcstrans/setroubleshoot) are installed."
    FAIL_COUNT=$((FAIL_COUNT + 1))
else
    echo -e "  \e[32m[PASS]\e[0m Unsafe packages are NOT installed."
fi

echo -e "\n[*] 2. Checking Bootloader configurations..."
if grubby --info=ALL | grep -E 'selinux=0|enforcing=0' >/dev/null 2>&1; then
    echo -e "  \e[31m[FAIL]\e[0m SELinux is disabled in bootloader (grub)."
    FAIL_COUNT=$((FAIL_COUNT + 1))
else
    echo -e "  \e[32m[PASS]\e[0m Bootloader parameters are clean."
fi

echo -e "\n[*] 3. Checking SELinux Config File (/etc/selinux/config)..."
if grep -Eq '^SELINUX=enforcing' /etc/selinux/config; then
    echo -e "  \e[32m[PASS]\e[0m SELINUX is set to enforcing in config."
else
    echo -e "  \e[31m[FAIL]\e[0m SELINUX is NOT set to enforcing in config."
    FAIL_COUNT=$((FAIL_COUNT + 1))
fi

if grep -Eq '^SELINUXTYPE=targeted' /etc/selinux/config; then
    echo -e "  \e[32m[PASS]\e[0m SELINUXTYPE is set to targeted in config."
else
    echo -e "  \e[31m[FAIL]\e[0m SELINUXTYPE is NOT set to targeted in config."
    FAIL_COUNT=$((FAIL_COUNT + 1))
fi

echo -e "\n[*] 4. Checking Current SELinux Status..."
CURRENT_MODE=$(getenforce)
if [ "$CURRENT_MODE" == "Enforcing" ]; then
    echo -e "  \e[32m[PASS]\e[0m Current SELinux mode is Enforcing."
else
    echo -e "  \e[31m[FAIL]\e[0m Current SELinux mode is $CURRENT_MODE."
    FAIL_COUNT=$((FAIL_COUNT + 1))
fi

echo -e "\n[*] 5. Checking for Unconfined Services..."
UNCONFINED=$(ps -eZ | grep unconfined_service_t)
if [ -z "$UNCONFINED" ]; then
    echo -e "  \e[32m[PASS]\e[0m No unconfined services found."
else
    echo -e "  \e[33m[WARN]\e[0m Unconfined services detected (Manual check required):"
    echo "$UNCONFINED" | awk '{print "    - " $NF}'
fi

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

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

این اسکریپت تنظیمات کرنل را اصلاح کرده، بسته‌های خطرناک را حذف و SELinux را امن می‌کند.

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

modules/remediate_04_Configure_SELinux.sh

 

#!/bin/bash
# Script: remediate_cis_1_3_1.sh
# Purpose: Harden SELinux Configurations (CIS 1.3.1)

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

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

# 1. Ensure libselinux is installed (Using --nogpgcheck temporarily if local keys are not imported, but recommended to import keys first)
echo "  [*] Ensuring libselinux is installed..."
dnf install -y libselinux -q

# 2. Remove unsafe SELinux troubleshooting tools (CIS 1.3.1.7, 1.3.1.8)
echo "  [*] Removing unsafe SELinux packages (mcstrans, setroubleshoot)..."
dnf remove -y mcstrans setroubleshoot -q >/dev/null 2>&1

# 3. Remove selinux=0 or enforcing=0 from bootloader (CIS 1.3.1.2)
echo "  [*] Hardening Bootloader parameters..."
grubby --update-kernel ALL --remove-args="selinux=0 enforcing=0"

# 4. Configure SELinux policy and mode in config file (CIS 1.3.1.3, 1.3.1.4, 1.3.1.5)
echo "  [*] Enforcing SELinux 'targeted' policy in /etc/selinux/config..."
sed -i 's/^SELINUX=.*/SELINUX=enforcing/' /etc/selinux/config
sed -i 's/^SELINUXTYPE=.*/SELINUXTYPE=targeted/' /etc/selinux/config

# 5. Apply Enforcing mode immediately if possible
echo "  [*] Applying SELinux state..."
if [ "$(getenforce)" != "Disabled" ]; then
    setenforce 1
    echo "  [+] SELinux is set to Enforcing."
else
    echo "  [!] SELinux is currently Disabled in kernel. A REBOOT IS REQUIRED to activate Enforcing mode."
fi

echo -e "\n[+] SELinux configuration applied successfully."

نکته عملیاتی: رفع موارد مربوط به unconfined_service_t (بند 1.3.1.6) فرآیندی خودکار نیست و نیاز به بررسی انسانی دارد. اگر در مرحله Audit سرویسی مشاهده شد، باید برای آن با audit2allow پالیسی نوشته شود یا سرویس مجدداً با استانداردهای سیستم‌عامل نصب گردد.

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

امن‌سازی پیکربندی Bootloader (GRUB2)

می رویم.