วิธีตั้งค่า HTTPS บน Apache2 รุ่นที่สูงกว่า 2.4.8

จากบทความ การแก้ไข Certificate สำหรับ Apache Web Server (Ubuntu 14.04 LTS) ตอนนี้ Apache2 รุ่นที่สูงกว่า 2.4.8 ประกาศให้ SSLCertificateChainFile นั้น obsolete หรือ จะไม่ใช้อีกต่อไป จากเดิม เราเคยใช้ SSLCertificateFile /etc/apache2/cer/[cer-file-name].crt SSLCertificateKeyFile /etc/apache2/cer/[cer-file-name].key SSLCertificateChainFile /etc/apache2/cer/[cer-file-name].ca-bundle ต่อไปนี้ แนะนำให้ใช้แค่ SSLCertificateFile /etc/apache2/cer/[cer-file-name]_combined.crt SSLCertificateKeyFile /etc/apache2/cer/[cer-file-name].key แล้ว  /etc/apache2/cer/[cer-file-name]_combined.crt มาจากไหน ??? มันมากจากการเอาไฟล์ [cer-file-name].crt แล้วต่อท้ายด้วยไฟล์ [cer-file-name].ca-bundle ด้วยคำสั่ง cat [cer-file-name].crt [cer-file-name].ca-bundle > [cer-file-name]_combined.crt เช่น cat in_psu.crt intermediate_ca.crt > in_psu_combined.crt เป็นต้น เสร็จแล้ว ก็ Restart Apache — จบแค่นี้ ใช้งานได้ TL;DR Q: มีไฟล์ .crt เต็มไปหมด จะรู้ได้ไงว่า อันไหนคือ Certificate ของอะไร อย่างไร A: สมมุติ Certificate ของ Server ที่ได้มา ชื่อ server.crt ต้องใช้คำสั่งนี้ ดูรายละเอียด openssl x509 -in server.crt -text ผลที่ได้ จะประมาณนี้ สิ่งสำคัญที่ควรดู ในที่นี้คือ Issuer จะเห็นว่า CN หรือ common name คือ AlphaSSL CA – SHA256 – G2  และบรรทัด Subject จะบอกว่า Domain (*.xxxxx.psu.ac.th) ที่ลงทะเบียนไว้ อยู่ภายใต้ “AlphaSSL CA” อีกที ซึ่ง ถ้าไปดูใน /etc/ssl/certs ก็จะเห็นว่า ไม่มี CA Certificate ของ “AlphaSSL CA” นี้อยู่ แต่จะมีของ “GlobalSign Root CA” อยู่ ทำไมเป็นอย่างนั้น ??? เพราะ CA เค้าต้องรักษา Root Certificate ของตนเองไว้ให้ดี จึงออกสิ่งที่เรียกว่า Intermediate CA ขึ้นมาอีกชั้นหนึ่ง แล้วแจกจ่ายให้กับผู้ที่ซื้อ Certificate ของเค้าอีกชั้นหนึ่ง คราวนี้ มาลองดูข้อมูลใน intermediate_ca.crt ว่ามีข้อมูลเป็นอย่างไร ด้วยคำสั่ง openssl x509 -in intermediate_ca.crt -text จะเห็นได้ว่า Issuer เป็น “GlobalSign Root CA” และ Subject เป็น “AlphaSSL CA”  จากเดิม Apache2 รุ่น < 2.4.8 ให้ใช้ Directive  “SSLCertificateChainFile” ในการกำหนด Intermediate CA ได้ แต่หลังจากนั้น ก็ให้ Obsolete เพราะ สามารถเอา 2 ไฟล์มาต่อกันได้ตามที่เขียนไว้ข้างต้น ในทางปฏิบัติ จริง ๆ แล้ว ก็ยังใช้ได้อยู่ แต่เป็น Obsolete ทางที่ดี ก็ควรจะปรับปรุงตามที่แนะนำไว้จะดีกว่า และ ถ้าใช้งานแค่ SSLCertificateFile (แบบที่มีแต่ Server Certificate) และ SSLCertificateKey (Server Private Key) นั้น เมื่อ

Read More »

django – Deploy to Production #02

