در قسمت قبل
پیکربندی آرگومانهای ماژولهای احراز هویت
انجام شد.
۱. الزامات 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 و محیط پیشفرض
می رویم.