امن‌سازی Oracle Linux 9 (بخش سوم): امن‌سازی مدیریت بسته‌ها و مخازن محلی (Package Management)

در قسمت قبل

پیکربندی پارتیشن‌ها و گزینه‌های اتصال

انجام شد.

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

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

  • 1.2.1.1 Ensure GPG keys are configured (Manual)
  • 1.2.1.2 Ensure gpgcheck is globally activated (Automated)
  • 1.2.1.3 Ensure repo_gpgcheck is globally activated (Manual)
  • 1.2.1.4 Ensure package manager repositories are configured (Manual)
  • 1.2.2.1 Ensure updates, patches, and additional security software are installed (Manual)

 

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

چرا امضای دیجیتال (GPG) مهم است؟

برای جلوگیری از نصب بدافزارها (Supply Chain Attacks) یا پکیج‌های دستکاری شده، سیستم‌عامل از امضای دیجیتال (GPG) استفاده می‌کند:

  • gpgcheck: با فعال کردن این گزینه، سیستم قبل از نصب هر بسته (RPM)، امضای دیجیتال خودِ آن فایل را بررسی می‌کند.
  • repo_gpgcheck: این گزینه علاوه بر خود پکیج، امضای متادیتاهای ریپازیتوری (فایل‌های repodata) را نیز بررسی می‌کند تا از اتصال به یک مخزن جعلی جلوگیری شود.

چالش محیط‌های Enterprise (مخازن محلی / Local Repository):

در اکثر سازمان‌ها، سرورهای پایگاه داده و زیرساخت در شبکه‌های ایزوله (Air-Gapped) قرار دارند و دسترسی مستقیم به اینترنت ندارند. بنابراین مدیران سیستم باید از Local Repository (مانند Mount کردن فایل ISO سیستم‌عامل، یا راه‌اندازی یک سرور مخزن داخلی با Nginx/Apache) استفاده کنند.

  • نکته حیاتی امنیتی و عملیاتی: در مخازن محلی، بررسی امضای خودِ پکیج‌ها (gpgcheck=1 و localpkg_gpgcheck=1) همواره ضروری است و بدون مشکل کار می‌کند. اما از آنجا که در ساخت مخازن محلی با ابزارهایی مثل createrepo معمولاً متادیتاها امضا نمی‌شوند، روشن بودن repo_gpgcheck=1 باعث دریافت خطای GPG در هنگام آپدیت می‌شود. به همین دلیل، در شبکه‌های داخلی ایمن، این گزینه عمداً غیرفعال (0) می‌شود تا فرآیند نصب پکیج‌ها مختل نگردد.

 

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

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

تنظیمات بررسی GPG به هیچ وجه تداخلی با اوراکل ندارد. اما مفهوم Local Repository برای اوراکل بسیار حیاتی است:

  • نصب پیش‌نیازهای اوراکل (مانند پکیج oracle-database-preinstall-19c یا 23ai) نیازمند وابستگی‌های فراوانی است. داشتن یک مخزن محلی آفلاین و پیکربندی صحیح آن، نصب اوراکل را بسیار پایدارتر می‌کند.
  • هشدار آپدیت سیستم (CIS 1.2.2.1): در محیط‌های Oracle RAC، آپدیت پکیج‌های هسته (Kernel) یا کتابخانه‌های پایه (مثل glibc) نباید در حین روشن بودن کلاستر انجام شود. این کار باید با برنامه‌ریزی قبلی (Downtime) و آپدیت نود به نود (Rolling Update) صورت گیرد.

 

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

این اسکریپت تنظیمات DNF و وضعیت مخازن را بررسی می‌کند:

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

modules/audit_03_Secure_Package_Management.sh

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

Bash for Oracle DBAs

#!/bin/bash
# Script: audit_cis_1_2.sh
# Purpose: Audit DNF settings and Repositories (CIS 1.2)

