امن‌سازی Oracle Linux 9 (مقاله هفدهم): امن‌سازی ارتقای دسترسی (Privilege Escalation) (CIS 5.2)

در قسمت قبل

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

انجام شد.

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

  • 5.2 Configure privilege escalation
    • 5.2.1 Ensure sudo is installed (Automated)
    • 5.2.2 Ensure sudo commands use pty (Automated)
    • 5.2.3 Ensure sudo log file exists (Automated)
    • 5.2.4 Ensure users must provide password for escalation (Automated)
    • 5.2.5 Ensure re-authentication for privilege escalation is not disabled globally (Automated)
    • 5.2.6 Ensure sudo authentication timeout is configured correctly (Automated)
    • 5.2.7 Ensure access to the su command is restricted (Automated)

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

  • مفهوم: این بخش بر مدیریت ایمن ابزارهای sudo و su تمرکز دارد. هدف این است که ارتقای سطح دسترسی کنترل‌شده، قابل ردیابی و محافظت‌شده در برابر بدافزارها باشد.
  • دلیل امنیتی:
    • نصب 5.2.1 (sudo): بهینه‌ترین روش برای اعطای دسترسی مدیریت بدون افشای رمز عبور root است.
    • استفاده از 5.2.2 (pty): پارامتر use_pty اجرای sudo را به یک ترمینال مجازی محدود می‌کند تا از شنود یا تزریق دستورات توسط بدافزارهای پس‌زمینه جلوگیری شود.
    • لاگ‌برداری 5.2.3 (logfile): ثبت دستورات در مسیر مجزا (مانند /var/log/sudo.log) برای ممیزی (Auditing) ضروری است.
    • مدیریت احراز هویت 5.2.4 و 5.2.5: جلوگیری از اعمال سراسری (Global) تگ‌های NOPASSWD و !authenticate تا کاربران نتوانند بدون احراز هویت، دسترسی ادمین دریافت کنند.
    • زمان‌سنج 5.2.6 (Timeout): محدود کردن زمان معتبر بودن احراز هویت sudo (معمولاً $15$ دقیقه) تا نشست‌های رهاشده مورد سوءاستفاده قرار نگیرند.
    • محدودسازی 5.2.7 (su): با استفاده از pam_wheel.so، تنها اعضای گروه wheel قادر به استفاده از su برای تغییر کاربری خواهند بود.

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

  • وضعیت تداخل: متوسط (نیازمند تنظیمات استثنا در اتوماسیون و دسترسی‌ها)
  • توضیحات و الزامات اوراکل:
    • استفاده از pty (use_pty / requiretty): اسکریپت‌های اتوماسیون اوراکل (مانند Cron Jobهای بکاپ با کاربر oracle یا پردازش‌های OEM) که بدون ترمینال (TTY) اجرا می‌شوند، با خطای sorry, you must have a tty to run sudo مواجه خواهند شد. راه‌حل: باید استثنای !use_pty صرفاً برای کاربر oracle در /etc/sudoers.d ایجاد شود.
    • الزام به رمز عبور (NOPASSWD): ابزارهای Provisioning و کلاسترینگ اوراکل (مانند Oracle FPP یا اجرای Ansible برای نصب Grid/RDBMS) برای اجرای خودکار اسکریپت‌هایی نظیر root.sh نیاز به NOPASSWD دارند. از آنجا که CIS اعمال سراسری آن را منع کرده است، اختصاص NOPASSWD به کاربر یا دستور خاصِ اوراکل بلامانع و کاملاً ضروری است.
    • محدودسازی su (pam_wheel): در مدیریت روزمره، DBAها معمولاً با شناسه شخصی لاگین کرده و سپس از طریق su - oracle به کاربر اوراکل سوییچ می‌کنند. با فعال‌سازی این بند، ادمین‌های پایگاه داده حتماً باید به گروه مجاز به su اضافه شوند. در اینجا ما گروهی با نام sugroup درست می کنیم در غیر این صورت با خطای Permission denied مواجه خواهند شد.

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

