امن‌سازی Oracle Linux 9 (مقاله دوازدهم): پیکربندی همگام‌سازی زمان (Time Synchronization - Chrony)

در قسمت قبل

حذف کلاینت‌های غیرضروری سرویس‌ها

انجام شد.

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

این بخش از استاندارد بر پیکربندی امن و دقیق سرویس همگام‌سازی زمان تمرکز دارد:

  • 2.3.1 Ensure time synchronization is in use (Automated)
  • 2.3.2 Ensure chrony is configured (Automated)
  • 2.3.3 Ensure chrony is not run as the root user (Automated)

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

  • مفهوم: همگام‌سازی دقیق زمان برای بررسی لاگ‌ها (Log Auditing)، تطبیق رویدادهای امنیتی در شبکه و عملکرد صحیح پروتکل‌های احراز هویت (مانند Kerberos) کاملاً حیاتی است. در Oracle Linux 9، سرویس پیش‌فرض برای این کار chronyd است.
  • دلیل امنیتی: اجرای سرویس همگام‌سازی زمان با کاربری غیر از root (مانند کاربر اختصاصی chrony) باعث کاهش سطح دسترسی آن می‌شود. در صورت کشف و سوءاستفاده از یک آسیب‌پذیری در این سرویس، سیستم کلان به خطر نمی‌افتد و اصل حداقل دسترسی (Principle of Least Privilege) رعایت می‌شود.

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

  • حیاتی برای Oracle RAC: همگام‌سازی زمان برای کلاسترهای اوراکل (Grid Infrastructure) به شدت بحرانی است. اگر سرویس chrony در سیستم‌عامل در حال اجرا باشد، سرویس زمان‌سنجی کلاستر اوراکل یعنی CTSS به صورت خودکار در حالت ناظر (Observer Mode) قرار می‌گیرد که این یک رفتار کاملاً استاندارد و توصیه‌شده توسط اوراکل است.
  • بدون تداخل: اجرای chrony با کاربر غیر-root هیچ‌گونه تداخلی با اوراکل ایجاد نمی‌کند، زیرا اوراکل زمان سیستم را به صورت مستقیم از کرنل دریافت می‌کند.
  • نکته مهم کلاستر: سرورهای NTP تعریف شده در فایل /etc/chrony.conf باید برای تمامی نودهای کلاستر RAC دقیقاً یکسان باشند تا از بروز خطای همگام‌سازی، پدیده Split-Brain یا Evict شدن (اخراج) نودها از کلاستر جلوگیری شود.

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

اسکریپت زیر بررسی می‌کند که آیا chrony نصب شده، سرورهای NTP تنظیم شده‌اند و آیا سرویس با کاربر chrony اجرا می‌شود یا خیر:

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

modules/audit_12_Time_Synchronization_Chrony.sh

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

Bash for Oracle DBAs

#!/bin/bash
# Script: audit12.sh
# Purpose: Audit Script for Time Sync (CIS 2.3)

echo "=========================================================================="
echo " CIS Requirement: 2.3 Time Synchronization"
echo " - Ensure time synchronization is in use and properly configured (Chrony)."
echo " Oracle Context:"
echo " - Time sync is CRITICAL for Oracle RAC/Grid Infrastructure."
echo " - 'chronyd' is the recommended time service for Oracle DB 19c/23ai on OL9."
echo " - When chronyd is active, Oracle CTSS automatically runs in Observer mode."
echo "=========================================================================="

FAIL_COUNT=0

echo -e "\n[*] Auditing Time Synchronization (Chrony)..."

# 1. Check if chrony is installed
if rpm -q chrony &>/dev/null; then
    echo -e "  \e[32m[PASS]\e[0m 'chrony' package is installed."
else
    echo -e "  \e[31m[FAIL]\e[0m 'chrony' package is NOT installed."
    FAIL_COUNT=$((FAIL_COUNT + 1))
