Category: Operating System

  • Configuration of TCP/IP with SSL and TLS for Database Connections

    สิ่งที่ต้องเตรียม

    1. Oracle Database Server ในตัวอย่างนี้ใช้ Oracle database บน Oracle Enterprise Linux 7
    2. Oracle Database Client  ในตัวอย่างใช้ Windows Server 2008 R2

    เริ่ม

    • ฝั่ง Server
    • เข้าระบบด้วยบัญชีผู้ใช้ oracle หรือบัญชีที่เป็นเจ้าของ Oracle Database
    • เปิด terminal สร้าง Oracle Wallet ด้วยคำสั่ง
      • mkdir -p /u01/app/oracle/wallet

    • ต่อด้วย
      • orapki wallet create -wallet "/u01/app/oracle/wallet" -pwd WalletPasswd123 -auto_login_local

      • โดย -pwd WalletPasswd123 ตัว WalletPasswd123 คือรหัสผ่านที่ใช้ป้องกันการเข้าถึงข้อมูลต่างๆ ใน wallet กฎการตั้งมีอยู่คือ ยาวอย่างน้อย 8 ตัวอักษร ไม่จำกัดความยาว จำเป็นต้องตั้งให้ตัวเลขผสมตัวอักษร
    • สร้าง Certificate และใส่เข้าไปใน wallet ด้วยคำสั่ง
      • orapki wallet add -wallet "/u01/app/oracle/wallet" -pwd WalletPasswd123 \
        -dn "CN=`hostname`" -keysize 1024 -self_signed -validity 3650

    • ตรวจสอบด้วยคำสั่ง
      • orapki wallet display -wallet "/u01/app/oracle/wallet" -pwd WalletPasswd123

    • ได้ผลลัพธ์ประมาณ
      • Oracle PKI Tool : Version 12.1.0.2
        Copyright (c) 2004, 2014, Oracle and/or its affiliates. All rights reserved.

        Requested Certificates:
        User Certificates:
        Subject: CN=reis.psu.ac.th
        Trusted Certificates:
        Subject: CN=reis.psu.ac.th

    • Export Certificate เพื่อนำไปใช้กับเครื่อง Oracle Client ด้วยคำสั่ง
      • orapki wallet export -wallet "/u01/app/oracle/wallet" -pwd WalletPasswd123 \
        -dn "CN=`hostname`" -cert /tmp/server-certificate.crt

    • ตรวจสอบแฟ้มที่ export ไปด้วยคำสั่ง
      • cat /tmp/server-certificate.crt

    • ได้ผลลัพธ์ประมาณว่า
      • -----BEGIN CERTIFICATE-----
        MIIBoTCCAQoCAQAwDQYJKoZIhvcNAQEEBQAwGTEXMBUGA1UEAxMOcmVpcy5wc3UuYWMudGgwHhcN
        MTgwMTA5MDcyNTA2WhcNMjgwMTA3MDcyNTA2WjAZMRcwFQYDVQQDEw5yZWlzLnBzdS5hYy50aDCB
        nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAj4x2/NviDaTlXuEJt0kZARY5fHiT2SiVX+a18hai
        I0stoUhKKefjOCgB85iuqjIk0rvcGXI0KXkbenTy2t40A+qGxB04mBhCLKaKeIe67BZKR6Zyw1dd
        oaesoaWChC01b+IW1X5WWtC53UxpIZQ4Zktj41sLGUnarIr9+9HFwncCAwEAATANBgkqhkiG9w0B
        AQQFAAOBgQAqSCF2Y8uyM4rSQHUC8MKEl3Ia3NJKnigMOUzDc2fP7grSaoeuQ4NvIntTD+s+IT5Y
        EpLVND4kSHFTwGRq0Py/ig8ybXZCXfHtvNZh7ZGziL/sYt5/8xYi/tOBKwVanBTUaseKIMovtmd7
        UyoOKrX8YBoFsB3UPRLudmFsksXRXw==
        -----END CERTIFICATE-----

    • ฝั่ง Client
    • เข้าระบบด้วยบัญชีผู้ใช้ administrator
    • เปิด cmd แล้วสร้าง wallet ด้วยคำสั่ง
      • mkdir c:\app\oracle\wallet

    สร้าง Certificate ด้วยคำสั่ง

      • orapki wallet add -wallet "c:\app\oracle\wallet" -pwd WalletPasswd123 -dn "CN=%computername%" -keysize 1024 -self_signed -validity 3650

      • โดย WalletPasswd123 คือพาสเวิร์ดที่ใช้ล็อค wallet ไม่จำเป็นต้องเหมือนกับของ Server
    • ตรวจสอบด้วยคำสั่ง
      • orapki wallet display -wallet "c:\app\oracle\wallet" -pwd WalletPasswd123

    • ได้ผลลัพธ์ประมาณว่า
      • Oracle PKI Tool : Version 12.2.0.1.0
        Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved.

        Requested Certificates:
        User Certificates:
        Subject: CN=ENERAZAN
        Trusted Certificates:
        Subject: CN=ENERAZAN

    • Export Certificate เพื่อนำไปใช้กับเครื่อง Oracle Database Server ด้วยคำสั่ง
      • orapki wallet export -wallet "c:\app\oracle\wallet" -pwd WalletPasswd123 -dn "CN=%computername%" -cert c:\client-certificate.crt

    • ตรวจสอบแฟ้มที่ export ไปด้วยคำสั่ง
      • more c:\client-certificate.crt
    • ได้ผลลัพธ์ประมาณว่า
      • -----BEGIN CERTIFICATE-----MIIBmTCCAQICAQAwDQYJKoZIhvcNAQEEBQAwEzERMA8GA1UEAxMIRU5FUkFaQU4wIhgPMDE1NTAxMDkwNzMzNDlaGA8wMTQ1MDEwNzA3MzM0OVowEzERMA8GA1UEAxMIRU5FUkFaQU4wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAJHEEnB4kiI82QVyt0/GlrILF9dwd/jVRlgCQkLmLrpF6RKrIUntzvygyVhtTybeaShH751gYvtl1NFxDUWkBnfS5u2DN6ATP2WpNQgGM/skPWZOxoewy6OeeFsDPNUJTsI8+F5DIwtNhZcdQtBexZ/D3ALkSboR87t2Vy8OJpD7AgMBAAEwDQYJKoZIhvcNAQEEBQADgYEAV7xLLslRn2srS4A4Ks1KiuUWI/ackyNK7UiWgWD/by5Vx4Zw+0x3hdLzQllDR2O5Nef9it5WyYWrDQ47RadqMEVVfTGuAqQn47n/t+v24ljwm2yZ36Tj2lDVaFbE/ZtRyzPKgIwUy6RIt9XVX39vXFJVaENCHzZ0R3hs2bx1K3o=-----END CERTIFICATE-----

    • ทำการส่งไฟล์ certificate แลกกันระหว่าง Server กับ Client โดยใช้วิธีการที่ชื่นชอบของแต่คน เมื่อแลกไฟล์กันเสร็จแล้ว
    • ฝั่ง Server import certificate ด้วยคำสั่ง
      • orapki wallet add -wallet "/u01/app/oracle/wallet" -pwd WalletPasswd123 \ -trusted_cert -cert /tmp/client-certificate.crt

    • สามารถตรวจสอบด้วยคำสั่ง
      • orapki wallet display -wallet "/u01/app/oracle/wallet" -pwd WalletPasswd123

    • ได้ผลลัพธ์ประมาณ
      • Oracle PKI Tool : Version 12.1.0.2
        Copyright (c) 2004, 2014, Oracle and/or its affiliates. All rights reserved.

        Requested Certificates:
        User Certificates:
        Subject: CN=reis.psu.ac.th
        Trusted Certificates:
        Subject: CN=ENERAZAN
        Subject: CN=reis.psu.ac.th

    • ฝั่ง Client import certificatae ด้วยคำสั่ง
      • orapki wallet add -wallet "c:\app\oracle\wallet" -pwd WalletPasswd123 -trusted_cert -cert c:\server-certificate.crt

    • สามารถตรวจสอบด้วยคำสั่ง
      • orapki wallet display -wallet “c:\app\oracle\wallet” -pwd WalletPasswd123
    • ได้ผลลัพธ์ประมาณว่า
      • Oracle PKI Tool : Version 12.2.0.1.0
        Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved.

        Requested Certificates:
        User Certificates:
        Subject: CN=ENERAZAN
        Trusted Certificates:
        Subject: CN=reis.psu.ac.th
        Subject: CN=ENERAZAN

    • ฝั่ง Server แก้ไขแฟ้ม $ORACLE_HOME/network/admin/sqlnet.ora ด้วย editor ที่ชื่นชอบ
      • เพิ่มคำสั่งต่อไปนี้
      • WALLET_LOCATION =
        (SOURCE =
        (METHOD = FILE)
        (METHOD_DATA =
        (DIRECTORY = /u01/app/oracle/wallet)
        )
        )

        SQLNET.AUTHENTICATION_SERVICES = (TCPS,NTS,BEQ)
        SSL_CLIENT_AUTHENTICATION = FALSE
        SSL_CIPHER_SUITES = (SSL_RSA_WITH_AES_256_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA)

    แก้ไขแฟ้ม $ORACLE_HOME/network/admin/listener.ora

      • เพิ่มข้อความส่วนที่เป็นตัวหนาตามตำแหน่งต่อไปนี้
      • LISTENER =
        (DESCRIPTION_LIST =
        (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = reis.psu.ac.th)(PORT = 1521))
        (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
        (ADDRESS = (PROTOCOL = TCPS)(HOST = reis.psu.ac.th)(PORT = 2484))
        )
        )

        SSL_CLIENT_AUTHENTICATION = FALSE

        WALLET_LOCATION =
        (SOURCE =
        (METHOD = FILE)
        (METHOD_DATA =
        (DIRECTORY = /u01/app/oracle/wallet)
        )
        )

    • restart listener ด้วยคำสั่ง
      • lsnrctl stop
      • lsnrctl start
    • ฝั่ง Client แก้ไขแฟ้ม C:\app\client\Administrator\product\12.2.0\client_1\network\admin\sqlnet.ora โดยเพิ่มข้อความต่อไปนี้
      • WALLET_LOCATION =
        (SOURCE =
        (METHOD = FILE)
        (METHOD_DATA =
        (DIRECTORY = c:\app\oracle\wallet)
        )
        )

        SQLNET.AUTHENTICATION_SERVICES = (TCPS,NTS)
        SSL_CLIENT_AUTHENTICATION = FALSE
        SSL_CIPHER_SUITES = (SSL_RSA_WITH_AES_256_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA)

    • แก้ไขแฟ้ม C:\app\client\Administrator\product\12.2.0\client_1\network\admin\tnsnames.ora เพิ่มข้อความต่อไปนี้
      • REIS_SSL =
        (DESCRIPTION =
        (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCPS)(HOST = reis.psu.ac.th)(PORT = 2484))
        )
        (CONNECT_DATA =
        (SERVICE_NAME = reis.psu.ac.th)
        )
        )

    • ทดสอบใช้งาน
    • ที่ Client พิมพ์คำสั่ง
      • sqlplus scott/tiger@reis_ssl
    • ได้ผลลัพธ์ประมาณว่า
      • SQL*Plus: Release 12.2.0.1.0 Production on Wed Feb 7 16:54:05 2018
        Copyright (c) 1982, 2016, Oracle. All rights reserved.

        Last Successful login time: Wed Feb 07 2018 16:52:50 +07:00

        Connected to:
        Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 – 64bit Production
        With the Partitioning, OLAP, Advanced Analytics and Real Application Testing opt
        ions

        SQL>

    • หรือต่อด้วย SQL Developer ต้องตั้งค่าการเชื่อมต่อเป็นดังภาพ
    • จากภาพเลือก Connection Type เป็น Advanced และใช้ช่อง Custom JDBC URL ใส่เป็น jdbc:oracle:oci:/@reis_ssl
    • เนื่องจากไม่สามารถเชื่อมต่อผ่าน tns ได้ ดังภาพ
    • วิธีเซ็ตค่าแบบนี้ใช้ได้กับ Oracle Database 10G R2 เป็นต้นมา
    • จบขอให้สนุก

    ที่มา:
    https://oracle-base.com/articles/misc/configure-tcpip-with-ssl-and-tls-for-database-connections

  • วิธีขยาย Disk ใน VM/Virtualbox แล้วให้ Ubuntu

    ในกรณีใช้ VMWare/VirtualBox  บางครั้งเราต้องการขยาย Disk ให้ Ubuntu มีพื้นที่มากขึ้น

    1. เดิมมี Disk 100 GB
    2. แก้ไขให้เป็น 300 GB
    3. Login เข้าไป ดูข้อมูล ด้วยคำสั่ง df -h จะเห็น 100 GB อยู่

      แล้ว sudo reboot
    4. ลอง Login ใหม่ แล้วใช้คำสั่ง
      sudo su
      fdisk -l

      ก็จะ ขนาดเพิ่มเป็น 300 GB
      จากนั้นใช้คำสั่ง

      growpart /dev/sda 1
      resize2fs /dev/sda1

      แล้วลอง

      df -h


      ก็จะพบว่า ได้ขนาดมาเป็น 300 GB แล้ว

  • เทคนิคการใช้ Word ในการทำบรรณานุกรม

    ในการทำเอกสารงานวิชาการ/งานวิจัย เมื่อเราอ่านเอกสารจากบทความหรือหนังสือต่าง ๆ แล้วมาเขียนในงานของเราจะต้องมีการอ้างอิงที่มาของเนื้อหาดังกล่าว โดยไปที่ References คลิก Insert Citation  คลิก Add New Source จะแสดง Dialog ดังรูป

    • Type of Source ให้เลือกประเภทของแหล่งข้อมูลเนื้อหาตามต้องการ ไม่ว่าจะเป็นหนังสือ, เอกสารวิชาการ, Conference Proceeding, รายงาน, เอกสารอิเล็กทรอนิกส์, จาก Website ต่าง ๆ ก็สามารถทำอ้างอิงได้ ในที่นี้ขอเลือก Book
    • Author ระบุชื่อผู้แต่ง
    • Title ระบุชื่อหนังสือ
    • Year ระบุปีที่พิมพ์
    • City ระบุชื่อเมืองที่พิมพ์
    • Publisher ระบุสำนักพิมพ์
      จากนั้นคลิก OK ก็จะได้อ้างอิง ดังรูป

      พอเราทำเอกสารเสร็จทั้งหมดไปถึงหน้าสุดท้ายแล้ว ถึงเวลาที่เราต้องทำบรรณานุกรมแล้ว ไปที่ References ที่ Style เราสามารถเลือกได้ว่าจะใช้มาตรฐานการอ้างอิงแบบไหน ส่วนใหญ่ก็จะเป็น APA จากนั้นคลิกที่ Bibliography คลิกเลือก Bibliography ก็จะได้บรรณานุกรม ดังรูปโดยที่เราสามารถปรับแต่งขนาดตัวอักษร จัดรูปแบบ และยังสามารถอัพเดตอ้างอิงและบรรณานุกรมได้ด้วยค่ะ อาจจะเป็นเทคนิคเล็ก ๆ น้อย ๆ แต่คิดว่าคงมีประโยชน์กับผู้ที่ทำเอกสารงานวิชาการ/งานวิจัยนะคะ 

     

  • Windows CRLF to Unix LF Issues in Cygwin Shell Script

    เมื่อเรารัน shell script ของโปรแกรม Cygwin for Windows ซึ่งมีการเขียนคำสั่งไปตัดเอาข้อความผ่านคำสั่ง (Command Line) ของ Windows มาใส่ในตัวแปรของ shell script

    เช่น ในตัวอย่างนี้คือคำสั่ง ipconfig เมื่อได้ข้อความที่ต้องการมาเราจะได้ \r แถมมาให้ด้วยต่อท้าย เพราะ Windows style line ending จะมี CRLF (\r\n)  ในขณะที่ Linux style line ending จะมี LF (\n) เท่านั้น

    น่าแปลกใจมากว่า เราเคยรัน shell script นี้ใน Windows 7 ใช้งานได้ แต่พอเป็น Windows 10 build 1709 มันรันไม่ได้

     

    ปัญหา

    เมื่อเปิด Cygwin Terminal ขึ้นมา จะได้เป็น bash shell

    ในไฟล์ test.sh ดังตัวอย่างข้างล่างนี้ เมื่อสั่งรัน จะพบว่าพบข้อผิดพลาด ตัวแปร ZONEX จะไม่มีค่า ซึ่งจริง ๆ จะต้องได้คำว่า zone1
    $ cat test.sh

    #!/bin/bash
    
    DHCPSERVER=$(ipconfig /all | grep -i "DHCP Server" | cut -d: -f2 | xargs)
    
    MAC=$(ipconfig /all | grep -A4 -i "^Ethernet Adapter Ethernet" | tail -1 | cut -d\: -f2 | tr - : | xargs)
    
    ZONEX=$(curl -s http://${DHCPSERVER}/dhcpd.txt | grep -i ${MAC} | awk '{print $2}' | cut -d'_' -f1)
    
    echo "DHCP SERVER is ${DHCPSERVER}"
    echo "MAC is ${MAC}"
    echo "Zone is ${ZONEX}"

    สั่งรันดูผลลัพธ์ด้วยคำสั่ง bash test.sh

    $ bash test.sh
    DHCP SERVER is 192.168.6.150
    MAC is 50:7B:9D:30:2E:4B
    Zone is

    ผมก็ตรวจสอบด้วยวิธีการ debug คือ เพิ่ม -x ดังตัวอย่างนี้

    $ bash -x test.sh
     ++ ipconfig /all
     ++ grep -i 'DHCP Server'
     ++ cut -d: -f2
     ++ xargs
     + DHCPSERVER=$'192.168.6.150\r'
     ++ ipconfig /all
     ++ grep -A4 -i '^Ethernet Adapter Ethernet'
     ++ tail -1
     ++ cut -d: -f2
     ++ tr - :
     ++ xargs
     + MAC=$'50:7B:9D:30:2E:4B\r'
     ++ curl -s $'http://192.168.6.150\r/dhcpd.txt'
     ++ grep -i $'50:7B:9D:30:2E:4B\r'
     ++ awk '{print $2}'
     ++ cut -d_ -f1
     + ZONEX=
     ' echo 'DHCP SERVER is 192.168.6.150
     DHCP SERVER is 192.168.6.150
     ' echo 'MAC is 50:7B:9D:30:2E:4B
     MAC is 50:7B:9D:30:2E:4B
     + echo 'Zone is '
     Zone is

    จึงพบว่า ตัวแปร DHCPSERVER และ ตัวแปร MAC จะมี “/r” แถมมาให้ด้วย ซึ่งเป็นส่วนเกินที่ทำให้คำสั่งถัดไปทำงานผิดพลาดทำให้ได้ค่า ZONEX เป็น ว่างเปล่า

     

    วิธีแก้ไข เราต้องใส่ option ” -o igncr ” หลังคำสั่ง bash เพื่อให้ตัด “/r” ออกไป

    สั่งรันดูผลลัพธ์ด้วยคำสั่ง bash -o igncr test.sh

    ผลลัพธ์คราวนี้ถูกต้องแล้ว

    $ bash -o igncr test.sh
    DHCP SERVER is 192.168.6.150
    MAC is 50:7B:9D:30:2E:4B
    Zone is zone1

     

    วิธีแก้อีกวิธีคือ หากไม่ใส่ option ที่ว่านี้ เราก็ต้องไปแก้ไขบรรทัดคำสั่ง เพื่อเติม sed ‘s/\r$//’ ต่อท้าย เป็นการตัด /r ออกไปก่อนนำค่าที่ได้ไปใส่ในตัวแปร DHCPSERVER
    เช่น

    DHCPSERVER=$(ipconfig /all | grep -i "DHCP Server" | cut -d: -f2 | xargs | sed 's/\r$//')

    ซึ่งก็ทำได้เช่นกัน แต่ต้องแก้ไขไฟล์ shell script ซึ่งก็แล้วแต่ชอบวิธีไหน

     

    Reference
    https://stackoverflow.com/users/1010997/user1010997
    https://stackoverflow.com/questions/11616835/r-command-not-found-bashrc-bash-profile
    https://stackoverflow.com/questions/18608380/r-command-not-found

  • วิธี 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

    ก็เรียบร้อย

  • วิธีป้องกันไม่ให้ Notebook Windows 10 เข้าสู่ Hibernate หลังจาก Sleep 180 วินาที

    ปัญหามีอยู่ว่า บางที เราก็อยากจะแค่ ปิดฝา Notebook แล้วให้มัน Sleep แล้วเมื่อเปิดอีกครั้ง ก็สามารถทำงานต่อได้เลย
    แต่ค่า Default คือ ระบบจะเข้าสู่ Sleep เป็นเวลา 180 วินาที (3 นาที) แล้วหลังจากนั้นก็จะ Hibernate ทำให้ เวลากลับมาทำงานใหม่ ต้องรอสักพัก (แบบว่าอยากได้เหมือน Macbook อ่ะ เปิดปั๊บ ทำงานต่อได้เลย)

    วิธีการมีดังนี้

    1. กดปุ่ม Windows แล้วพิมพ์ sleep > เลือก Power & sleep settings
    2. คลิก  Additional power settings
    3. เลือก Change plan settings
    4. Change advanced power settings
    5. ใน Sleep > Hibernate after
      จากเดิม น่าจะเป็น 180 seconds ก็เปลี่ยนให้เป็น Never
      แล้วคลิก OK

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

  • วิธีติดตั้งระบบ 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 ไปให้เหมือนกันทุกเครื่อง

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

  • GCP #01 วิธีการสร้าง Virtual Machine บน Google Cloud Platform

    ขั้นตอน

    1. มี Google Account
    2. ไปที่ https://console.cloud.google.com/start
    3. สำหรับคนที่ใช้ครั้งแรก ควรจะใช้สิทธิ์ Free Trial 300 USD / 12 Month

    4. ในการใช้งาน จะต้องมี Billing Account โดยต้องกรอกข้อมูล บัตร Credit/Debit ซึ่งต้องเป็น VISA/MasterCard เท่านั้น และต้องไม่ใช่ Prepaid ด้วย
      https://cloud.google.com/billing/docs/how-to/payment-methods#add_a_payment_method
    5. เมื่อเสร็จแล้วจะได้ Credit อย่างนี้
    6. ต่อไป สร้าง Virtual Machine กัน
      ไปที่ เมนู > Cloud Launcher

      จะเห็นได้ว่า ตอนนี้ระบบจะสร้าง “My First Project” ไว้ให้ ซึ่งเราสามารถ สร้าง Project ใหม่ก็ได้ แต่ตอนนี้ใช้อย่างนี้ไปก่อน
    7. ต่อไป จะลองสร้าง Ubuntu Server ขึ้นมาใช้งาน ในที่นี้จะสร้าง Ubuntu 14.04
      พิมพ์ Ubuntu ในช่องค้นหา แล้ว เลือก Ubuntu 14.04
    8. จากนั้น คลิก Launch on Compute Engine
    9. ตั้งชื่อตามต้องการ (ถ้าต้องการ)
    10. สามารถเลือก Zone และ Machine Type ได้ตามความเหมาะสม ซึ่งจะมีราคาแตกต่างกัน
    11. ค่าเริ่มต้น Machine Type: n1-standard-1 จะให้ 1 vCPU, 3.75 GB RAM และ 10 GB standard persistent disk หากต้องการ Disk เพิ่ม สามารถคลิก Change เพื่อเพิ่มได้​ (standard persistent disk จะราคาถูกกว่า ssd มาก)
    12. ต่อไป กำหนดเรื่องเของ Firewall ถ้าให้บริการ HTTP/HTTPS ก็คลิกเลือกได้เลย
      ในกรณีที่ต้องการกำหนดค่าอื่นๆ เช่น Disk, Network, SSH Key ให้คลิก “Management, disks, networking, SSH keys”
      เสร็จแล้วกดปุ่ม Create
    13. รอสักครู่ ก็จะได้ VM มาใช้งานแล้ว
    14. ในที่นี้ จะได้ External IP ซึ่งใช้ในการติดต่อจาก Internet มา แต่หากมีการ Restart/Stop IP address นี้ก็จะเปลี่ยนไป (การ Fix มีค่าใช้จ่ายนิดหน่อย) และ การติดต่อไปยัง VM ก็สามารถทำได้ โดยการคลิก SSH ซึ่งสามารถเข้าถึงได้จาก Console นี้ หากต้องการใช้งานจาก Client อื่นก็ทำได้ แต่ต้องกำหนด SSH Key กันนิดหน่อย ซึ่งจะกล่าวในภายหลัง
    15. เพิ่มเติม ในกรณีต้องการเปิด Port เพิ่มที่ไม่ใช่ HTTP/HTTPS ให้คลิกที่ Menu > Network Services > Firewall Rules

      แล้วกำหนดค่าตามต้องการ โดยการ Create Firewall Rule

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

  • วิธีทำ Password-less SSH บน Ubuntu

    ในการทำงานกับ Server Cluster ขนาดใหญ่ ซึ่งประกอบด้วย Ubuntu Server จำนวนมาก หากต้องแก้ไขระบบทั้งหมด โดยการ Secure Shell หรือ SSH เข้าไปทีละเครื่อง “โดยต้องเป็น root ด้วย” จะเป็นงานที่ใช้เวลาอย่างมาก เค้าจึงมีระบบที่เรียกว่า Password-less SSH โดยการแลกเปลี่ยน Public Key แทนที่จะต้อง Login ด้วย Username/Password

    และเนื่องจาก Ubuntu โดย Default ไม่มีการสร้าง root password (มี root แต่ไม่มี password –> ก็เลย Login ไม่ได้ด้วย Password) ซึ่งก็ดีในเรื่องของ Security แต่ทำให้การทำงานยุ่งยากนิดหน่อย

    บทความนี้จะกล่าวถึงวิธีการทำ Password-less SSH รวมไปถึง การที่ไม่ต้องถาม Known Host ในครั้งแรกที่เข้าใช้งานด้วย โดยระบบจะประกอบด้วย server01 เป็นเครื่องที่จะสั่งการเครื่อง server02 … serverNN ในสิทธิ์ root และในระบบนี้ ทุกเครื่องมี user ชื่อ mama ซึ่งมีสิทธิ์ sudo

    ที่เครื่อง server01

    1. ใช้คำสั่งต่อไปนี้ เพื่อสร้าง Public/Private rsa key pair
      ssh-keygen

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

      ซึ่งจะได้ไฟล์มา 2 file อยู่ใน directory: ~/.ssh
      – id_rsa
      – id_rsa.pub

    2. เพื่อไม่ให้การ SSH ไปยังเครื่องใหม่ๆ มีการถาม Known Host แบบนี้ แล้วก็ต้องคอยตอบ yes ทุกเครื่องไป

      ก็ให้สร้างไฟล์ .ssh/config ว่า (วิธีนี้จะมีผลเฉพาะ mama เท่านั้น) หรือสร้างใน /etc/ssh/ssh_config เพื่อให้มีผลทั้งระบบ

      Host *
       StrictHostKeyChecking no
       UserKnownHostsFile=/dev/null
    3. จากนั้น ให้เอาไฟล์ Public Key คือ  .ssh/id_rsa.pub  ไปยังเครื่องปลายทาง ในที่นี้คือ server02 (ใช้วิธี scp ไปยัง mama@server02)
      scp .ssh/id_rsa.pub mama@server02:~

      ในครั้งแรกนี้ ยังต้องใส่ Password ของ mama บนเครื่อง server02 อยู่
      จากนั้น ไปดำเนินการต่อใน server02

    ที่เครื่อง server02

    1. ใน home directory ของ mama บน server02 จะมีไฟล์ id_rsa.pub อยู่ ลองตรวจสอบโดยใช้คำสั่ง
      ls -l /home/mama/id_rsa.pub
    2. เปลี่ยนเป็น root ด้วยคำสั่ง
      sudo su

      แล้ว เข้าไปใน root home directory ด้วยคำสั่ง

      cd
    3. สร้าง directory .ssh และ สร้างไฟล์ .ssh/authorized_keys โดยนำข้อมูลในไฟล์ /home/mama/id_rsa.pub มาต่อท้าย
      mkdir .ssh
      cat /home/mama/id_rsa.pub >> .ssh/authorized_keys
    4. เพื่อความปลอดภัย ตั้งค่า Permission ให้ถูกต้อง
      chmod 700 .ssh
      chmod 600 .ssh/authorized_keys

     

    จากนั้น ลองทดสอบ ssh จาก mama บน server01 ไปยัง root บน server02

    ssh root@server02

    ก็จะไม่มีการถาม Password และ ไม่ถาม Known Host อีก

    หลังจากนี้ สามารถ clone เครื่อง server02 ไปเป็นเครื่องต่างๆได้เลย