اسکریپت زیر وضعیت تنظیمات sudo و ماژول su را ممیزی می‌کند:

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

modules/audit_17_Privilege_Escalation.sh

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

Bash for Oracle DBAs

 

#!/bin/bash
# Script: audit17.sh
# Purpose: Audit Script for Sudo and su (CIS 5.3 & 5.6)

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 Sudo & su (CIS 5.3 & 5.6)"
echo " Oracle Context: oracle/grid users need 'su -' access without being sudoers."
echo " Oracle Exception: Using custom 'sugroup' instead of default 'wheel'."
echo "=========================================================================="

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

echo -e "\n[*] Checking sudo configuration (Defaults)..."
check_sudo_default() {
    local param=$1
    if grep -rEi "^\s*Defaults\s+([^#]+,\s*)?${param}" /etc/sudoers /etc/sudoers.d/* >/dev/null 2>&1; then
        echo -e "  \e[32m[PASS]\e[0m sudo is configured with $param"
    else
        echo -e "  \e[31m[FAIL]\e[0m sudo is missing configuration for $param"
        ((FAIL_COUNT++))
    fi
}

check_sudo_default "use_pty"
check_sudo_default "logfile"
check_sudo_default "timestamp_timeout"

echo -e "\n[*] Checking for '!authenticate' in sudoers..."
if grep -rEi "^\s*[^#].*!authenticate" /etc/sudoers /etc/sudoers.d/* >/dev/null 2>&1; then
    echo -e "  \e[31m[FAIL]\e[0m Found '!authenticate' in sudo configuration"
    ((FAIL_COUNT++))
else
    echo -e "  \e[32m[PASS]\e[0m No '!authenticate' found in sudo configuration"
fi

echo -e "\n[*] Checking 'su' restrictions (pam_wheel.so) and groups..."
if grep -Eq "^\s*auth\s+(required|requisite)\s+pam_wheel\.so\s+.*group=sugroup" /etc/pam.d/su; then
    echo -e "  \e[32m[PASS]\e[0m pam_wheel.so is configured with group=sugroup in /etc/pam.d/su"
else
    echo -e "  \e[31m[FAIL]\e[0m pam_wheel.so with group=sugroup is not properly configured in /etc/pam.d/su"
    ((FAIL_COUNT++))
fi

# Check if sugroup exists and users are members
if getent group sugroup >/dev/null 2>&1; then
    echo -e "  \e[32m[PASS]\e[0m Group 'sugroup' exists"
    for u in oracle grid; do
        if id "$u" >/dev/null 2>&1; then # Check if user exists on system
            if id -nG "$u" | grep -qw "sugroup"; then
                echo -e "  \e[32m[PASS]\e[0m User $u is a member of 'sugroup'"
            else
                echo -e "  \e[31m[FAIL]\e[0m User $u is NOT a member of 'sugroup'"
                ((FAIL_COUNT++))
            fi
        fi
    done
else
    echo -e "  \e[31m[FAIL]\e[0m Group 'sugroup' does not exist"
    ((FAIL_COUNT++))
fi

# Ensure Oracle users are NOT in wheel group
for u in oracle grid; do
    if id "$u" >/dev/null 2>&1; then
        if id -nG "$u" | grep -qw "wheel"; then
            echo -e "  \e[31m[FAIL]\e[0m User $u is in 'wheel' (Should be removed to prevent sudo access)"
            ((FAIL_COUNT++))
        else
            echo -e "  \e[32m[PASS]\e[0m User $u is safely NOT in 'wheel'"
        fi
    fi
done

echo "=========================================================================="
if [ $FAIL_COUNT -eq 0 ]; then
    echo -e "\e[32m[+] AUDIT PASSED: All Sudo & su settings meet CIS/Oracle requirements.\e[0m"
else
    echo -e "\e[31m[-] AUDIT FAILED: $FAIL_COUNT issue(s) found. Run remediation17.sh.\e[0m"
fi

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

این اسکریپت تنظیمات sudo را در یک فایل Drop-in امن اعمال کرده و تنظیمات ناامن سراسری را حذف می‌کند:

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

modules/remediate_17_Privilege_Escalation.sh

#!/bin/bash
# Remediation Script for CIS 5.3 & 5.6 - Sudo and su Configuration
# Direct configuration of sudoers and pam (Oracle RAC Compatible)

# 1. Check if running as root
if [ "$EUID" -ne 0 ]; then
  echo -e "\033[31m[-] Please run as root.\033[0m"
  exit 1
fi

SUDOERS_FILE="/etc/sudoers"
PAM_SU_FILE="/etc/pam.d/su"
BACKUP_SUFFIX=".bak.$(date +%F_%T)"

# 2. Backup the original files
echo -e "\033[34m[*] Backing up configuration files...\033[0m"
cp -p "$SUDOERS_FILE" "${SUDOERS_FILE}${BACKUP_SUFFIX}"
cp -p "$PAM_SU_FILE" "${PAM_SU_FILE}${BACKUP_SUFFIX}"

# 3. Ensure sudo is installed
echo -e "\033[34m[*] Ensuring sudo is installed...\033[0m"
dnf install -y sudo > /dev/null 2>&1

# 4. Configure Sudo Defaults
echo -e "\033[34m[*] Applying CIS Sudo Defaults (use_pty, logfile, timestamp_timeout)...\033[0m"
cat << 'EOF' > /etc/sudoers.d/99-cis-sudo-defaults
Defaults use_pty
Defaults logfile="/var/log/sudo.log"
Defaults timestamp_timeout=15
EOF
chmod 0440 /etc/sudoers.d/99-cis-sudo-defaults

# 5. Remove !authenticate
echo -e "\033[34m[*] Removing '!authenticate' from sudoers files...\033[0m"
sed -i 's/!authenticate//g' /etc/sudoers
for f in /etc/sudoers.d/*; do
  if [ -f "$f" ]; then
    sed -i 's/!authenticate//g' "$f"
  fi
done


# 6. Restrict 'su' to a specific group (e.g., 'sugroup') to prevent granting sudo access
echo -e "\033[34m[*] Restricting 'su' command to 'sugroup' in pam...\033[0m"

# Create the group if it does not exist
groupadd -f sugroup

# Add Oracle users to this group
usermod -aG sugroup oracle 2>/dev/null
usermod -aG sugroup grid 2>/dev/null

# Configure pam_wheel to use this specific group (preventing interference with wheel and sudo)
if grep -q "pam_wheel.so" "$PAM_SU_FILE"; then
    sed -i 's/^#\s*auth\s*required\s*pam_wheel.so.*/auth            required        pam_wheel.so use_uid group=sugroup/' "$PAM_SU_FILE"
    sed -i 's/^auth\s*required\s*pam_wheel.so.*/auth            required        pam_wheel.so use_uid group=sugroup/' "$PAM_SU_FILE"
else
    sed -i '/pam_rootok.so/a auth            required        pam_wheel.so use_uid group=sugroup' "$PAM_SU_FILE"
fi

# 7. Add Oracle/Grid to wheel group (Oracle Exception)
echo -e "\033[34m[*] Adding Oracle and Grid users to 'wheel' group...\033[0m"
for user in oracle grid; do
    if id "$user" &>/dev/null; then
        usermod -aG wheel "$user"
    fi
done

# 8. Check syntax
echo -e "\033[34m[*] Checking sudoers configuration syntax...\033[0m"
if visudo -c >/dev/null 2>&1; then
    echo -e "\033[32m[+] Syntax OK. Remediation completed successfully.\033[0m"
else
    echo -e "\033[31m[-] Syntax error detected in sudoers. Restoring backup...\033[0m"
    cp -p "${SUDOERS_FILE}${BACKUP_SUFFIX}" "$SUDOERS_FILE"
    rm -f /etc/sudoers.d/99-cis-sudo-defaults
    exit 1
fi

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

ماژول‌های احراز هویت

می رویم.