امن‌سازی Oracle Linux 9 (مقاله بیست و هشتم): مدیریت دسترسی فایل‌های سیستم (System File Permissions)

در قسمت قبل

مدیریت دسترسی فایل‌های حسابرسی

انجام شد.

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

این مقاله به بررسی سطح دسترسی و مالکیت فایل‌های حیاتی سیستم (نظیر مدیریت کاربران و رمزعبور) و بررسی فایل‌های فاقد مالک یا دارای دسترسی‌های خطرناک می‌پردازد:

  • 7.1.1 Ensure permissions on /etc/passwd are configured
  • 7.1.2 Ensure permissions on /etc/passwd- are configured
  • 7.1.3 Ensure permissions on /etc/group are configured
  • 7.1.4 Ensure permissions on /etc/group- are configured
  • 7.1.5 Ensure permissions on /etc/shadow are configured
  • 7.1.6 Ensure permissions on /etc/shadow- are configured
  • 7.1.7 Ensure permissions on /etc/gshadow are configured
  • 7.1.8 Ensure permissions on /etc/gshadow- are configured
  • 7.1.9 Ensure permissions on /etc/shells are configured
  • 7.1.10 Ensure permissions on /etc/security/opasswd are configured
  • 7.1.11 Ensure world writable files and directories are secured
  • 7.1.12 Ensure no files or directories without an owner and a group exist
  • 7.1.13 Ensure SUID and SGID files are reviewed

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

فایل‌های پایه‌ای مانند passwd، shadow و group ساختار هویتی سیستم‌عامل را تشکیل می‌دهند. محافظت از این فایل‌ها و همچنین شناسایی فایل‌های بدون مالک (Orphaned)، قابل نوشتن برای همه (World-Writable) و فایل‌های دارای بیت‌های اجرایی ویژه (SUID/SGID) برای جلوگیری از افشای اطلاعات هویتی، کرک شدن رمزها و افزایش سطح دسترسی (Privilege Escalation) غیرمجاز کاملاً حیاتی است.

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

تنظیم سطح دسترسی فایل‌های کاربری (خواندن passwd توسط همه با 0644 و محدودیت شدید روی shadow با ) با نیازهای اوراکل کاملاً سازگار است.

  • نکته بسیار مهم (مربوط به بند 7.1.13): نرم‌افزارهای Oracle Database و Grid Infrastructure به شدت به فایل‌های دارای بیت‌های SUID/SGID وابسته‌اند (مانند فایل باینری oracle، extjob و jexec). حذف یا تغییر خودکار دسترسی این فایل‌ها در فرآیند امن‌سازی، باعث از کار افتادن فوری کلاستر و دیتابیس (بروز خطاهایی نظیر ORA-12546) خواهد شد. بنابراین بررسی SUID/SGID باید به‌صورت دستی انجام شود و مسیرهای $ORACLE_HOME و $GRID_HOME حتماً از این بازرسی مستثنی (Exclude) شوند.

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

اسکریپت زیر مالکیت و دسترسی فایل‌های سیستمی و همچنین وجود فایل‌های بدون مالک یا world-writable را بررسی می‌کند:

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

modules/audit_28_System_File_Permissions.sh

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

Bash for Oracle DBAs

#!/bin/bash
# Script: audit28.sh
# Purpose: Audit System File Permissions (CIS 7.1)

echo "=========================================================================="
echo " CIS Requirement: System File Permissions (CIS 7.1)"
echo " - Ensure permissions on /etc/passwd, /etc/shadow, /etc/group, etc. are configured (CIS 7.1.1 - 7.1.10)."
echo " - Ensure no world-writable files exist (CIS 7.1.11)."
echo " - Ensure no unowned files or directories exist (CIS 7.1.12)."
echo " - Audit SUID/SGID executables (CIS 7.1.13)."
echo " Oracle Context & Exceptions:"
echo " - Oracle requires read access to /etc/passwd (0644 is standard and safe)."
echo " - EXCEPTION: Oracle heavily relies on SUID/SGID binaries (e.g., oracle, extjob)."
echo "   Directories like /u01 MUST be excluded from automated SUID removal."
echo "   World-writable and unowned file checks exclude /u01, /proc, and /sys"
echo "   to prevent accidental damage to the database environment."
echo "=========================================================================="

