Category: Operating System

  • 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
    • ก็จะมีอีเมลส่งมาทุกวันนนน
    • จบ
    • ขอให้สนุก
  • SSH with MFA

    เปิด Multi Factor Authentication (MFA) ให้กับ OpenSSH บน Ubuntu 22.04

    1. ติดตั้ง Google authenticator PAM module

    sudo apt install libpam-google-authenticator

    2. เปิดใช้งาน Google Authenticatior PAM ให้ OpenSSH

    echo "auth required pam_google_authenticator.so" | sudo tee -a /etc/pam.d/sshd
    
    sudo systemctl restart sshd.service

    3. เปิด KbdInteractiveAuthentication

    OpenSSH version 8.7 ขึ้นไปจะใช้ KbdInteractiveAuthentication แทน ChallengeResponseAuthentication

    ตั้งค่า KbdInteractiveAuthentication yes

    sudo grep -q "^KbdInteractiveAuthentication" /etc/ssh/sshd_config && sudo sed -i 's/^#?no/KbdInteractiveAuthentication yes/' /etc/ssh/sshd_config | sudo tee -a /etc/ssh/sshd_config >/dev/null <<<"KbdInteractiveAuthentication yes"
    
    sudo systemctl restart sshd.service

    4. เชื่อมต่อกับ Authenticator

    ใช้คำสั่ง

    google-authenticator

    เปิด Authenticator บน Smart Phone (Google/Microsoft ก็ได้) จากนั้น Scan QR Code จากนั้นตอบตามนี้

    Make tokens “time-base””: yes
    Update the .google_authenticator file: yes
    Disallow multiple uses: yes
    Increase the original generation time limit: no
    Enable rate-limiting: yes

    เมื่อ ssh เข้ามา ก็จะได้หน้าจอประมาณนี้

    หวังว่าจะเป็นประโยชน์ครับ

  • [บันทึกกันลืม] วิธีหาไฟล์ที่มีคำที่ต้องการ โดยแสดงเฉพาะ ชื่อไฟล์เท่านั้น

    โจทย์ ต้องการหาไฟล์ที่มีคำว่า text_pattern จากทุกไฟล์ในไดเรคทอรี่ /path/to/ ที่มีนามสกุล .ipynb แต่ต้องไม่มีคำว่า checkpoint ใน path หรือชื่อไฟล์

    find /path/to -name "*.ipynb" ! -name "*checkpoint*" -type f -print0 | while read -r -d '' i; do
        if grep -q "text_pattern" "$i"; then
             echo "$i"  # Output only the filename if the pattern is found
        fi;
    done
  • Mail merge ด้วย Excel Online และ Power Automate

    สิ่งที่ต้องมี

    1. เมล์มหาวิทยาลัยที่ใช้งานที่ http://email.psu.ac.th
    2. Browser เช่น Edge, Firefox ฯลฯ

    Optional

    1. Office 365 Desktop แต่บทความนี้จะไม่ใช้นะครับ

    เริ่มได้

    1. ล็อคอินเข้าระบบที่ http://email.psu.ac.th
    2. คลิกปุ่ม 9 จุดมุมบนซ้าย เลือก Excel คลิก Blank workbook
    1. คลิกที่คำว่า Book1 เพื่อเปลี่ยนชื่อไฟล์ และเลือกโฟลเดอร์บน Onedrive สำหรับเก็บไฟล์นี้ให้เรียบร้อย
    1. กรอกข้อมูลที่จะใช้ส่งอีเมล เช่น
    1. เลือกข้อมูลทั้งหมดตั้งแต่ A1 ถึง B3 แล้วคลิกที่ Insert เลือก Table และคลิกที่ My table has headers แล้วคลิก OK
    1. ได้ดังภาพ
    1. จากนั้นคลิกที่ Automate แล้วคลิกที่ Automate Work
    1. ได้ดังภาพ
    1. ให้เลื่อนช่องด้านขวาลงมาล่างสุดจนเห็นคำว่า See all templates
    1. คลิก See all templates จะได้หน้าต่างใหม่ดังภาพ
    1. พิมพ์ต่อท้ายคำว่า Excel ว่า send แล้วกดปุ่ม enter บนคีย์บอร์ดจะเจอ Send an email for a selected row ให้คลิกที่ช่องนั้นได้เลย
    1. จะได้หน้าตาประมาณนี้
    1. คลิก Continue จะได้
    1. ในส่วนของ For a selected row เลือกข้อมูลให้ถูกต้องดังนี้ ซึ่งในบทความนี้จะเซฟไฟล์ไว้ใน OneDrive เลยดังนั้นเลือกเป็นดังภาพ ช่อง Table สำคัญมากคือ Table1
    1. ในส่วนของ Send an email ในช่อง To ให้ลบของเก่าออกแล้วเลือกชื่อฟิลด์ email ของเราที่กรอกเตรียมไว้แล้วใน excel
    1. Subject พิมพ์ตามต้องการ และ Body ก็จะเป็นเนื้อหาที่ต้องการส่งให้ผู้รับอ่านสามารถกรอกได้เลย สามารถเลือกฟิลด์ต่าง ๆ ใน excel มาใช้งานได้
    1. เมื่อเสร็จสิ้นแล้วกด Save
    2. กลับมาที่ excel กดปุ่ม Automate Work อีกครั้ง จะเห็นว่าหัวข้อเพิ่มขึ้นมาคือ Flows in this workbook
    1. ให้เลือกแถวที่ต้องการส่งอีเมล (A2-A3) แล้วไปคลิกที่จุดสามจุดหลังชื่อ Flows ดังภาพ
    1. คลิก Run
    1. คลิก Run flow จะได้ดังภาพ เมล์จะถูกส่งไปเรียบร้อย คลิก Done เพื่อจบการทำงาน
    1. เมื่ออีเมลถูกส่งไปค่าต่างๆ ในไฟล์ excel และเราได้ใส่ในเนื้อเมล์จะถูกแทนที่ให้อัตโนมัติ
    1. จบขอให้สนุก
  • Hard links and junctions

    ntfs file system

    • NTFS สนับสนุนการ file links 3 แบบ
      • Hard links
      • Junctions
      • Symbolic
    • เราจะพูดถึง Hard links และ Junctions

    Hard links

    • ใช้แสดงถึงไฟล์เดียวกัน ในไดรฟ์เดียวกัน (same volume) ที่อยู่หลายโฟลเดอร์ (path)
    • แก้ไขไฟล์เดียวกันนี้ที่ใดที่หนึ่งก็จะเปลี่ยนแปลงทุกที่
    • ตัวอย่างที่ทำได้
    C:\dira\ethel.txt ชี้ไปที่ C:\dirb\dirc\lucy.txt
    
    D:\dir1\tinker.txt ชี้ไปที่ D:\dir2\dirx\bell.txt
    C:\diry\bob.bak ชี้ไปที่ to C:\dir2\mina.txt
    C:\a\1.txt ชี้ไปที่ C:\a\11.txt
    • ตัวอย่างที่ทำไม่ได้
    C:\dira ชี้ไปที่ to C:\dirb #โฟลเดอร์ทำ Hard link ไม่ได้
    C:\dira\ethel.txt ชี้ไปที่ to D:\dirb\lucy.txt #ชี้ไฟล์ที่อยู่คนละไดรฟ์ไม่ได้
    • สามารถลบไฟล์ใดไฟล์หนึ่งที่ชี้ไปก็ได้ โดยที่เนื้อหาข้างในจะยังคงอยู่ในไฟล์ที่เหลืออยู่

    วิธีสร้าง Hard links

    • ต้องใช้ cmd บน Windows 11 หรือ cmd ของ administrator บน Windows 10
    mklink /H ปลายทาง ต้นทาง
    • ตัวอย่างเช่น ต้องการทำ Hard link ชื่อ cadabra.txt ในโฟลเดอร์ dirb ชี้ไปที่ไฟล์ adabra.tx ในโฟลเดอร์ dira
    mklink /H c:\dirb\cadabra.txt c:\dira\adabra.txt
    • ดังภาพ

    Junction

    • เรียกอีกอย่างว่า Soft links ต่างจาก Hard links ตรงที่ใช้เชื่อมโยงโฟลเดอร์ ภายในเครื่องคอมพิวเตอร์เครื่องเดียวกัน
    • ตัวอย่างที่เป็นไปได้
    C:\dira ชี้ไปที่ C:\dirb\dirc
    
    C:\dirx ชี้ไปที่ D:\diry
    • ตัวอย่างที่เป็นไม่ได้
    C:\dira\one.txt ชี้ไปที่ C:\dirb\two.txt #ใช้ Junction กับไฟล์ไม่ได้
    
    C:\dir1 ชี้ไปที่ Z:\dir2 
    #ไดรฟ์ Z โดยทั่วไปหมายถึงเน็ตเวิร์คไดรฟ์ ต้องเป็นโฟลเดอร์ในเครื่องคอมพิวเตอร์เครื่องเดียวกัน

    วิธีสร้าง Junction

    • เหมือนที่ผ่านมาต้องทำใน cmd บน Windows 11 หรือ cmd ของ administrator บน Windows 10
    mklink /J ปลายทาง ต้นทาง
    • ตัวอย่างต้องการสร้าง c:\dirx ชี้ไปที่ c:\dira\dirc
    • ดังภาพ สังเกตว่าตรง dirx จะเห็นเป็น <JUNCTION>
    • การลบ junction สามารถลบได้เลยโดยที่ต้นทางจะไม่ถูกลบด้วย
  • เปลี่ยน iPad เป็นหน้าจอเสริมไร้สายสำหรับ PC/Notebook (Windows)

    ในปัจจุบัน iPad เรียกว่าเป็นอุปกรณ์ที่ใช้งานในชีวิตประจำวันของใครหลายๆคน แต่บางครั้งซื้อ iPad มาแล้วรู้สึกว่ายังใช้งานไม่คุ้มค่า ไม่ค่อยได้หยิบมาเล่นเพราะต้องใช้คอมพิวเตอร์ในการทำงานมากกว่า

    แล้วถ้าเราสามารถเอา iPad มาใช้ประโยชน์เพิ่มเป็นจอเสริมพกพา เชื่อมต่อแบบไร้สาย มีแบตเตอรี่ในตัวใช้งานได้สบายๆ หลายชม.แบบไม่ต้องเสียบสายชาร์จ แถมยังใช้ความสามารถขอจอทัชสกรีน apple pencil ได้ น่าจะใช้งานได้คุ้มค่ามากยิ่งขึ้น

    ถ้าทำงานในฝั่งของ Mac OS สามารถใช้งาน iPad เป็นจอเสริมได้ทันทีโดยไม่ต้องติดตั้งโปรแกรมเพิ่มเติม แต่ถ้าฝั่งของ Windows เราจำเป็นต้องติดตั้งโปรแกรมเพิ่มเติม(Freeware) ที่ชื่อว่า “ Spacedesk “ โดยจะต้องติดตั้งทั้งใน Notebook และ iPad

    Download Spacedesk : https://www.spacedesk.net/

    โปรแกรมรองรับการใช้งานบน Windows 8.1/10/11

    Notebook/PC

    เมื่อทำการติดตั้งโปรแกรมบน Windows แล้วให้เปิดโปรแกรม Spacedesk จากช่อง Search หรือจาก Taskbar ก็ได้

    ให้ตรวจสอบ IP ที่ Notebook ทำการเชื่อมต่อ WIFI (เนื่องจากทั้ง Notebook และ iPad ต้องเชื่อมต่ออยู่บนเครือข่ายเดียวกัน)

    iPad/Tablet

    เมื่อติดตั้ง Spacedesk บน iPad แล้วให้กดเพิ่ม IP ของ Notebook ตามรูป

    เมื่อตรวจสอบที่โปรแกรมฝั่ง Notebook จะแสดงสถานะการเชื่อมต่อดังรูป

    และข้อดีอีกอย่างของการใช้งาน iPad เป็นจอเสริมคือคือการใช้ความสามารถของการ Touch Screen และ Apple Pencil บน Windows ได้

  • Install from scratch – licensing (1)

    ติดตั้งปรับแต่ง Ubuntu 22.04 เพื่อเตรียมสำหรับติดตั้ง WordPress บน apache2 และติดตั้ง WordPress

    Host setting
    1. เครื่อง Server มี 2 ชื่อ A record เป็น server-name1.psu.ac.th Cname เป็น server-name.psu.ac.th
    2. ติดตั้ง Ubuntu 22.04 ข้ามเรื่องการติดตั้ง Ubuntu ไปนะครับ
    3. จะได้ username: group ที่สามารถเรียกใช้ sudo ได้ตั้งแต่เริ่มต้นตามที่ติดตั้ง
    4. sudo apt update && sudo apt dist-upgrade -y && sudo apt autopurge -y เพื่อปรับปรุง software ต่าง ๆ ให้เป็นรุ่นปัจจุบัน
    5. sudo reboot ในกรณีที่มี kernel ใหม่ต้องรีบูตเพื่อเปลี่ยน kernel
    6. sudo apt install mysql-server apache2 php libapache2-mod-php php-mysql php-gd php-imagick php-xml php-curl php-mbstring php-intl php-zip unzip php-apcu
    7. sudo a2enmod ssl rewrite headers
    8. เปลี่ยนเป็น user root ด้วยคำสั่ง sudo -i
    9. cd /etc/ssl/private
    10. cp /home/username/certificate/* . (ต้องได้รับไฟล์ certificate มาเรียบร้อยแล้วนะครับ ขอข้ามไปเรื่องการจัดเตรียมไฟล์ certificate) ในตัวอย่างนี้จะมีไฟล์เดียวคือ star.psu.ac.th-combined.crt
    11. openssl dhparam -out /etc/ssl/private/dhparams_4096.pem
    12. /etc/apache2/sites-available
    13. vi default-ssl.conf
    <IfModule mod_ssl.c>
    SSLUseStapling On
    SSLStaplingCache "shmcb:logs/ssl_stapling(32768)"
    <VirtualHost _default_:443>
    ServerAdmin someone@somedomain.com
    ServerName server-name1.psu.ac.th

    DocumentRoot /var/www/html

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    SSLEngine on

    SSLCertificateFile /etc/ssl/private/star.psu.ac.th-combined.crt

    SSLOpenSSLConfCmd DHParameters "/etc/ssl/private/dhparam.pem"
    SSLOpenSSLConfCmd ECDHParameters brainpoolP512r1
    SSLOpenSSLConfCmd Curves brainpoolP512r1:sect571r1:secp521r1:secp384r1

    #A+
    SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
    SSLHonorCipherOrder on
    SSLCipherSuite ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
    SSLCompression off
    #Header add Strict-Transport-Security "max-age=15768000;includeSubDomains"
    Header always set Strict-Transport-Security "max-age=63072000"

    <FilesMatch "\.(cgi|shtml|phtml|php)$">
    SSLOptions +StdEnvVars
    </FilesMatch>
    <Directory /usr/lib/cgi-bin>
    SSLOptions +StdEnvVars
    </Directory>

    </VirtualHost>
    </IfModule>
    1. vi licensing.conf
    <virtualHost *:80>
        Documentroot /var/www/html/lsc
        ServerName server-name.psu.ac.th
        ErrorLog ${APACHE_LOG_DIR}/licensing_error_log
        CustomLog ${APACHE_LOG_DIR}/licensing_access_log common
        Options -Indexes
        RewriteEngine On
        RewriteRule (.*) https://server-name.psu.ac.th
        RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK) [NC]
        RewriteRule ^.* - [F]
    </virtualhost>
    1. vi licensing-ssl.conf
    <IfModule mod_ssl.c>
    SSLUseStapling On
    SSLStaplingCache "shmcb:logs/ssl_stapling(32768)"
            <VirtualHost *:443>
                    ServerAdmin someone@somedomain.com
                    ServerName server-name.psu.ac.th
                    DocumentRoot /var/www/html/lsc

                    LogLevel info
                    ErrorLog ${APACHE_LOG_DIR}/lsc-ssl-error.log
                    CustomLog ${APACHE_LOG_DIR}/lsc-ssl-access.log combined

                   SSLEngine on

                    SSLOpenSSLConfCmd DHParameters "/etc/ssl/private/dhparams_4096.pem"
                    SSLOpenSSLConfCmd ECDHParameters brainpoolP512r1
    SSLOpenSSLConfCmd Curves brainpoolP512r1:sect571r1:secp521r1:secp384r1

                    SSLCertificateFile /etc/ssl/private/star.psu.ac.th-combined.crt

    #A+
    SSLProtocol all -SSLv2 -SSLv3
    SSLHonorCipherOrder on
    SSLCipherSuite TLSv1.3 TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384
    SSLCipherSuite ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
    SSLCompression off
    Header always set Strict-Transport-Security "max-age=63072000"

                    RewriteEngine on
                    RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK) [NC]
                    RewriteRule ^.* - [F]

                    Options -Indexes

                    <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                    SSLOptions +StdEnvVars
                    </FilesMatch>

                    <Directory /var/www/html/lsc>
                            Options FollowSymLinks
                            AllowOverride All
                    </Directory>

                    <Directory /usr/lib/cgi-bin>
                                    SSLOptions +StdEnvVars
                    </Directory>
            </VirtualHost>
    </IfModule>
    1. a2ensite licensing.conf licensing-ssl.conf default-ssl.conf
    2. a2enmod headers
    3. systemctl restart apache2
    4. mysql
    CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
    create database licensing;
    GRANT ALL PRIVILEGES ON licensing.* TO 'username'@'localhost' WITH GRANT OPTION;
    quit
    1. cd /var/www/html
    2. wget https://wordpress.org/latest.zip
    3. unzip latest.zip
    4. rm latest.zip
    5. mv wordpress lsc
    6. chmod -R username:www-data .
    7. cd lsc
    8. chmod g+w .
    9. logout
    10. จบส่วนการตั้งค่า Host เพื่อเตรียมติดตั้ง WordPress
    11. เปิด browser ไปที่เว็บ http://licensing.psu.ac.th ซึ่งจะถูก redirect ไปที่ https://licensing.psu.ac.th โดยอัตโนมัติ
    12. กรอกข้อมูลสำหรับเชื่อมต่อให้เรียบร้อย และติดตั้ง wordpress ให้เรียบร้อย
    13. กลับมาที่ console หรือ terminal
    14. cd /var/www/html/lsc
    15. chmod og-w .
    16. sudo chown username:www-data .htaccess wp-config.php
    17. chmod og-w .htacess wp-config.php
    18. vi wp-config.php เพิ่มข้อความว่า
    /** Direct install plugin **/
    define('FS_METHOD', 'direct');
    1. cd /var/www/html/lsc/wp-content
    2. mkdir uploads upgrade languages
    3. sudo chown -R username:www-data uploads upgrade languages themes plugins
    4. chmod -R g+w uploads upgrade languages themes plugins เพื่อให้สามารถติดตั้ง plugin theme และ upload ไฟล์ขึ้นเว็บได้ เมื่อติดตั้ง themes และ plugins ได้จนพอใจแล้วสั่งคำสั่งต่อไปนี้ chmod -R g-w upgrades languages themes plugins
    5. จบส่วนติดตั้ง WordPress
  • วิธีการติดตั้ง Chat GPT บน Windows

    ChatGPT คืออะไร มาจากไหน

    ChatGPT คือโปรแกรม AI ประเภทแชทบอท (Chatbot) หรือที่เข้าใจง่ายๆ ก็คือโปรแกรมโต้ตอบที่มีการผสมผสานเทคโนโลยี AI เข้าไปด้วย ซึ่งเจ้า ChatGPT นั้นถูกพัฒนาโดยองค์กร OpenAI ที่เคยฝากผลงาน AI เจ๋งๆ มาแล้วทั้ง DALL-E จิตรกร AI ที่เคยสร้างกระแส AI Art ในช่วงแรกๆ และ OpenAI Five เกมมิ่งบอทของ DOTA 2 ที่เคยล้มโปรเพลเยอร์ระดับโลกมานับไม่ถ้วน โดย ChatGPT คือผลงานชิ้นล่าสุดที่เปิดตัวไปเมื่อปลายปี 2022 นี้เอง ซึ่งเป้าหมายหลักของ ChatGPT นั้นคือการเป็นโปรแกรมแซตบอทที่เป็นมิตร เข้าถึงได้ และตอบโจทย์การทำงานของมนุษย์ให้มากที่สุด

    ChatGPT ใช้ทำอะไรได้บ้าง

    ถ้าให้นึกถึงโปรแกรมแชทบอทที่หลายๆ คนพอนึกภาพออกนั้น ก็คงจะไม่พ้น Simsimi แชทบอทที่เคยฮิตฮอตในบ้านเราเมื่อหลายสิบปีก่อน แล้วลองจินตนาการว่า Simsimi ผสมกับ Google แล้วจะออกมาเป็นอะไร นั่นแหละคือสิ่งที่ใกล้เคียงกับ ChatGPT มากที่สุด เพราะความเจ๋งของ ChatGPT นั้นไม่ใช้ความสามารถในการโต้ตอบประโยคพูดคุยทั่วๆ ไป แต่ความสามารถที่แท้จริงของ ChatGPT คือการตอบคำถามที่ซับซ้อนกว่านั้นหลายเท่า อย่างเช่นการสั่งให้เขียนบทความทั้งชิ้นขึ้นมา เขียนคำสั่งสำหรับงานโปรแกรมมิ่ง หาบัคในโค้ดโปรแกรม หาคำตอบให้กับการบ้านที่เรากำลังทำอยู่ การสรุปข้อมูลยากๆ เหล่านี้ให้กลายเป็นคำตอบที่เข้าใจได้ง่าย ใช้ภาษาที่มีความเป็นมิตร เสมือนกับมีมนุษย์ตัวเป็นมานั่งตอบคำถามอยู่ตรงหน้าเลยทีเดียว แถมยังใช้เวลาโต้ตอบเพียงมีกี่วินาทีเท่านั้น และด้วยความสามารถเหล่านี้เองที่ทำให้ ChatGPT นั้นกลายเป็นกระแสไวรัลในปัจจุบัน

    วิธีการติดตั้ง Chat GPT บน Windows

    1. ดาวน์โหลดโปรแกรม ChatGPT_0.11.0_windows_x86_64.msi 

    2. เป็น command line ด้วยการกด Windows+R หรือไปที่ช่อง Search แล้วพิมพ์ cmd 

    3. เปิด Directory อยู่ที่โปรแกรม ด้วยคำสั่ง

        cd %HOMEPATH%/Downloads

    4. ใช้คำสั่งในการติดตั้งโปรแกรม  โดยใช้คำสั่ง

          # install the latest version
          winget install –id=lencx.ChatGPT -e

                                หรือ

           # install the specified version
           winget install –id=lencx.ChatGPT -e –version 0.10.0

    5. หลังจากติดตั้งเสร็จสิ้นเป็นที่เรียบร้อยแล้ว ให้ทำการ Login เข้าใช้งานด้วยอีเมล์ของตัวเอง

    อ้างอิง : https://github.com/lencx/ChatGPT

  • 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. ถึงแม้ว่าวันนี้ อูบุนตู ของท่านจะได้รับการอัพเดตล่าสุดแล้ว แต่ด้วยภัยคุกคามทางไซเบอร์มีการเปลี่ยนแปลงอยู่เสมอ ก็อย่าลืมติดตามอ่านข่าวสารเกี่ยวกับความปลอดภัยไซเบอร์ และหมั่นปรับปรุง อัพเดต อยู่เป็นประจำครับ