امن‌سازی Oracle Linux 9 (مقاله هجدهم): ماژول‌های احراز هویت (PAM و Authselect) (CIS 5.3)

در قسمت قبل

امن‌سازی ارتقای دسترسی

انجام شد.

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

شماره‌گذاری‌های تکراری و بهم‌ریخته اصلاح و مطابق استاندارد تنظیم شدند:

  • 5.3 Pluggable Authentication Modules
    • 5.3.1 Configure PAM software packages
  • 5.3.1.1 Ensure latest version of pam is installed (Automated)
  • 5.3.1.2 Ensure latest version of authselect is installed (Automated)
  • 5.3.1.3 Ensure latest version of libpwquality is installed (Automated)
    • 5.3.2 Configure authselect
  • 5.3.2.1 Ensure active authselect profile includes pam modules (Automated)
  • 5.3.2.2 Ensure pam_faillock module is enabled (Automated)
  • 5.3.2.3 Ensure pam_pwquality module is enabled (Automated)
  • 5.3.2.4 Ensure pam_pwhistory module is enabled (Automated)
  • 5.3.2.5 Ensure pam_unix module is enabled (Automated)

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

  • مفهوم: این بخش به پیکربندی زیرساخت PAM (Pluggable Authentication Modules) و مدیریت متمرکز سیاست‌های احراز هویت از طریق ابزار authselect می‌پردازد.
  • دلیل امنیتی:
    • بسته‌های پایه‌ای (5.3.1): سیستم‌عامل Oracle Linux 9 برای مدیریت احراز هویت به بسته‌های pam، authselect و libpwquality وابسته است. به‌روزرسانی مداوم این بسته‌ها برای رفع آسیب‌پذیری‌های امنیتی الزامی است.
    • مدیریت با authselect (5.3.2.1): در نسخه‌های جدید لینوکس (مانند EL9)، ویرایش دستی فایل‌های درون /etc/pam.d/ منسوخ و ناامن است و باید از پروفایل‌های یکپارچه authselect استفاده کرد.
    • قفل‌گذاری حساب (5.3.2.2 - faillock): ماژول pam_faillock جهت مقابله با حملات Brute-force، حساب کاربری را پس از چند بار تلاش ناموفق برای ورود، موقتاً قفل می‌کند.
    • پیچیدگی رمز عبور (5.3.2.3 - pwquality): اعمال سیاست‌های سخت‌گیرانه برای رمز عبور (حداقل طول، ترکیب حروف بزرگ/کوچک، اعداد و کاراکترهای ویژه).
    • تاریخچه رمز عبور (5.3.2.4 - pwhistory): جلوگیری از استفاده مجدد از رمزهای عبور قبلی کاربر.
    • رمزنگاری امن (5.3.2.5 - pam_unix): تضمین می‌کند که رمزهای عبور با استفاده از الگوریتم‌های قوی و مدرن (مانند yescrypt یا sha512) هش و ذخیره می‌شوند.

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

  • وضعیت تداخل: کم تا متوسط (نیازمند دقت در تنظیمات اتوماسیون و حساب‌های سیستمی)
  • توضیحات و الزامات اوراکل:
    • تداخل با faillock: در محیط‌های کلاستر اوراکل (RAC)، اسکریپت‌های مانیتورینگ (مانند Oracle Enterprise Manager - OEM)، فرآیندهای کلاستر یا اتصالات خودکار ممکن است به دلیل تغییرات شبکه یا خطای تنظیمات، تلاش‌های ناموفقی برای ورود با کاربران oracle یا grid داشته باشند. فعال بودن faillock می‌تواند منجر به قفل شدن این حساب‌های حیاتی و در نتیجه قطعی کامل سرویس دیتابیس شود.
  • راه‌حل: حتماً باید کاربران سیستمی اوراکل (نظیر oracle و grid) از محدودیت‌های قفل شدن مستثنی شوند. این کار از طریق تنظیمات در /etc/security/faillock.conf (یا پارامترهای مدیریتی مربوطه) انجام می‌پذیرد.
    • تداخل با pwquality: در فرآیندهای نصب خودکار (Silent Install) گرید و دیتابیس یا استفاده از ابزارهای Provisioning (مانند Ansible یا Terraform)، رمزهای عبورِ تولید و تزریق شده برای کاربران دیتابیس یا سیستم‌عامل، باید به دقت با سیاست‌های اعمال‌شده توسط pam_pwquality همگام باشند. در غیر این صورت، فرآیند نصب به دلیل رد شدن رمز عبور متوقف خواهد شد.
  1. نحوه بررسی (Audit Script)

اسکریپت زیر نصب بودن بسته‌ها و وضعیت پروفایل authselect را بررسی می‌کند:

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

modules/audit_18_PAM_Authselect.sh

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

Bash for Oracle DBAs

#!/bin/bash
# Script: audit18.sh
# Purpose: Audit Script for PAM, Authselect & Oracle Faillock Bypass (CIS 5.3)

if [ "$EUID" -ne 0 ]; then
    echo -e "\e[31m[!] Please run as root\e[0m"
    exit 1
fi

FAIL_COUNT=0

echo "=========================================================================="
echo " Audit Script for PAM Packages & Authselect Profile (CIS 5.3)"
echo " Context: EL9 authselect requires 'with-faillock' and 'without-nullok'."
echo " Exception (Oracle): 'oracle' and 'grid' must be bypassed in PAM to avoid DB outage."
echo "=========================================================================="