check_file() {
    local file=$1
    local req_mode=$2
    local req_uid=$3
    local req_gid=$4

    if [ ! -f "$file" ]; then
        echo "[FAIL] $file does not exist."
        return
    fi

    local stat_out=$(stat -c "%a %U %G" "$file")
    read -r mode uid gid <<< "$stat_out"

    local pass=true
    if [ "$mode" != "$req_mode" ] && [ "$mode" -gt "$req_mode" ]; then pass=false; fi
    if [ "$uid" != "$req_uid" ]; then pass=false; fi
    if [[ "$gid" != "$req_gid" && "$gid" != "root" ]]; then pass=false; fi

    if $pass; then
        echo "[PASS] $file (Mode: $mode, Owner: $uid:$gid)"
    else
        echo "[FAIL] $file (Found Mode: $mode, Owner: $uid:$gid | Expected: <=$req_mode, Owner: $req_uid:$req_gid)"
    fi
}

# 7.1.1 to 7.1.10
check_file "/etc/passwd" "644" "root" "root"
check_file "/etc/passwd-" "600" "root" "root"
check_file "/etc/group" "644" "root" "root"
check_file "/etc/group-" "600" "root" "root"
check_file "/etc/shadow" "0" "root" "root"
check_file "/etc/shadow-" "0" "root" "root"
check_file "/etc/gshadow" "0" "root" "root"
check_file "/etc/gshadow-" "0" "root" "root"
check_file "/etc/shells" "644" "root" "root"

if [ -f "/etc/security/opasswd" ]; then
    check_file "/etc/security/opasswd" "600" "root" "root"
else
    echo "[PASS] /etc/security/opasswd does not exist (OK)."
fi

echo "-----------------------------------------------------------------"
echo "Checking for World-Writable, Unowned files, and SUID/SGID..."
echo "(Note: Excluding /proc, /sys, and Oracle homes: /u01)"
echo "-----------------------------------------------------------------"

# World Writable Files
WW_FILES=$(find / -xdev -type f -perm -0002 -print 2>/dev/null | grep -vE "^/proc|^/sys|^/u01")
if [ -z "$WW_FILES" ]; then
    echo "[PASS] No unexpected world-writable files found."
else
    echo "[FAIL] World-writable files found:"
    echo "$WW_FILES" | head -n 5
    echo "  ... (truncated for display)"
fi

# Unowned Files/Directories
UNOWNED=$(find / -xdev \( -nouser -o -nogroup \) -print 2>/dev/null | grep -vE "^/proc|^/sys|^/u01")
if [ -z "$UNOWNED" ]; then
    echo "[PASS] No unowned files/directories found."
else
    echo "[FAIL] Unowned files/directories found:"
    echo "$UNOWNED" | head -n 5
    echo "  ... (truncated for display)"
fi

echo "================================================================="
echo "Audit Complete."
echo "================================================================="

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

اسکریپت زیر دسترسی‌های امن را روی فایل‌های احراز هویت اعمال می‌کند. (رفع مشکلات فایل‌های بدون مالک و World-Writable نیازمند بررسی موردی مدیر سیستم است).

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

modules/remediate_28_System_File_Permissions.sh

#!/bin/bash
# Script: remediate_cis_7_1.sh
# Purpose: Fix permissions and ownership for system credential files

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

echo -e "\n[+] Remediating CIS 7.1..."

chown root:root /etc/passwd /etc/passwd- /etc/group /etc/group- /etc/shadow /etc/shadow- /etc/gshadow /etc/gshadow- /etc/shells /etc/security/opasswd 2>/dev/null

chmod 0644 /etc/passwd
chmod 0600 /etc/passwd-
chmod 0644 /etc/group
chmod 0600 /etc/group-
chmod 0000 /etc/shadow
chmod 0000 /etc/shadow-
chmod 0000 /etc/gshadow
chmod 0000 /etc/gshadow-
chmod 0644 /etc/shells
chmod 0600 /etc/security/opasswd 2>/dev/null || touch /etc/security/opasswd && chmod 0600 /etc/security/opasswd

echo "[+] Basic file permissions applied successfully."
echo "[!] Action Required: You must manually investigate and fix unowned files, world-writable files, and review SUID/SGID binaries (CIS 7.1.11 - 7.1.13)."

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

تنظیمات کاربران و گروه‌های محلی

می رویم.