Category: Open Source Software & Freeware

  • django (ดี)จังโก้ ดีอย่างไร #01

    ขอไม่ลงรายละเอียดว่า อะไรคือ Web Framework, MVC, MVT พวกนั้นนะครับ อ่านเองที่ https://www.djangoproject.com/ และ เขียนวิธีติดตั้งบน Windows ไว้คร่าว ๆ ที่ ขั้นตอนการติดตั้ง django บน Windows และในที่นี้ใช้ Visual Studio Code เป็น Editor (สั่งด้วยคำสั่ง code …)

    โจทย์

    สมมุติในทีม มีคน 10 คน ต้องการ ระบบบันทึกการปฏิบัติงาน

    1. จัดเก็บข้อูล วันเวลาของงานที่ทำ, ประเภทของงงาน (ตาม TOR), รายละเอียดของงานที่ทำ, ระยะเวลาที่ใช้ไป (ชั่วโมง)
    2. แต่ละคน ต้อง Login เข้ามาก่อน จึงจะบันทึกปฏิบัติงานได้

    วิถีแบบ django

    สร้าง project ชื่อ myproject

    django-admin startproject myproject

    สร้าง App ชื่อ worklog

    cd myproject
    python manage.py startapp worklog

    สร้าง Model ว่าจะเก็บข้อมูลอะไรบ้าง

    แก้ไขไฟล์

    code worklog/models.py

    แล้วสร้าง Class ชื่อ Worklog เพื่อกำหนด Field เป็นช่องทางการเก็บค่าตามโจทย์ (Reference: https://docs.djangoproject.com/en/2.1/ref/models/fields/)
    –> ขั้นตอนนี้ เขียนใน Visual Studio Code เสร็จแล้ว Save and Exit

    from django.db import models
    from django.utils.timezone import now
    
    # Create your models here.
    class Worklog(models.Model):
        timestamp = models.DateTimeField(default = now())
        typeOfWork = models.ForeignKey('TypeOfWork', on_delete=models.CASCADE)
        work_text = models.TextField(default="")
        manhour = models.FloatField(default=0)
        def __str__(self):
            return self.work_text
    
    class TypeOfWork(models.Model):
        typeOfWork_text = models.CharField(max_length=200)
        def __str__(self):
            return self.typeOfWork_text

    บอกให้ django สร้างโครงสร้างฐานข้อมูลตามโมเดล (จาก Command Prompt)

    python manage.py migrate

    เพิ่ม App ‘worklog’ เข้าสู่ myproject

    แก้ไขไฟล์

    code myproject/settings.py

    เพิ่ม ‘worklog’ ในส่วนของ INSTALLED_APPS
    –> ขั้นตอนนี้ เขียนใน Visual Studio Code เสร็จแล้ว Save and Exit

    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'worklog'
    ]

    สร้าง Super User สักคนนึง

    python manage.py createsuperuser

    ตั้งชื่อว่า admin และ รหัสผ่านตามต้องการ

    เพิ่มโมเดล TypeOfWork และ WorkLog เข้าสู่หน้าของ Admin โดยการแก้ไขไฟล์
    –> ขั้นตอนนี้ เขียนใน Visual Studio Code เสร็จแล้ว Save and Exit

    code worklog/admin.py

    ดังนี้

    from django.contrib import admin
    
    # Register your models here.
    from .models import TypeOfWork, Worklog
    admin.site.register(TypeOfWork)
    admin.site.register(Worklog)

    สั่ง Run Server

    สั่งที่ Command Prompt

    python manage.py runserver

    แล้วเปิด Web Browser ไปที่
    http://127.0.0.1:8000/admin/

    ใส่ Login และ Password ของ admin ทั้งตั้งไว้ก่อนหน้านี้

    เริ่มต้นใช้งาน

    เพิ่มประเภทของงาน

    คลิก Type of works — django พยายามใส่ s ให้ด้วยอัตโนมัติ
    คลิกที่ปุ่ม ADD TYPE OF WORK
    เพิ่มประเภทของงาน วนไป
    เสร็จแล้วได้ผลประมาณนี้ อยากจะ Edit Delete ได้หมด

    เพิ่มบันทึกการปฏิบัติงาน

    คลิกที่ Add ในส่วนของ Worklogs

    มี Form สำหรับ Input ทันที

    สวยงาม ไม่ต้องทำอะไรเพิ่ม เลือก Type of works ได้ ช่องวันที่ เวลา ก็มี Widget ให้เรียบร้อย
    แก้ไขไป มี History ให้ด้วย

    จากนั้น ก็เพิ่มคนเข้าทีม ด้วยเมนู Users ได้

    ระบบ Security พร้อม

    User01 ตั้งค่าให้เป็น Worklog > Can Add Worklog
    ก็จะทำได้แค่เข้ามาบันทึกปฏิบัติงานเท่านั้น

    สรุป

    จะเห็นได้ว่า ด้วยการสร้างโมเดลเล็กน้อย django ก็สามารถสร้างระบบ User Entry ง่าย ๆ ที่มาพร้อม Security Features มากมายได้แล้ว ยังมีรายละเอียดอีกเยอะ โดยเฉพาะในส่วนของ View/Template ที่จะสร้าง User Input และการออกรายงานต่าง ๆ รวมถึง การสร้าง API และ RESTful API หรือ จะผูกกับ OAuth2 ก็ยังได้

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

  • Everything are connected together

    “ทุกสรรพสิ่งเชื่อมต่อกัน”

    สวัสดี ผู้อ่านทุกท่านนะครับ นี่คือบทความฉบับปฐมภูมิของผู้เขียน ที่จะนำพาท่านไปพบกับบทความในอีกรูปแบบหนึ่ง ที่ผู้เขียนพยามสรรสร้างบทความนี้เพื่อให้เกิดแนวความคิดที่เรียบง่าย แต่ได้ไอเดีย เพื่อนำไปสร้างนวัตกรรมหรือนำไปประยุกต์ใช้งานกับหน้าที่การงาน ที่เราต่างร่วมกันทำเพื่อองค์กรของเราให้มีความก้าวหน้าอย่างยั่งยืนต่อไป

    กล่าวถึงหัวข้อที่ผู้เขียนเรื่อง “Everything are connected together” เป็นเรื่องราวที่ผู้เขียนได้สกัดมาจากงานที่ผู้เขียนปฏิบัติจริงและได้มีการดำเนินการมาเป็นระยะเวลา 2 ปี ตั้งแต่เริ่มตั้งไข่ จนกระทั่งเริ่มยืนและเดินได้ เติบโตขึ้นทีละเล็ก ทีละน้อย ค่อยๆ เพิ่มทักษะในการเรียนรู้ไปพร้อม ๆ กัน

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

    ปัจจุบันโลกของเรามีการเปลี่ยนอย่างก้าวกระโดด โดยเฉพาะในด้านเทคโนโลยีตลอดจนเครื่องมือต่าง ๆ เกิดขึ้นมากมายให้เราเลือกนำมาใช้งาน สิ่งที่จะกล่าวต่อไปนี้คือ “ทุกสรรพสิ่งเชื่อมต่อกัน” เมื่ออ่านมาถึงจุดนี้ผู้อ่านคงจะเริ่มคิดถึงสิ่งต่าง ๆ ที่อยู่รอบตัวเรา ในชีวิตประจำวันที่เราใช้ Internet มันเชื่อมโยงทุกสิ่งอย่าง อย่างไรก็ตามในหลาย ๆ มิติของการเปลี่ยนแปลงมันก็เป็นไปตามธรรมชาติของมัน นั่นคือทุกอย่างล้วน เกิดขึ้น ตั้งอยู่ และดับไป ผู้เขียนพยามสะท้อนให้เห็นถึงความเป็นจริง หากเราจะก้าวไปข้างหน้า จงอย่างไปยึดติด แต่เราควรเลือกที่จะเปลี่ยนให้เหมาะสมไปตามภาวะในความเป็นจริง

    เรามาเข้าเรื่องที่จะนำเสนอในบทความนี้กัน…. เพิ่งได้เข้าเรื่องนะ OK ใจเย็น ๆ ไม่ต้องรีบร้อนค่อย ๆ อ่านไปแล้วกันนะ ^_^

    จากการที่ศูนย์คอมพิวเตอร์ มหาวิทยาลัยสงขลานครินทร์ เป็นเจ้าภาพในการจัดการประชุมปฏิบัติการ “ระบบเทคโนโลยีสารสนเทศและการสื่อสารมหาวิทยาลัยสงขลานครินทร์” ครั้งที่ 1 (The 1st PSU ICT Workshop) นับเป็นนิมิตหมายอันดีที่ทำให้เราได้เชื่อมต่อถึงกัน ในการประชุมครั้งนั้นผู้เขียนได้มีส่วนร่วมในการนำเสนอ ” แพลตฟอร์มสำหรับการพัฒนา web app และ mobile app บนสถาปัตยกรรมไมโครเซอร์วิส (Microservices Architecture)”

    สถาปัตยกรรมของแพลตฟอร์มใหม่ ของคณะวิศวกรรมศาสตร์
    สามารถอ่านรายละเอียด Story ได้ที่นี่(เปิดดูได้เฉพาะเครือข่ายภายใน มอ.)
    https://dev-paas.eng.psu.ac.th

    สถาปัตยกรรมของแพลตฟอร์มใหม่ ของคณะวิศวกรรมศาสตร์ ได้ออกแบบขึ้นบนพื้นฐานของสถาปัตยกรรม Microservice ซึ่งทุกสิ่งอย่างเชื่อมต่อกัน แต่ละ Service มีหน้าที่เฉพาะตัว ไม่ยึดติดภาษาที่ใช้พัฒนา แต่เราจะควบคุมให้ทำงานตามที่เราต้องการและสามารถปรับแต่งได้ เพื่องรองรับการเปลี่ยนแปลง นั่นคือภาพโดยรวมของเพลตฟอร์ม

    การเลือกเครื่องมือ (Tools) ทีนำมาใช้ในการพัฒนาหรือการ Operation ระบบทั้งหมดนั้นมีความสำคัญต่อการปฏิบัติงาน หลักการเลือกเครื่องมือของผู้เขียนมีดังนี้

    1. ตรงตามความต้องการ
    2. มีรายละเอียด (Docs) อธิบายชัดเจน
    3. มีชุมชน (Community) ที่มีการ update ปัญหาอย่างสมำเสมอ
    4. มี Road map ของการพัฒนาที่ชัดเจน
    5. มีช่องทางเชื่อมต่อแบบต่างเพลตฟอร์ม (Cross Platform)

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

    ชุดเครื่องมือ Open source สำหรับการบริหารจัดการเพลตฟอร์ม

    จากภาพเครื่องมือที่ใช้นั้นเป็น Open source ที่มาจากต่างค่าย ต่างผู้พัฒนาแต่มันสามารถเชื่อมต่อกันได้อย่างลงตัว ซึ่งรายละเอียดของเครื่องมือนั้นผู้เขียน ขอให้ข้อมูลจากผู้ให้บริการเลยนะครับซึ่งมีดังนี้

    1. Kong API Gateway เป็นเครื่องมือสำหรับจัดการ การเข้าถึง APIs จากภายนอกแล้วไปเรียก APIs ภายในโดยใช้หลักการ Reverse proxy ได้อย่างง่าย สะดวก ไม่ต้องเขียน config ให้ยุ่งยากปลอดภัยและรวดเร็ว ในตัว Kong API Gateway นั้น มี Logging UDP/TCP Plugin  ให้เราสามารถส่ง logs ไปบันทึกตามตำแหน่งที่เราต้องการได้ Reference:  https://konghq.com
    2. ELK API Analytic เป็นเครื่องมือที่หลายคนน่าจะรู้จักดีและมีบทความดี ๆ ที่ผ่านมาเกี่ยวกับ ELK อยู่ในชุมชนนี้ด้วย เครื่องมือนี้ช่วยวิเคราะห์ปัญหาการเรียกใช้ APIs ตรวจสอบความผิดปกติในการใช้งาน เป็นต้น Reference: https://www.elastic.co
    3. Grafana API Monitoring เป็นเครื่องมือสำหรับใช้สร้าง Dashboard / Visualize กราฟ และวิเคราะห์ในเชิงสถิติ โดยตัวมันมี Plugin connection data source หลายแบบ หนึ่งใน data source ที่ใช้อยู่คือการดึงมาจาก elastic search ที่ผ่านการทำ indexing มาแล้ว รวมถึงมีความสามารถในการตั้งค่า threshold เพื่อกำหนดเงื่อนไขในการส่ง Notification ได้หลายช่องทาง เช่น Email , Line เป็นต้น Reference: https://grafana.com

    บทสรุป

    “Everything are connected together” ทุกสรรพสิ่งเชื่อมต่อกัน ล้วนมีช่องทางให้เชื่อมต่อ แม้ในการทำงานก็เช่นกัน การเชื่อมต่อกันเป็นการประสานการทำงานกันได้อย่างดี แม้จะมีหน้าที่งานระดับใดก็ตามขอเพียงแค่เปิดใจรับฟังและไม่ใช้เหตุผลส่วนตัวในการตัดสินใจ ขอให้ใช้เหตุผลเพื่อส่วนรวม คุณพร้อมหรือยังที่จะเชื่อมต่อ….

    สำหรับขั้นตอนวิธีอย่างละเอียดในการเชื่อมต่อทำอย่างไร หากสนใจ ติดต่อสอบถาม หรือปรึกษาได้ครับ โทร. 749931 / email: thawat.va@psu.ac.th

    ผู้เขียน: นายธวัช วราไชย
    ตำแหน่งนักวิชาการคอมพิวเตอร์
    สังกัดฝ่ายคอมพิวเตอร์ทางวิศวกรรมศาสตร์ คณะวิศวกรรมศาสตร์ มหาวิทยาลัยสงขลานครินทร์

  • ELK #07 LogStash

    จากที่ได้กล่าวถึงมายาวนานในเรื่อง ELK  และ  ELK #02 ที่ได้กล่าวถึงการติดตั้ง LogStash ไว้เบื้องต้น ในบทความนี้จะมาลงลึก ถึงกระบวนการทำงานของ LogStash ซึ่งเป็นส่วนสำคัญในการเปลี่ยนข้อมูล Unstructured ให้เป็น Structured

    ตอนนี้ เราจะทำงานใน /etc/logstash/conf.d/

    Simple input – output plugin

    สร้างไฟล์ 01-input-file.conf มีเนื้อหาดังนี้

    input {
    	file {
    		path => ["/tmp/input.txt"]
    		mode => "tail"
    		}
    }
    

    ในส่วนนี้ เป็นการกำหนดว่า ให้ LogStash อ่านไฟล์ /tmp/input.txt โดยให้อ่านบรรทัดล่าสุด (ต่อจาก Checkpoint ก่อนหน้า) เข้ามา โดยถ้าไม่กำหนด mode => “tail” ระบบจะอ่านไฟล์ก็ต่อเมื่อ มีการสร้างไฟล์ใหม่เท่านั้น

    สร้างไฟล์ 98-output-file.conf มีเนื้อหาดังนี้

    output {
            file {
                    path => "/tmp/output.txt"
            }
    }
    

    ในส่วนนี้ เป็นการกำหนดว่า ให้ LogStash เขียนไฟล์ /tmp/output.txt

    เมื่อปรับเปลี่ยน configuration ต้องทำการ Restart Service

    service logstash restart
    

    ลองส่งข้อมูลเข้าไปในไฟล์ /tmp/input.txt ด้วยคำสั่ง

    echo "Hello World 1" >> /tmp/input.txt

    ดูผลลัพธ์ใน /tmp/output.txt

    cat /tmp/output.txt
    {"path":"/tmp/input.txt","@version":"1","message":"Hello World 1","@timestamp":"2018-09-11T03:42:33.645Z","host":"elk1"}

    แสดงให้เห็นว่า ระบบ LogStash สามารถรับข้อมูลจากไฟล์ และส่งข้อมูลออกไปยังไฟล์ได้

    Filter Plugin

    ก่อนอื่น Stop Service ด้วยคำสั่ง

    service logstash stop
    

    ในการจัดการข้อมูลก่อนบันทึก เช่นการกรอง การจัดรูปแบบ LogStash ทำงานผ่าน Filter Plugin ซึ่งมีหลายรูปแบบ (https://www.elastic.co/guide/en/logstash/current/filter-plugins.html) แต่ในที่นี้ จะใช้ grok เหมาะกับข้อมูล Unstructured อย่าง syslog เป็นต้น ซึ่งมักจะเป็น Log ที่ให้มนุษย์อ่านได้ง่าย แต่ไม่ค่อยเหมาะสำหรับให้คอมพิวเตอร์เอาไปใช้งานต่อ ซึ่ง LogStash มีไว้ให้แล้วกว่า 120 ตัว

    ตัวอย่าง grok-pattern

    ต่อไป สร้าง 44-filter-basic.conf มีเนื้อหาดังนี้

    filter {
            grok {
                    match => {
                            "message" => "%{IP:ipaddress} %{NUMBER:size}"
                    }
            }
    }
    

    จากนั้น Start Service ด้วยคำสั่ง (รอสักครู่ด้วย)

    service logstash start
    

    แล้วส่งข้อมูลต่อไปนี้ต่อท้ายไฟล์ /tmp/input.txt

    echo "192.168.1.1 120" >> /tmp/input.txt

    และเมื่อดูผลใน /tmp/output.txt จะพบบรรทัดสุดท้าย

    {"message":"192.168.1.1 120","@version":"1","path":"/tmp/input.txt","@timestamp":"2018-09-11T04:56:03.662Z","size":"120","host":"elk1","ipaddress":"192.168.1.1"}

    แสดงให้เห็นว่า สามารถใช้ filter นี้ แยกแยะข้อมูลเบื้องต้นได้

    Example : Postfix Log

    ก่อนอื่น Stop Service ด้วยคำสั่ง

    service logstash stop
    

    เนื่องจาก Log แต่ละชนิด แต่ละซอฟต์แวร์มีความหลากหลายมาก แต่ดีที่มีผู้เชี่ยวชาญเค้าเขียน Pattern เอาไว้ให้ ให้ใช้คำสั่งต่อไปนี้ สร้างไดเรคทอรี่ /etc/logstash/patterns.d/ และ ดาวน์โหลด มาเก็บไว้

    mkdir /etc/logstash/patterns.d
    wget https://raw.githubusercontent.com/logstash-plugins/logstash-patterns-core/master/patterns/grok-patterns -O /etc/logstash/patterns.d/grok-patterns
    wget https://raw.githubusercontent.com/whyscream/postfix-grok-patterns/master/postfix.grok -O /etc/logstash/patterns.d/postfix.grok
    
    

    ในกรณีของ Postfix จากนั้น ดาวน์โหลด Filter Plugin มาเก็บไว้ใน /etc/logstash/conf.d/ ด้วยคำสั่ง

    wget https://raw.githubusercontent.com/whyscream/postfix-grok-patterns/master/50-filter-postfix.conf -O /etc/logstash/conf.d/50-filter-postfix.conf
    

    และ ต้องสร้างอีกไฟล์ เพื่อเตรียมข้อมูล ชื่อ 49-filter-postfix-prepare.conf ใน /etc/logstash/conf.d/ เนื้อหาตามนี้

    filter {
    	grok {
        		match => { "message" => "%{SYSLOGTIMESTAMP} %{SYSLOGHOST} %{DATA:program}(?:\[%{POSINT}\])?: %{GREEDYDATA:message}" }
        		overwrite => "message"
    	}
    }
    

    จากนั้น Start Service ด้วยคำสั่ง (รอสักครู่ด้วย)

    service logstash start
    

    แล้วส่งข้อมูลต่อไปนี้ต่อท้ายไฟล์ /tmp/input.txt

    echo "Sep 11 12:05:26 mailscan postfix/smtp[105836]: 268E04DFFE6: to=, relay=mail.psu.ac.th[192.168.107.11]:25, delay=43, delays=43/0/0.01/0.01, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as DE294461637)" >> /tmp/input.txt

    และเมื่อดูผลใน /tmp/output.txt จะพบบรรทัดสุดท้าย

    {"program":"postfix/smtp","postfix_delay":43.0,"postfix_dsn":"2.0.0","postfix_relay_port":25,"message":"268E04DFFE6: to=, relay=mail.psu.ac.th[192.168.107.11]:25, delay=43, delays=43/0/0.01/0.01, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as DE294461637)","path":"/tmp/input.txt","postfix_queueid":"268E04DFFE6","postfix_delay_conn_setup":0.01,"@version":"1","host":"elk1","postfix_to":"xxx.y@psu.ac.th","postfix_relay_hostname":"mail.psu.ac.th","postfix_delay_transmission":0.01,"tags":["_grokparsefailure","_grok_postfix_success"],"postfix_smtp_response":"250 2.0.0 Ok: queued as DE294461637","postfix_delay_before_qmgr":43.0,"postfix_relay_ip":"192.168.107.11","@timestamp":"2018-09-11T07:57:20.354Z","postfix_delay_in_qmgr":0.0,"postfix_status":"sent"}

    แสดงให้เห็นว่า สามารถใช้ filter นี้ แยกแยะข้อมูลเบื้องต้นได้

    From Syslog to ElasticSearch

    จากตัวอย่างข้างต้น เราทำงานกับไฟล์ /tmp/input.txt และ /tmp/output.txt ต่อไปนี้ จะเป็นการ รับ Input จาก syslog จริง ๆ จากเซิร์ฟเวอร์ ผ่าน Filter และส่งผลออกไปเก็บใน ElasticSearch

    ก่อนอื่น Stop Service ด้วยคำสั่ง

    service logstash stop
    

    สร้างไฟล์ 02-input-syslog.conf ไว้ใน /etc/logstash/conf.d/ เนื้อหาดังนี้
    ( เปิดรับ syslog ที่ tcp/5514 )

    input {
            syslog {
                    port => "5514"
            }
    }
    

    สร้างไฟล์ 99-output-elasticsearch.conf ไว้ใน /etc/logstash/conf.d/ เนื้อหาดังนี้
    ( ในที่นี้ ใช้ ElasticSearch บน localhost ที่ tcp/9200 และ ไม่ได้ตั้ง Security ใด ๆ )

    output {
            elasticsearch {
                    hosts => ["localhost:9200"]
            }
    }
    

    จากนั้น Start Service ด้วยคำสั่ง (รอสักครู่ด้วย)

    service logstash start
    

    ที่เซิร์ฟเวอร์ที่จะส่ง Log มาเก็บใน ElasticSearch ผ่าน LogStash ให้แก้ไข /etc/rsyslog.d/50-default.conf ชี้ mail.* ไปยัง LogStash  ที่ tcp/5514

    mail.* @@logstash.ip:5514
    

    หากทุกอย่างเรียบร้อย ก็จะสามารถดูผลจาก Kibana ได้อย่างสวยงาม

    สามารถนำข้อมูลไปใช้วิเคราะห์ได้ต่อไป

  • pGina fork 3.9.9.12 configuration

    pGina 3.9.9.12 ส่ง RADIUS accounting ได้ และทำ option Remove account and profile after logout ได้ และ ปุ่ม Shutdown ก็ log off user ให้ด้วย (โดยตั้งค่าที่ Local Machine Plugin จะมีให้ ติ๊ก เลือก Notification เพิ่มมาอีกอัน) นอกจากนี้ก็มีเพิ่ม plugins อีกหลายตัว พร้อมแก้บั๊ก ที่น่าสนใจคือ scripting plugin ทำให้ customize ได้มากขี้น แต่ผู้เขียนบทความนี้ยังไม่ได้ลอง

    เวอร์ชั่น 3.9.9.12 ดาวน์โหลดได้จาก http://mutonufoai.github.io/pgina/index.html

    การตั้งค่าสำหรับทำเป็น Windows Authentication ในเครื่องคอมที่เป็น Windows 10 ผมได้ทำ screen capture มาเฉพาะที่ผมได้ใช้งาน ซึ่งก็คือ Local Machine, RADIUS plugin ดังนี้

    หน้าแรกคือแท็บ General จะแสดงให้เห็นว่าโปรแกรมพร้อมทำงาน ให้ดูที่ข้อความที่แสดงเป็นสีเขียวใต้ข้อความ pGina Service status

    pGina แท็บ General

    และตัวเลือกที่ผมเลือกใช้คือ Use original username to unlock computer คือหากหลุดไปที่หน้า screen saver ก็ปลดได้ด้วย username ที่ login นั้น

    แท็บถัดไปคือ แท็บ Plugin Selection อันแรกที่จะใช้คือ Local Machine คือ user ที่สร้างขึ้นภายใน Windows นั่นเอง สังเกตจะมีตัวเลือกที่ Authentication, Gateway และ Notification (เพิ่มมาใหม่) และที่ใช้อีกอันคือ RADIUS Plugin

    pGina แท็บ Plugin

    จากนั้นให้เลือก Local Machine แล้วให้คลิกปุ่ม Configure จะได้ค่าดีฟอลต์ ดังรูปข้างล่างนี้

    Configure Local Machine

    ผมจะใช้ค่าตัวเลือก Remove account and profile after logout เพื่อที่ไม่ต้องเก็บ user profile ที่เป็น user จาก user database ภายนอก เช่น จาก RADIUS server เป็นต้น และ หากต้องการให้ user นั้นมีสิทธิมากกว่า User ทั่วไป ก็ตั้ง Mandatory Group เช่น ตั้งเป็น Administrators หรือ ใส่ชื่อกลุ่ม Guests ไว้ เมื่อเวลาผู้ใช้ login ก็จะมีสิทธิแค่ Guest ติดตั้งโปรแกรมเพิ่มไม่ได้ เป็นต้น

    เราจะไม่ใช้ option Remove account and profile after logout ก็ได้โดยให้เก็บ user account ไว้ ก็จะทำให้การเข้าใช้งาน login ในครั้งต่อไปเร็วขึ้น เพราะไม่ต้องเสียเวลาสร้าง user profile ใหม่ แต่ก็ต้องเตรียม disk ไว้ให้ใหญ่เพียงพอ หรือ ทำรอบ cloning ใหม่ให้เร็วขึ้น

    ต่อไปก็มาถึงตั้งค่า RADIUS plugin หลังจากเลือก Authentication และ Notification แล้วจากนั้นคลิกปุ่ม Configure จะได้ค่าดีฟอลต์รวมกับที่แก้ไขแล้ว ดังรูป

    ผมจะเลือกใช้และใส่ค่าต่าง ๆ เหล่านี้ครับ

    เลือก Enable Authentication เพื่อสอบถาม username/password

    เลือก Enable Accounting เพื่อส่งข้อมูลบันทึกค่า Acct-Status-Type ไปยัง RADIUS Server

    แล้วระบุ Server IP และ Shared Secret ที่จะต้องตรงกันกับที่ระบุอยู่ใน config ที่ RADIUS server เช่น FreeRADIUS จะอยู่ในไฟล์ clients.conf เป็นต้น

    เลือก Called-Station-ID ด้วย หากต้องการเลข MAC Address เก็บด้วยนอกจากเก็บ IP

    พบว่าจำเป็นต้องเลือก Accounting Options หัวข้อ Send Interim Updates เพื่อให้มีการส่งค่า accounting ได้ (โดยใช้ค่า Send update every 900 seconds ตามที่เป็นค่าดีฟอลต์)

    แล้วระบุ IP Address Suggestion เช่น 192.168.1. หมายถึงระบุว่าจะใช้ข้อมูลของ network นี้ เพราะว่าในเครื่องอาจมีการติดตั้งซอฟต์แวร์ที่จำลอง network interface เพิ่มขึ้นมาอีกอัน เป็นต้น

    ส่วนค่าอื่น ๆ ปล่อยไว้ตามเดิม

    ตรวจดูแท็บ Order มีค่าดีฟอลต์ดังรูป

    ผลลัพธ์ของ radius accounting log ที่ไว้ตรวจสอบ ดังรูป

    เพิ่มเติมเนื้อหา

    คัดลอกเนื้อหามาจากเพจเดิม เรื่อง การตั้งค่า pGina และ FreeRADIUS เพื่อส่งค่า RADIUS Accounting ไปยัง Firewall ของมหาวิทยาลัย

    FreeRADIUS Version 2.2.8 แก้ไขไฟล์ /etc/freeradius/proxy.conf
    FreeRADIUS Version 3.0.16 แก้ไขไฟล์ /etc/freeradius/3.0/proxy.conf
    อาจด้วยคำสั่ง vi หรือ nano ตามชอบ

    เพื่อให้มีค่า realm NULL (ประมาณบรรทัดที่ 672) ที่กำหนดค่า Accounting Port เพียงอย่างเดียวส่งไปยังเครื่อง Firewall

    pgina06
    รูปก่อนแก้ไข

    pgina07
    รูปหลังแก้ไข

    ในรูปตัวอย่างเครื่อง Firewall คือ radius.hatyai.psu.ac.th และต้องรู้ค่า secret ที่ตั้งเพื่อใช้สำหรับเครื่อง FreeRADIUS และ Firewall ในที่นี้คือ yoursecret (อันนี้ต้องมีการติดต่อกับ network administrator ของมหาวิทยาลัยเพื่อร่วมกันตั้งค่านี้)

    และแก้ไขอีกแฟ้มคือ

    FreeRADIUS Version 2.2.8 แก้ไขที่แฟ้ม /etc/freeradius/sites-available/default
    FreeRADIUS Version 3.0.16 แก้ไขที่แฟ้ม /etc/freeradius/3.0/sites-available/default

    ประมาณบรรทัดที่ 325 Pre-accounting ใน module ชื่อ preacct

    preacct {
                   preprocess
                   เพิ่ม
    }

    หากยังไม่มีบรรทัดเหล่านี้ ให้เพิ่มด้วยต่อท้ายบรรทัด preprocess

    # append update for pGina no attribute Framed-IP-Address
    if (NAS-IP-Address != 127.0.0.1) {
           update request {
                 Framed-IP-Address = "%{NAS-IP-Address}"
           }
    }

    แล้ว restart FreeRADIUS ใหม่

    pgina08
    รูปแสดงคำสั่งในการ restart

    sudo service freeradius stop
    sudo service freeradius start

    จากนั้นรอให้ทางฝั่งผู้ดูแล Firewall ตั้งค่าโปรแกรมที่ดึงข้อมูลที่ FreeRADIUS ของเราส่งไปนำไปใส่ใน Firewall Rule อนุญาตเครื่องไคลเอ็นต์ไม่ต้อง login ซ้ำ

    ขั้นตอนข้างล่างนี้ ใช้ในขณะทดสอบ option เรื่อง Remove account and profile after logout

    การลบ Windows user account และ profile ที่สร้างโดย pGina

    1.เปิด Computer Management เพื่อเข้าไปลบ user account (ต้อง log off แล้วเท่านั้นจึงลบได้) คลิกขวาปุ่ม Start เลือก Computer Management

    จะได้หน้าต่าง 

    รายการที่มีคำว่า pGina created ค้างอยู่ ผลมาจากการไม่ได้เลือก option Remove  account and profile after logout

    2.เปิด System and Security เพื่อเข้าไปลบ user profile ชื่อ Account unknown

    โดยคลิกปุ่ม Start พิมพ์คำว่า advanc แล้วเลือก View advanced system settings

    คลิกเลือก Advanced system settings ได้หน้าต่างมีหลายส่วน ให้คลิก Setting ในส่วน User Profiles

    คลิกที่ Account unknown แล้วคลิก Delete

  • ขั้นตอนการติดตั้ง Django ด้วย Python3 บน Windows

    ขั้นตอนการติดตั้ง Django ด้วย Python3 บน Windows

    1. ติดตั้ง Python จาก https://www.python.org/downloads/
    2. เปิด cmd โดย Run As Administrator
    3. ใช้คำสั่ง
      python -m pip install django
    4. ทดสอบโดยใช้คำสั่ง
      python -m django --version
    5. สร้าง Project ด้วยคำสั่ง
       django-admin startproject mysite
    6. เข้าไปใน project “mysite” directory ด้วยคำสั่ง
      cd mysite
    7. ทดสอบ runserver
      python manage.py runserver
    8. เปิด website:
      http://127.0.0.1:8000/

    เดี๋ยวมาต่อเรื่อง การสร้าง App, การใช้ Database, การ Authentication และการสร้าง REST API เพื่อใช้งานกับ OAuth2

  • Choose Network Type In VirtualBox

    เมื่อต้องไปจัดอบรม และต้องใช้ Oracle VM VirtualBox สำหรับสร้าง Virtual Machine (VM) จำนวนหนึ่ง (มากกว่า 1 ตัว ฮ่า ๆ) เราจำเป็นจะต้องรู้ว่า สภาพแวดล้อมของห้องบริการคอมพิวเตอร์ที่เราไปขอใช้งานนั้น จัด IP ให้กับเครื่อง Windows แบบใด เช่น ในกรณีที่มีการปล่อย DHCP IP แบบเหลือเฟือ การเลือกชนิด network ของ VM แต่ละตัว ก็ง่าย เราก็เลือกตั้งค่าเป็น Bridges ซึ่งแบบนี้ VM แต่ละตัวก็จะได้ IP อยู่ในชุดเดียวกันกับ Windows แต่หากจัด IP แบบตายตัวให้กับ MAC Address ของ PC นั้นเลย และไม่ปล่อย DHCP IP เพิ่มให้ อย่างนี้ เราก็ต้องออกแบบว่าจะให้ VM (Guest) เหล่านั้นใช้ IP อะไร จะทำงานร่วมกันได้อย่างไร และจะให้ VM เหล่านั้น ติดต่อกับ Windows (Host) ด้วยหรือไม่

    แบบแรก NAT Network

    แบบนี้ VirtualBox จะสร้าง network จำลองขึ้นมาในโปรแกรมมันเองเท่านั้น ผลลัพธ์คือ VM (Guest) ทุกตัวจะทำงานร่วมกันได้ แต่จะติดต่อกับ Windows (Host) ไม่ได้ แบบนี้ VM (Guest) ทุกตัวจะได้รับ IP อยู่ในชุดที่ใช้สำหรับ NAT นั่นคือ 10.0.2.0/24 และ VM แต่ละตัวเมื่อได้ IP จะได้ค่า IP ของ DNS server ที่เครื่อง Windows ใช้งานมาให้ด้วย ทำให้ VM สามารถติดต่อไปใช้งาน Internet ได้

    ตัวอย่างเช่น VM 2 ตัว ตั้งค่า network ชนิด NAT Network

    VM ตัวที่ 1 จะได้ IP 10.0.2.6 และได้ค่า IP DNS Server ชุดที่ใช้ใน Windows (Host) ใช้งาน Internet ได้เลย

    VM ตัวที่ 2 ได้ IP 10.0.2.15 และใช้คำสั่ง ping ไปยัง VM ตัวที่ 1 ได้

    แต่ Windows (Host) จะใช้คำสั่ง ping VM ทั้ง 2 ตัว ไม่ได้

    สำหรับวิธีการตั้งค่า NAT Network ก็เข้าไปที่ File > Preferences > Network  และเราสามารถแก้ หรือ เพิ่มใหม่ ได้

    แบบที่สอง Host-Only Adapter

    แบบนี้ VirtualBox จะสร้าง Virtual network adapter เพิ่มลงใน Windows OS ให้ด้วย ผลลัพธ์คือ VM (Guest) ทุกตัวจะทำงานร่วมกันได้ และติดต่อกับ Windows (Host) ได้ แต่แบบนี้ VM (Guest) ทุกตัวจะได้รับ IP ในชุด 192.168.56.0/24 (ค่า default ซึ่งเราจะเปลี่ยนได้) แต่ VM แต่ละตัวจะได้มาเพียง IP จะไม่ได้ค่า IP ของ DNS server ที่เครื่อง Windows ใช้งาน ส่งผลให้ VM ไม่สามารถติดต่อไปใช้งาน Internet ได้ แต่ก็แก้ปัญหานี้ได้โดยการเพิ่ม Network Adapter อันที่สอง และตั้งค่า network เป็นชนิด NAT แล้วไป config ให้มีการ start network interface อันที่สองนี้ใน VM (Guest)

    ตัวอย่าง VM 2 ตัว ตั้งค่า network ชนิด Host-only Adapter

     

    Windows (Host) ได้ IP เพิ่มขึ้นมาคือ 10.0.0.1 (ผมแก้ค่า default มาเป็นอันใหม่ เดิม 192.168.56.1)

    VM 1 ได้ IP 10.0.0.101

    VM 2 ได้ IP 10.0.0.102

    Windows ใช้คำสั่ง ping ไปยัง VM 1 ได้

    VM 1 ใช้คำสั่ง ping ไปยัง VM 2 ได้

    VM 1 ไม่ได้ค่า IP DNS server ในไฟล์ /etc/resolv.conf ทำให้ติดต่อใช้งาน Internet ไม่ได้

    ต้องปิด VM แล้ว เราต้องเพิ่ม Adapter อันที่ 2 ให้เป็น NAT

    เปิด VM จากนั้นเข้าไปใน VM ในตัวอย่างคือ Ubuntu 16.04.4 server ให้เพิ่ม Add NAT interface แล้ว reboot

    ข้อความที่เพิ่มคือ (ชื่อ interface enp0s8 จะเปลี่ยนไป อาจไม่ใช่ชื่อนี้ เช็คด้วย ifconfig -a)

    auto enp0s8

    iface enp0s8 inet dhcp

    จะเห็นว่า มี network interface 2 อัน อันที่เพิ่มมาเป็น NAT มี IP เป็น 10.0.3.15

    ตอนนี้จะได้ค่า IP DNS Server อยู่ใน /etc/resolv.conf ทำให้ใช้งาน Internet ได้

    สำหรับวิธีการเปลี่ยนค่า ชุด IP ของ Host-Only Adapter ทำดังนี้ ผมทำการเปลี่ยนตัวเลขชุด 192.168.56 ทุกแห่งที่แท็บ Adapter และแท็บ DHCP Server

    ต้องไป disable และ enable VirtualBox Host-only Network ที่ Windows ด้วย แล้วปิดเปิดโปรแกรม VirtualBox

    แบบที่สาม Internal Network

    แบบนี้ VirtualBox ไม่ได้สร้าง network จำลอง และไม่ได้สร้าง Virtual network adapter เพิ่มลงใน Windows OS แต่ได้เตรียมชื่อไว้ให้ว่า Intnet (ค่า default) ผลลัพธ์คือ แบบนี้ VM (Guest) ทุกตัว จะต้องตั้งค่า IP เองก่อนจึงทำงานร่วมกันได้ และไม่สามารถติดต่อกับ Windows (Host) ได้ และ ไม่สามารถติดต่อไปใช้งาน Internet ได้ แต่ก็แก้ปัญหานี้ได้โดยการสร้าง VM (Guest) 1 ตัว ให้ทำหน้าที่เป็น Router นั่นคือ มี Network Adapter อันที่ 1 เป็นชนิด NAT และมี Network Adapter อันที่ 2 เป็นชนิด Internal Network (ชื่อ Intnet) เมื่อสร้าง Router นี้ขึ้นมา ก็จะทำให้ VM (Guest) ทุกตัวติดต่อกับ Internet ได้ แต่ตัว Router ต้องทำหน้าที่เป็นทั้ง DHCP Server และ DNS Server เพื่อแจก IP ให้กับ VM และ แจกค่า IP ของ DNS Server ให้ด้วยตามลำดับ การตั้งค่าแบบที่สามนี้ ดู ๆ ไปก็น่าจะยุ่งยากมากในการเตรียม แต่ก็มีความสามารถที่เพิ่มมาคือ เราสามารถจำลองระบบเครือข่ายได้ เช่น สามารถสร้างโดเมนเนมให้กับ VM ที่ทำหน้าที่เป็น Web Server ได้ด้วย เช่น เราอาจจะตั้งชื่อ zone ว่า example.com แล้วเราให้ VM Web Server นี้มีชื่อโดเมนเนมว่า wordpress1.example.com อย่างนี้ เราทำได้

    ตัวอย่างเช่น VM 2 ตัวที่ตั้งค่า network แบบ Internal Network

    ผมมี myrouter.ova ให้ download ไปใช้ โดยการ import เข้าก็ใช้ได้เลย หากจะเล่าว่าต้องติดตั้งอะไรบ้างคงจะยาวมาก ๆ เอาเป็นว่า ใน myrouter.ova นี้ ผมได้ติดตั้ง DHCP Server ใช้ค่า 10.0.100.0/24, DNS Server ใช้ชื่อโดเมนคือ example.com, Apache2 Web Server และผมมี LDAP Database ou=lulu,ou=example,ou=com ไว้ให้ทดสอบ ด้วยครับ

    VM ตัวพิเศษ ทำหน้าที่เป็น Router จะมี Network Adapter 2 อัน อันแรกเป็น NAT อันที่สองเป็น Internal Network ชื่อ Intnet (ชื่อนี้เป็นค่า default เราเปลี่ยนได้)

    VM ตัวที่ 1 ตั้งค่า network ชนิด Internal Network

    VM ตัวที่ 2 ตั้งค่า network ชนิด Internal Network

    หวังว่าคงจะได้นำไปประยุกต์ใช้งานกันนะครับ

  • วิธีใช้ Google Sheets เป็นฐานข้อมูล เพื่อการเฝ้าระวังระบบ โดยการใช้งานผ่าน Google API Client Library for Python

    ต่อจาก

    1. วิธีการใช้ Google Sheets เป็นฐานข้อมูล
    2. การใช้งาน Google Drive API ด้วย Google Client Library for Python
    3. วิธีการ Upload ไฟล์ไปบน Google Drive File Stream ด้วย Google Client Library for Python

    คราวนี้ ใครมีข้อมูลที่เกิดขึ้นในเซิร์ฟเวอร์ภายในองค์กร แล้วต้องการส่งไปเขียนเก็บไว้ใน Google Sheets แบบต่อท้าย (Append)

    เช่น ในตัวอย่างนี้ วัดระยะเวลาการโอนย้ายข้อมูล เปรียบเทียบระหว่าง rsync เพื่อสำรองข้อมูลไปไว้ในเครื่องเซิร์ฟเวอร์สำรองที่ต่างวิทยาเขต กับ การนำไปเก็บไว้ใน Google Drive ตามวิธีการที่กล่าวไว้ใน วิธีการ Upload ไฟล์ไปบน Google Drive File Stream ด้วย Google Client Library for Python

    ผมได้เขียนโค๊ดเอาไว้ที่ https://github.com/nagarindkx/google.git
    สามารถโคลนไปใช้งานได้ (ช่วย Reference กันด้วยนะครับ)

    ขั้นตอนการใช้งานมีดังนี้

    1. ใช้คำสั่ง
      git clone https://github.com/nagarindkx/google.git
      cd google
    2. ติดตั้ง python, pip, google-api-python-client ตามที่เขียนไว้ใน การใช้งาน Google Drive API ด้วย Google Client Library for Python และสร้างโปรเจคใน Google Developer Console เปิดใช้งาน Google Sheets API, สร้าง Credentials > OAuth Client ID แล้ว download JSON มาไว้ในชื่อว่า client_secret.json
    3. รูปแบบคำสั่งคือ
      $ python append2gsheet.py --help
      
      usage: append2gsheet.py [-h] [--auth_host_name AUTH_HOST_NAME]
                                   [--noauth_local_webserver]
                                   [--auth_host_port [AUTH_HOST_PORT [AUTH_HOST_PORT ...]]]
                                   [--logging_level {DEBUG,INFO,WARNING,ERROR,CRITICAL}]
                                    --data DATA --sheetid SHEETID [--range RANGE]
                                   [--value-input-option VALUEINPUTOPTION]
      
      optional arguments:
       -h, --help show this help message and exit
       --auth_host_name AUTH_HOST_NAME
         Hostname when running a local web server.
       --noauth_local_webserver
         Do not run a local web server.
       --auth_host_port [AUTH_HOST_PORT [AUTH_HOST_PORT ...]]
         Port web server should listen on.
       --logging_level {DEBUG,INFO,WARNING,ERROR,CRITICAL}
         Set the logging level of detail.
       --data DATA CSV format
       --sheetid SHEETID Google Sheets ID
       --range RANGE Simply Sheet Name like 'Sheet1!A1'
       --value-input-option VALUEINPUTOPTION
         Optional: [RAW,USER_ENTERED]
    4. สิ่งที่ต้องมี คือ Google Sheets ที่สร้างไว้แล้ว ให้สังเกตที่ URL
      ตัวข้อความที่อยู่หลัง https://docs.google.com/spreadsheets/d/ จะเป็น “Sheet ID” ซึ่งจะใช้ในตัวแปร “sheetid” ในขั้นต่อไป
    5. ในแต่ละ Google Sheets จะประกอบด้วย หลาย Sheet ในที่นี้ จะเขียนลง Sheet ที่ชื่อว่า “Data” ซึ่งจะใช้ในตัวแปร “range” ในขั้นต่อไป
    6. ตัวอย่างการใช้งาน เมื่อระบบทำการสำรองข้อมูล จับเวลา ก็จะทำการส่งข้อมูลไปเก็บในลักษณะ CSV อย่างนี้ส่งไป เช่น
      20180129-12,37.0188,27.5338,943.7682,902.7372

      ซึ่งประกอบด้วย 5 ฟิลด์ คือ วันเวลาที่วัด และ ข้อมูล เป็นจำนวนวินาที อีก 4 ฟิลด์
      วิธีการส่งคำสั่งในการใช้งาน ครั้งแรก ต้องใส่  –noauth_local_webserver ด้วย

      python append2gsheet.py --data 20180129-12,37.0188,27.5338,943.7682,902.7372 --sheetid 1YV_W_k8VkJbYn1fG1XXXXXXXXXXXXF8y5YtQwRC0DAY --range 'Data!A1' --noauth_local_webserver
      

      จะได้ผลดังนี้

      ให้เอา URL ไปเปิดบนเว็บ Browser ที่สามารถยืนยันตัวตนกับ Google ได้ ผลดังนี้

      แล้วก็ให้การอนุมัติ

      ก็จะได้ Verification Code อย่างนี้

      เอาไปใส่

      สำเร็จ และ ผลที่ได้

    7. แต่จะเห็นว่า ข้อมูล ตัวเลขที่ใส่เข้ามา จะถูกแปลงเป็นข้อความ ซึ่ง สามารถแก้ไขได้ด้วยการใส่ –value-input-option USER_ENTERED
      python append2gsheet.py --data 20180129-12,37.0188,27.5338,943.7682,902.7372 --sheetid 1YV_W_k8VkJbYn1fG1XXXXXXXXXXXXF8y5YtQwRC0DAY --range 'Data!A1' --noauth_local_webserver --value-input-option USER_ENTERED

      ผลที่ได้คือ คือ บรรทัดล่าง จะได้ชนิดเป็น Numeric มาเลย

    8. เมื่อเก็บผลเรียบร้อยแล้ว สามารถดูเป็น Chart แบบ Realtime ได้

    เผื่อเป็นประโยชนครับ

  • วิธี upgrade Node.js ใน Bash ของ Windows 10 ให้เป็นรุ่นปัจจุบัน

    ปัญหาคือ บน Windows 10 เราสามารถใช้ Windows Subsystem for Linux (WSL) หรือ Bash Shell ได้ ซึ่งจริงๆมันก็คือ Ubuntu 16.04.3

    แต่ว่า เวลาจะใช้งาน Node.js ติดตั้งพวก Firebase, Angular อะไรพวกนี้ จะทำไม่ได้ เพราะรุ่นที่ให้มามันเก่ามาก

    วิธีการคือ (Reference: https://nodejs.org/en/download/package-manager/#debian-and-ubuntu-based-linux-distributions)

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

    curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
    apt-get install -y nodejs

    ก็เรียบร้อย

  • วิธีติดตั้งระบบ Cyrus IMAP Cluster (Cyrus Murder)

    ต่อจาก
    Mail Clustering with Cyrus Murder และ How Cyrus Murder (Mail Clustering) work?

    คราวนี้ มาลง รายละเอียดทีละขั้นตอน

    ระบบ Cyrus IMAP Cluster หรือ Cyrus Murder นี้ ประกอบด้วยเครื่องคอมพิวเตอร์ ขั้นต่ำ 3 เครื่อง คือ frontend, backend, mupdate ต่อไปนี้ จะเป็นวิธีการทำ แต่ละเครื่อง

     

    Prerequisite

    ทั้งหมดเป็น Ubuntu 16.04 Server, ทำการ update และ upgrade แล้ว และ เข้า SSH ด้วย user ที่สามารถ sudo ได้ และรุ่นของ cyrus-imapd, cyrus-murder ที่ใช้เป็น 2.4.18
    ทุกเครื่อง มี user ชื่อ ‘cyrus’ และ ทำการตั้งรหัสผ่านไว้เรียบร้อย
    เฉพาะเครื่องที่เป็น Backend จะต้องมี uesr ชื่อ ‘mailproxy’ และทำการตั้งรหัสผ่านไว้เรียบร้อย ด้วยอีก 1 คน
    ในที่นี้ จะใช้ pam-ldap ติดตั้งใน Backend ทุกเครื่อง

    MUPDATE ( mupdate1.example.com )

    1. ติดตั้ง cyrus-murder ด้วยคำสั่ง
      sudo apt install cyrus-murder cyrus-common sasl2-bin

      ระบบจะติดตั้งตั้งโปรแกรมที่เกี่ยวข้อง รวมถึง postfix ด้วย ให้เลือกเป็น No configuration ไป

    2. แก้ไขไฟล์ /etc/cyrus.conf ใน Section “SERVICES” ประมาณบรรทัดที่ 62 ให้ uncomment เพื่อได้บรรทัดนี้
      mupdate       cmd="mupdate -m" listen=3905 prefork=1

      จุดสำคัญคือ mupdate -m คือ ตัวที่จะบอกว่า ทำหน้าที่เป็น MUPDATE Master

    3. แก้ไขไฟล์ /etc/imapd.conf เพื่อกำหนด admins ในที่นี้ให้ใช้ชื่อ cyrus โดยการ uncomment ประมาณบรรทัดที่ 55
      และแก้ sasl_pwcheck_method เป็น saslauthd

      sasl_pwcheck_method: saslauthd
      sasl_mech_list: PLAIN
      admins: cyrus
    4. จากนั้น start ระบบขึ้นมา จะพบว่ามีการเปิด port 3905 รออยู่
      sudo /etc/init.d/cyrus-imapd start
      netstat -nl | grep 3905
    5. แก้ไขไฟล์ /etc/default/saslauthd บรรทัดที่ 7
      START=yes

      แล้ว start saslauthd

      sudo /etc/init.d/saslauthd start

    BACKEND ( backend01.example.com)

    1. ติดตั้ง
      sudo apt install cyrus-imapd cyrus-common cyrus-clients sasl2-bin
    2. แก้ไขไฟล์ /etc/imapd.conf โดยเพิ่มบรรทัดต่อไปนี้ไว้ท้ายไฟล์
      #SASL
      sasl_pwcheck_method: saslauthd
      sasl_mech_list: PLAIN
      
      # MUPDATE
      servername: backend01.example.com
      admins: cyrus   
      proxyservers:   mailproxy
      lmtp_admins: mailproxy
      mupdate_server: mupdate.example.com
      mupdate_port: 3905
      mupdate_username: cyrus
      mupdate_authname: cyrus
      mupdate_password: <secret>
      
    3. แก้ไข /etc/cyrus.conf
      ใน START section ให้ uncomment

      mupdatepush cmd="/usr/sbin/cyrus ctl_mboxlist -m"
    4. เพิ่มส่วนนี้ ท้ายไฟล์ /etc/services ด้วย
      #MUPDATE
      mupdate 3905/tcp # MUPDATE
      mupdate 3905/udp # MUPDATE
    5. *** ติดตั้ง PAM LDAP
      sudo apt-get install ldap-auth-client nscd

      ตั้งค่าต่อไปนี้

      LDAP server Uniform Resource Identifier: ldap://ldap.your.domain/
      Distinguished name of the search base: dc=example,dc=com
      LDAP version to use: 3
      Make local root Database admin: No
      Does the LDAP database require login? No

      ต่อไป สั่งให้ระบบแก้ไขเงื่อนไขการ authen เป็น LDAP

      sudo auth-client-config -t nss -p lac_ldap

      จากนั้นใช้คำสั่งต่อไปนี้ เพื่อเริ่มใช้งาน PAM LDAP

      sudo pam-auth-update

      จะมีคำถามว่า
      PAM profiles to enable:
      ให้เลือกทั้ง
      Unix authentication และ
      LDAP Authentication

      สุดท้าย

      sudo /etc/init.d/nscd restart
    6. แก้ไขไฟล์ /etc/default/saslauthd บรรทัดที่ 7
      START=yes

      แล้ว start saslauthd

      sudo /etc/init.d/saslauthd start

    FRONTEND ( frontend01.example.com )

    1. ติดตั้ง
      sudo apt install cyrus-imapd cyrus-common cyrus-clients sasl2-bin
    2. แก้ไขไฟล์ /etc/imapd.conf โดยเพิ่มบรรทัดต่อไปนี้ไว้ท้ายไฟล์
      #SASL
      sasl_pwcheck_method: saslauthd
      sasl_mech_list: PLAIN
      
      # MUPDATE
      mupdate_server: mupdate.example.com
      mupdate_port: 3905
      mupdate_username: cyrus
      mupdate_authname: cyrus
      mupdate_password: <secret>
      
      #PROXY
      serverlist: backend01.example.com
      backend01_password: mailproxy
      proxy_authname: mailproxy
      
    3. แก้ไข /etc/cyrus.conf
      ใน SERVICE section ให้ uncomment

      mupdate cmd="mupdate" listen=3905 prefork=1
    4. เพิ่มส่วนนี้ ท้ายไฟล์ /etc/services ด้วย
      #MUPDATE
      mupdate 3905/tcp # MUPDATE
      mupdate 3905/udp # MUPDATE
    5. แก้ไขไฟล์ /etc/default/saslauthd บรรทัดที่ 7
      START=yes

      แล้ว start saslauthd

      sudo /etc/init.d/saslauthd start

    และ เมื่อทุกอย่างพร้อม ทุกเครื่องก็

    sudo /etc/init.d/cyrus-imapd restart

    เมื่อจะเพิ่มเครื่อง Backend ก็ทำตามขั้นตอน แล้ว เพิ่มใน /etc/imapd.conf ของเครื่อง Frontend ในส่วนของ serverlist และ password เช่น
    จะเพิ่มเครื่อง backend02.example.com ก็ต้องเพิ่มดังนี้

    #PROXY
    serverlist: backend01.example.com backend02.example.com
    backend01_password: <secret>
    backend02_password: <secret>
    proxy_authname: mailproxy

    เมื่อต้องการเพิ่ม Frontend ก็ให้ Sync ตัวไฟล์ /etc/imapd.conf ไปให้เหมือนกันทุกเครื่อง

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