fi

# 2. Check chrony configuration for servers/pools
if grep -E '^(server|pool)' /etc/chrony.conf &>/dev/null; then
    echo -e "  \e[32m[PASS]\e[0m Remote time servers are configured in /etc/chrony.conf."
else
    echo -e "  \e[31m[FAIL]\e[0m No remote time servers (server/pool) configured."
    FAIL_COUNT=$((FAIL_COUNT + 1))
fi

# 3. Check if chrony runs as non-root (user 'chrony')
if grep -q 'OPTIONS.*-u chrony' /etc/sysconfig/chronyd 2>/dev/null; then
    echo -e "  \e[32m[PASS]\e[0m chronyd is configured to run as user 'chrony'."
else
    echo -e "  \e[31m[FAIL]\e[0m chronyd is NOT explicitly configured to run as user 'chrony'."
    FAIL_COUNT=$((FAIL_COUNT + 1))
fi

# 4. Check service status
if systemctl is-enabled chronyd &>/dev/null; then
    echo -e "  \e[32m[PASS]\e[0m chronyd service is enabled."
else
    echo -e "  \e[31m[FAIL]\e[0m chronyd service is NOT enabled."
    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)

در این اسکریپت، ابتدا آدرس سرور NTP از کاربر پرسیده می‌شود، سپس بسته chrony نصب شده، آدرس سرور در فایل کانفیگ جایگذاری می‌شود و تنظیمات کاربر غیر-root اعمال می‌گردد:

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

modules/remediate_12_Time_Synchronization_Chrony.sh

#!/bin/bash
# Script: remediation12.sh
# Purpose: Configure Time Synchronization via Chrony (CIS 2.3)

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

echo "=========================================================================="
echo " Applying Remediation for CIS 2.3 (Time Synchronization)"
echo " Oracle Context: chronyd setup is fully supported and required for Oracle."
echo "=========================================================================="

echo -e "\n[*] Configuring Time Synchronization (Chrony)..."

# Ask user for NTP Server IP/Hostname
read -p "Enter your primary NTP server address (e.g., 192.168.1.50 or pool.ntp.org): " NTP_SERVER

if [ -z "$NTP_SERVER" ]; then
    echo -e "\n\e[31m[-] NTP Server address cannot be empty. Exiting.\e[0m"
    exit 1
fi

# 1. Install chrony if not present
dnf install -y chrony > /dev/null 2>&1

# 2. Configure NTP Server in chrony.conf
cp /etc/chrony.conf /etc/chrony.conf.bak
# Remove existing default pools/servers to avoid conflicts
sed -i '/^pool /d' /etc/chrony.conf
sed -i '/^server /d' /etc/chrony.conf
# Add the user-provided NTP server
echo "server $NTP_SERVER iburst" >> /etc/chrony.conf
echo -e "  \e[32m[OK]\e[0m Set NTP server to $NTP_SERVER in /etc/chrony.conf"

# 3. Ensure it does not run as root
SYSCONFIG_FILE="/etc/sysconfig/chronyd"
if grep -q "^OPTIONS" "$SYSCONFIG_FILE"; then
    if ! grep -q 'OPTIONS.*-u chrony' "$SYSCONFIG_FILE"; then
        sed -i 's/^OPTIONS="\(.*\)"/OPTIONS="\1 -u chrony"/' "$SYSCONFIG_FILE"
    fi
else
    echo 'OPTIONS="-u chrony"' >> "$SYSCONFIG_FILE"
fi
echo -e "  \e[32m[OK]\e[0m Configured chronyd to run as 'chrony' user."

# 4. Enable and restart the service
systemctl enable --now chronyd > /dev/null 2>&1
systemctl restart chronyd
echo -e "  \e[32m[OK]\e[0m chronyd service enabled and restarted."

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

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

پیکربندی زمان‌بندها (Job Schedulers - Cron & At)

می رویم.