echo -e "\n[*] Checking required PAM packages..."
check_package() {
    local pkg=$1
    if rpm -q "$pkg" >/dev/null 2>&1; then
        echo -e "  \e[32m[PASS]\e[0m Package '$pkg' is installed"
    else
        echo -e "  \e[31m[FAIL]\e[0m Package '$pkg' is NOT installed"
        ((FAIL_COUNT++))
    fi
}

check_package "pam"
check_package "authselect"
check_package "libpwquality"

echo -e "\n[*] Checking Authselect Profile configuration..."
CURRENT_PROFILE=$(authselect current 2>/dev/null | head -n 1 | awk '{print $3}')

if [ -z "$CURRENT_PROFILE" ] || [[ "$CURRENT_PROFILE" == "No" ]]; then
    echo -e "  \e[31m[FAIL]\e[0m No authselect profile is currently active"
    ((FAIL_COUNT++))
else
    echo -e "  \e[32m[PASS]\e[0m Active authselect profile: $CURRENT_PROFILE"

    check_authselect_feature() {
        local feature=$1
        if authselect current 2>/dev/null | grep -qw "$feature"; then
            echo -e "  \e[32m[PASS]\e[0m Feature '$feature' is enabled"
        else
            echo -e "  \e[31m[FAIL]\e[0m Feature '$feature' is missing"
            ((FAIL_COUNT++))
        fi
    }

    check_authselect_feature "with-faillock"
    check_authselect_feature "without-nullok"
fi

echo -e "\n[*] Checking Oracle/Grid Faillock Bypass..."
if grep -q "pam_succeed_if.so user in oracle:grid" /etc/pam.d/system-auth 2>/dev/null; then
    echo -e "  \e[32m[PASS]\e[0m Oracle/Grid accounts are successfully excluded from faillock rules"
else
    echo -e "  \e[31m[FAIL]\e[0m Oracle/Grid accounts are NOT excluded from faillock (High Risk for DB!)"
    ((FAIL_COUNT++))
fi

echo "=========================================================================="
if [ $FAIL_COUNT -eq 0 ]; then
    echo -e "\e[32m[+] AUDIT PASSED: PAM, Authselect, and Oracle Exceptions are perfectly configured.\e[0m"
else
    echo -e "\e[31m[-] AUDIT FAILED: $FAIL_COUNT issue(s) found. Run remediation18.sh.\e[0m"
fi

 

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

این اسکریپت بسته‌های لازم را نصب کرده و پروفایل authselect را با فعال‌سازی ماژول‌های امنیتی پیکربندی می‌کند:

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

modules/remediate_18_PAM_Authselect.sh

#!/bin/bash
# Script: remediation18.sh
# Purpose: Remediation Script for PAM & Authselect with Oracle Exclusions (CIS 5.3)

if [ "$EUID" -ne 0 ]; then
    echo -e "\e[31m[!] Please run as root\e[0m"
    exit 1
fi

echo "=========================================================================="
echo " Remediation Script for PAM Packages & Authselect Profile (CIS 5.3)"
echo " Action: Creating custom authselect profile to implement 'with-faillock'"
echo "         while explicitly excluding 'oracle' and 'grid' accounts."
echo "=========================================================================="

# Variables for custom profile
CUSTOM_PROFILE_NAME="oracle-sssd"
BASE_PROFILE="sssd"
CUSTOM_DIR="/etc/authselect/custom/$CUSTOM_PROFILE_NAME"

echo -e "\n[*] 1. Creating Custom Authselect Profile for Oracle..."
# Ensure any broken previous attempts are cleaned up
rm -rf "$CUSTOM_DIR"

echo "Creating custom profile '$CUSTOM_PROFILE_NAME' based on '$BASE_PROFILE'..."
# Without --symlinks to ensure physical files are copied and modifiable
authselect create-profile "$CUSTOM_PROFILE_NAME" -b "$BASE_PROFILE"

if [ ! -d "$CUSTOM_DIR" ]; then
    echo -e "\e[31m[!] Error: Failed to create custom authselect profile!\e[0m"
    exit 1
fi

echo -e "\n[*] 2. Injecting Faillock Bypass logic for 'oracle' and 'grid' users..."
BYPASS_RULE="auth        [success=1 default=ignore]                   pam_succeed_if.so user in oracle:grid"

for pam_file in system-auth password-auth; do
    FILE_PATH="$CUSTOM_DIR/$pam_file"
    if [ -f "$FILE_PATH" ]; then
        # Insert bypass rule right above the first occurrence of pam_faillock preauth
        sed -i "/pam_faillock.so preauth/i $BYPASS_RULE" "$FILE_PATH"

        # Insert bypass rule right above pam_faillock authfail
        sed -i "/pam_faillock.so authfail/i $BYPASS_RULE" "$FILE_PATH"

        # Insert bypass rule right above pam_faillock authsucc
        sed -i "/pam_faillock.so authsucc/i $BYPASS_RULE" "$FILE_PATH"

        echo " -> Injected successfully into $pam_file"
    else
        echo " -> Warning: File $pam_file not found in custom directory!"
    fi
done

echo -e "\n[*] 3. Applying the new Custom Oracle Profile..."
# Select the profile. In EL9 the path prefix 'custom/' is required.
authselect select "custom/$CUSTOM_PROFILE_NAME" with-faillock without-nullok --force

echo -e "\n[*] 4. Forcing Authselect changes to PAM stack..."
authselect apply-changes

echo -e "\n[*] Current Authselect Configuration:"
authselect current

echo "=========================================================================="
echo -e "\e[32m[+] Remediation completed.\e[0m"
echo -e "Please run audit18.sh to verify."

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

پیکربندی آرگومان‌های ماژول‌های احراز هویت

می رویم.