امن‌سازی Oracle Linux 9 (مقاله بیستم): پیکربندی پارامترهای رمز عبور (Shadow Password Suite)

در قسمت قبل

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

انجام شد.

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

  • 5.4.1 Configure shadow password suite parameters
    • 5.4.1.1 Ensure password expiration is configured (Automated)
    • 5.4.1.2 Ensure minimum password days is configured (Manual)
    • 5.4.1.3 Ensure password expiration warning days is configured (Automated)
    • 5.4.1.4 Ensure strong password hashing algorithm is configured (Automated)
    • 5.4.1.5 Ensure inactive password lock is configured (Automated)
    • 5.4.1.6 Ensure all users last password change date is in the past (Automated)

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

  • PASS_MAX_DAYS: حداکثر روزهایی که یک رمز عبور معتبر است (معمولاً 365 روز).
  • PASS_MIN_DAYS: حداقل روزهایی که باید از تغییر رمز عبور بگذرد تا کاربر بتواند مجدداً آن را تغییر دهد (معمولاً 1 روز، برای جلوگیری از تغییر مکرر و دور زدن تاریخچه رمز عبور).
  • PASS_WARN_AGE: تعداد روزهای قبل از انقضا که به کاربر هشدار داده می‌شود (معمولاً 7 روز).
  • ENCRYPT_METHOD: استفاده از الگوریتم‌های قوی مانند YESCRYPT یا SHA512 برای هش کردن رمزهای عبور.
  • INACTIVE: غیرفعال‌کردن حساب کاربری پس از گذشت چند روز (مثلاً 30 روز) از تاریخ انقضای رمز عبور.

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

  • وضعیت تداخل: بسیار بالا (بحرانی)
  • توضیحات و الزامات اوراکل:
    • بحران انقضای رمز عبور کاربران سرویس: تنظیم سیاست انقضای رمز عبور برای کاربرانی مانند oracle، grid و opc می‌تواند باعث اختلالات شدید شود. اگر رمز عبور این کاربران منقضی شود، فرآیندهای پس‌زمینه (Cron jobs، ارتباطات SSH مبتنی بر کلید در محیط‌های RAC، و Agentهای مانیتورینگ) با خطای احراز هویت مواجه شده و متوقف می‌شوند که این امر به قطعی سرویس می‌انجامد.
    • راه‌حل: مقادیر اعمال‌شده در /etc/login.defs صرفاً برای کاربران جدید اعمال می‌شود. برای کاربران سیستمی و سرویس‌های اوراکل (که از قبل وجود دارند یا بعداً ساخته می‌شوند)، باید سیاست انقضا از طریق دستوراتی مانند chage -M 99999 oracle کاملاً غیرفعال شود تا پایداری کلاستر و دیتابیس تضمین گردد.

 

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

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

modules/audit_20_Shadow_Password_Suite.sh

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

Bash for Oracle DBAs

#!/bin/bash
# Script: audit20.sh
# Purpose: Audit Script for Password Expiration & Aging (CIS Section 20)

echo "=========================================================================="
echo " CIS Requirement: Password Aging Policies (/etc/login.defs & Shadow)"
echo " - Ensure password expiration is 365 days or less (PASS_MAX_DAYS)."
echo " - Ensure minimum days between changes is 1 or more (PASS_MIN_DAYS)."
echo " - Ensure inactive password lock is 30 days or less (INACTIVE)."
echo " - Ensure all passwords have a valid change date (not in the future)."
echo " Oracle Context:"
echo " - WARNING: Enforcing expiration (PASS_MAX_DAYS) on database service"
echo "   accounts ('oracle', 'grid') will cause critical cluster and database"
echo "   outages. Service accounts must be explicitly excluded from aging."
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 /etc/login.defs parameters..."
check_login_defs() {
    local param=$1
    local expected=$2
    local current=$(grep -E "^\s*${param}\b" /etc/login.defs | awk '{print $2}')
    
    if [ "$current" == "$expected" ]; then
        echo -e "  \e[32m[PASS]\e[0m $param is $current"
    else
        echo -e "  \e[31m[FAIL]\e[0m $param is $current (Expected: $expected)"
        FAIL_COUNT=$((FAIL_COUNT + 1))
    fi
}

check_login_defs "PASS_MAX_DAYS" "365"
check_login_defs "PASS_MIN_DAYS" "1"
check_login_defs "PASS_WARN_AGE" "7"
check_login_defs "ENCRYPT_METHOD" "YESCRYPT"

echo -e "\n[*] Checking Default Inactive Lock..."
inactive_val=$(useradd -D | grep INACTIVE | cut -d= -f2)
if [ "$inactive_val" == "30" ]; then
    echo -e "  \e[32m[PASS]\e[0m INACTIVE is set to $inactive_val"
else
    echo -e "  \e[31m[FAIL]\e[0m INACTIVE is set to $inactive_val (Expected: 30)"
    FAIL_COUNT=$((FAIL_COUNT + 1))
fi

echo -e "\n[*] Checking for passwords changed in the future (/etc/shadow)..."
# Fix for the broken awk command in the original script
CURRENT_EPOCH=$(date +%s)
CURRENT_DAYS=$((CURRENT_EPOCH / 86400))
FUTURE_USERS=$(awk -v now="$CURRENT_DAYS" -F: '($2 != "!" && $2 != "*" && $2 != "" && $3 > now) {print $1}' /etc/shadow)

if [ -z "$FUTURE_USERS" ]; then
    echo -e "  \e[32m[PASS]\e[0m No accounts have a password change date in the future."
else
    echo -e "  \e[31m[FAIL]\e[0m Accounts with future password change dates: $(echo $FUTURE_USERS | tr '\n' ' ')"
    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_20_Shadow_Password_Suite.sh

#!/bin/bash

# 1. Update /etc/login.defs
sed -i -E 's/^\s*PASS_MAX_DAYS.*/PASS_MAX_DAYS   365/' /etc/login.defs
sed -i -E 's/^\s*PASS_MIN_DAYS.*/PASS_MIN_DAYS   1/' /etc/login.defs
sed -i -E 's/^\s*PASS_WARN_AGE.*/PASS_WARN_AGE   7/' /etc/login.defs
sed -i -E 's/^\s*ENCRYPT_METHOD.*/ENCRYPT_METHOD YESCRYPT/' /etc/login.defs

# 2. Update inactive password lock (useradd default)
useradd -D -f 30

# 3. Apply changes to existing users (excluding oracle, grid, root, opc)
for user in $(awk -F: '($3 == "" || $3 > 0) && $1 != "root" && $1 != "oracle" && $1 != "grid" && $1 != "opc" {print $1}' /etc/shadow); do
    chage --maxdays 365 --mindays 1 --warndays 7 --inactive 30 "$user"
done

# Fix any users with future password change dates to today
CURRENT_DAY=$(($(date +%s) / 86400))
for user in $(awk -F: -v today="$CURRENT_DAY" '$3 > today {print $1}' /etc/shadow); do
    chage --lastday "$CURRENT_DAY" "$user"
done

echo "Configuration applied successfully. Note: 'oracle' and 'grid' users were explicitly excluded from password aging."

 

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

حساب‌های کاربری سیستمی، کاربر root و محیط پیش‌فرض

می رویم.