امن‌سازی Oracle Linux 9 (مقاله بیست و یکم): حساب‌های کاربری سیستمی، کاربر root و محیط پیش‌فرض

در قسمت قبل

پیکربندی پارامترهای رمز عبور

انجام شد.

۱. الزامات CIS Benchmark (بخش‌های 5.4.2 و 5.4.3)

  • 5.4.2 Configure root and system accounts and environment
    • 5.4.2.1 Ensure root is the only UID 00 account (Automated)
    • 5.4.2.2 Ensure root is the only GID 00 account (Automated)
    • 5.4.2.3 Ensure group root is the only GID 00 group (Automated)
    • 5.4.2.4 Ensure root account access is controlled (Automated)
    • 5.4.2.5 Ensure root path integrity (Automated)
    • 5.4.2.6 Ensure root user umask is configured (Automated)
    • 5.4.2.7 Ensure system accounts do not have a valid login shell (Automated)
    • 5.4.2.8 Ensure accounts without a valid login shell are locked (Automated)
  • 5.4.3 Configure user default environment
    • 5.4.3.1 Ensure nologin is not listed in /etc/shells (Automated)
    • 5.4.3.2 Ensure default user shell timeout is configured (Automated)
    • 5.4.3.3 Ensure default user umask is configured (Automated)

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

  • یکتایی root: هیچ کاربری جز root نباید شناسه (UID/GID) برابر با 0 داشته باشد تا از دسترسی‌های پنهان مدیریتی جلوگیری شود.
  • حساب‌های سیستمی: حساب‌هایی که توسط سرویس‌ها استفاده می‌شوند (معمولاً با UID کمتر از 1000) نباید پوسته تعاملی (Shell) داشته باشند و باید در وضعیت قفل (Locked) قرار گیرند تا امکان ورود مستقیم به آن‌ها وجود نداشته باشد.
  • TMOUT: بستن خودکار نشست‌های بیکار پس از گذشت زمان مشخص (معمولاً 900 ثانیه) برای جلوگیری از سوءاستفاده از نشست‌های رها شده.
  • umask: تعیین سطح دسترسی پیش‌فرض فایل‌ها و پوشه‌های جدید (پیشنهاد CIS برای محیط‌های امن مقدار 027 است).

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

  • وضعیت تداخل: بالا (مستلزم استثناسازی)
  • توضیحات و الزامات اوراکل:
    • تداخل umask (بحرانی): استاندارد CIS مقدار 027 را برای umask سراسری پیشنهاد می‌دهد. اما نصب و اجرای دیتابیس اوراکل (و Grid Infrastructure) صراحتاً به مقدار 022 نیاز دارد. اگر این مقدار در فایل‌های پروفایل کاربران oracle و grid (مانند ~/.bash_profile) به 022 لغو (Override) نشود، نصب نرم‌افزار، ایجاد فایل‌های دیتابیس و ارتباطات کلاستر با خطاهای عدم دسترسی (Permission Denied) مواجه خواهد شد.
    • تداخل TMOUT (متوسط): تنظیم Timeout روی 900 ثانیه (۱۵ دقیقه) باعث قطع شدن نشست‌های SSH یا ترمینال DBAها در حین اجرای اسکریپت‌های طولانی و زمان‌بر (مانند پچ‌کردن، بکاپ‌گیری یا اجرای کوئری‌های سنگین) می‌شود. توصیه می‌شود برای کاربران مدیریت دیتابیس، این محدودیت تعدیل شده یا در هنگام اجرای عملیات حساس، متغیر TMOUT به‌طور موقت لغو (Unset) شود.

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

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

modules/audit_21_System_Accounts_Root_Env.sh

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

Bash for Oracle DBAs

#!/bin/bash
# Script: audit21.sh
# Purpose: Audit System Accounts, Umask, TMOUT & UID 0 (CIS 5.4.2 & 5.4.3)

echo "=========================================================================="
echo " CIS Requirement: User Accounts and Environment"
echo " - Ensure only 'root' has UID 0."
echo " - Ensure system accounts are non-login (shell /sbin/nologin)."
echo " - Ensure default user umask is 027."
echo " - Ensure TMOUT is 900 or less."
echo " Oracle Context & Exceptions:"
echo " - EXCEPTION: Oracle/Grid users require umask 022 for installation/operation."
echo " - WARNING: TMOUT=900 may disconnect long-running DBA scripts."
echo "=========================================================================="

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

