Category: Linux (OS, shell script, etc)

  • Windows Subsystem for Linux in Windows 10

    แนะนำวิธีติดตั้ง Windows Subsystem for Linux ใน Windows 10 รุ่น 1903 และวิธีเปิด sshd service อัตโนมัติ

    ขั้นตอน
    1.เปิด Featured Windows Subsystem for Linux ให้ไปที่ Control Panel เลือก Program เลือก Turn Windows features on or off ทำเครื่องหมายเพื่อเลือก Windows Subsystem for Linux รอสักครู่ จากนั้นจะมีคำสั่งให้ reboot เพื่อเริ่มใช้งานได้

    Open Control Panel
    Select Program
    Select Turn Windows features on or off
    Check Windows Subsystem for Linux
    Next, reboot Windows

    2.เปิด Microsoft Store App ใส่คำว่า ubuntu ในช่อง search เลือก Ubuntu 18.04 LTS App คลิก Get ถาม Sign in with Microsoft ให้ตอบ No, thanks จากนั้นรอ

    Open Microsoft Store
    Select Ubuntu 18.04 LTS App
    Get
    Answer with “No, thanks”
    On downloading

    3.เปิด Ubuntu 18.04 LTS ที่ปุ่ม Windows Start ให้คีย์คำว่า ubuntu แล้วเลือก Run ad administrator จะใช้เวลาสักครู่ แล้วจะให้เราตั้ง username และ password ที่ไม่จำเป็นต้องเหมือนกับ username ที่ sign in เข้า Windows

    Open Ubuntu with Run as administrator
    First time Installing

    4.เปิดอนุญาตให้มีการเชื่อมต่อผ่าน sshd ในครั้งแรกที่คีย์คำสั่งว่า
    sudo service ssh start

    Allow ssh in Windows Firewall

    5.ให้ถอนโปรแกรม openssh-server เพราะว่า Ubuntu ที่ได้มาไม่มี host key

    sudo apt remove openssh-server
    Remove sshd

    6.แล้วจะติดตั้งใหม่จะได้ ssh host key

    sudo apt install openssh-server
    Install sshd with new host key

    เปิด sshd service ด้วยคำสั่ง

    sudo service ssh start

    และทดสอบว่า บริการ sshd ทำงานได้แล้วด้วยคำสั่ง

    ssh john@127.0.0.1

    ให้เปลี่ยนคำว่า john เป็นชื่อ username ที่ใช้งาน
    จะพบว่าครั้งแรกนี้ จะเข้าไม่ได้ Permission denied (publickey)

    Permission denied

    7.เราจะตั้งค่าให้ใช้ password ได้ด้วยนอกจากใช้ public key

    sudo sed -i "s/^PasswordAuthentication no/PasswordAuthentication yes/" /etc/ssh/sshd_config
    Allow using password

    เปิด sshd service อีกครั้ง ด้วยคำสั่ง
    sudo service ssh restart
    และทดสอบอีกครั้งว่า บริการ sshd ทำงานได้แล้วด้วยคำสั่ง
    ssh john@127.0.0.1
    ให้เปลี่ยนคำว่า john เป็นชื่อ username ที่ใช้งาน
    ในรอบนี้ เราจะใส่ password ได้แล้ว หลังจากสำเร็จ ก็ใช้คำสั่ง exit ออกมา

    sshd is OK

    เมื่อมาถึงตรงนี้ เราได้ทำให้บริการ sshd พร้อมใช้งานใน Windows ของเราแล้ว

    ต่อไปเป็นการตั้งค่าให้บริการ sshd ทำงานทันทีที่เปิด Windows
    คีย์คำสั่งเหล่านี้

    echo "sudo /usr/sbin/service ssh start" > /mnt/c/startssh.sh

    และ

    echo "%sudo ALL = NOPASSWD: /usr/sbin/service ssh start" | sudo tee /etc/sudoers.d/custom

    (ตรงนี้อาจมีถาม password ของ username ที่กำลังใช้งานที่มีสิทธิใช้คำสั่ง sudo)
    และคำสั่งนี้

    sudo chmod 0440 /etc/sudoers.d/custom

    เสร็จแล้วคีย์คำสั่ง exit เพื่อปิดหน้าต่าง

    To prepare a task for Task Schdule

    คำเตือน: หากคีย์ข้อความในคำสั่งตกหล่น จะต้องกลับไปติดตั้ง Ubuntu ใหม่โดยการ Uninstall แล้ว Install ใหม่

    เราจะไปตั้งค่าให้ startssh.sh ทำงานด้วย Task Schedule
    เปิด Task Scheduler เลือก Run as administrator เลือก Task Scheduler Library ดูด้านขวา เลือกคำสั่ง Create Task

    Open Task Schedule
    Select Create Task

    แท็บแรกคือ General ตั้ง Name ว่า startssh เลือก Run whether user is logged on or not เลือก Run with highest privileges ที่ช่อง Configure for เลือก Windows 10

    General Tab

    แท็บสองคือ triggers เลือก New ที่ช่อง Begin the task เลือก At startup ที่ช่อง Advanced Settings ด้านล่าง เลือก Enabled

    Triggers Tab

    แท็บสามคือ Actions เลือก New ที่ช่อง Action เลือก Start a program ที่ช่อง Program/script ใส่คำว่า bash และที่ช่อง Add arguments ใส่ข้อความ /mnt/c/startssh.sh

    Action Tab

    จะมี pop up window ถาม username กับ password ที่จะรัน Task นี้ ก็ใส่ให้ถูก แล้วปิดหน้าต่าง Task Schedule

    Enter password

    เมื่อมาถึงตรงนี้ เราก็ได้ตั้งค่าให้ Start sshd เมื่อ Windows Start เสร็จแล้ว

    ทดสอบโดยการ reboot Windows เพื่อดูว่า Task Schedule ทำ task ขื่อ startssh ให้อัตโนมัติสำเร็จหรือไม่ โดยการทดสอบ ssh เข้าจาก PC อีกเครื่อง สมมติว่า เครื่อง Windows มี IP 192.168.6.221

    ssh john@192.168.6.221

    หลังจากตอบ Yes แล้วใส่ password ผ่าน ก็ให้พิมพ์คำสั่ง exit เป็นอันเสร็จสิ้นการทดสอบ
    หากได้ข้อความประมาณว่า ssh: connect to host 192.168.6.221 port 22: Resource temporarily unavailable ก็ต้องกลับไปตรวจสอบว่า ทำไมจึงเปิดบริการ sshd ไม่สำเร็จ ลองเช็ค Windows Firewall

    ต่อไปเป็นการนำ ssh key (id_rsa.pub) จากเครื่อง server ไปฝากไว้ที่ Windows Subsystem for Linux เพื่อเป็น publickey ใช้แทนการใส่ password เมื่อเราจะส่งคำสั่งเข้าไปจัดการ Windows ผ่านทาง Windows Subsystem for Linux เช่น reboot Windows เป็นต้น

    ตรวจสอบที่ server จะต้องมีไฟล์ id_rsa.pub ใน ~/.ssh/ ถ้ายังไม่ได้สร้าง key ก็ให้ใช้คำสั่งนี้

    ssh-keygen -t rsa
    directory ~/.ssh

    ส่ง ssh key ด้วยคำสั่งนี้

    ssh-copy-id -i ~/.ssh/id_rsa.pub john@192.168.6.221

    ให้แทนที่ john ด้วย username ที่ใช้ และเปลี่ยน IP เป็นที่ใช้

    Send ssh key

    ถ้าทำสำเร็จ ทดสอบด้วยคำสั่ง ssh john@192.168.6.221 จะเข้าได้โดยไม่มีถาม password
    ให้ออกจาก ssh นั้นด้วยคำสั่ง exit

    Testing

    ขั้นสุดท้ายทดสอบสั่ง reboot Windows ด้วยคำสั่ง เขียนติดกันเป็นบรรทัดเดียว

    ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no john@192.168.6.221 "/mnt/c/Windows/system32/shutdown.exe -r -f -t 0"
    Now we can manage Windows from remote

    วิธีที่ได้นำเสนอนี้ จะนำไปเป็นส่วนหนึ่งในการควบคุม Windows PC ในห้องบริการคอมพิวเตอร์ ซึ่งเราจะประยุกต์ให้เป็นการติดตั้งผ่าน shell script ไม่ต้องคีย์ทีละคำสั่ง

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

    • หลังจากไม่ได้ตรวจสอบช่องโหว่มานาน วันนี้ 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
    • เย่….หายไปละ
    • จบขอให้สนุก
  • อัปเดต Apache2 ให้ได้เวอร์ชั่นล่าสุดด้วย Third-Party PPA ของ ondrej

    พบว่า ubuntu 16.04 จะใช้ apache2 v 2.4.18 แม้ว่าเราจะสั่ง apt update; apt upgrade แล้วก็ตามเมื่อเช็คด้วยคำสั่ง apache2 -v จะพบว่ายังคงเป็นเวอร์ชั่น 2.4.18 เช่นเดียวกับ ubuntu 18.04 จะใช้ apache2 v 2.4.29 เท่านั้น หลังจากหาข้อมูลอยู่ทั้งวัน มีผู้ให้ข้อมูลใน google search ว่า ทีมพัฒนาจะไม่เปลี่ยนเวอร์ชั่นใน ubuntu ตาม upstream developer จนกว่าจะทดสอบและออก ubuntu next release

    หากต้องการเป็นเวอร์ชั่น 2.4.39 ณ วันนี้ (4 เม.ย. 62 หลังจากข่าวช่องโหว่ apache2 2 วัน) ก็ต้องใช้ Third-Party PPA ของ ondrej (ผู้พัฒนาคนหนึ่งที่ทำ Debian Package)

    เพิ่มเติมล่าสุด (5 เม.ย. 62) ทำใน ubuntu server อีกเครื่องที่ยังไม่ได้ทำแบบ PPA

    $ sudo apt-get update ; sudo apt-get dist-upgrade
    $ apache2 -v
    Server version: Apache/2.4.18 (Ubuntu)
    Server built: 2019-04-03T13:34:47

    $ dpkg -l | grep apache2
    ii apache2 2.4.18-2ubuntu3.10 amd64 Apache HTTP Server

    พบว่ามีการปรับปรุงเวอร์ชั่น Server built 2019-04-03 ซึ่งตามหลัง patch PPA ไม่กี่ชั่วโมง ใครยังไม่สนใจจะเปลี่ยนเป็นเวอร์ชั่น 2.4.39 ก็น่าจะไม่ต้องทำแบบ PPA ตามข้อมูลใน link นี้
    https://usn.ubuntu.com/3937-1/ และ
    https://launchpad.net/ubuntu/xenial/+source/apache2/+changelog

    ข้อควรระวัง ให้ตรวจสอบว่ามีการเข้าไปปรับแต่งไฟล์ apache2.conf ไว้หรือไม่ ต้องมีการทำ backup ไว้ก่อนอัปเดต เช่น บางท่านอาจไปเขียน Rewrite Rule ในไฟล์นี้ เป็นต้น ก็ต้องแก้ไขหลังจากอัปเดต รวมถึง Apache configuration files อื่น ๆ ที่เราใช้ เราต้องมี backup

    อย่างไรก็ตามก่อนทำอัปเดต ต้องมั่นใจว่าถ้า server เราเป็น VM ก็ต้องมีการ backup VM ไว้ก่อน จะอุ่นใจขึ้น

    sudo add-apt-repository ppa:ondrej/apache2
    sudo apt-get update
    sudo apt-get upgrade

    หลังจากอัปเดต เช็คเวอร์ชั่นด้วยคำสั่ง apache2 -v ได้เวอร์ชั่นล่าสุด

    Server version: Apache/2.4.39 (Ubuntu)
    Server built: 2019-04-02T20:30:08

    หากพบว่า ยังคงได้ version เดิม ตรวจสอบดู output จะพบว่า

    Reading package lists… Done
    Building dependency tree
    Reading state information… Done
    Calculating upgrade… Done
    The following packages have been kept back:
    apache2 apache2-bin apache2-data apache2-utils libaprutil1
    libaprutil1-dbd-sqlite3 libaprutil1-ldap openssl
    0 upgraded, 0 newly installed, 0 to remove and 8 not upgraded.

    ทำคำสั่งนี้แทน

    sudo apt-get dist-upgrade
    Reading package lists… Done
    Building dependency tree
    Reading state information… Done
    Calculating upgrade… Done
    The following package was automatically installed and is no longer required:
    liblua5.1-0
    Use 'apt autoremove' to remove it.
    The following NEW packages will be installed:
    libbrotli1 libjansson4 liblua5.2-0 libnghttp2-14 libssl1.1
    The following packages will be upgraded:
    apache2 apache2-bin apache2-data apache2-utils libaprutil1
    libaprutil1-dbd-sqlite3 libaprutil1-ldap openssl
    8 upgraded, 5 newly installed, 0 to remove and 0 not upgraded.
    Need to get 4,628 kB of archives.
    After this operation, 6,757 kB of additional disk space will be used.
    Do you want to continue? [Y/n]

    กด Enter (เพื่อเลือก Y) แล้วจะมีการติดตั้งให้

    ตอนนี้ก็เฝ้าระวังกันต่อไปว่า หลังจากทำวิธีนี้จะมีผลกระทบอะไรตามมาในอนาคตบ้างมั้ย หวังว่าจะไม่มี เพราะพยายามหาข้อมูลว่ามีใครแจ้งปัญหาจากวิธีการนี้ก็ไม่พบ พบแต่คำแนะนำวิธีนี้

    ผมคงไม่สามารถรับประกันความปลอดภัยใด ๆ หรือผลที่ตามมาจากการทำขั้นตอนในโพสต์นี้นะครับ


    สำหรับวิธีไม่ใช้ PPA จะกลับไปใช้ของเดิม

    sudo apt-get install ppa-purge
    sudo ppa-purge ppa:ondrej/apache2

    ตรวจสอบ version ของ apache2

    apache2 -v
    dpkg -l | grep apache2

    และล้างไฟล์ใน sources.list.d

    ls -l /etc/apt/sources.list.d/
    sudo add-apt-repository --remove ppa:ondrej/apache2

    ลิงค์ที่เกี่ยวข้อง

  • Virtual data center with OpenNebula

    OpenNebula เป็นชื่อของ open source software สำหรับทำ virtual data center เวอร์ชั่นล่าสุดคือ 5.6.1 (https://opennebula.org)

    ผมได้ทดลองในห้องปฏิบัติการ และเขียนเป็นขั้นตอนการติดตั้งจนกระทั่งได้ VM ขึ้นมา แต่ยังไม่ลงรายละเอียดถึงขั้นใช้งาน storage network ได้ ซึ่งจะได้ทดลองกันต่อไป

    ในตอนนี้ จะเรียกว่า basic set up ก็ได้นะ ในการ set up ระบบจริงตามคำแนะนำ แต่ละเครื่องควรมี network card 2 cards เพื่อแยกระหว่าง network ที่ให้บริการ กับ Management network

    การ set up จะต้องมีเครื่องที่เป็น Front-end เพื่อทำหน้าที่เป็น database และเว็บเพจสำหรับทำ configuration และสั่งการ และจะต้องมีเครื่องที่เป็น Hypervisor อย่างน้อย 1 เครื่อง โดยเลือกได้ว่าจะใช้ KVM หรือ vcenter สเปคเครื่อง hypervisor นี้ต้องรองรับ Virtualization extensions (Intel VT-x or AMD-V)

    เตรียมการทดลองโดยใช้ เครื่องคอมพิวเตอร์ที่ผมนำมาใช้มี 3 เครื่อง อายุเครื่องก็พอสมควร (ตามกำลังทรัพย์ที่มีในห้องปฏิบัติการ) แต่ทั้ง 3 เครื่องนี้ มีเพียง 1 network card ครับ เครื่อง Front-end 1 เครื่อง สเปค Pentium(R) Dual-Core CPU E5200 @ 2.50GHz มี RAM 4 GB อันนี้เป็นเครื่องทั่วไปที่รัน apache2 web server และ mariadb database ได้ ใช้เครื่อง KVM จำนวน 2 เครื่อง เพื่อจะให้เห็นว่าสามารถสร้าง VM ไปที่ KVM node ที่ต้องการได้ เครื่อง KVM node01 เป็น AMD Phenom(tm) II X4 945 Processor มี RAM 8 GB และ KVM node02 เป็น Intel(R) Core(TM) i5 CPU M 520 @ 2.40GHz มี RAM 4 GB

    นอกจากเครื่องคอมฯ แล้ว ผมก็มี network switch (L2-managed) เพื่อกำหนด port ให้รองรับ 802.1Q VLAN ผมออกแบบให้มี 2 VLAN คือ VLAN ID 6 (untagged) และ VLAN ID 7 (tagged) ซึ่ง VLAN 6 ก็คือ ครึ่งแรกของ network class C 192.168.6.0 เขียนแบบ CIDR 192.168.6.0/25 มี gateway คือ 192.168.6.1 และ VLAN 7 ก็คือ ครึ่งหลังของ network 192.168.6.128/25 มี gateway คือ 192.168.6.129

    ผมเขียนขั้นตอนไว้ในเว็บไซต์ opensource.psu.ac.th จะสะดวกกว่านำมาใส่ไว้ในบล็อกนี้ทั้งหมด เข้าไปที่ https://opensource.cc.psu.ac.th/Ubuntu1804 ก็จะเห็น link ต่อไปนี้

    แล้วจะมานำเสนอเรืองราวถัดไปครับ

  • Ubuntu server 18.04 config static IP with netplan

    เดิมก่อนหน้า Ubuntu server 18.04 LTS จะออกมาให้ใช้งานกันนั้น จะเป็น Ubuntu server 16.04 LTS เราตั้งค่า (config) static IP ให้กับ server ด้วยไฟล์นี้ /etc/network/interfaces ซึ่งก็คือ software package ชื่อ ifupdown และ DNS resolver ที่ใช้ก็คือ resolvconf

    แต่ใน Ubuntu server 18.04 นี้ เปลี่ยนไปใช้ package ชื่อ netplan แก้ไขที่ไฟล์ /etc/netplan/01-netcfg.yaml และใช้ DNS resolver คือ systemd-resolve ซึ่งจะ connect สอบถามชื่อ DNS จาก internal DNS ที่ IP 127.0.0.53 (ตรวจดูด้วยคำสั่ง cat /etc/resolv.conf)

    โดย default จะเป็นค่า network interface แบบ รับค่า IP มาจาก DHCP server

    ไฟล์ /etc/netplan/01-netcfg.yaml

    network:
    version: 2
    renderer: networkd
    ethernets:
    enp0s3:
    dhcp4: yes
    dhcp6: yes

    หากต้องการใช้เลข IP แบบ Static IP ก็ต้องตั้งค่าเองในแฟ้ม /etc/netplan/01-netcfg.yaml เป็นตัวอย่างประมาณว่า IP คือ 10.0.100.251 ใน class C (/24) มี gateway คือ 10.0.100.1 ทำหน้าที่ nameserver ด้วย และมี nameserver ที่สองคือ 192.100.77.10

     network:
    version: 2
    renderer: networkd
    ethernets:
    enp0s3:
    dhcp4: no
    addresses: [ 10.0.100.251/24 ]
    gateway4: 10.0.100.1
    nameservers:
    addresses:
    - 10.0.100.1
    - 192.100.77.10

    หลังจากแก้ไขค่าเสร็จแล้ว สั่งให้ network ทำงานใหม่ ใช้คำสั่ง sudo netplan apply

    ถ้าตอนนี้ใช้ netplan version 0.36.3 เราสามารถตั้งชื่อ network interface เป็นชื่อ vif1 แทน physical network interface เดิม

    ก่อนอื่น ให้ใช้คำสั่ง ifconfig เพื่อดูค่า MAC address ของ enp0s3 สมมติคือ 44:bb:33:85:91:08

    ตัวอย่างการแก้ไขข้อมูล

    network:
    version: 2
    renderer: networkd
    ethernets:
    vif1:
    match:
    macaddress: "44:bb:33:85:91:08"
    set-name: vif1
    dhcp4: no
    addresses: [ 10.0.100.251/24 ]
    gateway4: 10.0.100.1
    nameservers:
    addresses:
    - 10.0.100.1
    - 192.100.77.10

    หลังจากแก้ไขค่าเสร็จแล้ว ใช้คำสั่ง sudo reboot

    หลาย ๆ คน อาจจะอยากตั้งชื่อ network interface เป็นชื่อ eth0 แบบเดิมที่ชินตา ก็ทำได้ครับ ลองดูครับ และหมายเหตุไว้สักนิดว่า ไวยกรณ์ของไฟล์ *.yaml นี้ ต้องมีการเว้นวรรค เยื้องเข้า ให้ถูกต้องด้วยนะ เยื้องด้วยช่องว่างอย่างน้อย 2 spaces (เค้าว่ามา)

    ผมได้รวบรวมเป็น wiki เอาไว้สำหรับเรื่องคล้าย ๆ กันนี้

  • วิธีติดตั้ง HTTPS ด้วย Certificate ของ Let’s Encrypt

    จาก มาใช้งาน let’s encrypt กันเถอะ ของอาจารย์ฉัตรชัย ผมขอขยายความต่อ เอาแบบว่า Copy-Paste กันเลย

    โดยในที่นี้ …

    • OS เป็น Ubuntu 18.04
    • Web Server เป็น Apache
    • ที่ Firewall เปิดให้เข้าถึง TCP 80 / 443 จาก Internet ได้ — มันจำเป็นสำหรับการ Verification ของ Certbot ครับ *** ในเบื้องต้นนะ 🙂 ***

    Let’s Encrypt คืออะไร อ่าน …
    https://letsencrypt.org/getting-started/

    เริ่มต้น ต้องติดตั้ง Certbot ก่อน อ่าน …
    https://certbot.eff.org/

    ดูต้นฉบับการติดตั้งของ Ubuntu 18.04 และใช้ Apache ได้จาก
    https://certbot.eff.org/lets-encrypt/ubuntubionic-apache

    ติดตั้ง Certbot ก่อน

    ใช้คำสั่งต่อไปนี้ จาก User ที่สามารถ sudo ได้

    sudo apt-get update
    sudo apt-get install software-properties-common
    sudo add-apt-repository ppa:certbot/certbot
    sudo apt-get update
    sudo apt-get install python-certbot-apache 

    แบบ Auto

    จากนั้นใช้คำสั่งต่อไปนี้ เพื่อให้ certbot ทำการติดตั้ง Certificate และแก้ไขไฟล์ (ในที่นี้ใช้ Apache) Configuration ให้เลย

    sudo certbot --apache

    แบบแก้ไขเอง

    หรือถ้าจะทำเอง โดยต้องการเอาเฉพาะ Certificate มา แล้วทำการแก้ไขไฟล์ Apache Configuration เองก็ได้

    sudo certbot --apache certonly 

    ระบบจะถาม

    • ยอมรับเงื่อนไขไม๊ –> แน่นอน (A) Accept
    • email address ให้ใส่ไปตามจริง
    • ต้องการให้แสดง email address เปิดเผยหรือไม่ –> ผมตอบ No นะ
    • และ บอกว่า Domain Name ของเราคืออะไร ให้ใส่ FQDN ไป เช่น kx1.in.psu.ac.th เป็นต้น

    จากนั้น Certbot จะ Callback ไป ให้มีการ Verification จาก Internet ว่าสามารถเข้าถึงได้จริงหรือไม่ (ตรงนี้ ใน PSU ต้องแจ้งทาง Network Admin เพื่อเปิด Port ที่ Firewall ให้เข้าถึง TCP 80 และ 443 ให้สำเร็จก่อน)

    เมื่อ Verification สำเร็จ ก็จะได้ไฟล์ Certificate และ Private Key มา จะอยู่ที่ (path แต่ละเครื่องจะแตกต่างกันตรงที่ Domain Name ที่กำหนดข้างต้น) ตามลำดับ

    /etc/letsencrypt/live/kx1.in.psu.ac.th/fullchain.pem
    /etc/letsencrypt/live/kx1.in.psu.ac.th/privkey.pem

    แก้ไขไฟล์

    /etc/apache2/sites-available/default-ssl.conf

    ให้มีค่าต่อไปนี้

    SSLCertificateFile  
       /etc/letsencrypt/live/kx1.in.psu.ac.th/fullchain.pem
    SSLCertificateKeyFile 
        /etc/letsencrypt/live/kx1.in.psu.ac.th/privkey.pem

    จากนั้นใช้คำสั่งนี้ เพื่อเปิดใช้งาน https

    sudo a2enmod ssl

    ใช้คำสั่งนี้ เพื่อใช้งาน default-ssl

    sudo a2ensite default-ssl

    และทำการ Restart apache ด้วยคำสั่งนี้

    sudo systemctl reload apache2

    ทดสอบใช้งาน HTTPS

    ใช้งานได้

    NOTE

    • จริง ๆ แล้ว ในองค์กร สามารถทำเครื่อง ๆ หนึ่งขึ้นมา เพื่อติดตั้ง certbot แล้วขอ Certificate มา ของ Domain ต่าง ๆ แล้วค่อย “ย้าย” certificate และ key file ไปเครื่องที่จะใช้งานจริง แล้ว ชี้ Domain Name ใหม่ไปยังเครื่องนั้นก็ได้ แต่เมื่อครบ 90 วัน ต้อง Renew ใหม่ (ทดลองทำกับ Google Compute Engine โดยสร้าง Certificate โดยชี้ Domain ไปยัง IP จริง ของ Google พอเรียบร้อยแล้ว ก็แล้วย้ายไฟล์ ย้าย Domain Name มาที่ IP ภายใน ใช้งานได้ เหมือนกัน) — วิธีนี้ลักไก่เอาได้ แต่ก็จะยุ่งยากหน่อย และต้องระวัง 90 วันที่จะต้อง Renew
    • แต่จะให้ถูกต้อง ก็ควรใช้งานกับเครื่องที่เปิด Firewall ให้เข้าถึง TCP 80 / 443 ได้ เพื่อติดตั้ง certbot จะดีกว่า
    • สามารถขอ Wildcard ได้ เช่น จะขอ *.kx1.in.psu.ac.th ก็ได้ แต่ต้องมีความรู้ DNS กว่านี้หน่อย เดี๋ยวค่อยมาเล่าให้ฟังครับ
    • [UPDATE] กรณีเป็น Web Hosting กล่าวคือ ให้บริการหลาย ๆ Virtual Host เช่น เครื่องหลักใช้ชื่อว่า kx1.in.psu.ac.th ถ้าต้องการให้ www.something.psu.ac.th ชี้มาที่เครื่องนี้ด้วย ก็ทำ www CNAME kx1.in.psu.ac.th.  (ที่ zone something.psu.ac.th) มาก็ได้ แล้วค่อยใช้ certbot ที่เครื่อง kx1.in.psu.ac.th นี้ สร้าง Certificate ให้ก็ได้ครับ

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

  • รวมร่าง Windows กับ Linux ใช้งานในเครื่องเดียวกันแบบเนียนๆ

    จุดประสงค์

    สามารถใช้งาน Windows กับ Linux ได้ในเครื่องเดียวกันและในเวลาเดียวกันเหมือนเป็นทองแผ่นเดียวกัน แก้ปํญหา Dev / SysAdmin ส่วนใหญ่ที่ต้องใช้ Linux เป็นหลักในการทำงานแต่ต้องเผื่อใจต้องทำงานบน Windows ด้วยในบางเวลา เช่น ทำเอกสาร MS Word ไม่ให้เพี้ยน หรือ Adobe PhotoShop หรือโปรแกรมที่ไม่สามารถทำการติดตั้งลงใน Linux ได้ และที่สำคัญคือการทำงานระหว่างสองระบบต้องไหลลื่นและรวดเร็ว ประหยัด กินทรัพยากรน้อย

    หากยังนึกภาพไม่ออก สามารถดูวิดีโอนี้ครับ  Windows 10 + Linux Lite (Seamless) 

    สเปกเครื่อง

    สามารถใช้บน windows 7, 8, 10 แต่ขอให้มี RAM อย่างน้อย 4 GB จะดีมากถ้า RAM 8 GB แต่ในที่นี้จะเป็นการติดตั้งและใช้งาน Linux บน Windows 10 64 bit  

    (more…)
  • 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

    จบขอให้สนุก

  • How to install PSU SSL VPN Client ubuntu 18.04

    • เปิด terminal
    • เริ่มด้วยการติดตั้งโปรแกรมที่จำเป็น
      sudo apt install -y openfortivpn
    • สร้างแฟ้ม /home/username/fortivpn.config มีข้อความว่า
      host = vpn2.psu.ac.th
      port = 443
      username = PSU Passport Username
      password = PSU Passport Password
      trusted-cert = 34df1a6bd3705782fd17152de0c4fe0b3e7f31302cbdcf737b113c17a5b9ff09
    • สั่งรันคำสั่ง
      sudo openfortivpn -c fortivpn.config
    • ได้ข้อความประมาณว่า
    • แปลว่าเชื่อมต่อได้แล้ว หากต้องการยกเลิกการเชื่อมต่อให้กด ctrl-c จะได้ข้อความประมาณว่า
    • แปลว่ายกเลิกการเชื่อมต่อแล้ว
    • ต้องเปิด terminal ที่รันคำสั่ง openfortivpn ไว้ตลอดเวลาที่เชื่อมต่อห้ามปิด
    • จบสไตล์คอมมานไลน์ ….

    หากอยากได้ง่ายกว่านี้

    • ติดตั้งโปรแกรม OpenFortiGUI โหลดที่ https://hadler.me/linux/openfortigui/ โดยเลือกโปรแกรมสำหรับ Ubuntu 18.04
    • โหลดมาแล้วติดตั้งด้วยคำสั่ง
      sudo dpkg -i openfortigui_0.6.2-1_bionic_amd64.deb
    • จะมี error message มากมาย ให้ต่อด้วยคำสั่ง
      sudo apt -f -y install
    • เริ่มใช้งานเปิดโปรแกรม openFortiGUI โดยกดที่ปุ่ม Show Applications เลือก openFortiGUI
    • จะได้หน้าต่าง
    • คลิกปุ่ม Add เลือก VPN จะได้
    • กรอกข้อความตามรูป ช่อง username และ password ก็ใส่ PSU Passport ลงไปเสร็จแล้วกด Save
    • ได้ดังรูป
    • เลือก PSU แล้วคลิก Connect ได้ผลดังรูป
    • คลิก x เพื่อปิดหน้าต่างสังเกตว่าจะมีรูป  ที่มุมบนขวา หากจะยกเลิกการเชื่อมต่อ คลิกขวาที่  เลือก PSU เพื่อ dissconnect
    • จบขอให้สนุก…

    ***  จากที่ลองทดสอบพบว่า เมื่อเชื่อมต่อ AIS 4G จะไม่สามารถใช้วิธี OpenFortiGUI ได้ แต่ใช้วิธีคอมมานไลน์ได้ครับ