Month: August 2016

  • การพัฒนา API อย่างมืออาชีพ และทำไมต้อง RESTful Service

    API คืออะไร?
    API ย่อมาจาก Application Programming Interface คือการพัฒนาโปรแกรมสำหรับเป็นส่วนติดต่อเซอร์วิสของแอพพลิเคชั่น หรือโมดูลต่างๆ เพื่อให้คนภายนอกมาเรียกใช้งาน หรือกล่าวอย่างง่ายๆ ก็คือการเขียนโปรแกรมเพื่อให้บริการสำหรับให้คนอื่นมาเรียกใช้งาน ซึ่งแนวคิดเรื่องการสร้าง API เพื่อการใช้งานก็มีมาอย่างยาวนานแล้ว ยกตัวอย่างเช่นตั้งแต่ที่มีการสร้างระบบปฎิบัติการ (OS) ก็จะมีการติดต่อ API ของไดร์เวอร์อุปกรณ์ฮาร์แวร์ต่างๆ ของเครื่องคอมพิวเตอร์เพื่อเรียกใช้งานอุปกรณ์นั้นๆ ตามคำสั่งของนักพัฒนา (more…)

  • แก้ไข wordpress post แล้ว update ไม่ได้ แอดมินต้องแก้ไขอย่างไร

    หลังจากย้าย WordPress site ไปลง ubuntu 16.04.1 ก็ได้เตรียมติดตั้งโปรแกรมต่าง ๆ แต่แล้วเมื่อลองจะแก้ไขบล็อก กลับทำไม่ได้ ขึ้นข้อความว่า

    “The sysadmin.psu.ac.th page isn’t working
    sysadmin.psu.ac.th is currently unable to handle this request.
    HTTP ERROR 500”

    เกิดอะไรขึ้นหล่ะ แล้วเราจะต้องทำอย่างไร

    ค้นหาเจอเว็บนี้ ที่บอกเราว่า ให้ลองเปิด DEBUG
    https://wordpress.org/support/topic/http-error-500-internal-server-error-whole-blog-is-down

    “So to understand where the reason of 500 error is I suggest go to wp-config.php in the root of your website and add there two lines:
    define(‘WP_DEBUG’, true);
    @ini_set(‘display_errors’, 1);
    After that you can see exactly place which linked with 500 error.
    After fixing I suggest return it how it was by default (only one line)
    define(‘WP_DEBUG’, false);”

    เมื่อใช้คำสั่งตรวจสอบ error.log ครั้งแรก ไม่เห็นอะไรเพิ่มเติม แต่พบ error 404 ของ plugin ที่ชื่อ WP Like Button ก็ลองปิด plugin นี้ดูเราจึงจะพบ error ก็เห็น error ต่าง ๆ ได้จากคำสั่งข้างล่างนี้

    tail -f /var/log/apache2/error.log

    Fatal error: Uncaught Error: Class ‘DomDocument’ not found in /var/www/wordpress/wp-content/plugins/google-sitemap-plugin/google-sitemap-plugin.php:144

    ค้นหาต่อว่าทำไมจึงขาด DomDocument ก็เจอเว็บนี้
    https://blog.namran.net/2009/03/10/php-fatal-error-class-domdocument-not-found-in-blabla/
    แนะนำว่า

    “the solution turn out to be yum install php-xml”

    ตรวจสอบดู เออนะ ไม่มี php-xml จริง ๆ ด้วย ด้วยคำสั่งนี้
    dpkg -l | grep php-xml
    dpkg -l | grep php7.0-xml

     

    ทีนี้เราก็ติดตั้ง php-xml ด้วยคำสั่ง
    sudo apt install php-xml
    จะได้
    libxslt1.1 php-xml php7.0-xml

    ทำให้สามารถใช้งานได้ปรกติแล้ว ซึ่งในกระบวนการ post และ ppdate post นั้น ได้แก้ไข post ให้แล้ว เพียงแต่ว่ามันไปทำต่อที่ google-sitemap-plugin ไม่สำเร็จจึงแสดงเป็น error ออกมา

    ขอบคุณเพื่อน ๆ ที่ช่วยกันแก้ไขเรื่องนี้ด้วยกันด้วยครับ

  • การตั้งค่า MaxRequestWorkers บน Apache ให้เหมาะสมกับจำนวนผู้ใช้

    ปัญหาของ PSU Webmail ในช่วง 9-15 สิงหาคม 2559 ที่ผ่านมา คือ เมื่อเริ่มเข้าสู่เวลาราชการ ในวันทำการ พบว่า มีการตอบสนองที่ช้า บางครั้งต้องรอถึง 15-20 วินาที หรือ ผู้ใช้บางท่านแจ้งว่า Timeout ไปเลย หรือไม่ก็ใช้งานไปสักพัก ถูกดีดกลับมาหน้า Login ใหม่

    แต่เมื่อพ้นเวลาราชการ พบว่าการตอบสนองก็เร็วขึ้นดังเดิม รวมถึงในช่วงวันหยุดก็เร็วอย่างที่ควรเป็น

    ขอบคุณทาง NetAdmin ที่ทำระบบตรวจสอบไว้ที่หน้า Data Center เพื่อตรวจจับความเร็วในการตอบสนองบริการ PSU Webmail ด้วย SmokePing ผลที่ได้เป็นดังภาพ

    2559-08-15 16_03_36-SmokePing Latency Page for HTTPS to webmail.psu.ac.th in Data Center at Hat Yai

    จะเห็นว่า มีความหน่วงในการตอบสนอง เฉพาะในวันเวลาราชการเท่านั้น … ทำไม ???

    ทำการตรวจสอบด้วยคำสั่ง

    ps aux |grep apache| wc -l

    เพื่อดูว่า มีจำนวน Apache อยู่กี่ Process พบว่า ในช่วงเวลาที่ระบบหน่วง มี Process เกือบคงที่ที่ 150 แต่ในช่วงที่ระบบทำงานได้เร็ว มีจำนวนประมาณ 50 process

    จากการศึกษา พบว่า Apache2 ที่ใช้ MPM Prefork นั้น จะจำกัดค่า MaxRequestWorkers ไว้ โดยหากไม่กำหนดค่าใดๆจะตั้งไว้ที่ 256 แต่เมื่อตรวจสอบในไฟล์

    /etc/apache2/mods-enabled/mpm_prefork.conf

    พบว่า

    <IfModule mpm_prefork_module>
    StartServers 5
    MinSpareServers 5
    MaxSpareServers 10
    MaxRequestWorkers 150
    MaxConnectionsPerChild 0
    </IfModule>

    ทำให้เพดานของจำนวน Process ไปจำกัดที่ 150 ดังที่ตรวจสอบเบื้องต้น เมื่อมีผู้ใช้มากขึ้นกว่าเดิม จึงทำให้ Process ไม่เพียงพอต่อความต้องการ เป็นผลให้เกิดการหน่วงขึ้น

    จึงทำการแก้ไข MaxRequestWorkers เป็น 256 แล้ว Restart Apache

    ผลทำให้ จำนวน Apache Process ขึ้นไปถึง 200 Process และการตอบสนองเร็วขึ้นตามที่ควรเป็นดังภาพ (หลังเวลา 14:45)

    2559-08-15 16_03_21-SmokePing Latency Page for HTTPS to webmail.psu.ac.th in Data Center at Hat Yai

    ทั้งนี้ การกำหนดจำนวน MaxRequestWorkers นั้น ต้องสัมพันธ์กับ RAM ของ Server ด้วย โดยมีสูตรคร่าวๆ คือ จำนวน RAM ในหน่วย MB หารด้วยขนาดของ Apache Process โดยเฉลี่ย

    เช่น

    มี RAM 4GB = 4 x 1024 = 4096

    ขนาดเฉลี่ย Apache Process = 20

    ดังนั้น MaxRequestWorkers = 4096/20 = 204

    แต่จริงๆแล้ว ควรเผื่อ Memory ไว้ให้ OS และอื่นๆด้วย (อาจจะไม่เต็ม 4096) หากขยับค่า MaxRequestWorkers แล้วยังพบว่า จำนวน Process ยังขึ้นไปเต็มเพดานอยู่ ควรพิจารณาเพิ่ม Memory ด้วย

    ประมาณนี้ครับ

    UPDATE:

    ผลการปรับแก้ไข ทำให้ เวลาในการตอบสนอง จากที่หน่วง 10 วินาที เหลือ เพียง 50 มิลลิวินาที ดังภาพ

    2559-08-17 16_03_42-SmokePing Latency Page for HTTPS to webmail.psu.ac.th in Data Center at Hat Yai

     

  • การเชื่อมต่อ Thunderbird กับ Google Mail (ทั้ง Gmail และ Google Apps)

    ในอดีต Thunderbird และ Mail Client อื่นๆสามารถติดต่อกับ Google Mail ได้โดยตั้งค่า Mail Server ให้ถูกต้อง และ username/password ก็สามารถใช้งานได้ แต่ในปัจจุบัน Google หันไปใช้ระบบ OAuth 2.0 ซึ่งการ Authentication หรือการใส่ username/password ต้องทำที่ Google เท่านั้น รวมถึงการทำ 2-Step Verification ด้วย (การใส่ One-Time Password นอกเหนือจาก username/password เป็นต้น) ทำให้ Thunderbird และ Mail Client ที่ยังไม่รองรับ OAuth 2.0 ไม่สามารถใช้งานได้

    แต่ทาง Google Mail ยังเปิดให้สามารถใช้งานได้ โดยแบ่งเป็น 2 กรณีคือ ใช้หรือไม่ใช้ 2-Step Verification โดยตรวจสอบได้จาก

    0. วิธีตรวจสอบว่าใช้งาน 2-Step Verification หรือไม่ โดยการไปที่ https://myaccount.google.com/security
    หากไม่เปิดใช้ 2-Step Verification จะได้หน้าตาอย่างนี้
    2559-08-08 09_33_29-Program Manager
    หากเปิดใช้ 2-Step Verification จะได้หน้าตาอย่างนี้
    2559-08-08 09_34_04-Program Manager

    1. ผู้ใช้ที่ไม่ได้เปิดใช้งาน 2-Step Verification ให้ไปที่ https://myaccount.google.com/security#connectedapps
    ภายใต้หัวข้อ Allow less secure apps ให้เปิดใช้งาน ดังภาพ
    2559-08-08 09_40_49-Program Manager

    2. ผู้ใช้ที่เปิดใช้งาน 2-Step Verification ให้ไปที่ https://security.google.com/settings/security/apppasswords
    แล้วเลือก Mail และ Windows Computer แล้วคลิก Generate ดังภาพ
    2559-08-08 10_03_47-App passwords - Account Settings
    จะได้ Password ที่ใช้ครั้งเดียวทิ้ง (ไม่ต้องไปจำ) ดังภาพ
    2559-08-08 10_06_10-App passwords - Account Settings
    หากวันหลังต้องการเลิกใช้ ก็กดปุ่ม Revoke ภายหลังได้

    จากนั้น เปิดให้ Google Account ใช้งาน IMAP ได้ โดยไปที่ https://mail.google.com/mail/u/0/#settings/fwdandpop
    แล้วคลิก Enable IMAP ดังภาพ
    2559-08-08 10_17_17-Settings - Psu.ac.th Mail
    แล้วคลิก Save Change ด้านล่าง

    สุดท้าย ที่ Thunderbird ให้ตั้งค่า

    Password: สำหรับคนที่ไม่ใช้ 2-Step Verification ให้ใส่ Password ของ Google Account เดิมลงไป ส่วนคนที่ใช้ 2-Step Verification ให้เอา Password ที่ได้มาใหม่ใส่ลงไปแทน
    Incoming IMAP เป็น imap.gmail.com และ SSL เป็น SSL/TLS
    Outgoing SMTP เป็น smtp.gmail.com และ SSL เป็น SSL/TLS
    อย่าลืม ใส่ username ให้มี @gmail.com หรือ @psu.ac.th ในกรณีใช้ PSU GAFE ด้วย
    แล้วคลิกปุ่ม Done ดังภาพ

    2559-08-08 10_12_15-Mail Account Setup

    เท่านี้ก็สามารถใช้งาน Google Mail จาก Thunderbird ได้แล้ว

  • เทคนิคการวัดความเร็วในการตอบอีเมลลูกค้า

    ถ้ามี KPI ที่ต้องทำให้สำเร็จคือ “ร้อยละของปัญหาที่ตอบกลับลูกค้าภายใน 2 วันทำการ”
    แล้ว … ช่องทางที่รับปัญหาจากลูกค้าคือ ทางอีเมล (ในที่นี้เป็นบริการอีเมลบนระบบของ Google Mail หรือ Gmail)
    โดยการตอบกลับ คือ การ Reply กลับไปหาลูกค้า
    เวลาที่นับคือ นับตั้งแต่เวลาที่อีเมลเข้ามาถึง จนกระทั่งมีการตอบกลับไปหาลูกค้าทางอีเมลฉบับแรก

    สำหรับคนที่ใช้ Google Mail หรือ Gmail อยู่ สามารถใช้ Google Sheets ทำรายงานได้ ตามขั้นตอนต่อไปนี้
    1. ไปที่ drive.google.com (ให้ Login ด้วย Account ที่ต้องการด้วย)
    2. สร้าง Google Sheets แล้วตั้งชื่อตามต้องการ เช่น Report
    3. ไปที่เมนู Tools > Script Editor
    2559-08-04 11_20_00-My Drive - Google Drive
    4. ตั้งชื่อ Project ว่า report แล้ววางโค๊ดต่อไปนี้ลงไป

     

    function reportResponseTime() {
    // ถ้าจะทำรายงานทั้ง Inbox ให้ uncomment บรรทัดต่อไปแทน
    //var threads = GmailApp.getInboxThreads();

    // ถ้าจะทำรายงานเฉพาะ Lable ที่เตรียมไว้ ในที่นี้ใช้ Label “support-psuemail”
    var threads = GmailApp.search(‘label:support-psuemail ‘);

    for (var i = 0; i < threads.length; i++) { // วนลูปแต่ละ Thread
    if (threads[i].getMessageCount() > 1) { // สนใจเฉพาะ Thread ที่มีการตอบกลับเท่านั้น
    var messages = threads[i].getMessages(); // Subject ของอีเมล
    var d1= messages[0].getDate().getTime(); // เวลาที่อีเมลเข้ามา
    var d2= messages[1].getDate().getTime(); // เวลาที่ตอบกลับฉบับแรก
    var diff = (d2-d1)/(1000*60*60); // ระยะเวลาหน่วยเป็น ชั่วโมง

    // เขียนต่อท้าย Sheet ที่กำลังใช้งาน
    SpreadsheetApp.getActiveSheet().appendRow([messages[0].getSubject(), messages[0].getDate(), messages[1].getDate(), diff])
    }
    }
    }

     

     

    2559-08-04 11_24_42-Clipboard

    5. คลิก Run > reportResponseTime
    (หากมีหน้าจอ Consense ต่างๆขึ้นมาให้ Allow ไป)
    6. ผลจะปรากฏใน Sheet ที่เปิดไว้
    2559-08-04 11_34_18-Report - Google Sheets
    7. จากนั้นสามารถเอาผลไปคำนวนต่อ เช่น ร้อยละของอีเมลที่ตอบสนองภายใน 48 ชั่วโมงหรือ 2 วัน เป็นต้น และสามารถตอบคำถามได้ว่า ทำไมบางฉบับใช้เวลาเกิน 48 ชั่วโมง (อาจจะเป็นเพราะติดเสาร์อาทิตย์เป็นต้น)

    *** กรุณาอ้างอิงด้วยนะครับ หากนำไปเผยแพร่ต่อ ***

  • Bash Bash Bash เต็มไปหมด…

    ไมโครซอฟท์ปล่อยอัพเดต Windows 10 Anniversary Update แล้ว ถึงเวลาลอง bash shell บนวินโดวส์แล้วสิ…

    • ติดตั้ง Windows 10 Anniversary ทำได้สองทาง
      • หากใช้ Windows 10 อยู่แล้วก็ Windows update ได้เลย (รุ่น Professional อาจยังไม่มีให้ update)
      • ต้องการติดตั้ง Windows 10 ใหม่ โหลดที่ https://licensing.psu.ac.th/tag/anniversary/ เลือกเอาเลยจะเอารุ่น Professional หรือ Education (สำหรับนักศึกษาต้องเป็นรุ่น Education)
      • ติดตั้งไปจนเสร็จเรียบร้อย
    • ต้องเชื่อมต่อ Internet ตลอดเวลาที่ติดตั้ง!!
    • คลิกขวาที่ปุ่ม start เลือก Programs and Features
      Programs and Features
    • คลิก Turn Windows Features on or off
      Turn Windows Features on or off
    • เลือก Windows Subsystem for Linux (Beta)
    • เมื่อติดตั้งเสร็จแล้ว ให้เปิด developer mode คลิกที่ start menu แล้วพิมพ์ deve จะได้ดังรูป แล้วเลือก for developers settings
      Start menu
    • ได้ดังภาพเลือก Developer mode
      developer mode
      คลิก Yes
      Developer Mode
    • อาจมีข้อความเตือนให้ restart ก็ restart ให้เรียบร้อย
    • คลิกขวาที่ปุ่ม Start เลือก Command Prompt (Admin)
      CMD
    • พิมพ์ bash
      bash
    • กด y แล้วกด enter
      Download
    • จะเป็นการเริ่ม download รอจนครบ 100%
      Download
    • ตั้ง username และ password
      create user
    • เมื่อตั้งเสร็จเรียบร้อยก็พร้อมใช้งาน
      ready
    • ทุกครั้งที่ต้องการใช้งานให้เรียก bash ได้ที่ปุ่ม start แล้วเลือก Bash on Ubuntu on Windows
      bash on start
    • ทดสอบ ssh
      ssh
    • จบ… ขอให้สนุกครับ
  • วิธีตรวจสอบเว็บไซต์ที่โดน Hack #18

    ได้รับแจ้งจาก ThaiCERT ว่ามีเว็บไซต์ภายในโดเมนของมหาวิทยาลัย เผยแพร่ Code อันตราย ดังต่อไปนี้
    2559-08-01 14_13_24-[THAICERT.OR.TH #93507] แจ้งปัญหา พบโปรแกรมหรือซอร์สโค้ดที่ต้องสงสัยบนโดเมน psu.
    จึงเข้าทำการตรวจสอบในเครื่องเว็บเซิร์ฟเวอร์ดังกล่าว พบการวางไฟล์ Backdoor ไว้ดังที่อธิบายใน วิธีตรวจสอบเว็บไซต์ที่โดน Hack #17 แล้ว

    แต่ที่เห็นผิดปรกติ ก็เป็นใน access.log ของ Apache ซึ่งพบว่า มีการเรียกใช้ xmlrpc.php เป็นจำนวนมาก ดังภาพ

    13838385_1246527315359434_1464114410_o

    จากการตรวจสอบ พบว่า xmlrpc.php เป็นช่องทางให้สามารถเรียกใช้ Function ต่างๆผ่านทาง HTTP และเป็นช่องทางให้ App ต่างๆสามารถติดต่อกับ WordPress ได้ แต่ก็เป็นช่องทางให้เกิดการเดารหัสผ่านจำนวนมากได้เช่นกัน (Brute Force Attack) โดยสามารถทดลอง ส่ง XML ที่มีโครงสร้าตามที่ API กำหนด เช่น wp.getUsersBlogs [1][2][3] สามารถดูจำนวน Blog ที่ User คนนั้นๆเขียนขึ้นมา แต่ ต้องระบุ username/password ซึ่งตรงนี้จะเป็นส่วนที่ทำให้เกิดการ Brute Force ได้ ด้วยคำสั่งต่อไปนี้ เป็นการเดารหัสผ่านไปยัง http://localhost/blog/xmlrpc.php


    echo "<methodCall><methodName>wp.getUsersBlogs</methodName><params><param><value> <string>admin</string></value></param>  <param><value><string>password</string></value></param></params></methodCall>" | POST http://localhost/blog/xmlrpc.php

    หากสำเร็จ จะได้คำตอบมาอย่างนี้

    2559-08-01 15_14_21-Clipboard

    หากเป็น WordPress รุ่นต่ำกว่า 4.0 เปิดให้ใช้ system.multicall ซึ่งทำให้สามารถเดารหัสผ่านจำนวนมาก ใน 1 Request ทำให้ระบบตรวจจับได้ยาก ดังนั้น หากไม่จำเป็นต้องใช้ xmlrpc.php ก็สมควรปิดการใช้งานที่ระดับ Apache โดยสร้างไฟล์ /etc/apache2/conf-enabled/xmlrpc.conf มีข้อมูลเป็น


    <FileMatch "xmlrpc\.php$">
    Order Deny,Allow
    Deny from All
    </FileMatch>

    จากนั้น Restart Apache ก็สามารถปิดการทำงานได้
    Reference
    [1] http://www.hackingsec.in/2014/08/wordpress-xml-rpc-brute-force-attack.html#
    [2] http://blog.dewhurstsecurity.com/2012/12/11/introduction-to-the-wordpress-xml-rpc-api.html
    [3] https://codex.wordpress.org/XML-RPC_WordPress_API