Tag: oval

  • Debian Oval Security auto check

    Debian Oval Security auto check

    วันก่อนเขียนสคริปต์ตรวจสอบ Debian oval อัตโนมัติเขียนเสร็จ อ่ะ ไหนๆ สมัครโปรของ เจ๊มินิ (gemini.google.com) แล้ว ให้เจ๊ช่วยขัดเกลาสคริปต์ bash script บ้านๆ เสร็จปุบ ดูหรูไฮ… ทันตาเห็น จากสคริปต์ พบว่าเขียน bash ยังไงให้ถูก ? โวะเพิ่งรู้ว่ามีนั่นนี่โน่น…

    • สร้างสคริปต์ gem-oval-check.sh มีข้อความว่า
    gem-oval-check.sh
    #!/usr/bin/env bash
    # OVAL Updater & Parser - Final Fixed Version
    # Description: Downloads Debian OVAL definitions, runs check, and sends an email report.
    
    # -------------------------
    # 1. Configuration & Variables
    # -------------------------
    readonly DEBIAN_CODENAME=$(lsb_release -c | awk '{print $2}')
    readonly DEBIAN_RELEASE=$(cat /etc/debian_version)
    readonly SERVER_HOSTNAME=$(hostname -f)
    readonly SERVER_IP=$(hostname -I | awk '{print $1}')
    
    readonly URL="https://www.debian.org/security/oval/oval-definitions-${DEBIAN_CODENAME}.xml.bz2"
    readonly DEST_BZ2="oval-definitions-${DEBIAN_CODENAME}.xml.bz2"
    readonly DEST_XML="oval-definitions-${DEBIAN_CODENAME}.xml"
    readonly TMP_BZ2="/tmp/${DEST_BZ2}"
    readonly RESULT_XML="oval_result.xml"
    readonly ID_FILE="/tmp/oval_ids_${DEBIAN_CODENAME}"
    readonly MSG_FILE="/tmp/oval_messages_${DEBIAN_CODENAME}"
    readonly CVE_REPORT="/tmp/oval_cve_titles_parsed_${DEBIAN_CODENAME}"
    
    readonly REPORT_TO="***********Your E-mail***********"
    SUBJECT="OVAL Report ${SERVER_HOSTNAME} $(date +%F)"
    
    OVAL_TIMESTAMP="N/A"
    OVAL_VERSION="N/A"
    
    # -------------------------
    # 2. Functions
    # -------------------------
    
    # Function for clean up temporary files
    cleanup() {
        rm -f "${ID_FILE}" "${MSG_FILE}" "${CVE_REPORT}"
    }
    trap cleanup EXIT
    
    # Function to generate URL based on the security ID (CVE or DSA)
    generate_url() {
        local id_string=$1
        if [[ "$id_string" =~ ^CVE-[0-9]{4}-[0-9]+$ ]]; then
            echo "https://cve.mitre.org/cgi-bin/cvename.cgi?name=${id_string}"
        elif [[ "$id_string" =~ ^DSA-[0-9]+-[0-9]+$ ]]; then
            echo "https://www.debian.org/security/${id_string}"
        else
            echo "(No Link Available)"
        fi
    }
    
    # Function to generate and send email
    send_report() {
        local exit_status=$1
        local message_type=$2 # 'SUCCESS', 'INFO', 'ERROR', 'CVE_FOUND'
        
        local status_prefix=""
        case "${message_type}" in
            "SUCCESS")
                status_prefix="[OVAL OK] Not Found"
                ;;
            "INFO")
                status_prefix="[OVAL INFO] Not Found (Old File Check)"
                ;;
            "ERROR")
                status_prefix="[OVAL ERROR]"
                ;;
            "CVE_FOUND")
                status_prefix="[OVAL ALERT] CVE Found!"
                ;;
        esac
        
        local final_subject="${status_prefix} - OVAL Report ${SERVER_HOSTNAME} $(date +%F)"
    
        {
            echo "Host Name: ${SERVER_HOSTNAME}"
            echo "IP Address: ${SERVER_IP}"
            echo "-------------------------------------"
            echo "OVAL Version: ${OVAL_VERSION}"
            echo "OVAL Timestamp: ${OVAL_TIMESTAMP}"
            echo "-------------------------------------"
        } > "${MSG_FILE}"
    
        case "${message_type}" in
            "SUCCESS")
                echo "**********************" >> "${MSG_FILE}"
                echo "* Congratulations!  *" >> "${MSG_FILE}"
                echo "**********************" >> "${MSG_FILE}"
                echo "Distribution: ${DEBIAN_CODENAME} Release: ${DEBIAN_RELEASE}" >> "${MSG_FILE}"
                echo "No CVE found" >> "${MSG_FILE}"
                echo "No definitions with result=true found" >> "${MSG_FILE}"
                ;;
            "INFO")
                echo "**********************" >> "${MSG_FILE}"
                echo "* OVAL Check Ran   *" >> "${MSG_FILE}"
                echo "**********************" >> "${MSG_FILE}"
                echo "File not modified (HTTP 304). Check performed on local file." >> "${MSG_FILE}"
                echo "Distribution: ${DEBIAN_CODENAME} Release: ${DEBIAN_RELEASE}" >> "${MSG_FILE}"
                echo "No CVE found" >> "${MSG_FILE}"
                ;;
            "ERROR")
                echo "**********************" >> "${MSG_FILE}"
                echo "* ERROR!       *" >> "${MSG_FILE}"
                echo "**********************" >> "${MSG_FILE}"
                echo "$3" >> "${MSG_FILE}"
                ;;
            "CVE_FOUND")
                echo "**********************" >> "${MSG_FILE}"
                echo "* CVE Found!!!   *" >> "${MSG_FILE}"
                echo "**********************" >> "${MSG_FILE}"
                echo "Distribution: ${DEBIAN_CODENAME} Release: ${DEBIAN_RELEASE}" >> "${MSG_FILE}"
                echo "--------------------------------------------------------" >> "${MSG_FILE}"
                echo "Package | Security ID | URL" >> "${MSG_FILE}"
                echo "--------------------------------------------------------" >> "${MSG_FILE}"
                cat "${CVE_REPORT}" >> "${MSG_FILE}" 
                ;;
        esac
    
        if ! mail -s "${final_subject}" "${REPORT_TO}" < "${MSG_FILE}"; then
            echo "🚨 ERROR: Failed to send email report to ${REPORT_TO}" >&2
        fi
        echo "Report sent to ${REPORT_TO}. Exiting with status ${exit_status}."
        exit "${exit_status}"
    }
    
    # -------------------------
    # 3. Main Logic
    # -------------------------
    
    echo "🚀 Starting OVAL check for Debian ${DEBIAN_CODENAME} (${DEBIAN_RELEASE}) on ${SERVER_HOSTNAME} (${SERVER_IP})..."
    
    STATUS=$(curl -s -f -w "%{http_code}" -z "${TMP_BZ2}" -o "${TMP_BZ2}" "${URL}" || echo "999")
    
    case "${STATUS}" in
        200)
            echo "✅ New/updated file downloaded (HTTP 200). Processing..."
            
            rm -f "${DEST_XML}" "${RESULT_XML}"
            cp "${TMP_BZ2}" "${DEST_BZ2}"
            
            ;&
    
        304)
            if [ "$STATUS" -eq 304 ]; then
                echo "ℹ️ OVAL file not modified (HTTP 304). Running check on existing file..."
            fi
            
            if [ ! -f "${DEST_XML}" ] && [ ! -f "${DEST_BZ2}" ]; then
                if [ -f "${TMP_BZ2}" ]; then
                    echo "⚠️ Local file missing. Using cached file for check."
                    cp "${TMP_BZ2}" "${DEST_BZ2}"
                else
                    send_report 1 "ERROR" "Cannot process OVAL check. Local files missing (HTTP ${STATUS})."
                fi
            fi
    
            if [ ! -f "${DEST_XML}" ]; then
                if ! bunzip2 -f "${DEST_BZ2}"; then
                    send_report 1 "ERROR" "Failed to decompress OVAL file: bunzip2 failed."
                fi
            fi
    
            echo "🔬 Running OVAL evaluation with oscap..."
            oscap oval eval --results "${RESULT_XML}" "${DEST_XML}" || true 
    
            if [ -f "${RESULT_XML}" ]; then
                OVAL_VERSION=$(grep 'oval:schema_version' "${DEST_XML}" 2>/dev/null | cut -d\> -f2 | cut -d\< -f1 | head -1 || echo "N/A")
                OVAL_TIMESTAMP=$(grep 'oval:timestamp' "${DEST_XML}" 2>/dev/null | cut -d\> -f2 | cut -d\< -f1 | head -1 || echo "N/A")
    
                echo "🔎 Extracted OVAL Version: ${OVAL_VERSION}, Timestamp: ${OVAL_TIMESTAMP} from result.xml"
            fi
            # ----------------------------------------------------------------------
    
            grep "<definition " "${RESULT_XML}" 2>/dev/null | \
              sed -nE 's/.*id="([^"]+)".*result="([^"]+)".*/\1,\2/p' | \
              awk -F, 'tolower($2) ~ /true/ {print $1}' | sort -u > "${ID_FILE}"
            
            if [ -s "${ID_FILE}" ]; then
                echo "🚨 Found $(wc -l < "${ID_FILE}") definitions with result=true."
                
                : > "${CVE_REPORT}" 
                
                while IFS= read -r ID || [ -n "${ID}" ]; do
                    [ -z "${ID}" ] && continue
                    
                    CVE_TITLE=$(grep -a -A6 -F -- "$ID" "${RESULT_XML}" 2>/dev/null | \
                                sed -n 's/.*<title>\(.*\)<\/title>.*/\1/p' | head -n1 || true)
    
                    if [ -n "$CVE_TITLE" ]; then
                        SECURITY_ID=$(echo "${CVE_TITLE}" | awk '{print $1}')
                        PACKAGE_NAME=$(echo "${CVE_TITLE}" | awk '{print $2}')
                        
                        LINK=$(generate_url "${SECURITY_ID}")
                        
                        PARSED_CVE="${PACKAGE_NAME} | ${SECURITY_ID} | ${LINK}"
                    else
                        PARSED_CVE="(no-title-found-for-${ID})"
                    fi
                    
                    echo "${PARSED_CVE}" >> "${CVE_REPORT}"
                done < "${ID_FILE}"
    
                send_report 0 "CVE_FOUND"
    
            else
                echo "✅ No vulnerable definitions found (result=true)."
                if [ "$STATUS" -eq 304 ]; then
                     send_report 0 "INFO"
                else
                     send_report 0 "SUCCESS"
                fi
            fi
            ;;
    
        999)
            send_report 1 "ERROR" "Network/Curl failed to reach ${URL}"
            ;;
    
        *)
            send_report 1 "ERROR" "Something went wrong: Unexpected HTTP status code ${STATUS} from ${URL}"
            ;;
    esac
    • เปลี่ยนสิทธิ์
    Bash
    chmod +x gem-oval-check.sh
    • อย่าลืมก่อนใช้งานต้องติดตั้ง openscap-scanner ด้วยคำสั่ง
    Bash
    apt install -y openscap-scanner
    • จากนั้นตั้ง crontab รันวันละครั้ง
    Bash
    crontab -e
    • กรอกข้อมูล
    Bash
    30 2 * * * /path_to_script/gem-oval-check.sh > /dev/null 2>&1
    • ก็จะมีอีเมลส่งมาทุกวันนนน
    • จบ
    • ขอให้สนุก
  • OVAL Definition Generator Information

    เพิ่มเติมจาก
    https://sysadmin.psu.ac.th/2023/02/14/ubuntu-oval/
    OVAL Definition Generator Information (ทางขวาในรายงาน) เป็น Canonical USN OVAL Generator ซึ่งรายงานจะสรุปเป็นหมวดหมู่ช่องโหว่

    ต่างจากรายงานที่โครงการ Data Lake ส่งมาใช้ OVAL Definition Generator Information เป็น Canonical CVE OVAL Generator เน้นแสดงตาม CVE จึงไม่มีสรุปว่า CVE เกี่ยวกับช่องโหว่ใด

  • Debian Oval

    https://wiki.debian.org/DebianOval

    1. ระบบปฏิบัติการ Debian 12.4
    2. ล็อคอินด้วย root หรือ user ที่สามารถเรียกใช้ sudo ได้
    3. ติดตั้ง openscap-scanner ด้วยคำสั่ง
     apt install -y openscap-scanner
    1. ดาวน์โหลดไฟล์ Definition จาก https://www.debian.org/security/oval/ เลือกไฟล์ให้ตรงกับรุ่น ของ Debian ที่ใช้งาน ตัวอย่างนี้ใช้ Bookworm (รุ่น 12.4) โหลดไฟล์ชื่อ oval-definitions-bookworm.xml.bz2
    2. ขยายไฟล์ที่ดาวน์โหลดมาด้วยคำสั่ง
    bunzip2  oval-definitions-bookworm.xml.bz2
    1. ต่อด้วยคำสั่ง
    oscap oval eval --report report.html oval-definitions-bookworm.xml
    1. นำไฟล์ report.html มาเปิดใน web browser
    1. ช่อง Result ต้องเป็น false ถึงจะ Ok ?
    2. จบขอให้สนุก
  • Ubuntu OVAL Update2

    จากโพสตั้งต้น เมื่อ 6 เดือนก่อนที่
    https://sysadmin.psu.ac.th/2023/02/14/ubuntu-oval/

    มาดูว่ามีอะไรเปลี่ยนแปลงไปบ้างในรายงาน OVAL

    1. OVAL Results Generator

    1.1. v1.2.16 เมื่อวันที่ 6Feb2023@1632 สำหรับ Ubuntu 20.04 LTS
    1.2. v1.2.17 เมื่อวันที่ 18Aug2023@0234 สำหรับ Ubuntu 22.04 LTS

    1. OVAL Definition Generator

    2.1. เมื่อวันที่ 6Feb2023@0635 มี 1049 Definitions, 2284 Tests, 2264 Variables สำหรับ Ubuntu 20.04 LTS
    2.2. เมื่อวันที่ 14Jul2023@0240 มี 513 Definitions, 1043 Tests, 735 Variables สำหรับ Ubuntu 22.04 LTS
    2.3. เมื่อวันที่ 16Aug2023@0037 มี 550 Definitions, 1123 Tests, 794 Variables สำหรับ Ubuntu 22.04 LTS

  • Ubuntu OVAL

    เครื่องมือตรวจสอบช่องโหว่สำหรับอูบุนตู

    เพิ่มเติม สำหรับ Ubuntu 24.04 10Jun2024

    เมื่อได้รับทราบข้อมูลช่องโหว่ของลีนุกซ์อูบุนตูที่ดูแลอยู่จากเว็บไซต์ให้บริการตรวจสอบช่องโหว่ในระบบได้ฟรีๆ ไม่มีค่าใช้จ่าย เช่น https://www.shodan.io/ ซึ่งบริการฟรี สถานะ Last Seen แสดงวันที่ Shodan แวะเวียนมาตรวจสอบให้ล่าสุด
    จึงเกิดคำถามว่า ถ้าเราได้อัพเดตส่วนประกอบพื้นฐานต่างๆ ที่ Ubuntu มีมาให้ด้วยคำสั่ง
    sudo apt update
    sudo apt dist-upgrade
    แล้วจะรู้ได้อย่างไรว่า ช่องโหว่ต่างๆ ได้ถูกปิดให้ปลอดภัยขึ้นแล้วตามคำแนะนำของ Ubuntu ที่มีประกาศข่าวเรื่องความปลอดภัยเกี่ยวกับอูบุนตูไว้ที่ https://ubuntu.com/security/notices

    อูบุนตูมี Ubuntu OVAL (Open Vulnerability and Assessment Language) ไว้ให้ใช้ตรวจสอบช่องโหว่ ซึ่งใช้โปรแกรมชื่อ OpenSCAP เพื่อทำรายงานช่องโหว่ให้ดูได้เอง ตามขั้นตอนต่อไปนี้

    1. Login เข้าไปที่เครื่องอูบุนตูที่ใช้อินเทอร์เน็ตได้
    2. Download ด้วยการใช้คำสั่ง
    wget https://security-metadata.canonical.com/oval/com.ubuntu.$(lsb_release -cs).usn.oval.xml.bz2

    หรือเลือก Download ให้ตรง Ubuntu Version จากตัวเลือกที่
    https://security-metadata.canonical.com/oval/
    โดยให้เลือกแบบ CVE เพื่อจะได้เปรียบเทียบรายการช่องโหว่กับรายงาน Nessus ที่แสดงด้วย CVE เช่นกัน
    1. คลายไฟล์ที่ถูกบีบอัดลดขนาดที่ Download มาได้ ด้วยการใช้คำสั่ง
    bunzip2 com.ubuntu.$(lsb_release -cs).usn.oval.xml.bz2
    1. ใช้โปรแกรม OpenSCAP เพื่ออ่านเงื่อนไขการตรวจสอบช่องโหว่ต่างๆ บนเครื่อง และสร้างไฟล์รายงานผลชื่อ report.html ด้วยการใช้คำสั่ง
    oscap oval eval --report report.html com.ubuntu.$(lsb_release -cs).usn.oval.xml
    1. เพิ่มเติม จากคุณ เกรียงไกร 15Feb2023 => บางเครื่องต้องติดตั้ง libopenscap8 ก่อนด้วยคำสั่ง sudo apt install libopenscap8 ไม่งั้นใช้ oscap ไม่ได้
    2. เพิ่มเติม สำหรับ Ubuntu 24.04 10Jun2024 => ต้องติดตั้ง openscap-scanner ด้วยคำสั่ง sudo apt install openscap-scanner ไม่งั้นใช้ oscap ไม่ได้
    3. ใช้โปรแกรม เว็บบราวเซอร์ เพื่อเปิดอ่านไฟล์รายงานผลชื่อ report.html

    ตัวอย่างการใช้งานจริงกับเครื่องบริการทดสอบความเร็วอินเทอร์เน็ต Ookla Server ซึ่งใช้เป็นตัวอย่างแสดง

    1. Ubuntu Server 20.04 5.4.0-121#137 15Jun2022 ก่อนจะใช้คำสั่ง sudo apt dist-upgrade เพื่อปรับปรุงความปลอดภัย
      ในรายงานแสดงจำนวน 14 #X ที่ยังมีช่องโหว่ พร้อมด้วยรายการช่องโหว่หมายเลข USN และ CVE ต่างๆ โดยละเอียดตามรูป
    2. Ubuntu Server 20.04 5.4.0-137#154 5Jan2023 เมื่อได้ใช้คำสั่ง sudo apt dist-upgrade ปรับปรุงความปลอดภัยและรีบูทเครื่องแล้ว
      ในรายงานแสดงจำนวน 2 #X ที่ยังมีช่องโหว่ พร้อมด้วยรายการช่องโหว่หมายเลข USN และ CVE ต่างๆ โดยละเอียดตามรูป
    3. เนื่องจากส่วนการปรับปรุงความปลอดภัยอีก 2 รายการที่ยังเหลืออยู่นั้นทาง Ubuntu จะมีบริการให้เฉพาะกับสมาชิก Ubuntu Pro https://ubuntu.com/pro เท่านั้น (จะเขียนคำแนะนำเพิ่มให้ครับ)
      ซึ่งหลังจากทำตามขั้นตอนใส่ คีย์ ของ Ubuntu Pro ลงบน เครื่องอูบุนตูของเราเรียบร้อย และอัพเดตความปลอดภัยเพิ่มจากสิทธิ์ Ubuntu Pro ในรายงาน OVAL จะได้รับการอัพเดตปิดกั้นช่องโหว่อย่างครบถ้วน ตามรูป
    4. ถึงแม้ว่าวันนี้ อูบุนตู ของท่านจะได้รับการอัพเดตล่าสุดแล้ว แต่ด้วยภัยคุกคามทางไซเบอร์มีการเปลี่ยนแปลงอยู่เสมอ ก็อย่าลืมติดตามอ่านข่าวสารเกี่ยวกับความปลอดภัยไซเบอร์ และหมั่นปรับปรุง อัพเดต อยู่เป็นประจำครับ