امن‌سازی Oracle Linux 9 (مقاله سیزدهم): پیکربندی زمان‌بندها (Job Schedulers - Cron & At)

در قسمت قبل

پیکربندی همگام‌سازی زمان

انجام شد.

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

این بخش به امن‌سازی و محدودسازی دسترسی به سرویس‌های زمان‌بندی وظایف (cron و at) می‌پردازد. شماره‌گذاری‌های فایل شما اصلاح شد:

  • 2.4.1 Configure cron
    • 2.4.1.1 Ensure cron daemon is enabled and active (Automated)
    • 2.4.1.2 Ensure permissions on /etc/crontab are configured (Automated)
    • 2.4.1.3 Ensure permissions on /etc/cron.hourly are configured (Automated)
    • 2.4.1.4 Ensure permissions on /etc/cron.daily are configured (Automated)
    • 2.4.1.5 Ensure permissions on /etc/cron.weekly are configured (Automated)
    • 2.4.1.6 Ensure permissions on /etc/cron.monthly are configured (Automated)
    • 2.4.1.7 Ensure permissions on /etc/cron.d are configured (Automated)
    • 2.4.1.8 Ensure crontab is restricted to authorized users (Automated)
  • 2.4.2 Configure at
    • 2.4.2.1 Ensure at is restricted to authorized users (Automated)

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

  • مفهوم: سرویس‌های cron و at برای اجرای زمان‌بندی‌شده‌ی اسکریپت‌ها و دستورات استفاده می‌شوند. از آنجا که بسیاری از این وظایف در سطح سیستم با دسترسی root اجرا می‌گردند، هدف از این الزامات جلوگیری از دسترسی غیرمجاز به فایل‌های پیکربندی آن‌هاست.
  • دلیل امنیتی: اگر سطح دسترسی پوشه‌ها و فایل‌های پیکربندی باز باشد، کاربران غیرمجاز می‌توانند با تزریق کدهای مخرب در اسکریپت‌های زمان‌بندی‌شده، دسترسی خود را ارتقا دهند (Privilege Escalation). محدود کردن دسترسی فقط به کاربران تایید شده و تنظیم مجوزهای 0600 برای فایل‌ها و 0700 برای پوشه‌ها، سطح حمله را به شدت کاهش می‌دهد.

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

  • تداخل بسیار بالا در صورت عدم دقت: مدیران پایگاه داده (DBA) به شدت به cron وابسته هستند (برای اجرای اسکریپت‌های بکاپ‌گیری RMAN، پاکسازی لاگ‌ها، جمع‌آوری لاگ‌های سیستم و مانیتورینگ). محدود کردن بی‌دقت این سرویس باعث از کار افتادن تمام این فرآیندها می‌شود.
  • راه‌حل و رفع تداخل: در اجرای بند 2.4.1.8 (ایجاد فایل /etc/cron.allow و حذف /etc/cron.deny)، باید حتماً کاربران oracle و grid فوراً به فایل /etc/cron.allow اضافه شوند. در غیر این صورت، وظایف زمان‌بندی‌شده اوراکل مختل خواهد شد.
  • عدم تداخل در مجوزها: اعمال محدودیت روی پوشه‌های /etc/cron.* تداخلی ایجاد نمی‌کند، زیرا کاربران اوراکل معمولاً از دستور crontab -e استفاده می‌کنند و وظایف آن‌ها مستقیماً در مسیر /var/spool/cron ذخیره می‌شود.

 

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

اسکریپت زیر وضعیت سرویس و سطح دسترسی فایل‌ها/پوشه‌های حیاتی cron و at را بررسی می‌کند:

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

modules/audit_13_Job_Schedulers_Cron_At.sh

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

Bash for Oracle DBAs

#!/bin/bash
# Script: audit13.sh
# Purpose: Audit Script for Job Schedulers - Cron & At (CIS 2.4)

echo "=========================================================================="
echo " CIS Requirement: 2.4 Job Schedulers"
echo " - Ensure cron daemon is active and permissions are tightly configured."
echo " Oracle Context:"
echo " - CRITICAL: 'oracle' and 'grid' users MUST be allowed to use cron."
echo " - Database backups (RMAN) and maintenance jobs rely heavily on crontab."
echo "=========================================================================="

FAIL_COUNT=0

echo -e "\n[*] Auditing Cron & At Configurations..."

# 1. Check crond service
if systemctl is-enabled crond &>/dev/null && systemctl is-active crond &>/dev/null; then
    echo -e "  \e[32m[PASS]\e[0m crond service is enabled and active."
else
    echo -e "  \e[31m[FAIL]\e[0m crond service is NOT enabled/active."
    FAIL_COUNT=$((FAIL_COUNT + 1))
fi

