Author: grianggrai.n

  • ปิดช่องโหว่เหลือค้าง

    • หลังจากไม่ได้ตรวจสอบช่องโหว่มานาน วันนี้ Nessus ทำใหม่แล้วลองสแกนซักหน่อย
    Nessus Scan Report
    • ซึ่งจะพบว่ามี Medium สองรายการ คือ Browsable Web Directory และ WordPress User Enumeration โดย
      • Browsable Web Directory คือ สามารถเข้าถึงรายการใน directory ได้ เช่น ชื่อไฟล์ มีไฟล์อะไรบ้าง ขนาดเท่าไหร่ เป็นต้น เมื่อตรวจสอบก็พบว่าเป็น directory ที่ผู้ใช้ไม่จำเป็นต้องเข้าถึง
      • WordPress User Enumeration คือ สามารถเข้าถึง username ได้ว่ามี user อะไรบ้าง

    ปิด Directory Browsing

    ทำได้ 2 วิธีคือ

    • แก้ไขแฟ้ม config ของ site ที่ต้องการปิด โดยทั่วไปแฟ้มจะอยู่ที่ /etc/apache2/site-enabled/site.conf โดย site.conf คือชื่อไฟล์ที่ต้องการ โดยเพิ่มในส่วนของ Directory ของไซต์นั้น ตัวอย่างเป็น /var/www/html/aaeee ให้ทำการแก้ไขหรือเพิ่มข้อความตามตัวอย่าง ส่วนสำคัญคือ Options ต้องไม่มีคำว่า Indexes เมื่อแก้ไขเสร็จ ให้ reload หรือ restart apache2 ด้วยคำสั่ง sudo systemctl reload apache2 หรือ sudo systemctl restart apache2
    <Directory /var/www/html/aaeee>
            Options FollowSymLinks
            AllowOverride All
    </Directory>
    • สำหรับวิธีที่สองนี้ ต้องมีการระบุ AllowOverride All ในแฟ้มของไซต์ ด้วยจึงจะใช้งานได้ (หากแก้ไขไฟล์ไซต์ของ apache2 ต้อง reload หรือ restart ด้วย) เช่น
    <Directory /var/www/html/aaeee>
            AllowOverride All
    </Directory>
    • สร้างแฟ้ม .htaccess เอาไว้ใน Directory (จากตัวอย่างนี้คือ /var/www/html/aaeee) ที่ต้องการ โดยเพิ่มข้อความข้างล่างนี้วิธีนี้ มีผลทันทีไม่ต้อง reload หรือ restart apache2
    Options -Indexes

    ปิด WordPress User Enumeration

    • ในไซต์ของ WordPress จะมีแฟ้ม .htaccess อยู่ให้เพิ่มข้อความต่อไปนี้ลงไป โดย yoursite.name คือชื่อเว็บไซต์
    #user enumeration
    RewriteCond %{QUERY_STRING} ^author=([0-9]*)
    RewriteRule .* https://yoursite.name/? [L,R=302]
    • เมื่อทำสองอย่างแล้วให้ nessus เข้าตรวจสอบอีกครั้ง
    Nessus Scan Report
    • เย่….หายไปละ
    • จบขอให้สนุก
  • บริหารจัดการ App Passwords บน Office 365

    App passwords คือ password ที่จำเป็นต้องใช้บนแอพพลิเคชั่นใดๆ ก็ตามที่ไม่สามารถผ่าน Multi-factor authentication ได้ เช่น Outlook, Lync เป็นต้น

    เริ่ม…ได้

    Profile
    • เลือก My account จะได้ดังรูป
    My account
    • คลิก Security & privacy
    Security & privacy
    • คลิก Additional security verification
    Additional security verification 
    app passwords
    • คลิก create
    Create app password
    • ตั้งชื่อที่เราเข้าใจว่าคือ app ไหน คลิก Next
    Name
    • จะได้ password สำหรับใช้งานได้ทันที ก็เอาไปใช้ได้เลยแล้วคลิก close
    Your app password
    • จะเห็นว่า password ยาวมาก และเป็นพาสเวิร์ดที่สร้างขึ้นมาครั้งเดียว
    • จำไม่ได้ต้องสร้างใหม่ แล้วของเก่าทิ้งโดยการกด Delete หลัง password ที่ไม่ใช้งาน
    • ชื่อ app เป็นเพียงชื่อที่ใช้สื่อความหมายว่าเอาพาสเวิร์ดไปใช้กับ app อะไรเท่านั้น
    • password สามารถใช้ได้ตราบใดที่ยังไม่ลบออก ถึงแม้จะจำไม่ได้ถ้ากรอกไว้และให้โปรแกรมที่ใช้งาน password นี้จำไว้ก็จะใช้ได้ตลอด
    Delete app password
    Successfully deleted
    • จบขอให้สนุก
  • Download and install Office365

    ปัจจุบันนักศึกษาและบุคลากรของมหาวิทยาลัยสงขลานครินทร์ สามารถใช้งาน Office365 ได้แล้ว โดยมีเงื่อนไขดังนี้

    • PC (Windows) หรือ Macs สามารถติดตั้งรวมกันได้ 5 เครื่อง
    • Tablets ติดตั้งได้ 5 เครื่อง (Android, iPadOS)
    • โทรศัพท์ ติดตั้งได้ 5 เครื่อง (Android, iOS)
    • email account ภายใต้โดเมน @email.psu.ac.th ขนาด 50GB
    • พื้นที่จัดเก็บข้อมูล One drive ขนาด 5TB

    สำหรับนักศึกษา

    • สามารถเข้าระบบได้ที่ http://email.psu.ac.th หรือ https://outlook.com/email.psu.ac.th
    • โดย username จะเป็น
      [รหัสนักศึกษา]@email.psu.ac.th
      ยกตัวอย่าง เช่น 62111111111@email.psu.ac.th
    • รหัสผ่านคือรหัสเดียวกับ PSU Passport

    สำหรับบุคลากร

    • ต้องขอเปิดใช้บริการก่อนที่ https://passport.psu.ac.th
    • หลังจากขอเปิดใช้บริการ ต้องรอ 1 ชั่วโมง จึงจะสามารถใช้งานได้
    • สามารถเข้าระบบได้ที่ http://email.psu.ac.th หรือ https://outlook.com/email.psu.ac.th
    • โดย Username จะเป็น
      [log in ของ PSU passport]@email.psu.ac.th
      ยกตัวอย่าง เช่น username.s@email.psu.ac.th
    • รหัสผ่านคือรหัสเดียวกับ PSU Passport
    ขอใช้บริการ Office365

    เริ่ม…ได้

    Sign in

    หากเป็นการเข้าระบบครั้งแรก ระบบจะให้ทำการตั้งค่า Multi-factor authentication

    More information required
    • จะเป็นหน้า Additional security verification
    Additional security verification 
    • หากต้องการความง่ายให้เลือกตามรูป แล้วใส่หมายเลขโทรศัพท์ของเราลงไป
    • คลิก Next แล้วรอรับ SMS (**อาจใช้เวลานานกว่า SMS จะมา)
    Telephone 📞
    • กรอกตัวเลขจาก SMS แล้วกด Next
    SMS

    Pages: 1 2 3

  • Windows 10, Version 1903, May 2019 Update installation

    Windows 10, Version 1903, May 2019 Update เป็นรุ่นปรับปรุงที่ออกเมื่อ พฤษภาคม 2562 การติดตั้งเปลี่ยนแปลงไปนิดหน่อยดังนี้

    จะพูดถึงการติดตั้งใหม่เท่านั้น ใครจะอัพเดตผ่าน Windows update ก็สามารถอัพเดตได้เลย

    สำหรับนักศึกษา

    • Windows 10 ที่สามารถติดตั้งได้คือ Windows 10 Education เท่านั้น เนื่องจากหมายเลขผลิตภัณฑ์ (Product key) ที่ได้จาก Microsoft Azure เป็น Windows 10 Education โหลดได้จาก Microsoft Azure และ https://licensing.psu.ac.th/windows-10/
    • การ activate สามารถทำได้เพียงวิธีเดียวคือใช้ Product key จาก Microsoft Azure เท่านั้น
    • เมื่อติดตั้งจะมีหน้าจอให้เลือกว่าจะติดตั้งรุ่นไหน ก็ให้เลือก Windows 10 Education เท่านั้น
    Windows Setup
    Windows 10 Education 

    สำหรับบุคลากร

    • เลือกติดตั้งได้ 3 รุ่นได้แก่ Windows 10 Education, Windows 10 Pro และ Windows 10 Pro for workstation เท่านั้น รุ่น Enterprise และรุ่นที่มี N ต่อท้ายติดตั้งไม่ได้
    • การ activate สามารถทำได้ 2 วิธี คือ
      • กดรับ Product key ได้ที่ CD-Key ซึ่งเป็นคีย์กลางของมหาวิทยาลัย ใช้ร่วมกันทั้งมหาวิทยาลัย activate 1 ครั้งนับ 1 ครั้ง ฉะนั้นก่อน activate ควรติดตั้ง Software ตัวอื่น ๆ ให้เสร็จเรียบร้อยจนแน่ใจว่าจะไม่ติดตั้ง Windows ใหม่ในระยะเวลา 6 เดือน
      • activate ผ่าน KMS ของมหาวิทยาลัย วิธีนี้เหมาะสำหรับห้องปฏิการคอมพิวเตอร์ และเครื่องในสำนักงาน ที่เปิดใช้งานทุกวัน (หรืออย่างน้อย 1 ครั้งใน 6 เดือน) และเชื่อมต่อกับเครือข่ายของมหาวิทยาลัยตลอดเวลา

    เริ่ม…ได้

    • ดาวน์โหลดแผ่นได้ที่ https://licensing.psu.ac.th/windows-10/
    • สร้าง flash drive สำหรับบูต (flash drive ต้องมีขนาดอย่างน้อย 8GB) ด้วย Rufus https://rufus.ie/ หรือเขียนแผ่น DVD ให้เรียบร้อย
    • เปิดเครื่องบูตด้วย flash drive หรือ DVD ที่สร้างเตรียมไว้แล้ว
    Boot
    (more…)

    Pages: 1 2 3

  • How to install Office Professional Plus 2019 in PSU

    • สามารถ download ได้จาก https://licensing.psu.ac.th
    Office Professional Plus 2019
    • ล็อคอินเข้าระบบให้เรียบร้อย
    • เมื่อเปิดหน้าของ Office Professional Plus 2019 เลื่อนลงมาล่างสุดจะมีให้ Download อยู่ 2 ส่วน
    Download
    • โดย Office pro plus 2019 setup คือส่วนที่จำเป็นต้องโหลด และสามารถเลือกโหลด Configuration Setup ได้ตามภาษาและสถาปัตยกรรมที่ต้องการ
    • เมื่อโหลดเสร็จแล้ว ติดตั้งโดยการเปิด cmd เรียกใช้ cmd ด้วยการกด windows+R
    • การติดตั้ง Office Professional Plus 2019 จะเป็นการติดตั้งผ่านอินเตอร์เน็ตเท่านั้น
    Run cmd
    cmd
    • พิมพ์ cd ไปยังโฟลเดอร์ที่ดาวน์โหลดทั้งสองไฟล์ไว้ (ในตัวอย่างโหลดไฟล์ไว้ที่ Desktop)
    Download location
    • พิมพ์คำสั่งดังต่อไปนี้ โดยเลือกตามรุ่นและสถาปัตยกรรมที่เลือก
    1. o2019proplussetup.exe /configure o2019proplus32en.xml
    2. o2019proplussetup.exe /configure o2019proplus32th.xml
    3. o2019proplussetup.exe /configure o2019proplus64en.xml
    4. o2019proplussetup.exe /configure o2019proplus64th.xml
    Setup command
    • จะมีหน้า User control ให้ตอบ Yes แล้วจะได้หน้าต่างติดตั้งขึ้นมา
    Installing
    • รอจนเสร็จ
    installation is finished!
    Finish
    • เปิด Microsoft word สร้างเอกสารใหม่
    Blank document
    • คลิกเมนู File แล้วเลือก account
    Account
    • มองไปด้านขวาในส่วนของ Product Information หากยังไม่มีข้อความว่า Product Activated ให้คลิก Change Product key
    Product Information
    • ให้นำคีย์จากเว็บ https://licensing.psu.ac.th มาใส่แล้วกด Activate Office
    • ต้องเชื่อมต่ออินเตอร์เน็ตให้เรียบร้อยก่อนทำขั้นตอนนี้
    Activate Office
    • สำหรับผู้ใช้ทั่วไปจบเพียงเท่านี้ ขอให้สนุก
    • สำหรับ Power Users และคนที่ต้องการใช้ Office ภาษาอื่นๆ มากกว่าภาษาไทย และ ภาษาอังกฤษ
    • หากเปิดดูในแฟ้ม o2019proplus64en.xml จะมีส่วนที่แก้ไขได้
    <Configuration>
      <Add SourcePath="https://bahamut.psu.ac.th/office2019-64" OfficeClientEdition="64"
     Channel="PerpetualVL2019">
          <Product ID="ProPlus2019Volume" PIDKEY="NMMKJ-6RK4F-KMJVX-8D9MJ-6MWKP">
             <Language ID="en-us" />
          </Product>
          <Product ID="ProofingTools">
            <Language ID="th-th" />
          </Product>
      </Add>
      <Property Name="AUTOACTIVATE" Value="1" />
      <Display Level="Full" AcceptEULA="TRUE" />  
      <Logging Level="Standard" Path="%temp%" /> 
    </Configuration>
    </code>
    • ได้แก่ SourcePath และ Language ID
    • โดยค่าที่เป็นไปได้ของ SourcePath คือ โฟลเดอร์ปลายทางที่จะได้เป็นที่เก็บตัวติดตั้ง Office Professional Plus 2019 เช่น d:\download ซึ่งแปลว่าโหลดตัวติดตั้งมาเก็บไว้ที่ d:\download
    • และค่าที่เป็นไปได้ของ Language ID ได้แก่ รหัสภาษาที่ไมโครซอฟท์กำหนดโดยสามารถดูได้ที่ https://docs.microsoft.com/en-us/DeployOffice/office2016/language-identifiers-and-optionstate-id-values-in-office-2016
    • ตัวอย่างไฟล์ที่แก้เสร็จแล้ว
    <Configuration>
      <Add SourcePath="d:\download" OfficeClientEdition="64" 
    Channel="PerpetualVL2019">
          <Product ID="ProPlus2019Volume" PIDKEY="NMMKJ-6RK4F-KMJVX-8D9MJ-6MWKP">
             <Language ID="ja-jp" />
          </Product>
          <Product ID="ProofingTools">
            <Language ID="ja-jp" />
          </Product>
      </Add>
      <Property Name="AUTOACTIVATE" Value="1" />
      <Display Level="Full" AcceptEULA="TRUE" />  
      <Logging Level="Standard" Path="%temp%" /> 
    </Configuration>
    </code>
    • วิธีใช้งานให้พิมพ์คำสั่งต่อไปนี้ใน cmd
    o2019proplussetup.exe /download o2019proplus64en.xml
    download
    • จะค้างอยู่จนกว่าจะ download เสร็จ
    downloading
    • เมื่อ download เสร็จแล้วสามารถพิมพ์คำสั่งต่อไปนี้ใน cmd เช่นเดิม เพื่อเริ่มกระบวนการติดตั้ง แบบที่กล่าวมาแล้ว
    o2019proplussetup.exe /configure o2019proplus64en.xml
    • จบขอให้สนุกครับ
  • Hardening your HTTP response headers

    Introduction

    HTTP Response headers คือ ค่าของสตริงที่ส่งกลับมาจากเซิร์ฟเวอร์ที่มีเนื้อหาตามที่ถูกร้องขอ โดยปกติจะใช้บอกข้อมูลทางเทคนิค เช่น เบราเซอร์ควรแคชเนื้อหา, ประเภทของเนื้อหาคืออะไร, ซอฟต์แวร์ที่ทำงานบนเซิร์ฟเวอร์ และอื่น ๆ   HTTP Response headers ถูกใช้เพื่อส่งต่อนโยบายความปลอดภัยไปยังเบราเซอร์  ทำให้การเปิดเว็บไซต์ของเรามีความปลอดภัยเพิ่มมากขึ้น

    Header ของ Apache2 ที่ควรต้องใส่เพื่อเพิ่มความปลอดภัยมีดังนี้

    Content Security Policy

    Header เรื่อง Content Security Policy (CSP) ช่วยให้กำหนดต้นทางของเนื้อหาที่อนุญาตสำหรับเว็บไซต์ โดยการจำกัดเนื้อหาที่เบราเซอร์สามารถโหลดได้ ได้แก่ js และ css

    สามารถสร้าง CSP ได้จาก https://report-uri.com/home/generate ทั้งนี้ต้องทดสอบการทำงานทุกครั้งเนื่องจาก การกำหนดค่าบางอย่างอาจทำให้เว็บไซต์ ทำงานไม่ถูกต้อง ดูรายละเอียดเพิ่มเติมได้ที่ https://scotthelme.co.uk/content-security-policy-an-introduction/ สำหรับ Apache2 เพิ่ม Header ต่อไปนี้ ในแฟ้มของไซต์ที่ต้องการ เช่น /etc/apache2/site-enabled/lsc-ssl.conf  หรือแฟ้ม .htaccess ในไซต์ที่ต้องการ (ซึ่งแนะนำว่าใช้ .htaccess จะได้ไม่ต้องรีสตาร์ทเซิร์ฟเวอร์) เพื่อเปิดการใช้งาน CSP


    Header always set Content-Security-Policy "default-src https: data: 'unsafe-inline' 'unsafe-eval'"

    HTTP Strict Transport Security (HSTS)

    เว็บไซต์ ต้องมีการตั้งค่าให้ redirect จาก HTTP ไปยัง HTTPS เสมอ และ HSTS จะเป็น Header ที่กำหนดให้เบราเซอร์จำสถานะของ HTTPS เอาไว้แม้ว่าจะเป็นการเปิดจาก bookmark ที่เป็น HTTP ก็ตาม ก็จะถูกบังคับให้เป็น HTTPS รายละเอียดเพิ่มเติม https://scotthelme.co.uk/hsts-the-missing-link-in-tls/ เช่น เมื่อเปิด http://licensing.psu.ac.th ก็จะถูก redirect ไป https://licensing.psu.ac.th

    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"

    X-Frame-Options

    X-Frame-Options หรือ XFO header จะช่วยป้องกันผู้ใช้จากการโจมตีแบบ clickjacking ที่ผู้บุกรุกสามารถโหลด iframe จากไซต์ของเขาบนไซต์ของเราได้ ซึ่งทำให้ผู้ใช้งานเว็บไซต์ของเราเชื่อว่าไม่อันตราย!! รายละเอียดเพิ่มเติม https://www.troyhunt.com/clickjack-attack-hidden-threat-right-in/

    Header always set X-Frame-Options "SAMEORIGIN"

    X-Xss-Protection

    Header นี้ใช้กำหนดค่าการป้องกัน XSS ที่มีอยู่บนเบราเซอร์ต่างๆ โดยการตั้งค่าจะมี 0 คือ ปิดการทำงาน 1 คือเปิดการทำงาน และ 1; mode=block ซึ่งจะกำหนดให้เบราเซอร์ทำการบล็อคการกระทำใดๆ ก็ตามที่มากกว่าการล้างข้อมูลสคริปต์

    Header always set X-Xss-Protection "1; mode=block"

    X-Content-Type-Options

    X-Content-Type-Options ใช้ในการป้องกันการโจมตีผ่านทางช่องโหว่ MIME sniffing ซึ่งจะเกิดเมื่อ เว็บไซต์อนุญาตให้ผู้ใช้อัพโหลดเนื้อหาไปยังเซิร์ฟเวอร์ ซึ่งผู้ใช้อาจเปลี่ยนหรือซ่อนไฟล์อันตราย แล้วอัพโหลดขึ้นเซิร์ฟเวอร์ รายละเอียดเพิ่มเติม https://www.keycdn.com/support/x-content-type-options/

    Header always set X-Content-Type-Options "nosniff"

    เบื้องต้นแนะนำเท่านี้ก่อนครับ พิเศษ!! สำหรับผู้ใช้งาน wordpress มีปลั๊กอินชื่อ HTTP Headers ใช่ตั้งค่า Header ต่างๆ ที่เล่ามาข้างต้นได้อย่างสบายใจหายห่วง!!! ไม่ต้องแก้ .htaccess ไม่ต้องแก้ config ใด ๆ  เมื่อติดตั้งเสร็จแล้วจะพบว่ามี Header อีกมากที่สามารถตั้งค่าเพิ่มเติมได้ ซึ่งจะกล่าวอีกในครั้งต่อ ๆ ไป

    ต้นฉบับ

    https://scotthelme.co.uk/hardening-your-http-response-headers/

    มีวิธีการเซ็ตสำหรับ Nginx และ IIS สามารถดูเพิ่มเติมได้ครับ
    อย่าลืม!!

    ตรวจ HTTP Response ได้ที่ https://securityheaders.com

    จบขอให้สนุก

  • Oracle Label Security

    Oracle Label Security (OLS) เป็นส่วนขยายของเทคโนโลยี Virtual Private Database (VPD) ซึ่งเริ่มนำมาใช้ตั้งแต่ Oracle 8i  OLS อนุญาตให้มีการควบคุมการเข้าถึงลงในแถวต่างๆ ตามป้ายกำกับที่ระบุ ฟังก์ชันการทำงานที่คล้ายคลึงกันสามารถทำซ้ำโดยใช้ Fine Grained Access Control (FGAC) แต่ OLS ให้โซลูชันที่ง่ายกว่าสำหรับการรักษาความปลอดภัยระดับแถว (row-level security) ในบทความนี้ฉันจะนำเสนอตัวอย่างง่ายๆของการกำหนดค่า OLS

    ตั้งค่าฐานข้อมูล

    • หากไม่ได้เลือกตัวเลือก Label Security เมื่อครั้งติดตั้ง Oracle Database สามารถเรียกตัวติดตั้งและเลือกตัวเลือก Label Security เพิ่มเติมได้ภายหลัง
    • เข้าระบบด้วยบัญชีผู้ใช้ Oracle เปิด terminal พิมพ์ dbca (Database Server เป็น Linux)
    • เมื่อได้ Welcome Screen คลิก Next
    • ที่หน้า Operation คลิก Configure Database Options แล้วคลิก Next
    • หน้า Database เลือกฐานข้อมูลที่ต้องการ คลิก Next
    • ที่หน้า Database Features คลิกเลือก Label Security คลิก Next
    • คลิก Finish
    • เมื่อจบการตั้งค่าให้ restart database

    สร้างผู้ใช้ทดสอบ

    คำสั่งทั้งหมดทำภายใน sqlplus สร้างผู้ใช้ ols_test มีรหัสผ่านว่า password โดยให้สิทธิ์ CONNECT, RESOURCE, SELECT_CATALOG_ROLE

    sqlplus, / as sysdba
    CONN / AS SYSDBA
    
    CREATE USER ols_test IDENTIFIED BY password 
    DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp
    GRANT CONNECT, RESOURCE, SELECT_CATALOG_ROLE TO ols_test;

    ต่อไปเป็นการให้สิทธิ์ในแพ็คเกจ OLS แก่ผู้ใช้ ols_test จำเป็นต้อง unlock ผู้ใช้ lbacsys และตั้งรหัสผ่านว่า lbacsys เพื่อใช้เป็นคนกำหนดสิทธิ์ต่างๆ ให้ ols_test ได้แก่สิทธิ์ execute บน sa_components, sa_user_admin, sa_label_admin, sa_policy_admin, sa_audit_admin, sa_sysdba, to_lbac_data_label และให้ ols_test เป็น lbac_dba

    sqlplus, / as sysdba, lbacsys/lbacsys
    ALTER USER lbacsys IDENTIFIED BY lbacsys ACCOUNT UNLOCK;
    
    CONN lbacsys/lbacsys
    
    GRANT EXECUTE ON sa_components TO ols_test WITH GRANT OPTION;
    GRANT EXECUTE ON sa_user_admin TO ols_test WITH GRANT OPTION;
    GRANT EXECUTE ON sa_user_admin TO ols_test WITH GRANT OPTION;
    GRANT EXECUTE ON sa_label_admin TO ols_test WITH GRANT OPTION;
    GRANT EXECUTE ON sa_policy_admin TO ols_test WITH GRANT OPTION;
    GRANT EXECUTE ON sa_audit_admin  TO ols_test WITH GRANT OPTION;
    
    GRANT LBAC_DBA TO ols_test;
    GRANT EXECUTE ON sa_sysdba TO ols_test;
    GRANT EXECUTE ON to_lbac_data_label TO ols_test;

    สร้าง Policy

    ต่อไปจะสร้าง policy ชื่อ region_policy ด้วยผู้ใช้ ols_test และระบุชื่อของ column ที่จะเป็นที่เก็บ label ว่า region_label

    sqlplus, ols_test/password
    CONN ols_test/password
    
    BEGIN
    	SA_SYSDBA.CREATE_POLICY(
    	policy_name => 'region_policy',
    	column_name => 'region_label');
    END;
    /
    
    GRANT region_policy_DBA TO ols_test;

    กำหนด component ของ label

    สร้าง component ของ label เพื่อใช้สำหรับ policy ที่สร้างไว้ตอนต้น region_policy
    – สร้างระดับไว้ 3 ระดับ คือ 20, 40 และ 60 มีชื่อเรียกสั้น ๆ ว่า L1, L2 และ L3 ชื่อเรียกยาว ๆ ว่า Level 1, Level 2 และ Level 3 ตามลำดับ
    – สร้างสิทธิ์การใช้งานไว้ 2 ชนิดประกอบด้วย 100, 120 มีชื่อเรียกอย่างย่อว่า M และ E และชื่อเรียกยาวว่า Manage และ Employee ตามลำดับ
    – สร้างกลุ่มของ policy ไว้ 4 กลุ่ม 20, 40, 60 และ 80 ชื่อย่อ R20, R40, R60 และ R80 ชื่อยาว Region North, Region South, Region East และ Region West ตามลำดับ
    สุดท้ายกำหนดให้ ols_test เป็นผู้มีสิทธิ์สูงสุดใน policy region_policy

    sqlplus, ols_test/password
    EXECUTE SA_COMPONENTS.CREATE_LEVEL('region_policy',20,'L1','Level 1');
    EXECUTE SA_COMPONENTS.CREATE_LEVEL('region_policy',40,'L2','Level 2');
    EXECUTE SA_COMPONENTS.CREATE_LEVEL('region_policy',60,'L3','Level 3');
    
    EXECUTE SA_COMPONENTS.CREATE_COMPARTMENT('region_policy',100,'M','MANAGEMENT');
    EXECUTE SA_COMPONENTS.CREATE_COMPARTMENT('region_policy',120,'E','EMPLOYEE');
    
    EXECUTE SA_COMPONENTS.CREATE_GROUP('region_policy',20,'R20','REGION NORTH');
    EXECUTE SA_COMPONENTS.CREATE_GROUP('region_policy',40,'R40','REGION SOUTH');
    EXECUTE SA_COMPONENTS.CREATE_GROUP('region_policy',60,'R60','REGION EAST');
    EXECUTE SA_COMPONENTS.CREATE_GROUP('region_policy',80,'R80','REGION WEST');
    
    EXECUTE SA_USER_ADMIN.SET_USER_PRIVS('region_policy','ols_test','FULL,PROFILE_ACCESS');

    สร้าง Table ทดสอบ

    สร้าง table พร้อมข้อมูลทดสอบใน schema ols_test โดย table ชื่อ customers มีฟิลด์ id, cust_type, first_name, last_name, region, credit กำหนดให้ id เป็น Primary key และ insert ข้อมูลลง table ด้วย

    sqlplus, ols_test/password
    CONN ols_test/password
    
    CREATE TABLE customers (
    	id                  NUMBER(10) NOT NULL,
    	cust_type           VARCHAR2(10),
    	first_name          VARCHAR2(30),
    	last_name           VARCHAR2(30),
    	region              VARCHAR2(5),
    	credit              NUMBER(10,2),
    	CONSTRAINT customer_pk PRIMARY KEY (id));
    
    GRANT SELECT, INSERT, UPDATE, DELETE ON customers TO PUBLIC;
    
    INSERT INTO customers (id, cust_type, first_name, last_name, region, credit)
    VALUES ( 1, 'SILVER', 'Harry', 'Hill', 'NORTH', 11000.00);
    INSERT INTO customers (id, cust_type, first_name, last_name, region, credit)
    VALUES ( 2, 'SILVER', 'Vic', 'Reeves', 'NORTH', 2000.00);
    INSERT INTO customers (id, cust_type, first_name, last_name, region, credit)
    VALUES ( 3, 'SILVER', 'Bob', 'Mortimer', 'WEST', 500.00);
    INSERT INTO customers (id, cust_type, first_name, last_name, region, credit)
    VALUES ( 4, 'SILVER', 'Paul', 'Whitehouse', 'SOUTH', 1000.00);
    INSERT INTO customers (id, cust_type, first_name, last_name, region, credit)
    VALUES ( 5, 'SILVER', 'Harry', 'Enfield', 'EAST', 20000.00);
    
    INSERT INTO customers (id, cust_type, first_name, last_name, region, credit)
    VALUES ( 6, 'GOLD', 'Jenifer', 'Lopez', 'WEST', 500.00);
    INSERT INTO customers (id, cust_type, first_name, last_name, region, credit)
    VALUES ( 7, 'GOLD', 'Kylie', 'Minogue', 'NORTH', 1000.00);
    INSERT INTO customers (id, cust_type, first_name, last_name, region, credit)
    VALUES ( 8, 'GOLD', 'Maria', 'Carey', 'WEST', 1000.00);
    INSERT INTO customers (id, cust_type, first_name, last_name, region, credit)
    VALUES ( 9, 'GOLD', 'Dani', 'Minogue', 'SOUTH', 20000.00);
    INSERT INTO customers (id, cust_type, first_name, last_name, region, credit)
    VALUES (10, 'GOLD', 'Whitney', 'Houston', 'EAST', 500.00);
    
    INSERT INTO customers (id, cust_type, first_name, last_name, region, credit)
    VALUES (11, 'PLATINUM', 'Robbie', 'Williams', 'SOUTH', 500.00);
    INSERT INTO customers (id, cust_type, first_name, last_name, region, credit)
    VALUES (12, 'PLATINUM', 'Thom', 'Yorke', 'NORTH', 2000.00);
    INSERT INTO customers (id, cust_type, first_name, last_name, region, credit)
    VALUES (13, 'PLATINUM', 'Gareth', 'Gates', 'WEST', 10000.00);
    INSERT INTO customers (id, cust_type, first_name, last_name, region, credit)
    VALUES (14, 'PLATINUM', 'Darius', 'Dinesh', 'EAST', 2000.00);
    INSERT INTO customers (id, cust_type, first_name, last_name, region, credit)
    VALUES (15, 'PLATINUM', 'Will', 'Young', 'EAST', 100.00);
    
    COMMIT;

    สร้าง label function

    เป็นการสร้าง function ชื่อ get_customer_label สำหรับสร้าง label ประกอบด้วย p_cust_type, p_region, p_credit
    – โดยกำหนด policy ระดับด้วย p_credit >2000 ก็จะมี v_label ว่า L3 ถ้า p_credit > 500 v_label คือ L2 และ p_credit < 500 v_label คือ L1
    – กำหนด p_cust_type เป็น platinum หรือไม่ถ้าเป็นก็จะอยู่ในจะมีิสิทธิ์ M ถ้าไม่ก็จะเป็น E โดยเอาค่าที่ได้มาต่อกับ v_label ข้อที่แล้ว
    – กำหนด p_region ถ้าเป็น north จะอยู่กลุ่ม R20 เป็นต้น และจะเอาค่าที่ได้ไปต่อกับ v_label ที่ได้จากข้อที่แล้ว
    – ค่าที่ return จา function นี้จะเป็นชื่อ policy และ v_label สุดท้ายที่ได้จากข้อกำหนดที่กล่าวมาข้างต้น

    sqlplus, ols_test/password
    CREATE OR REPLACE FUNCTION get_customer_label (
    	p_cust_type  IN  VARCHAR2,
    	p_region     IN  VARCHAR2,
    	p_credit     IN  NUMBER)
    RETURN LBACSYS.LBAC_LABEL AS
    	v_label  VARCHAR2(80);
    BEGIN
    	IF p_credit > 2000 THEN
    		v_label := 'L3:';
    	ELSIF p_credit > 500 THEN
    		v_label := 'L2:';
    	ELSE
    		v_label := 'L1:';
    	END IF;
    
    	IF p_cust_type = 'PLATINUM' THEN
    		v_label := v_label || 'M:';
    	ELSE
    		v_label := v_label || 'E:';
    	END IF;
    	IF p_region = 'NORTH' THEN
    		v_label := v_label || 'R20';
    	ELSIF p_region = 'SOUTH' THEN
    		v_label := v_label || 'R40';
    	ELSIF p_region = 'EAST' THEN
    		v_label := v_label || 'R60';
    	ELSIF p_region = 'WEST' THEN
    		v_label := v_label || 'R80';
    	END IF;
    
    	RETURN TO_LBAC_DATA_LABEL('region_policy',v_label);
    END get_customer_label;
    /
    
    SHOW ERRORS

    สั่งให้ Policy ทำงานกับ table ที่สร้าง

    เมื่อสั่งให้ Policy ทำงานจะเป็นการเพิ่ม column ที่เก็บ label ใน table เป้าหมาย

    sqlplus, ols_test/password
    CONN ols_test/password
    
    BEGIN
    	SA_POLICY_ADMIN.APPLY_TABLE_POLICY(
    	policy_name   => 'REGION_POLICY',
    	schema_name   => 'OLS_TEST',
    	table_name    => 'CUSTOMERS',
    	table_options => 'NO_CONTROL');
    END;
    /

    เริ่มสร้าง label

    เป็นการกำหนดค่าเริ่มต้นสำหรับ region_label ลงไปใน table ซึ่งถ้าไม่มีข้อมูลในฟิลด์นี้จะไม่มีใครสามารถเข้าถึงได้

    sqlplus, ols_test/password
    UPDATE customers
    SET region_label = CHAR_TO_LABEL('REGION_POLICY','L1');
    
    COMMIT;

    สั่งให้ Policy ทำงานอีกครั้ง

    ต่อไปจะเป็นการสั่งให้ policy ทำงานอีกครั้งใน table customers เพื่อเปลี่ยนค่าเป็นค่าที่ได้จะเป็นค่าจาก function ที่สร้างไว้

    sqlplus, ols_test/password
    BEGIN
    	SA_POLICY_ADMIN.REMOVE_TABLE_POLICY('REGION_POLICY','OLS_TEST','CUSTOMERS');
    	SA_POLICY_ADMIN.APPLY_TABLE_POLICY (
    	policy_name => 'REGION_POLICY',
    	schema_name => 'OLS_TEST',
    	table_name  => 'CUSTOMERS',
    	table_options => 'READ_CONTROL,WRITE_CONTROL,CHECK_CONTROL',
    	label_function => 'ols_test.get_customer_label(:new.cust_type,:new.region,:new.credit)',
    	predicate => NULL);
    END;
    /

    สั่งให้ label ทำงานกับข้อมูลในแต่ละแถว

    ปรับปรุงข้อมูลให้เป็นตามฟังก์ชันที่สร้างไว้กับข้อมูลแต่ละแถว

    sqlplus, ols_test/password
    UPDATE customers
    SET    first_name = first_name;
    
    COMMIT;

    สร้าง user ทดสอบ

    สร้าง user อื่นๆ เพื่อทดสอบ label ได้แก่ sales_manager, sales_north, sales_south, sales_east, sales_west
    – sales_manager มี label ว่า L3:M,E:R20,R40,R60,R80 แปลว่า sales_manager สามารถอ่านและเขียนข้อมูลได้ทุก Region
    – sales_north มี label ว่า L3:E:R20,R40 แปลว่า sales_north สามารถอ่านข้อมูลที่อยู่ใน Region North และ South
    – sales_south มี label ว่า L3:E:R20,R40,R60,R80 แปลว่า sales_south อ่านข้อมูลได้ทุก Region
    – sales_east มี label ว่า L3:E:R60 แปลว่า sales_east อ่านข้อมูล Region East ได้อย่างเดียว
    – sales_west มี label ว่า L3:E:R80 แปลว่า sales_west อ่านข้อมูล Region West ได้อย่างเดียว

    sqlplus, / as sysdba, (sales_manager, sales_nort, sales_south, sales_east, sales_west, ols_test)/password
    CONN / AS SYSDBA;
    
    CREATE USER sales_manager IDENTIFIED BY password;
    CREATE USER sales_north IDENTIFIED BY password;
    CREATE USER sales_south IDENTIFIED BY password;
    CREATE USER sales_east IDENTIFIED BY password;
    CREATE USER sales_west IDENTIFIED BY password;
    
    GRANT CONNECT TO sales_manager, sales_north, sales_south, sales_east, sales_west;
    
    CONN ols_test/password
    
    BEGIN
    	SA_USER_ADMIN.SET_USER_LABELS('region_policy','sales_manager','L3:M,E:R20,R40,R60,R80');
    	SA_USER_ADMIN.SET_USER_LABELS('region_policy','sales_north','L3:E:R20,R40');
    	SA_USER_ADMIN.SET_USER_LABELS('region_policy','sales_south','L3:E:R20,R40,R60,R80');
    	SA_USER_ADMIN.SET_USER_LABELS('region_policy','sales_east','L3:E:R60');
    	SA_USER_ADMIN.SET_USER_LABELS('region_policy','sales_west','L3:E:R80');
    END;
    /

    ทดสอบ Label Security 

    เข้าระบบผ่าน sqlplus ด้วย user ต่างๆ ที่สร้างในข้อที่แล้วเพื่อดูข้อมูลว่าถูกต้องหรือไม่ เพื่อความสะดวกจึงเข้าผ่านโปรแกรมสำเร็จรูปอื่นเพื่อให้ดูง่าย ได้ผลดังรูปต่อไปนี้นี้

    sqlplus, sales_manager, sales_north, sales_south, sales_east, sales_west

    จบขอให้สนุก

    ที่มา https://oracle-base.com/articles/9i/oracle-label-security-9i#Installation

  • WordPress Custom Error page

    เนื่องจากมีปัญหาเกี่ยวกับการแสดงผล error page ที่แสดงผลใน licensing.psu.ac.th จึงต้องหาทางแก้ไขการแสดง Error page 403 ใหม่

    1. Plug in ชื่อ Custom Error Pages ติดตั้งแล้วเปิดใช้งานให้เรียบร้อย
    2. เพิ่มข้อความต่อไปนี้ในแฟ้ม .htaccess
      ErrorDocument 403 /index.php?status=403
      ErrorDocument 401 /index.php?status=401
    3. แต่เนื่องจากไซต์ที่แสดง error 403 ไม่ใช่ licensing.psu.ac.th แต่เป็น bahamut.psu.ac.th ซึ่งอาจจะมีหลายท่านเคยเจอข้อความประมาณ
      Forbidden You don't have permission to access /licensing/SW_DVD5_Office_Professional_Plus
      _2013w_SP1_32-BIT_X64_English_X19-35900.ISO on this server.
    4. ฉะนั้นต้องไปสร้าง .htaccess ในพื้นที่ของไซต์ bahamut.psu.ac.th แทน ซึ่งอยู่ที่ /licensing มีข้อความว่า
      ErrorDocument 403 https://licensing.psu.ac.th/index.php?status=403 
      ErrorDocument 401 https://licensing.psu.ac.th/index.php?status=401
    5. จบขอให้สนุก
    6. ก่อนจาก licensing.psu.ac.th เป็นที่จัดเก็บ link ของไฟล์ที่อยู่บน bahamut.psu.ac.th เมื่อดาวน์โหลดไฟล์ต่างๆ นอกมหาวิทยาลัย จะแจ้ง error ในหน้าของ bahamut.psu.ac.th ทำให้ดูไม่เป็นหนึ่งเดียว ปรับแก้ด้วยวิธีข้างต้น
    7. ตัวอย่างหน้า error page เข้ารับชมได้ที่ https://licensing.psu.ac.th/index.php?status=403
    8. สรุปได้ว่า ErrorDocument จะชี้ที่ไหนก็ได้