FAIL_COUNT=0

echo -e "\n[*] Checking for UID 0 Accounts..."
UID_0_USERS=$(awk -F: '($3 == 0) { print $1 }' /etc/passwd)
if [ "$UID_0_USERS" == "root" ]; then
    echo -e "  \e[32m[PASS]\e[0m Only 'root' has UID 0."
else
    echo -e "  \e[31m[FAIL]\e[0m Non-root accounts with UID 0 found: $UID_0_USERS"
    FAIL_COUNT=$((FAIL_COUNT + 1))
fi

echo -e "\n[*] Checking System Accounts (Interactive Shell)..."
MIN_UID=$(awk '/^\s*UID_MIN/{print $2}' /etc/login.defs)
SYS_USERS_WITH_SHELL=$(awk -F: -v min_uid="$MIN_UID" '
    $3 < min_uid && $1 != "root" && $1 != "sync" && $1 != "shutdown" && $1 != "halt" && $7 != "/sbin/nologin" && $7 != "/bin/false" {print $1}
' /etc/passwd)

if [ -z "$SYS_USERS_WITH_SHELL" ]; then
    echo -e "  \e[32m[PASS]\e[0m No system accounts have an interactive shell."
else
    echo -e "  \e[31m[FAIL]\e[0m System accounts with valid shell: $(echo $SYS_USERS_WITH_SHELL | tr '\n' ' ')"
    FAIL_COUNT=$((FAIL_COUNT + 1))
fi

echo -e "\n[*] Checking Global Umask..."
if grep -q "umask 027" /etc/profile.d/umask.sh 2>/dev/null; then
    echo -e "  \e[32m[PASS]\e[0m Default umask 027 is configured."
else
    echo -e "  \e[31m[FAIL]\e[0m Default umask 027 not found in /etc/profile.d/umask.sh."
    FAIL_COUNT=$((FAIL_COUNT + 1))
fi

echo -e "\n[*] Checking TMOUT..."
if grep -Eq "^\s*readonly TMOUT=900" /etc/profile.d/tmout.sh 2>/dev/null; then
    echo -e "  \e[32m[PASS]\e[0m TMOUT is securely configured to 900 seconds."
else
    echo -e "  \e[31m[FAIL]\e[0m TMOUT is not correctly set to 900 in /etc/profile.d/tmout.sh."
    FAIL_COUNT=$((FAIL_COUNT + 1))
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

 

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

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

modules/remediate_21_System_Accounts_Root_Env.sh

#!/bin/bash

# 5.4.3.1 Remove nologin from /etc/shells
sed -i '/nologin/d' /etc/shells

# 5.4.3.2 Configure TMOUT (900 seconds) in a profile drop-in
cat << 'EOF' > /etc/profile.d/tmout.sh
readonly TMOUT=900
export TMOUT
EOF
chmod 0644 /etc/profile.d/tmout.sh

# 5.4.3.3 Configure default umask
cat << 'EOF' > /etc/profile.d/umask.sh
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
    umask 002
else
    umask 027
fi
EOF
chmod 0644 /etc/profile.d/umask.sh

# 5.4.2.7 & 5.4.2.8 Lock system accounts and set shell to nologin
MIN_UID=$(awk '/^\s*UID_MIN/{print $2}' /etc/login.defs)
for user in $(awk -F: -v uid="$MIN_UID" '$3 < uid && $1 != "root" && $1 != "sync" && $1 != "shutdown" && $1 != "halt" {print $1}' /etc/passwd); do
    usermod -s /sbin/nologin "$user"
    usermod -L "$user"
done

# Ensure oracle/grid umask bypass (Oracle DBA Note)
for o_user in oracle grid; do
    if id "$o_user" &>/dev/null; then
        grep -q "umask 022" /home/$o_user/.bash_profile || echo "umask 022" >> /home/$o_user/.bash_profile
    fi
done

echo "System accounts and default environment secured."

 

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

پیکربندی بررسی یکپارچگی سیستم

می رویم.