در قسمت قبل
امنسازی مدیریت بستهها و مخازن محلی
انجام شد.
۱. الزامات 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)
می رویم.