echo "=========================================================================="
echo " CIS Requirement: 1.2 Package Management"
echo " - Ensure gpgcheck is globally activated (1.2.3)"
echo " - Ensure localpkg_gpgcheck is activated (1.2.4)"
echo " - Ensure no individual repos override gpgcheck=0"
echo " Oracle Context: 'repo_gpgcheck=0' is allowed for air-gapped environments."
echo "=========================================================================="

DNF_CONF="/etc/dnf/dnf.conf"
FAIL_COUNT=0

echo -e "\n[*] Auditing DNF global configurations in $DNF_CONF..."

check_dnf_option() {
    local opt=$1
    local expected=$2
    local val=$(grep "^${opt}=" "$DNF_CONF" | cut -d'=' -f2)
    
    if [ "$val" == "$expected" ]; then
        echo -e "  \e[32m[PASS]\e[0m $opt is set to $val"
    else
        echo -e "  \e[31m[FAIL]\e[0m $opt is not set to $expected (Current: ${val:-Not Set})"
        FAIL_COUNT=$((FAIL_COUNT + 1))
    fi
}

check_dnf_option "gpgcheck" "1"
check_dnf_option "localpkg_gpgcheck" "1"
check_dnf_option "repo_gpgcheck" "0"

echo -e "\n[*] Checking Repository Overrides (*.repo)..."
OVERRIDE_COUNT=$(grep -ir '^gpgcheck\s*=\s*0' /etc/yum.repos.d/ 2>/dev/null | wc -l)

if [ "$OVERRIDE_COUNT" -eq 0 ]; then
    echo -e "  \e[32m[PASS]\e[0m No repositories override gpgcheck to 0."
else
    echo -e "  \e[31m[FAIL]\e[0m Found repositories overriding gpgcheck to 0:"
    grep -ir '^gpgcheck\s*=\s*0' /etc/yum.repos.d/ | sed 's/^/    - /'
    FAIL_COUNT=$((FAIL_COUNT + 1))
fi

echo -e "\n[*] Active Repositories:"
dnf repolist enabled 2>/dev/null | awk 'NR>1 {print "  - " $0}'

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)

این اسکریپت علاوه بر اعمال الزامات امنیتی DNF، یک قالب استاندارد برای ساخت Local Repository از طریق فایل ISO را نیز در مسیر مخازن ایجاد می‌کند.

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

modules/remediate_03_Secure_Package_Management.sh

#!/bin/bash
# Script: remediate_cis_1_2.sh
# Purpose: Harden DNF and Configure Local Repository

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

DNF_CONF="/etc/dnf/dnf.conf"
echo -e "\n[+] Applying Remediation for Package Management (CIS 1.2)..."

set_dnf_option() {
    local option=$1
    local value=$2
    if grep -q "^${option}=" "$DNF_CONF"; then
        sed -i "s/^${option}=.*/${option}=${value}/" "$DNF_CONF"
    else
        echo "${option}=${value}" >> "$DNF_CONF"
    fi
    echo "  [+] Set $option=$value in $DNF_CONF"
}

# 1. Global Settings
set_dnf_option "gpgcheck" "1"
set_dnf_option "localpkg_gpgcheck" "1"
set_dnf_option "repo_gpgcheck" "0"

# 2. Fix Repo Overrides (Change gpgcheck=0 to gpgcheck=1 in all .repo files)
echo -e "\n  [*] Checking for gpgcheck overrides in repository files..."
if grep -qir '^gpgcheck\s*=\s*0' /etc/yum.repos.d/; then
    sed -i 's/^gpgcheck\s*=\s*0/gpgcheck=1/ig' /etc/yum.repos.d/*.repo
    echo "  [+] Fixed: Changed 'gpgcheck=0' to 'gpgcheck=1' in repository files."
else
    echo "  [INFO] No repository overrides found."
fi

# 3. Configure Local Repository Template (if not exists)

echo -e "\n[+] Package Management Hardening Completed."

 

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

پیکربندی و امن‌سازی SELinux

می رویم