امن‌سازی Oracle Linux 9 (بخش هفتم): پیکربندی سیاست رمزنگاری سراسری (System-wide Crypto Policy)

در قسمت قبل

امن‌سازی Oracle Linux 9 (بخش ششم): امن‌سازی پردازش‌ها (Process Hardening) و مدیریت Core Dump

انجام شد.

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

این مقاله به پوشش و پیاده‌سازی بندهای زیر از استاندارد CIS در خصوص System-wide Crypto Policy می‌پردازد:

  • 1.6.1 Ensure system-wide crypto policy is not set to LEGACY (Automated)
  • 1.6.2 Ensure system-wide crypto policy is configured correctly (Automated)
  • 1.6.3 Ensure no weak hash algorithms are allowed (Automated)
  • 1.6.4 Ensure SSH uses secure cipher suites (Automated)
  • 1.6.5 Ensure SSH uses secure MAC algorithms (Automated)
  • 1.6.6 Ensure SSH uses secure key exchange algorithms (Automated)
  • 1.6.7 Ensure SSH uses secure host and public key algorithms (Automated)

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

در Oracle Linux 9، سیاست رمزنگاری سراسری سیستم یک لایه متمرکز برای کنترل الگوریتم‌ها و تنظیمات رمزنگاری در کل سیستم است. به‌جای آن‌که هر سرویس تنظیمات رمزنگاری خودش را جداگانه داشته باشد، سیستم از یک policy واحد استفاده می‌کند که امنیت و یکنواختی بیشتری ایجاد می‌کند.

هدف CIS در این بخش، حذف الگوریتم‌های ضعیف مانند SHA1 و جلوگیری از استفاده از تنظیمات hardcoded در SSH است. این کار باعث می‌شود سرویس SSH از سیاست رمزنگاری سراسری سیستم پیروی کند و تنظیمات ناامن در فایل‌های پیکربندی، override نشوند.

از دید امنیتی، این رویکرد چند مزیت مهم دارد:

  • جلوگیری از استفاده ناخواسته از الگوریتم‌های ضعیف
  • یکپارچه‌سازی تنظیمات رمزنگاری در سطح سیستم
  • کاهش ریسک اشتباهات دستی در `sshd_config`
  • افزایش سازگاری با الزامات ممیزی و استانداردهای CIS

۳. سازگاری با Oracle Database و RAC

تغییر System-wide Crypto Policy در Oracle Linux 9 معمولاً برای Oracle Database و Oracle RAC شفاف است و اختلالی در عملکرد پایگاه داده ایجاد نمی‌کند. این تغییر بیشتر روی سرویس‌هایی مانند SSH اثر می‌گذارد و به‌ویژه زمانی مهم است که تنظیمات رمزنگاری به‌صورت hardcoded در `sshd_config` یا فایل‌های drop-in تعریف شده باشند.

در محیط‌های Oracle، حذف تنظیمات hardcoded SSH به این معناست که `sshd` به‌جای override شدن توسط تنظیمات محلی، از policy سراسری امن استفاده می‌کند. این موضوع برای دسترسی راه دور DBAها مهم است، چون هم امنیت حفظ می‌شود و هم اتصال مدیریتی از بین نمی‌رود.

در این مقاله از policy زیر استفاده می‌شود:

DEFAULT:NO-SHA1:CIS-SSH

و در صورت استفاده از FIPS، مقدار زیر نیز قابل قبول است:

FIPS:NO-SHA1:CIS-SSH

۴. نحوه بررسی وضعیت فعلی (Audit Script)

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

Bash for Oracle DBAs

این اسکریپت وضعیت سیاست رمزنگاری سیستم و همچنین وجود یا عدم وجود تنظیمات hardcoded در SSH را بررسی می‌کند:

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

modules/audit_07_System_Crypto_Policy.sh

#!/bin/bash
# Script: audit_cis_1_6.sh
# Purpose: Audit System-wide Crypto Policy (CIS 1.6)

echo "=========================================================================="
echo " CIS Requirement: 1.6 System-wide Crypto Policy"
echo " - Ensure system-wide crypto policy is set correctly (NO-SHA1, CIS-SSH)."
echo " - Ensure no hardcoded crypto settings exist in sshd_config."
echo " Oracle Context:"
echo " 1. Updating the system crypto policy is generally transparent to"
echo "    Oracle Database and RAC installations."
echo " 2. Removing hardcoded SSH ciphers ensures SSHD uses the system-wide"
echo "    secure policy without disrupting DBA remote access."
echo "=========================================================================="

FAIL_COUNT=0

echo -e "\n[*] 1. Checking System Crypto Policy..."
CURRENT_POLICY=$(update-crypto-policies --show 2>/dev/null)
if [[ "$CURRENT_POLICY" == *"DEFAULT:NO-SHA1:CIS-SSH"* || "$CURRENT_POLICY" == *"FIPS:NO-SHA1:CIS-SSH"* ]]; then
    echo -e "  \e[32m[PASS]\e[0m System Crypto Policy is $CURRENT_POLICY."
else
    echo -e "  \e[31m[FAIL]\e[0m Crypto Policy is $CURRENT_POLICY (Expected: DEFAULT:NO-SHA1:CIS-SSH)."
    FAIL_COUNT=$((FAIL_COUNT + 1))