ต่อจาก django #01 Development Environment เริ่มจาก ไปที่ command prompt แล้วใช้คำสั่งต่อไปนี้ เพื่อ เก็บรายละเอียดของ Package และ Version ที่ใช้ในการพัฒนา ไว้ในไฟล์ myenv.txt และ เก็บไฟล์ myproject ทั้งหมดไว้ในไฟล์ myproject.tar.gz (บน Windows อาจจะใช้ 7zip สร้าง) แล้ว Upload ไฟล์ myenv.txt และ myproject.tar.gz ขึ้นบน Projection Server Production Server ในที่นี้ ลองไปใช้ Google Compute Engine สร้าง Instance ขึ้นมา เป็น Ubuntu 18.04 และ ได้ Upload ไฟล์ myenv.txt และ myproject.tar.gz จาก Development ขึ้นไว้แล้ว (ใน /home/user01) ติดตั้ง Python3, PIP, Apache2, และ mod_wsgi sudo apt update sudo apt install python3 python3-pip apache2 libapache2-mod-wsgi-py3 ติดตั้ง virtualenv pip3 install virtualenv สร้าง Virtual Environment ชื่อ production virtualenv production source production/bin/activate ติดตั้ง Package ต่าง ๆ ตามที่สร้างไว้จาก Development Environment (จากไฟล์ myenv.txt) pip install -r myenv.txt แตกไฟล์ myproject.tar.gz ออกมา tar -zxvf myproject.tar.gz สร้าง Apache Site Configuration ที่ /etc/apache2/sites-available/001-myproject.conf เนื้อหาตามนี้ จากนั้น สร้าง Symbolic Link จาก /home/user01/production/lib/python3.6/site-packages/django/contrib/admin/static มาที่ /home/user01/myproject/static ปรับ Permission ให้ www-data สามารถแก้ไข Database ได้ (เพราะในที่นี้ใช้ SQLite) สั่ง Apache ให้เอา Default Site ออก และ นำ myproject ขึ้นแทน และ ทำการ Reload ก็จะใช้ได้แล้ว หวังว่าจะเป็นประโยชน์ครับ

Read More »

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

ขอไม่ลงรายละเอียดว่า อะไรคือ Web Framework, MVC, MVT พวกนั้นนะครับ อ่านเองที่ https://www.djangoproject.com/ และ เขียนวิธีติดตั้งบน Windows ไว้คร่าว ๆ ที่ ขั้นตอนการติดตั้ง django บน Windows และในที่นี้ใช้ Visual Studio Code เป็น Editor (สั่งด้วยคำสั่ง code …) โจทย์ สมมุติในทีม มีคน 10 คน ต้องการ ระบบบันทึกการปฏิบัติงาน จัดเก็บข้อูล วันเวลาของงานที่ทำ, ประเภทของงงาน (ตาม TOR), รายละเอียดของงานที่ทำ, ระยะเวลาที่ใช้ไป (ชั่วโมง) แต่ละคน ต้อง 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

Read More »

Everything are connected together

