Tag: linux

  • SSH:- no matching key exchange method found

    เดี๋ยวนี้ใน Windows 10 ก็มี ssh ให้ใช้งาน แต่พอใช้กับเซิร์ฟเวอร์รุ่นเก่าๆ ก็เข้าไม่ได้ซะงั้น ไปลอง ssh ฝั่ง Linux (WSL2) ก็ให้ผลเหมือนกันคือ!!!

    Linux
    Windows
    • ถ้าเป็นเมื่อก่อน วิ่งไปหา putty อย่างไว…. แต่ Windows อุตส่าห์ทำมาให้ใช้แล้วทั้งทีจะไม่ใช้ได้ยังไง
    • สิ่งที่ต้องตรวจสอบก่อนคือ man ssh_config สำหรับ Linux ฝั่ง client ว่ารองรับ ciphers และ kexalgorithms แบบไหนรองรับหรือไม่ ส่วนฝั่ง Windows 10 จะอิงตาม OpenBSD manual ซึ่งเหมือนกับ Linux แหละ
    KexAlgorithms
    Ciphers
    • สร้างแฟ้ม .ssh/config โดย
      • Linux ก็จะให้สร้างที่ /home/username/.ssh/
      • Windows ก็อยู่ที่ C:\Users\username\.ssh
    • สำหรับ error ว่า no matching key exchange method found. Their offer: diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1 ให้เพิ่มข้อความต่อไปนี้ลงในแฟ้ม .ssh/config โดย somhost.example.org เป็นชื่อและโดเมนเนมของ server เป้าหมาย
    Host somehost.example.org
    	KexAlgorithms +diffie-hellman-group1-sha1
    • สำหรับ error ว่า no matching cipher found. Their offer: aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,arcfour,aes192-cbc,aes256-cbc,rijndael-cbc@lysator.liu.se ให้เลือกมา 1 cipher ที่ปรากฎใน error มาใส่ในแฟ้ม .ssh/config
    Host somehost.example.org
        Ciphers aes256-cbc
    • บาง server ต้องรวมทั้งสองอย่างเช่น
    Host somehost.example.org
        KexAlgorithms +diffie-hellman-group1-sha1
        Ciphers aes256-cbc
    • ถ้าไม่อยากสร้างแฟ้ม .ssh/config สามารถสั่งผ่าน command line ได้เลยเช่น
    ssh -oKexAlgorithms=+diffie-hellman-group1-sha1 oracle@somehost.example.org

    หรือ ถ้ามี error 2 อย่าง

    ssh -oKexAlgorithms=+diffie-hellman-group1-sha1 -c aes256-cbc oracle@somehost.example.org

    เมื่อสร้างแฟ้ม .ssh/config แล้วลอง ssh เข้าไปใหม่

    Linux
    Windows
  • Script สำหรับ หาวันที่ของไฟล์ล่าสุดใน directory

    Q: ถ้าจะเขียน คำสั่ง หรือ script บน linux เพื่อหา วันที่ของ file ล่าสุดใน folder ของ user จะเขียนยังไงดี มีไอเดียไหมครับ

    A: สมมติ folder ของ user คือ /home/user/Documents

    $ ls -t /home/user/Documents
    

    จะได้ไฟล์เรียงตามลำดับวันที่/เวลาของไฟล์ โดยไฟล์ล่าสุดจะโผล่มาเป็นไฟล์แรก

    ถ้าเราต้องการไฟล์ล่าสุดแค่ไฟล์เดียว ก็สามารถใช้คำสั่ง head -1 เพื่อตัดให้เหลือไฟล์เดียวได้ ก็จะได้คำสั่งเป็น

    $ ls -t /home/user/Documents | head -1
    

    ทีนี้ จากชื่อไฟล์ที่ได้ ถ้าต้องการวันที่ เราก็สามารถใช้คำสั่ง date โดยใช้ option -r สำหรับให้มันแสดงวันที่ของไฟล์ใดๆ ตย. เช่น ต้องการรู้วันที่ ของไฟล์ /etc/passwd ก็ใช้คำสั่ง

    $ date -r /etc/passwd
    

    เอาสองอย่างนี้มาใช้งานร่วมกันได้ตามนี้ครับ

    $ date -r `ls -t /home/user/Documents | head -1`
    

    ทีนี้ ถ้าต้องการให้ format ของวันที่ออกมาตามที่เราต้องการ อย่างเช่น ให้ format เป็น yyyy-mm-dd HH:MM:SS
    ก็เพิ่ม option ให้กับคำสั่ง date ประมาณนี้ “+%Y-%m-%d %H:%M:%S”

    รวมกันทั้งหมดเป็น

    $ date -r `ls -t /home/user/Documents | head -1` "+%Y-%m-%d %H:%M:%S"
    

    Q: ถ้าจะลงลึกไปหลาย level ต้องทำอะไรเพิ่มครับ
    A: หมายถึงต้องการไฟล์ล่าสุด ไฟล์เดียว จากใน directory นั้นและ sub directory ย่อยทั้งหมดใช่ใหมครับ?
    Q: ใช่ครับ
    A: งั้น คงต้องพึ่งพาคำสั่ง find ครับ เพื่อที่ list เอาเฉพาะไฟล์ทั้งหมดออกมาก่อน เพราะคำสั่ง ls ธรรมดามันจะไล่ไปตาม directory ทีละ directory

    เริ่มจาก

    $ find /home/user/Documents
    

    มันจะ list ทุกอย่างทั้งไฟล์ และ ไดเรคตอรี่และในไดเรคตอรี่ย่อยออกมา

    เราต้องการเฉพาะไฟล์ ระบุ option -type f
    เราต้องการให้มันแสดงวันที่ของไฟล์ออกมาด้วย อันนี้ต้องพึ่งคำสั่ง ls โดยใช้ option ของ ls เป็น –full-time

    $ find /home/user/Documents -type f -exec ls --full-time {} \;
    

    โดย {} เป็นการระบุว่าให้ find ใช้คำสั่ง ls –full-time กับ output ของ find ส่วน \; เป็นตัวระบุว่า จบ option ของ คำสั่ง find แค่นี้

    output ที่ได้ จะเป็นไฟล์ “ทั้งหมด” โดยที่ในแต่ละบรรทัดจะมี ข้อมูลอย่างอื่นของไฟล์นั้นออกมาด้วย เช่น permission, owner, group, size ซึ่งเราไม่สนใจ เราตัดเอาข้อมูลที่อยู่ข้างหน้าเหล่านั้นออกไปได้ โดยใช้คำสั่ง cut โดยในกรณีนี้ใช้ space ‘ ‘ เป็นตัวแบ่ง field และ เอาข้อมูลตั้งแต่ column ที่ 6 เป็นต้นไป

    $ find /home/user/Documents -type f -exec ls --full-time {} \; | cut -f6- -d' '
    

    คราวนี้เราก็ได้ไฟล์ทั้งหมดออกมาโดยนำหน้าชื่อไฟล์ด้วยวันที่/เวลา ซึ่งเราสามารถส่งเข้าไป sort โดยให้เรียงจากหลังมาหน้า
    sort -r และ เอา output ทั้งหมดมาตัดเอาเฉพาะบรรทัดแรกโดยใช้ คำสั่ง head -1 เหมือนเดิม

    $ find /home/user/Documents -type f -exec ls --full-time {} \; cut -f6- -d' ' | sort -r | head -1
    

    ซึ่ง output ที่ได้จากคำสั่ง head อันนี้จะมี วัน/เวลาของไฟล์ นำหน้า ตามด้วยชื่อไฟล์ ซึ่งอาจจะเอาไปใช้งานได้เลย
    หรือ ถ้าต้องการเฉพาะชื่อไฟล์ เพื่อจะเอาไปทำอะไรอย่างอื่นต่อ ก็ต้องส่งไปให้คำสั่ง cut เพื่อตัด field ข้อมูลที่อยู่ด้านหน้าออก

    ขอบคุณคำถามจาก Garnet Komane ครับ

    ปล. สุดท้ายแล้วจากคำสั่งข้างบนที่ว่า แทนที่จะพิมพ์เอาบน command line แล้วไปเปลี่ยน path ที่จะให้ค้นหา เขียนมันใหม่เป็น shell script เลยจะเรียกใช้งานได้ง่ายกว่า ซึ่งจะได้ shell script ประมาณนี้ครับ

    #!/bin/bash
    
    LOCATION="$1"
    
    [ -z "$LOCATION" ] && { echo "Usage: $0 LOCATION"; exit; }
    
    FILE=$(
    find $LOCATION -type f -exec ls --full-time {} \;  |\
    cut -f6- -d' '                                     |\
    sort -r                                            |\
    head -1                                            |\
    cut -f4- -d' '
    )
    
    STAMP=$(date -r "$FILE" "+%Y-%m-%d %H:%M:%S")
    
    echo "$STAMP $FILE"
    

    หรือ ดาวน์โหลด script ได้จาก ที่นี่

  • มาใช้งาน letsencrypt กันเถอะ

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

    เอาล่ะ ถ้าจะว่ากันตามตรงแล้ว งานที่ต้องเพิ่มขึ้นมาสำหรับการที่จะทำให้ เว็บเซิร์ฟเวอร์สามารถใช้ https ได้ ถ้าทำให้มันใช้ http ได้แล้ว โดยทั่วไปก็ไม่ได้ยุ่งยากมากขึ้นเท่าไหร่ ขึ้นอยู่กับระบบปฏิบัติการที่เลือกใช้ ขึ้นอยู่กับตัวเว็บเซิร์ฟเวอร์ที่เลือกใช้ ขึ้นอยู่กับเซอร์ติฟิเคท (certificate) ที่ใช้ด้วย แต่ว่ากันโดยทั่วไป ระบบที่มีผู้ใช้งานเยอะ ตัวติดตั้งซอฟต์แวร์ของระบบปฏิบัติการ ก็มักจะจัดเตรียมวิธีการตรงนี้ไว้ให้แล้ว เหลือแค่การเรียกใช้งานเพิ่มแค่ไม่กี่คำสั่ง ก็สามารถใช้งานได้เลย
    ขอยกตัวอย่างเลยก็แล้วกัน สำหรับระบบปฏิบัติการเดเบียนลินุกซ์ (Debian Linux) รุ่น เจสซี่ (jessie) และ ใช้งาน apache เวอร์ชัน 2 เป็นเว็บเซิร์ฟเวอร์

    วิธีการติดตั้งตัวเว็บเซิร์ฟเวอร์ก็คือ

    $ sudo apt-get install apache2

    เพียงเท่านี้ เราก็สามารถใช้งานเว็บเซิร์ฟเวอร์ สำหรับให้บริการแบบสแตติกไฟล์ และสามารถใช้สคริปต์แบบ CGI ได้แล้ว
    แล้วถ้าต้องการให้มันรองรับแบบไดนามิก โดยใช้ภาษา php ได้ด้วยล่ะ? ก็ไม่ได้ยากอะไร ก็เพียงเพิ่มโมดูลของ php เข้าไป โดยใช้คำสั่ง

    $ sudo apt-get install libapache2-mod-php5

    ตัวโปรแกรมสำหรับติดตั้ง (apt-get) ก็จะตรวจสอบ แพกเกจที่จำเป็นต้องใช้และยังไม่ได้ติิดตั้งเอาไว้ เช่น php5 แล้วก็ติดตั้งแพกเกจเหล่านั้นให้ด้วยเลยโดยอัตโนมัติ หลังจากนั้นเราก็สามารถสร้าง index.php ในไดเรคตอรี่ /var/www/html/ แล้วก็เขียนโปรแกรมภาษา php ให้บริการบนเว็บได้เลย

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

    $ sudo a2enmod ssl
    $ sudo a2ensite default-ssl

    และสั่ง restart ตัวเว็บเซิร์ฟเวอร์โดยใช้คำสั่ง

    $ sudo systemctl restart apache2

    เท่านี้ ก็จะสามารถใช้งาน https โปรโตคอลเพิ่มเติมขึ้นมาจากเดิม ที่ใช้งานได้เฉพาะ http โปรโตคอล

    แต่ … มันไม่ได้จบง่ายๆแค่นั้นน่ะสิ ถึงแม้ว่าการให้บริการจะโดยใช้ https โปรโตคอลจะมีการเข้ารหัสข้อมูลที่มีการรับส่งระหว่างตัวเบราเซอร์กับตัวเซิร์ฟเวอร์ แต่ เซอร์ติฟิเคท (certificate) สำหรับกุญแจที่ใช้ในการเข้ารหัสข้อมูลนั้น จะเป็นแบบที่เรียกว่า self-signed certificate ซึ่งตัวเบราเซอร์โดยทั่วไปจะ ไม่เชื่อถือ (un trusted) ว่าเป็นเซอร์ติฟิเคท ที่ออกให้กับเว็บไซท์ ที่ระบุว่าเป็นโดเมนนั้นๆจริง

    ในการใช้งานเว็บไซท์ที่ตัวกุญแจเข้ารหัสใช้ self-signed certificate ตัวเบราเซอร์ก็จะ “เตือน”, และสร้างความยุ่งยากในการใช้งานให้กับ ผู้ใช้ที่ต้องการเข้าใช้งานเว็บไซท์นั้นๆ

    นั่นอาจจะไม่ได้เป็นปัญหาใหญ่อะไร สำหรับเว็บไซท์ที่สร้างขึ้นมาเพื่อให้บริการภายในหน่วยงานกันเอง ซึ่งผู้ใช้งานในหน่วยงาน อาจจะใช้วิธีการอื่นๆ เช่นเดินไปถาม, โทรศัพท์ไปถาม, ส่ง e-mail ไปถาม … หรือในกรณีที่เป็นจริงส่วนใหญ่ ก็คือ ไม่ต้องถาม ก็แค่กดปุ่มยอมรับความเสี่ยง ให้ตัวเบราเซอร์จำเซอร์ติฟิเคทนั้นไว้ แล้วก็ใช้งานไปแค่นั้นเอง

    แต่นั่น อาจจะเป็นปัญหาในเรื่องของความน่าเชื่อถือ ถ้าเว็บไซท์ดังกล่าว เปิดให้บริการให้กับบุคคลภายนอกหน่วยงานด้วย

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

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

    ทางแก้ล่ะ ก็ไม่ได้เป็นเรื่องยุ่งยาก “มาก” แต่อย่างใด ก็แค่หาเซอร์ติฟิเคทที่ยอมรับโดยตัวเบราเซอร์มาใช้งานแค่นั้นเอง

    อย่างไร? … ก็ … จ่ายตังค์ ซื้อ … 🙂

    นั่นอาจจะทำให้เป็นเรื่องยุ่งยาก “มาก” ขึ้นมาทันทีสำหรับ หลายๆหน่วยงาน (ฮา)

    สำหรับหน่วยงานภายในมหาวิทยาลัยสงขลานครินทร์ อาจจะมีอีกหนึ่งทางเลือก นั่นคือว่า ถ้าเว็บไซท์ที่ผู้ดูแล มีโดเมนเป็น .psu.ac.th และไม่ได้เป็นโดเมนย่อยของ .psu.ac.th อีกที ตัวอย่างเช่น เว็บไซท์ www.psu.ac.th ถือว่าอยู่ในโดเมน .psu.ac.th แต่เว็บไซท์ www.coe.psu.ac.th จะอยู่ในโดเมนย่อย .coe ของ โดเมน .psu.ac.th อีกทีนึง

    สำหรับเว็บไซท์ ที่อยู่ภายใต้โดเมน .psu.ac.th และไม่ได้อยู่ในโดเมนย่อย ก็จะสามารถติดต่อทาง ผู้ดูแลระบบเครือข่ายของศูนย์คอมพิวเตอร์ เพื่อขอใช้เซอร์ติฟิเคทสำหรับเว็บไซท์นั้นได้ เนื่องจากศูนย์คอมพิวเตอร์ จะซื้อเซอร์ติฟิเคทแบบที่เรียกว่า wildcard สำหรับโดเมน .psu.ac.th ซึ่งจะสามารถออกใบเซอร์ติฟิเคทสำหรับเว็บไซท์ ที่ไม่ได้อยู่ภายใต้โดเมนย่อยของ .psu.ac.th ให้ได้

    แล้วสำหรับผู้ดูแลของเว็บไซท์ ที่ไปขอเซอร์ติฟิเคทของศูนย์คอมพิวเตอร์มาใช้งานไม่ได้ล่ะ ไม่ว่าจะสาเหตุเนื่องจาก โดเมนที่ใช้อยู่เป็นโดเมนย่อยของ .psu.ac.th อีกที หรือ ใช้โดเมนอื่นอยู่ที่ไม่ใช่ .psu.ac.th ทำอย่างไรดี?

    ก็ … จ่ายตังค์ซื้อสิ … เฮ่ย ไม่ใช่!
    งั้น … ใช้ self-signed certificate ต่อ … เฮ้ย! … แล้วจะเขียนมาหาพระแสงของ้าว อะไร …

    โอเค อีกทางเลือกนึง ก็ตามที่เขียนไว้ในหัวข้อบทความน่ะแหละครับ มันมีทางเลือกที่เราจะใช้เซอร์ติฟิเคทที่รองรับโดยเบราเซอร์ทั่วไป และ ไม่ต้องจ่ายตังค์ นั่นคือใช้บริการของ letsencrypt ซึ่ง … ยังมีเรื่องที่ต้องพูดถึงกันอีกยาวพอสมควร และ โดยความขึ้เกียจของผู้เขียน ถ้าจะรอให้เขียนเสร็จเป็นบทความเดียวแล้วค่อยตีพิมพ์เลย ก็เดาได้ว่า คงจะไม่เสร็จแหละ สำหรับใครๆที่สนใจจะอ่านก่อนว่าขั้นตอนที่จะเอามาใช้งานทำได้อย่างไรบ้าง ก็เริ่มต้นจาก ที่นี่ https://letsencrypt.org/getting-started/ ได้ครับ

    ผมขอจบบทความนี้ ไว้แค่นี้ก่อน แล้วค่อยมาต่อ ภาค 2 (หวังว่า) ในเวลาอีกไม่นาน 🙂

  • psuautosigned for windows?

    เช้าของวันที่ 14 ธันวาคม 2558 คุณ คณกรณ์ post ถามไว้ในกลุ่ม PSU Sysadmin บน facebook ว่า

    เรียนสอบถาม (จะได้ไม่ต้องทำซ้ำ) บน windows 10 ใครมี script ให้ทำการ auto authentication บ้างไม๊ครับ บางเครื่องต้องเปิดค้างไว้ข้ามวัน จะได้เข้ามาดูทางไกลได้ น่ะครับ ตอนนี้ใช้ team viewer ก็ยังติดเรื่องนี้อยู่ดี

    ขอบคุณครับ

    มีคุณ Thanongdat Noosrikaew กับคุณ ป้อม เภสัชฯ (Siripong Siriwan)  มาเสนอทางเลือกในการแก้ปัญหา แต่ดูเหมือนจะไม่ตรงกับที่เจ้าของคำถามต้องการสักเท่าไหร่
    ผมอ่านแล้วก็ตั้งคำถามกับตัวเองว่า แล้วผมจะต้องตอบคำถามนี้ ผมมีทางเลือกอะไรบ้าง?
    คำตอบที่มีให้กับตัวเองก็คือ หากินกับของเก่าที่เคยทำเอาไว้แล้ว … คือ… มีคำสั่งคำสอน ที่ถ่ายทอดมาตั้งแต่ยุคโบราณกาลครั้งเก่าโพ้น ในชนเผ่า sysadmin ว่า sysadmin ที่ดีจะเป็นคนขี้เกียจ อะไรที่ได้ทำไว้แล้ว และยังเอามาใช้ได้ ก็ไม่ควรที่ทำขึ้นมาใหม่ … อันนั้น เป็นเรื่องที่ผมได้ยินมานะครับ จะเชื่อถือได้แค่ใหนก็แล้วแต่ท่านทั้งหลายจะได้พิจารณากัน

    ผมก็เลยพยายามทำตัวเป็น admin ขี้เกียจ .. เฮ่ย ไม่ใช่ เป็น admin ที่ดี ซึ่ง … ก็คือ ขี้เกียจน่ะแหละ -_-”
    มีอะไรที่เคยทำเอาไว้แล้ว ก็เอามา recycle ขายใหม่ ถ้าขายได้ … เราต้องช่วยกันอนุรักษ์สิ่งแวดล้อม … เกี่ยวกันใหม?

    คำตอบแรกที่ผมคิดได้ก็คือ

    ถ้า ยังหา solution บน Windows โดยตรงไม่ได้ และ ไม่รังเกียจที่จะติดตั้ง cygwin เพิ่มเข้าไปบนตัว windows ผมคิดว่า psuautosigned ที่เขียนไว้สำหรับ Linux ก็น่าจะพอดัดแปลงให้ใช้งานบน Windows ได้ครับ ฟังก์ชัน หลักๆ ต้องการแค่ shell ซึ่งอาจจะเป็น cmd.exe ของ windows เองก็ได้ กับโปรแกรมที่ชื่อว่า curl ครับ โปรแกรมอย่างอื่นเป็นแค่ตัวประกอบ แต่ทั้งหมด รวมทั้ง shell และ curl มีอยู่ใน cygwin อยู่แล้ว

    ผมไม่มีเครื่องที่ใช้งาน windows 10 ให้ลอง ถ้าจะช่วยทดสอบให้ ผมก็ยินดีที่จะแก้ script ให้รองรับ windows 10 ด้วยครับ

    โปรแกรม psuautosigned ที่ผมอ้างถึงคือ ตัวนี้ ซึ่งเคยเขียนถึงเอาไว้แล้ว ที่นี่ , ที่นี่, ที่นี่, และ ที่นี่ … ซึ่ง มาคิดดูอีกที เยอะแฮะ กับ script ตัวเดียวทำไมจะต้องเขียนบันทึกเกี่ยวกับมันหลายบันทึกด้วยก็ไม่รู้ จะว่าไป บันทึกนี้เอง ก็นับเป็นหนึ่งในชุดนี้ด้วยแหละ

    ส่วน cygwin ก็คือ https://www.cygwin.com/ เป็น tools สำหรับ Windows ให้สามารถใช้งานได้เหมือน(หรือใกล้เคียงมากๆ) กับการใช้ชีวิตอยู่บน Unix Command Line … ซึ่งเนื่องจาก script psuautosigned พัฒนาและใช้งานบน Linux ถ้าจะให้เอาไปใช้งานบนเครื่อง Windows 10 ได้ตามความต้องการของคุณหนุ่ม ก็ต้องการเครื่องมือเหล่านี้ มาช่วยด้วย

    นั่นหมายถึงว่า ถ้าจะเอาไปใช้ จะต้องติดตั้งโปรแกรมเพิ่ม และ ถึงแม้ว่า cygwin จะสร้างสภาพแวดล้อมแบบ Unix บนเครื่อง Windows เจ้าตัว script ที่ผมเขียน และ ทดสอบบน Debian Linux ก็จะยังไม่สามารถเอาไปใช้งานได้ทันที มันจะต้องการแก้ไขบางส่วนแน่ ๆ

    พอนั่งทบทวนไปสักพักว่ามีส่วนใหนที่จะต้องแก้ไขบ้าง จากความจำที่ค่อนข้างลางเลือนในส่วนที่เกี่ยวข้องกับ cygwin เพราะไม่ได้ใช้ Windows นานมาก และ cygwin ก็ไม่ได้แต่นานมากเช่นเดียวกัน และ มีความขี้เกียจ เอ๊ย! ผิด! มีคุณลักษณะที่ดีของ sysadmin เป็นตัวกระตุ้น … ผมก็ได้ idea ใหม่แจ่มแจ๋วขึ้นมา

    นี่คือสิ่งที่ผม post reply ตามไปจาก reply ที่แล้ว

     

    หรือ อีกทางนึง ถ้ามี resource บนเครื่อง windows 10 เหลือเฟือ และไม่รังเกียจที่จะเสีย เนื้อที่ harddisk สัก 512MB และ memory สัก 32MB ก็ติดตั้ง virtualbox (เอ่อ เนื้อที่ harddisk กับ ram ข้างต้นไม่รวมของ virtualbox) และติดตั้ง linux ตัวใหนก็ได้แบบ minimal (แต่แนะนำ debian) ลงไปต้องการแค่ bash shell, basic linux utils และ ติดตั้งโปรแกรม curl เพิ่ม กำหนดให้ interface ของ VM เป็นแบบ NAT ก็จะสามารถใช้โปรแกรม psuautosigned สำหรับการ authen จากตัว VM ซึ่งเมื่อใช้งานเป็นแบบ NAT ก็จะ authen ให้กับ host ที่เป็น windows 10 ด้วยเลย วิธีการนี้ ก็ไม่จำเป็นที่จะต้องดัดแปลง psuautosigned ใดๆทั้งสิ้นครับ

    และ

    ถ้า เลือกใช้วิธีการติดตั้ง debian บน VM ตอนติดตั้งจะต้องให้ memory ของเครื่องซํก 256 หรือ 512 MB ก่อนนะครับ เพราะตอนตั้ง มันจะใช้ RAM ค่อนข้างเยอะ ถ้ามี memory น้อยเกินไปจะติดตั้งไม่สำเร็จ แต่ พอติดตั้งเสร็จแล้ว ก็ค่อยลด memory ให้เหลือเท่าที่จำเป็นต้องใช้ ผมไม่แน่ใจว่าตอนนี้มันต้องการเท่าไหร่ แต่ถ้าไม่มีอะไรอย่างอื่นที่ไม่จำเป็นต้องใช้ run อยู่เลย ผมคิดว่า 32MB ก็เหลือเฟือครับ เครื่องของผมที่ run linux สมัยแรกๆ ใช้ RAM แค่ 8MB ก็ run ได้โดยไม่แตะ swap ในตอน boot และใช้แค่ console ไม่ได้ run X-windows

    ข้อดีที่สุดของวิธีการนี้ ถ้าคุณหนุ่มจะเอาไปใช้ก็คือ จะต้องไป download และ ติดตั้งโปรแกรม virtualbox จาก ที่นี่ แล้วก็สร้าง Virtual Machine ที่เป็น Linux ขึ้นมา ซึ่งถ้า Linux ที่เป็น Debian ตามที่ผมแนะนำ ตัว script ก็สามารถที่จะทำงานได้เลย โดยไม่ต้องแก้ไขใดๆทั้งสิ้น ปล่อยภาระของการแก้ปัญหาเรื่องนี้ ให้เป็นการติดตั้ง Linux บน Virtual Box ของคุณหนุ่มไป ส่วนผม อยู่เฉยๆ ทำตัวขี้เกี… เอ๊ย ทำตัวเป็น sysadmin ที่ดี ที่มีทั้งหลังที่ยาว และ ขนตามตัวยาวเฟื้อยต่อไป 😉

    อันที่จริง วิธีการนี้ จะเป็นการใช้ psuautosigned script สำหรับการ signed in หรือ login สำหรับตัวเครื่อง Virtual Machine ที่เป็น Linux แต่ trick สำหรับกรณีนี้ก็คือว่า ถ้ากำหนดให้ชนิดของ Network Interface ของ Virtual Box เป็นแบบ NAT ตัว Host OS ของเครื่อง ซึ่งในกรณีนี้ก็คือ Windows 10 จะส่งข้อมูลของการติดต่อ ของ Linux VM ไปยังเครื่องอื่นๆด้วย IP Address ของเครื่อง Windows 10 เอง เมื่อ Linux VM ไป authentication กับเครื่อง Palo Alto ก็จะใช้ address ของ Windows 10 ก็เลยเป็นการ authentication ให้กับตัว Windows 10 ซึ่งเป็น host computer ไปด้วยกันเลย ทำให้ไม่จำเป็นจะต้องใช้การ authen ใดๆจาก Windows 10 เอง

    และ ถ้าจะว่าไป ในกรณีนี้ ไม่จำเป็นที่จะต้องใช้ VirtualBox ก็ได้ อาจจะใช้ VMWare หรือ Virtualization อื่นๆที่สามารถใช้งานได้บนเครื่อง Windows ก็สามารถืำได้แบบเดียวกัน ข้อสำคัญก็คือ ชนิดของเครือข่ายที่จะให้ Linux VM ติดต่อออกสู่ภายนอก จะต้องเป็นแบบ NAT ก็ทำได้แบบเดียวกัน เพียงแต่ผมไม่เคยใช้งาน Virtualization Technology อื่นๆ ก็เลยไม่แนะนำครับ เพราะคงตอบคำถามเกี่ยวกับวิธีการ setup network ให้กับ virtual machine ไม่ได้

    โดยหลักๆ วิธีการแก้ปัญหา ของผมก็คงมีแค่นี้แหละ

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

    #!/bin/bash

    USER=”YOUR-PASSPORT-ID”
    PASSWD=”YOUR-PASSPORT-PASSWORD”
    COOKIES=”cookies.txt”

    /usr/bin/curl \
    –connect-timeout 10 \
    –max-time 10 \
    -s -k \
    -L ‘https://cp-ufw.psu.ac.th:6082/php/uid.php?vsys=1‘ \
    -c $COOKIES \
    -b $COOKIES \
    -d user=$USER \
    –data-urlencode “passwd=$PASSWD” \
    -d ok=Login

    และนี่คือคำอธิบายที่ผม post ตามไป

    อันนี้ ไม่มีการตรวจสอบอะไรทั้งสิ้น และมีการเรียกใช้งานเพียงครั้งเดียว ซึ่งมันก็จะ timeout ไปตามช่วงเวลา ถ้าจะให้มัน authen ได้ตลอด ก็อาจจะเรียกใช้จาก crontab ทุกๆช่วงเวลาก่อนที่มันจะ timeout ไป ผมไม่แน่ใจว่าค่า timeout ล่าสุดจะเป็นเท่าไหร่ แต่ที่ผมใช้อยู่ผมให้มัน loop ไป check login ว่า authenticate ไปแล้วหรือเปล่า ทุกๆ 10 นาที URL ซึ่งใช้ตรวจสอบการ login จะต่างไปจากนี้ แต่ผมคิดว่า ถ้าสั่งให้ authen ใหม่ ผลก็น่าจะไม่ต่างกัน script ข้างบน ถ้าจะให้ใช้งานได้จาก windows 10 ก็ คงเปลี่ยนบรรทัดแรกให้ไป อ้างอิง cmd.exe หรือ เปลี่ยนเป็นชื่อเป็น .bat และ path ที่ใช้อ้างอิง /usr/bni/curl ก็เปลี่ยนไปใช้ของ Windows

    ส่วน parameter ของ curl ทั้งหมด ก็ลบเครื่องหมาย backslash ของทุกบรรทัดออก ให้เหลือคำสั่งแค่บรรทัดเดียวก็น่าจะใช้งานได้แล้วครับ

    อ้อ เปลี่ยน USER กับ PASSWD แล้วก็ COOKIES (ชื่อไฟล์สำหรับเก็บ cookeis) ให้เป็นค่าที่เหมาะสมด้วยครับ

    เนื่องจากโปรแกรมยังไม่ได้ทดสอบกับเครื่องที่เป็น Windows 10 จริงๆ ก็เลย ให้แนะนำตามในคำอธิบาย แต่ในแง่ของการติดตั้งโปรแกรมเพิ่ม ตัว script ตัวนี้ น่าจะเป็นตัวที่มีขนาดเล็ที่สุดแล้วครับ code สามารถ download ได้ ที่นี่

  • การตรวจสอบสถานะการใช้งาน IPv6 สำหรับ Client และ Server

    “เราจะตรวจสอบได้อย่างไรว่าเครื่องสามารถใช้งาน IPv6 ได้แล้ว และเราจะรู้ได้อย่างไรว่า Server ก็ให้บริการ IPv6”

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

    • สำหรับวิธีตรวจสอบ Client ให้เข้า Web Site http://ipv6-test.com จากนั้นสังเกตุดังรูป

    2015-12-08_110837

    Native IPv6 หมายความว่าสามารถสื่อสารจากต้นทาง กลางทาง ปลายทางด้วย IPv6 ทั้งหมด โดยไม่ต้องผ่าน IPv4 เลย (ต้นทาง ปลายทางไม่จำเป็นต้องมี IPv4 เลยก็ได้)

    2015-12-08_110901

    Fallback คือการที่ Web Browser ที่ใช้อยู่สามารถกลับมาใช้ IPv4 ในการเชื่อมต่อได้ในกรณีที่ Web ปลายทางไม่มี IPv6

    2015-12-08_110920

    ค่าดังกล่าวเป็นการบอกว่าสามารถเชื่อมต่อ DNS ด้วย IPv4 หรือ IPv6 และสามารถ resolve  IPv4 หรือ IPv6 ได้

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

    2015-12-08_133827

    ยกตัวอย่างในกรณีที่ยังไม่จด DNS จะขึ้นดังรูปเลย แต่ถ้าจดแล้วแต่ยังไม่ได้ออน Service IPv6 บน Web Server ก็จะขึ้น x ในส่วนที่ยังไม่สามารถเข้าถึงได้

    2015-12-08_133642

    ในกรณีที่ผ่านทุกอย่างก็จะปรากฎดังรูป
    • จะเห็นว่าการตรวจสอบไม่ยาก โดยเฉพาะเดี๋ยวนี้บาง Web จะมีตัวช่วยบอกว่าผู้ใช้กำลังเชื่อมต่อด้วยอะไรเข้ามาดังตัวอย่าง

    2015-12-08_135730

  • เทคนิคการเพิ่ม user ในระบบ linux คราวละมากๆ

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

    shell script นี้มีดังนี้
    1. makeusername.sh เพื่อสร้างไฟล์รายชื่อตามจำนวนที่ต้องการ เลขเริ่มต้น min และสิ้นสุด max
    2. bulkuseradd.sh เพื่อเพิ่ม user และ password แบบ random และสร้างไฟล์ .csv เก็บ user:password นำไปพิมพ์แจก user ได้
    3. bulkuserdel.sh เพื่อลบ user

    ผมเขียนไว้ในเว็บไซต์ opensource.cc.psu.ac.th หัวข้อ เทคนิค+scripts (
    http://opensource.cc.psu.ac.th/เทคนิคการเพิ่ม_user_ในระบบ_linux_คราวละมากๆ)

  • วิธีการติดตั้ง CA Certificate PSU Passport บน Ubuntu Server

    ทดสอบบน : Ubuntu 14.04

    ขั้นตอนการติดตั้ง Certificate บนเครื่อง Ubuntu Server

    1. เข้า Web Site : https://ca.psu.ac.th ทำการ Login ด้วย Account PSU Passport

    2. ให้เลือกหัวข้อ Download a CA Certificate….. ดังรูป1

    3. ในหน้าต่าง Download a CA Certificate ให้ทำการ Download ไฟล์ดังรูป (เลือกดี ๆ นะครับ เลือก Base 64 ไม่ใช่ DER)2015-01-27_153731

    4. เมื่อโหลดแล้วจะได้ไฟล์ดังรูป3

    5. เมื่อดูข้อความในไฟล์จะได้ประมาณรูปนี้ (ที่เป็นแถบขาว คือ Sensor ครับ :P)2015-01-27_153759

    6. ทำการ copy ข้อความในไฟล์ certificate ไปยัง folder เก็บ certificate ดังนี้

    sudo sh -c 'cat certnew.cer > /etc/ssl/certs/psucer.crt'
    

    7. ทำการแก้ไขไฟล์ /etc/ldap/ldap.conf ดังนี้

    #TLS_CACERT /etc/ssl/certs/ca-certificates.crt
    TLS_CACERT /etc/ssl/certs/psucer.crt
    

    *หมายเหตุ จริง ๆ แล้วมีอีกวิธีคือข้ามการ Check Certificate ไปเลย โดยจะเพิ่มข้อความ TLS_REQCERT never ท้ายไฟล์ /etc/ldap/ldap.conf ก็ได้ดังนี้

    sudo sh -c 'echo "TLS_REQCERT never" >> /etc/ldap/ldap.conf'

    แต่วิธีนี้อาจจะไม่ปลอดภัยครับ เพราะอาจเจอ phising site ที่ปลอม server เข้ามาสวมรอยได้ครับ เพราะไม่ได้มีการ verify certificate ว่า server เป็นตัวจริง

  • เรียนรู้ด้วยตนเอง Linux System Administration I และ II

    linux-tutorial

    ขอแนะนำแหล่งความรู้สำหรับทุกท่านที่ต้องการเรียนรู้ Linux ซึ่งผมและอาจารย์ฉัตรชัย จันทร์พริ้ม ได้รวบรวมเขียนไว้และจัดอบรมไปแล้ว 1 รุ่น ใน Workshop I สอนด้วย Ubuntu 12.04 และใน Workshop II Ubuntu 14.04 ออกมาพอทันให้ได้ใช้กันครับ

    Workshop Linux System Administration I
    (http://opensource.cc.psu.ac.th/WS-LSA1)
    เนื้อหา
    เป็นการให้ความรู้ในการทำหน้าที่ system administrator เพื่อดูแลระบบปฏิบัติการ Linux โดยจะใช้ Ubuntu ซึ่งปัจจุบันมีผู้ใช้งานกันมาก โดยจัดเนื้อหาเป็น 2 ตอน ในตอนแรกนี้จะเป็นความรู้จำเป็นที่จะเป็นพื้นฐานไปสู่การเป็นมืออาชีพที่สามารถดูแล server ด้วยตนเองต่อไปได้อย่างมั่นใจ โดยใช้เวลา 2 วัน

    LSA-I

    Workshop Linux System Administration II
    (http://opensource.cc.psu.ac.th/WS-LSA2)
    เนื้อหา
    เป็นการให้ความรู้ในการทำหน้าที่ system administrator เพื่อดูแลระบบปฏิบัติการ Linux โดยจะใช้ Ubuntu ในตอนที่ 2 นี้จะเป็นความรู้ในการติดตั้ง server การดูแล server การป้องกันและตรวจสอบความปลอดภัย server และ web application ที่ติดตั้งในเครื่อง โดยใช้เวลา 2 วัน

    LSA-II

    วิธีการเรียนใน workshop ผู้เรียนจะได้ฝึกปฏิบัติด้วย Ubuntu server ที่ติดตั้งใน Oracle VM Virtualbox ซึ่งเป็นโปรแกรมในการจำลองเครื่องเสมือนจริง

    สำหรับเพื่อนๆที่ไม่ได้เข้า workshop ลองเข้าไปอ่านกันได้นะครับ และเพื่อนๆที่เข้า workshop ก็ทบทวนได้เมื่อต้องการเรียนรู้ด้วยตนเองเกี่ยวกับ Linux System Administration I และ II

  • Shorewall Blacklist

    • ใช้ได้กับ Shorewall 4.4.12 ขึ้นมา
    • แก้แฟ้ม /etc/shorewall/interfaces โดยเพิ่มความว่า blacklist ต่อท้ายของเดิม เป็น

    net eth0 detect tcpflags,logmartians,nosmurfs,blacklist

    • เพิ่มลิสต์ที่ต้องการบล็อคลงไปในแฟ้ม /etc/shorewall/blacklist
    • ตัวอย่างค้นหาเครื่องที่ต้องการบล็อคการเข้าถึงพอร์ต 80 และ 443

    grep -R phpmyadmin/scripts/setup.php /var/log/apache2|cut -d: -f2|awk '{ print $1 }'|sort -t'.' -n -k1,1 -k2,2 -k3,3 -k4,4|uniq

    • จากตัวอย่างในเครื่องเราไม่มี phpmyadmin แต่มีคนพยายามเข้าถึงตัวติดตั้ง phpmyadmin ฉะนั้นบล็อค IP พวกนี้ไว้ก่อน (บล็อคถาวรกรั่กๆ…)
    • เอา IP จากข้อที่แล้วมาใส่ในแฟ้ม /etc/shorewall/blacklist รูปแบบ

    #ADDRESS/SUBNET PROTOCOL PORT

    • เช่น

    93.115.210.90 tcp 80,443
    93.174.93.153 tcp 80,443
    94.23.58.185 tcp 80,443
    94.102.51.155 tcp 80,443
    103.247.21.60 tcp 80,443
    107.6.88.155 tcp 80,443
    109.163.232.218 tcp 80,443
    110.170.34.220 tcp 80,443
    111.90.168.5 tcp 80,443
    115.84.101.78 tcp 80,443
    115.238.101.45 tcp 80,443
    115.239.253.11 tcp 80,443
    116.93.105.112 tcp 80,443
    117.35.96.146 tcp 80,443
    118.140.120.26 tcp 80,443
    119.52.254.20 tcp 80,443
    119.57.51.154 tcp 80,443
    122.49.0.220 tcp 80,443
    123.125.148.79 tcp 80,443
    125.210.204.242 tcp 80,443

    • restart shorewall

    sudo shorewall restart

    • IP ที่ถูกแบล็คลิสต์ อาจหายไปจากสารบบ ทำให้ shorewall start ไม่ขึ้น ต้องลบไอพีดังกล่าวออกไปก่อนจึงจะ start ได้

    Compiling /etc/shorewall/blacklist...
    ERROR: Unknown Host (93.x4.93.153) : /etc/shorewall/blacklist (line 23)

    • จบ… ขอให้สนุกครับ

    ที่มา http://shorewall.net/manpages/shorewall-blacklist.html

    • คีย์เวิร์ดสำหรับแบน
    • /CFIDE/administrator/enter.cfm
    • /MyAdmin/scripts/setup.php
    • /myadmin/scripts/setup.php
    • /phpMyAdmin/scripts/setup.php
    • /pma/scripts/setup.php
    • /w00tw00t.at.blackhats.romanian.anti-sec:)
    • เป็นต้น