fi

echo -e "\n[*] 2. Checking sshd_config for hardcoded crypto settings..."
HARDCODED=$(grep -h -E -i '^\s*(Ciphers|MACs|KexAlgorithms|GSSAPIKexAlgorithms|HostKeyAlgorithms|PubkeyAcceptedKeyTypes)' /etc/ssh/sshd_config /etc/ssh/sshd_config.d/*.conf 2>/dev/null)

if [ -z "$HARDCODED" ]; then
    echo -e "  \e[32m[PASS]\e[0m No hardcoded crypto settings found in SSH config."
else
    echo -e "  \e[31m[FAIL]\e[0m Hardcoded crypto settings found:"
    echo "$HARDCODED"
    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

منطق این اسکریپت ساده است: ابتدا policy فعال سیستم با `update-crypto-policies --show` خوانده می‌شود. اگر مقدار آن برابر `DEFAULT:NO-SHA1:CIS-SSH` یا `FIPS:NO-SHA1:CIS-SSH` باشد، این کنترل پاس می‌شود. سپس فایل‌های SSH بررسی می‌شوند تا هیچ directive سخت‌کد شده‌ای مانند `Ciphers` یا `MACs` باقی نمانده باشد.

۵. نحوه اعمال تنظیمات (Remediation Bash Script)

این اسکریپت تنظیمات ناامن SSH را غیرفعال کرده، یک module اختصاصی برای policy رمزنگاری ایجاد می‌کند و سپس policy را اعمال می‌نماید:

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

modules/remediate_07_System_Crypto_Policy.sh

#!/bin/bash
# Script: remediate_cis_1_6.sh
# Purpose: Configure System-wide Crypto Policy based on CIS (CIS 1.6)
# Context: Oracle Linux 9 (Database/RAC compatible)

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

echo -e "\n[+] Applying System-wide Crypto Policy (CIS 1.6)..."

# 1. Remove hardcoded crypto settings from SSH configs (CIS 1.6.2)
echo "[*] Cleaning up hardcoded crypto settings from sshd_config..."
sed -ri 's/^\s*(Ciphers|MACs|KexAlgorithms|GSSAPIKexAlgorithms|HostKeyAlgorithms|PubkeyAcceptedKeyTypes)/# \1/' /etc/ssh/sshd_config
if ls /etc/ssh/sshd_config.d/*.conf 1> /dev/null 2>&1; then
    sed -ri 's/^\s*(Ciphers|MACs|KexAlgorithms|GSSAPIKexAlgorithms|HostKeyAlgorithms|PubkeyAcceptedKeyTypes)/# \1/' /etc/ssh/sshd_config.d/*.conf
fi

# 2. Create custom policy module for SSH restrictions (CIS 1.6.4 to 1.6.7)
echo "[*] Creating custom module /etc/crypto-policies/policies/modules/CIS-SSH.pmod..."
cat <<EOF > /etc/crypto-policies/policies/modules/CIS-SSH.pmod
# Disable CBC and ChaCha20-Poly1305 for SSH
cipher@ssh = -*CBC -CHACHA20-POLY1305

# Disable MACs less than 128 bits
mac@ssh = -*MD5* -*UMAC-64*
EOF

# 3. Apply the Crypto Policy (CIS 1.6.1, 1.6.3)
echo "[*] Applying DEFAULT:NO-SHA1:CIS-SSH policy..."
update-crypto-policies --set DEFAULT:NO-SHA1:CIS-SSH

# 4. Restart SSHD to apply changes
echo "[*] Restarting SSHD service..."
systemctl restart sshd

echo -e "\n[+] Crypto policy updated and SSHD restarted successfully."

این remediation چهار کار اصلی انجام می‌دهد: ابتدا تنظیمات hardcoded را از `sshd_config` و فایل‌های زیرمجموعه comment می‌کند، سپس فایل policy module به نام `CIS-SSH.pmod` را می‌سازد، بعد policy سراسری `DEFAULT:NO-SHA1:CIS-SSH` را اعمال می‌کند، و در پایان سرویس `sshd` را restart می‌نماید.

محتوای فایل policy سفارشی به‌صورت زیر است:

# Disable CBC and ChaCha20-Poly1305 for SSH
cipher@ssh = -*CBC -CHACHA20-POLY1305

# Disable MACs less than 128 bits
mac@ssh = -*MD5* -*UMAC-64*

۶. جمع‌بندی

در این بخش، سیاست رمزنگاری سراسری Oracle Linux 9 بر اساس CIS 1.6 بررسی و اصلاح شد. نتیجه این تغییر، حذف الگوریتم‌های ضعیف، جلوگیری از تنظیمات hardcoded در SSH، و استفاده از یک policy متمرکز و امن برای کل سیستم است.

از منظر Oracle، این تغییر با Database و RAC سازگار است و در عین حال امنیت دسترسی مدیریتی را نیز حفظ می‌کند. بنابراین این کنترل، هم از نظر Compliance و هم از نظر عملیاتی برای سرورهای Oracle توصیه می‌شود.

در قسمت بعد

پیکربندی هشدارهای ورود از طریق Command Line

انجام خواهد شد.