“ทุกสรรพสิ่งเชื่อมต่อกัน” สวัสดี ผู้อ่านทุกท่านนะครับ นี่คือบทความฉบับปฐมภูมิของผู้เขียน ที่จะนำพาท่านไปพบกับบทความในอีกรูปแบบหนึ่ง ที่ผู้เขียนพยามสรรสร้างบทความนี้เพื่อให้เกิดแนวความคิดที่เรียบง่าย แต่ได้ไอเดีย เพื่อนำไปสร้างนวัตกรรมหรือนำไปประยุกต์ใช้งานกับหน้าที่การงาน ที่เราต่างร่วมกันทำเพื่อองค์กรของเราให้มีความก้าวหน้าอย่างยั่งยืนต่อไป กล่าวถึงหัวข้อที่ผู้เขียนเรื่อง “Everything are connected together” เป็นเรื่องราวที่ผู้เขียนได้สกัดมาจากงานที่ผู้เขียนปฏิบัติจริงและได้มีการดำเนินการมาเป็นระยะเวลา 2 ปี ตั้งแต่เริ่มตั้งไข่ จนกระทั่งเริ่มยืนและเดินได้ เติบโตขึ้นทีละเล็ก ทีละน้อย ค่อยๆ เพิ่มทักษะในการเรียนรู้ไปพร้อม ๆ กัน ในบทความนี้จะไม่เน้นเนื้อหาในเชิงลึก แต่จะนำเสนอแก่นสาร ที่รวบรวมแนวความคิดของผู้เขียนที่มีต่อการปฏิบัติงาน เพื่อนำเสนอไอดีย และแง่มุมต่าง ๆ ที่มันสะท้อนให้เห็นอะไรบางอย่างจากการปฏิบัติงาน เพื่อเป็นแนวทางให้กับผู้อ่านต่อไป ปัจจุบันโลกของเรามีการเปลี่ยนอย่างก้าวกระโดด โดยเฉพาะในด้านเทคโนโลยีตลอดจนเครื่องมือต่าง ๆ เกิดขึ้นมากมายให้เราเลือกนำมาใช้งาน สิ่งที่จะกล่าวต่อไปนี้คือ “ทุกสรรพสิ่งเชื่อมต่อกัน” เมื่ออ่านมาถึงจุดนี้ผู้อ่านคงจะเริ่มคิดถึงสิ่งต่าง ๆ ที่อยู่รอบตัวเรา ในชีวิตประจำวันที่เราใช้ Internet มันเชื่อมโยงทุกสิ่งอย่าง อย่างไรก็ตามในหลาย ๆ มิติของการเปลี่ยนแปลงมันก็เป็นไปตามธรรมชาติของมัน นั่นคือทุกอย่างล้วน เกิดขึ้น ตั้งอยู่ และดับไป ผู้เขียนพยามสะท้อนให้เห็นถึงความเป็นจริง หากเราจะก้าวไปข้างหน้า จงอย่างไปยึดติด แต่เราควรเลือกที่จะเปลี่ยนให้เหมาะสมไปตามภาวะในความเป็นจริง เรามาเข้าเรื่องที่จะนำเสนอในบทความนี้กัน…. เพิ่งได้เข้าเรื่องนะ OK ใจเย็น ๆ ไม่ต้องรีบร้อนค่อย ๆ อ่านไปแล้วกันนะ ^_^ จากการที่ศูนย์คอมพิวเตอร์ มหาวิทยาลัยสงขลานครินทร์ เป็นเจ้าภาพในการจัดการประชุมปฏิบัติการ “ระบบเทคโนโลยีสารสนเทศและการสื่อสารมหาวิทยาลัยสงขลานครินทร์” ครั้งที่ 1 (The 1st PSU ICT Workshop) นับเป็นนิมิตหมายอันดีที่ทำให้เราได้เชื่อมต่อถึงกัน ในการประชุมครั้งนั้นผู้เขียนได้มีส่วนร่วมในการนำเสนอ ” แพลตฟอร์มสำหรับการพัฒนา web app และ mobile app บนสถาปัตยกรรมไมโครเซอร์วิส (Microservices Architecture)” สถาปัตยกรรมของแพลตฟอร์มใหม่ ของคณะวิศวกรรมศาสตร์ ได้ออกแบบขึ้นบนพื้นฐานของสถาปัตยกรรม Microservice ซึ่งทุกสิ่งอย่างเชื่อมต่อกัน แต่ละ Service มีหน้าที่เฉพาะตัว ไม่ยึดติดภาษาที่ใช้พัฒนา แต่เราจะควบคุมให้ทำงานตามที่เราต้องการและสามารถปรับแต่งได้ เพื่องรองรับการเปลี่ยนแปลง นั่นคือภาพโดยรวมของเพลตฟอร์ม การเลือกเครื่องมือ (Tools) ทีนำมาใช้ในการพัฒนาหรือการ Operation ระบบทั้งหมดนั้นมีความสำคัญต่อการปฏิบัติงาน หลักการเลือกเครื่องมือของผู้เขียนมีดังนี้ ตรงตามความต้องการ มีรายละเอียด (Docs) อธิบายชัดเจน มีชุมชน (Community) ที่มีการ update ปัญหาอย่างสมำเสมอ มี Road map ของการพัฒนาที่ชัดเจน มีช่องทางเชื่อมต่อแบบต่างเพลตฟอร์ม (Cross Platform) เมื่ออ่านมาถึงจุดนี้ ผู้เขียนขอนำเสนอเครื่องมือที่ใช้ในการจัดการบริหารเพลตฟอร์ม ที่สามารถเชื่อมต่อกันโดยไม่ต้องพัฒนาหรือเขียน Code ขึ่นมาใหม่ ตรงนี้จะช่วยให้เรามีเวลาไปทำอย่างอื่นเพิ่มขึ้น เครื่องมือที่นำเสนอในบทความนี้เป็นเพียงส่วนหนึ่งของการพัฒนา ที่ผู้เขียนได้ผ่านกระบวนการทดสอบ และใช้งานจริงแล้ว ขอนำเสนอด้วยภาพด้านล่างเพื่อความเข้าใจอย่างรวดเร็ว จากภาพเครื่องมือที่ใช้นั้นเป็น Open source ที่มาจากต่างค่าย ต่างผู้พัฒนาแต่มันสามารถเชื่อมต่อกันได้อย่างลงตัว ซึ่งรายละเอียดของเครื่องมือนั้นผู้เขียน ขอให้ข้อมูลจากผู้ให้บริการเลยนะครับซึ่งมีดังนี้ Kong API Gateway เป็นเครื่องมือสำหรับจัดการ การเข้าถึง APIs จากภายนอกแล้วไปเรียก APIs ภายในโดยใช้หลักการ Reverse proxy ได้อย่างง่าย สะดวก ไม่ต้องเขียน config ให้ยุ่งยากปลอดภัยและรวดเร็ว ในตัว Kong API Gateway นั้น มี Logging UDP/TCP Plugin  ให้เราสามารถส่ง logs ไปบันทึกตามตำแหน่งที่เราต้องการได้ Reference:  https://konghq.com ELK API Analytic เป็นเครื่องมือที่หลายคนน่าจะรู้จักดีและมีบทความดี ๆ ที่ผ่านมาเกี่ยวกับ ELK อยู่ในชุมชนนี้ด้วย เครื่องมือนี้ช่วยวิเคราะห์ปัญหาการเรียกใช้ APIs ตรวจสอบความผิดปกติในการใช้งาน เป็นต้น Reference: https://www.elastic.co Grafana API Monitoring เป็นเครื่องมือสำหรับใช้สร้าง Dashboard / Visualize กราฟ และวิเคราะห์ในเชิงสถิติ โดยตัวมันมี Plugin connection data source หลายแบบ หนึ่งใน data source

Read More »

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 ตัว ต่อไป สร้าง 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/ และ ดาวน์โหลด มาเก็บไว้

Read More »