# 2. Check /etc/crontab permissions
if [ "$(stat -c "%a %U %G" /etc/crontab 2>/dev/null)" = "600 root root" ]; then
    echo -e "  \e[32m[PASS]\e[0m /etc/crontab permissions are correct (0600 root:root)."
else
    echo -e "  \e[31m[FAIL]\e[0m /etc/crontab permissions are incorrect."
    FAIL_COUNT=$((FAIL_COUNT + 1))
fi

# 3. Check cron directories permissions
for dir in /etc/cron.hourly /etc/cron.daily /etc/cron.weekly /etc/cron.monthly /etc/cron.d; do
    if [ -d "$dir" ]; then
        if [ "$(stat -c "%a %U %G" "$dir" 2>/dev/null)" = "700 root root" ]; then
            echo -e "  \e[32m[PASS]\e[0m $dir permissions are correct."
        else
            echo -e "  \e[31m[FAIL]\e[0m $dir permissions are incorrect."
            FAIL_COUNT=$((FAIL_COUNT + 1))
        fi
    fi
done

# 4. Check cron access control
if [ ! -f /etc/cron.deny ] && [ -f /etc/cron.allow ] && [ "$(stat -c "%a %U %G" /etc/cron.allow 2>/dev/null)" = "600 root root" ]; then
    echo -e "  \e[32m[PASS]\e[0m cron.allow exists (0600 root:root) and cron.deny is absent."
else
    echo -e "  \e[31m[FAIL]\e[0m cron access control is not properly configured."
    FAIL_COUNT=$((FAIL_COUNT + 1))
fi

# 5. Check at access control
if [ ! -f /etc/at.deny ] && [ -f /etc/at.allow ] && [ "$(stat -c "%a %U %G" /etc/at.allow 2>/dev/null)" = "600 root root" ]; then
    echo -e "  \e[32m[PASS]\e[0m at.allow exists (0600 root:root) and at.deny is absent."
else
    echo -e "  \e[31m[FAIL]\e[0m at access control is not properly configured."
    FAIL_COUNT=$((FAIL_COUNT + 1))
fi

# 6. Oracle Context: Check if oracle/grid are whitelisted in cron.allow
if grep -q "^oracle$" /etc/cron.allow 2>/dev/null || grep -q "^grid$" /etc/cron.allow 2>/dev/null; then
    echo -e "  \e[32m[PASS]\e[0m Oracle/Grid users are correctly whitelisted in /etc/cron.allow."
else
    echo -e "  \e[31m[FAIL]\e[0m Oracle/Grid users are MISSING from /etc/cron.allow!"
    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_13_Job_Schedulers_Cron_At.sh

#!/bin/bash
# Script: remediation13.sh
# Purpose: Configure Job Schedulers (Cron & At) (CIS 2.4)

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

echo "=========================================================================="
echo " Applying Remediation for CIS 2.4 (Job Schedulers)"
echo " Oracle Context: Ensuring 'oracle' and 'grid' can execute scheduled jobs."
echo "=========================================================================="

echo -e "\n[*] Configuring Cron and At..."

# 1. Enable and start crond
systemctl enable --now crond > /dev/null 2>&1
echo -e "  \e[32m[OK]\e[0m Enabled and started crond service."

# 2. Set permissions for /etc/crontab
chown root:root /etc/crontab
chmod 0600 /etc/crontab
echo -e "  \e[32m[OK]\e[0m Set permissions on /etc/crontab."

# 3. Set permissions for cron directories
for dir in /etc/cron.hourly /etc/cron.daily /etc/cron.weekly /etc/cron.monthly /etc/cron.d; do
    if [ -d "$dir" ]; then
        chown root:root "$dir"
        chmod 0700 "$dir"
    fi
done
echo -e "  \e[32m[OK]\e[0m Set permissions on /etc/cron.* directories."

# 4. Restrict crontab access
rm -f /etc/cron.deny
touch /etc/cron.allow
chown root:root /etc/cron.allow
chmod 0600 /etc/cron.allow

# 5. Restrict at access
rm -f /etc/at.deny
touch /etc/at.allow
chown root:root /etc/at.allow
chmod 0600 /etc/at.allow

echo -e "  \e[32m[OK]\e[0m Configured cron.allow and at.allow (denied others)."

# 6. Oracle DBA Exception: Allow oracle and grid users
grep -q "^oracle$" /etc/cron.allow || echo "oracle" >> /etc/cron.allow
grep -q "^grid$" /etc/cron.allow || echo "grid" >> /etc/cron.allow
# Optional: also allow root explicitly
grep -q "^root$" /etc/cron.allow || echo "root" >> /etc/cron.allow

echo -e "  \e[32m[OK]\e[0m Whitelisted 'root', 'oracle', and 'grid' users in /etc/cron.allow."

echo -e "\n\e[32m[+] REMEDIATION APPLIED SUCCESSFULLY\e[0m"

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

امن‌سازی پیکربندی شبکه و پارامترهای کرنل

می رویم.