در قسمت قبل
غیرفعالسازی ماژولهای فایلسیستم غیرضروری
انجام شد.
الزامات CIS Benchmark (بخش ۱.۱.۲)
این مقاله به پوشش و پیادهسازی بندهای زیر از استاندارد CIS میپردازد:
- 1.1.2.1 Configure /tmp (Separate partition, nodev, nosuid, noexec)
- 1.1.2.2 Configure /dev/shm (Separate partition, nodev, nosuid, noexec)
- 1.1.2.3 Configure /home (Separate partition, nodev, nosuid)
- 1.1.2.4 Configure /var (Separate partition, nodev, nosuid)
- 1.1.2.5 Configure /var/tmp (Separate partition, nodev, nosuid, noexec)
- 1.1.2.6 Configure /var/log (Separate partition, nodev, nosuid, noexec)
- 1.1.2.7 Configure /var/log/audit (Separate partition, nodev, nosuid, noexec)
۱. مفهوم و دلیل (Concept & Rationale)
چرا جداسازی پارتیشنها؟
در استانداردهای امنیتی، مسیرهایی که کاربران عادی به آنها دسترسی نوشتن دارند (مانند /tmp و /dev/shm) یا دادههای متغیر سیستم در آنها قرار دارد (مانند /var و /var/log) باید از پارتیشن ریشه (/) جدا شوند. این کار از پر شدن کل دیسک (Resource Exhaustion) که میتواند منجر به از کار افتادن سرویسها شود، جلوگیری میکند.
نکته بسیار حیاتی: الزام «جدا بودن پارتیشنها» حتماً باید در زمان نصب سیستمعامل (OS Installation) رعایت و پیادهسازی شود. جداسازی پارتیشنهای کلیدی مانند /var پس از نصب لینوکس، فرآیندی پرریسک است که نیازمند بوت سیستم در Rescue Mode و انتقال دستی دادهها میباشد. اسکریپتهای این مقاله تنها در صورتی کار میکنند که پارتیشنها از پیش جدا شده باشند.
چرا محدودیتهای Mount Options؟
پس از جداسازی، باید محدودیتهای زیر روی این پارتیشنها اعمال شود تا سطح حمله کاهش یابد:
- nodev (No Devices): جلوگیری از ایجاد و استفاده از فایلهای Character/Block Device مخرب در این پارتیشنها.
- nosuid (No SetUID): نادیده گرفتن بیتهای SUID/SGID. جلوگیری از اجرای فایلها با دسترسی کاربر مالک (پیشگیری از افزایش سطح دسترسی به Root).
- noexec (No Execution): جلوگیری از اجرای مستقیم اسکریپتها یا باینریها. این گزینه برای جلوگیری از اجرای بدافزارها در پوشههای موقت بسیار مفید است.
۲. بررسی سازگاری با پایگاه داده Oracle (آپدیتشده)
تداخلات بالقوه و راهکار:
اعمال گزینه noexec روی پارتیشنهای /tmp و /var/tmp، فرآیند نصب محصولات اوراکل (Database و Grid Infrastructure) و همچنین اعمال پچها (توسط ابزار OPatch) را مختل میکند؛ زیرا اوراکل اسکریپتهای نصب، فایلهای کتابخانهای (.so) و باینریهای موقت خود را در این مسیرها استخراج و اجرا میکند.
همچنین همانطور که پیشتر اشاره شد، اعمال noexec روی /dev/shm باعث قطعی کامل (Crash) دیتابیس و RAC به دلیل مکانیزم مدیریت حافظه (AMM/ASMM) میشود که استثنای آن به صورت دائمی در اسکریپت لحاظ شده است.
راهکار اجرایی برای DBAها (عملیات نصب و پچینگ):
در زمان نصب اولیه یا اعمال پچهای دورهای (RU/RUR)، مدیر سیستم یا پایگاه داده باید موقتاً محدودیت اجرا را بردارد و پس از اتمام کار، مجدداً سرور را به حالت امن بازگرداند:
# Before Oracle Installation/Patching:
mount -o remount,exec /tmp
mount -o remount,exec /var/tmp
# After completion:
mount -o remount,noexec /tmp
mount -o remount,noexec /var/tmp
۳. نحوه بررسی وضعیت فعلی (Audit Script)
این اسکریپت وضعیت جدا بودن پارتیشنها و اعمال Mount Options امنیتی را بررسی میکند:
لینک این اسکریپت در github:
modules/audit_02_Configure_Mount_Options.sh
در صورتی که با bash script آشنا نیستید، می توانید به آموزشی که برای دیتابیس ادمین ها در سایت گذاشته ام مراجعه کنید.
Bash for Oracle DBAs
#!/bin/bash
# Script: audit_cis_1_1_2.sh
# Purpose: Audit Filesystem Partitions and Mount Options (CIS 1.1.2 - 1.1.8)
FAIL_COUNT=0
echo -e "\n=========================================================================="
echo -e "[+] AUDIT: CIS 1.1.2 to 1.1.8 - Partitions & Mount Options"
echo -e "--------------------------------------------------------------------------"
echo -e "CIS Requirement : Separate partitions for /tmp, /dev/shm, /home, /var,"
echo -e " /var/tmp, /var/log, /var/log/audit."
echo -e " Mount options: nodev, nosuid, noexec (where applicable)."
echo -e "Oracle Context : CRITICAL EXCEPTION! /dev/shm MUST NOT have 'noexec'."
echo -e " Oracle DB/RAC requires execution rights on /dev/shm."
echo -e " /tmp also might need exec during Oracle installation,"
echo -e " but can be noexec post-install. Assuming post-install."
echo -e "==========================================================================\n"
# Format: "Partition:Required_Options"
declare -A PART_REQS=(
["/tmp"]="nodev,nosuid,noexec"
["/dev/shm"]="nodev,nosuid" # EXCEPTION: noexec is omitted for Oracle
["/home"]="nodev,nosuid"
["/var"]="nodev,nosuid"
["/var/tmp"]="nodev,nosuid,noexec"
["/var/log"]="nodev,nosuid,noexec"
["/var/log/audit"]="nodev,nosuid,noexec"
)
for part in "${!PART_REQS[@]}"; do
req_opts="${PART_REQS[$part]}"
MOUNT_INFO=$(findmnt -n -o OPTIONS "$part" 2>/dev/null)
if [ -z "$MOUNT_INFO" ]; then
echo -e " [FAIL] $part is NOT a separate partition!"
FAIL_COUNT=$((FAIL_COUNT + 1))
else
# Check each required option
IFS=',' read -ra OPTS <<< "$req_opts"
MISSING_OPTS=""
for opt in "${OPTS[@]}"; do
if ! echo "$MOUNT_INFO" | grep -qw "$opt"; then
MISSING_OPTS="$MISSING_OPTS $opt"
fi
done
if [ -n "$MISSING_OPTS" ]; then
echo -e " [FAIL] $part exists but missing options:$MISSING_OPTS (Current: $MOUNT_INFO)"
FAIL_COUNT=$((FAIL_COUNT + 1))
else
echo -e " [PASS] $part exists with secure options ($req_opts)"
fi
fi
done
echo -e "--------------------------------------------------------------------------"
if [ "$FAIL_COUNT" -eq 0 ]; then
echo -e "[+] AUDIT RESULT: PASSED (All partitions and mount options are secure.)\n"
exit 0
else
echo -e "[-] AUDIT RESULT: FAILED ($FAIL_COUNT issue(s) detected.)\n"
exit 1
fi
۴. نحوه اعمال تنظیمات (Remediation Bash Script)
این اسکریپت، گزینههای امنیتی را به /etc/fstab اضافه کرده و برای /tmp از پیکربندی systemd در Oracle Linux 9 استفاده میکند. (فرض بر این است که پارتیشنها قبلاً ساخته شدهاند).
لینک این اسکریپت در github:
modules/remediate_02_Configure_Mount_Options.sh
#!/bin/bash
# Script: remediate_cis_1_1_2.sh
# Purpose: Apply Secure Mount Options (CIS 1.1.2 - 1.1.8)
if [ "$EUID" -ne 0 ]; then echo "Please run as root"; exit 1; fi
echo -e "\n[+] Applying Remediation for Partitions & Mount Options..."
echo -e "[!] Note: Skipping 'noexec' on /dev/shm for Oracle compatibility.\n"
# 3. Function to update /etc/fstab safely
update_fstab() {
local mount_point=$1
local options=$2
if grep -q "^[^#].*[[:space:]]${mount_point}[[:space:]]" /etc/fstab; then
for opt in $(echo "$options" | tr ',' ' '); do
sed -i "/^[[:space:]]*[^#].*[[:space:]]${mount_point//\//\\/}[[:space:]]/ s/\([ \t]*[^\t ]*[ \t]*[^\t ]*[ \t]*[^\t ]*[ \t]*\)\([^ \t]*\)/\1\2,$opt/" /etc/fstab
done
sed -i "/^[[:space:]]*[^#].*[[:space:]]${mount_point//\//\\/}[[:space:]]/ s/,\{2,\}/,/g" /etc/fstab
sed -i "/^[[:space:]]*[^#].*[[:space:]]${mount_point//\//\\/}[[:space:]]/ s/,[ \t]/ /g" /etc/fstab
mount -o remount "$mount_point" 2>/dev/null
echo " [+] Updated options for $mount_point"
else
echo " [-] WARNING: $mount_point is not in /etc/fstab (requires architectural change)."
fi
}
# 1. Configure /tmp (Check fstab first, fallback to systemd)
echo " [*] Configuring /tmp..."
if grep -q "^[^#].*[[:space:]]/tmp[[:space:]]" /etc/fstab; then
update_fstab "/tmp" "nodev,nosuid,noexec"
else
echo " Using systemd (tmpfs) for /tmp..."
cp /usr/lib/systemd/system/tmp.mount /etc/systemd/system/ 2>/dev/null
sed -i 's/^Options=.*/Options=mode=1777,strictatime,noexec,nodev,nosuid/' /etc/systemd/system/tmp.mount
systemctl daemon-reload
systemctl enable tmp.mount --now
mount -o remount /tmp 2>/dev/null
fi
# 2. Fix /dev/shm (Add to fstab explicitly for Oracle)
echo " [*] Configuring /dev/shm explicitly for Oracle..."
if ! grep -q "^tmpfs[[:space:]]*/dev/shm" /etc/fstab; then
echo "tmpfs /dev/shm tmpfs defaults,nodev,nosuid,seclabel 0 0" >> /etc/fstab
else
sed -i -E 's|^(tmpfs[[:space:]]+/dev/shm[[:space:]]+tmpfs[[:space:]]+)([^[:space:]]+)|\1defaults,nodev,nosuid,seclabel|' /etc/fstab
fi
mount -o remount /dev/shm 2>/dev/null
# Update other partitions
update_fstab "/home" "nodev,nosuid"
update_fstab "/var" "nodev,nosuid"
update_fstab "/var/tmp" "nodev,nosuid,noexec"
update_fstab "/var/log" "nodev,nosuid,noexec"
update_fstab "/var/log/audit" "nodev,nosuid,noexec"
echo -e "\n[+] Mount options hardening completed."
در قسمت بعد به سراغ:
امنسازی مدیریت بستهها و مخازن محلی
می رویم.