Tag: A+

  • Install from scratch – licensing (1)

    ติดตั้งปรับแต่ง Ubuntu 22.04 เพื่อเตรียมสำหรับติดตั้ง WordPress บน apache2 และติดตั้ง WordPress

    Host setting
    1. เครื่อง Server มี 2 ชื่อ A record เป็น server-name1.psu.ac.th Cname เป็น server-name.psu.ac.th
    2. ติดตั้ง Ubuntu 22.04 ข้ามเรื่องการติดตั้ง Ubuntu ไปนะครับ
    3. จะได้ username: group ที่สามารถเรียกใช้ sudo ได้ตั้งแต่เริ่มต้นตามที่ติดตั้ง
    4. sudo apt update && sudo apt dist-upgrade -y && sudo apt autopurge -y เพื่อปรับปรุง software ต่าง ๆ ให้เป็นรุ่นปัจจุบัน
    5. sudo reboot ในกรณีที่มี kernel ใหม่ต้องรีบูตเพื่อเปลี่ยน kernel
    6. sudo apt install mysql-server apache2 php libapache2-mod-php php-mysql php-gd php-imagick php-xml php-curl php-mbstring php-intl php-zip unzip php-apcu
    7. sudo a2enmod ssl rewrite headers
    8. เปลี่ยนเป็น user root ด้วยคำสั่ง sudo -i
    9. cd /etc/ssl/private
    10. cp /home/username/certificate/* . (ต้องได้รับไฟล์ certificate มาเรียบร้อยแล้วนะครับ ขอข้ามไปเรื่องการจัดเตรียมไฟล์ certificate) ในตัวอย่างนี้จะมีไฟล์เดียวคือ star.psu.ac.th-combined.crt
    11. openssl dhparam -out /etc/ssl/private/dhparams_4096.pem
    12. /etc/apache2/sites-available
    13. vi default-ssl.conf
    <IfModule mod_ssl.c>
    SSLUseStapling On
    SSLStaplingCache "shmcb:logs/ssl_stapling(32768)"
    <VirtualHost _default_:443>
    ServerAdmin someone@somedomain.com
    ServerName server-name1.psu.ac.th

    DocumentRoot /var/www/html

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    SSLEngine on

    SSLCertificateFile /etc/ssl/private/star.psu.ac.th-combined.crt

    SSLOpenSSLConfCmd DHParameters "/etc/ssl/private/dhparam.pem"
    SSLOpenSSLConfCmd ECDHParameters brainpoolP512r1
    SSLOpenSSLConfCmd Curves brainpoolP512r1:sect571r1:secp521r1:secp384r1

    #A+
    SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
    SSLHonorCipherOrder on
    SSLCipherSuite ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
    SSLCompression off
    #Header add Strict-Transport-Security "max-age=15768000;includeSubDomains"
    Header always set Strict-Transport-Security "max-age=63072000"

    <FilesMatch "\.(cgi|shtml|phtml|php)$">
    SSLOptions +StdEnvVars
    </FilesMatch>
    <Directory /usr/lib/cgi-bin>
    SSLOptions +StdEnvVars
    </Directory>

    </VirtualHost>
    </IfModule>
    1. vi licensing.conf
    <virtualHost *:80>
        Documentroot /var/www/html/lsc
        ServerName server-name.psu.ac.th
        ErrorLog ${APACHE_LOG_DIR}/licensing_error_log
        CustomLog ${APACHE_LOG_DIR}/licensing_access_log common
        Options -Indexes
        RewriteEngine On
        RewriteRule (.*) https://server-name.psu.ac.th
        RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK) [NC]
        RewriteRule ^.* - [F]
    </virtualhost>
    1. vi licensing-ssl.conf
    <IfModule mod_ssl.c>
    SSLUseStapling On
    SSLStaplingCache "shmcb:logs/ssl_stapling(32768)"
            <VirtualHost *:443>
                    ServerAdmin someone@somedomain.com
                    ServerName server-name.psu.ac.th
                    DocumentRoot /var/www/html/lsc

                    LogLevel info
                    ErrorLog ${APACHE_LOG_DIR}/lsc-ssl-error.log
                    CustomLog ${APACHE_LOG_DIR}/lsc-ssl-access.log combined

                   SSLEngine on

                    SSLOpenSSLConfCmd DHParameters "/etc/ssl/private/dhparams_4096.pem"
                    SSLOpenSSLConfCmd ECDHParameters brainpoolP512r1
    SSLOpenSSLConfCmd Curves brainpoolP512r1:sect571r1:secp521r1:secp384r1

                    SSLCertificateFile /etc/ssl/private/star.psu.ac.th-combined.crt

    #A+
    SSLProtocol all -SSLv2 -SSLv3
    SSLHonorCipherOrder on
    SSLCipherSuite TLSv1.3 TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384
    SSLCipherSuite ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
    SSLCompression off
    Header always set Strict-Transport-Security "max-age=63072000"

                    RewriteEngine on
                    RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK) [NC]
                    RewriteRule ^.* - [F]

                    Options -Indexes

                    <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                    SSLOptions +StdEnvVars
                    </FilesMatch>

                    <Directory /var/www/html/lsc>
                            Options FollowSymLinks
                            AllowOverride All
                    </Directory>

                    <Directory /usr/lib/cgi-bin>
                                    SSLOptions +StdEnvVars
                    </Directory>
            </VirtualHost>
    </IfModule>
    1. a2ensite licensing.conf licensing-ssl.conf default-ssl.conf
    2. a2enmod headers
    3. systemctl restart apache2
    4. mysql
    CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
    create database licensing;
    GRANT ALL PRIVILEGES ON licensing.* TO 'username'@'localhost' WITH GRANT OPTION;
    quit
    1. cd /var/www/html
    2. wget https://wordpress.org/latest.zip
    3. unzip latest.zip
    4. rm latest.zip
    5. mv wordpress lsc
    6. chmod -R username:www-data .
    7. cd lsc
    8. chmod g+w .
    9. logout
    10. จบส่วนการตั้งค่า Host เพื่อเตรียมติดตั้ง WordPress
    11. เปิด browser ไปที่เว็บ http://licensing.psu.ac.th ซึ่งจะถูก redirect ไปที่ https://licensing.psu.ac.th โดยอัตโนมัติ
    12. กรอกข้อมูลสำหรับเชื่อมต่อให้เรียบร้อย และติดตั้ง wordpress ให้เรียบร้อย
    13. กลับมาที่ console หรือ terminal
    14. cd /var/www/html/lsc
    15. chmod og-w .
    16. sudo chown username:www-data .htaccess wp-config.php
    17. chmod og-w .htacess wp-config.php
    18. vi wp-config.php เพิ่มข้อความว่า
    /** Direct install plugin **/
    define('FS_METHOD', 'direct');
    1. cd /var/www/html/lsc/wp-content
    2. mkdir uploads upgrade languages
    3. sudo chown -R username:www-data uploads upgrade languages themes plugins
    4. chmod -R g+w uploads upgrade languages themes plugins เพื่อให้สามารถติดตั้ง plugin theme และ upload ไฟล์ขึ้นเว็บได้ เมื่อติดตั้ง themes และ plugins ได้จนพอใจแล้วสั่งคำสั่งต่อไปนี้ chmod -R g-w upgrades languages themes plugins
    5. จบส่วนติดตั้ง WordPress
  • Byeๆ TLS1.0 TLS1.1

    ใช้ Firefox beta อยู่เลยจะได้รับ Feature อะไรใหม่ๆ อยู่เรื่อยๆ จนเมื่อ beta 73 กว่าๆ เริ่มเข้าเว็บบางเว็บในมหาวิทยาลัยไม่ได้ จะปรากฏหน้าดังนี้

    เว็บสามัญประจำบ้านแห่งหนึ่ง

    อ่านดูถึงได้รู้ว่าออ เค้าจะเลิก TLS1.0 และ TLS1.1 แล้วจริงประกาศไว้นานละว่าจะเลิกปีนี้!! สำหรับ Firefox จะเลิกในรุ่น 74 และ Chrome น่าจะรุ่น 81 ส่วน Microsoft และ Safari ก็จะปิดในครึ่งปีแรก ในปีนี้เช่นกัน

    https://www.techtalkthai.com/old-tls-protocol-has-been-dropped-by-all-major-browsers-in-2020/

    เอ้าเลยเช็คเว็บตัวเองสักหน่อยเริ่มจาก ทดสอบกับเว็บที่เคยได้ A+ ผลเป็นดังรูป

    ม่ายยย

    อัยย่ะละก๊ะ…. เหลือ B เพราะเปิด TLS1.0 และ TLS1.1 เอาไว้ ปิดให้ไว

    วิธีการคือ (สำหรับ Apache2)

    แก้ไขแฟ้ม /etc/apache/mod-enabled/ssl.conf หาข้อความว่า

     SSLProtocol All -SSLv3

    (บางคนอาจจะมี -SSLv2 ด้วยแต่ apache2 ไม่สนับสนุน SSLv2 โดยปริยาย (default) แล้ว) เปลี่ยนข้อความข้างต้นเป็น

    SSLProtocol All -SSLv3 -TLSv1 -TLSv1.1

    บันทึกแล้ว restart apache ให้เรียบร้อย เมื่อไปตรวจใหม่ได้ผลตามภาพ

    เย่ กลับมา A+ แล้ว จบขอให้สนุก

    เกี่ยวข้อง

    https://sysadmin.psu.ac.th/hardening-your-http-response-headers/

    https://sysadmin.psu.ac.th/เปลี่ยน-certificate/

  • 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

    จบขอให้สนุก

  • เปลี่ยน Certificate!?

    เนื่อง Certificate *.psu.ac.th จาก Comodo เดิมซึ่งกลายเป็น Cert. ที่จัดว่า WEAK แล้ว ทางเจ้าหน้าที่เครือข่ายจึงได้ขอ Cert. ใหม่มา ที่ Strong ขึ้น 🙂 ก็ต้องมานั่งเปลี่ยน Cert. ในเครื่องที่ให้บริการขั้นตอนดังนี้

    • Download Cert. ใหม่มาซึ่งต้องติดต่อขอไปที่ Net@dmin โดยผ่านช่องทางของ help.psu.ac.th
    • ไฟล์ที่จะโหลดมาใช้งานมีทั้งหมด 3 ไฟล์ได้แก่ STAR_psu_ac_th.ca-bundle, STAR_psu_ac_th.crt และ STAR_psu_ac_th_key.key เมื่อดาวน์โหลดมาเสร็จแล้วให้เอาไปแทนที่เก่าได้เลย ในตัวอย่างนี้จะเก็บไว้ที่ /etc/ssl/private
    • ทีนี้ มาดู config เก่าของ apache2

    <IfModule mod_ssl.c>
    <VirtualHost *:443>
    ServerName bahamut.psu.ac.th
    ServerAdmin cc-server-admin@group.psu.ac.th
    DocumentRoot "/var/www/html"
    ErrorLog ${APACHE_LOG_DIR}/bahamut.ssl_error_log
    TransferLog ${APACHE_LOG_DIR}/bahamut.ssl_access_log
    LogLevel warn

    SSLEngine on
    SSLCertificateFile /etc/ssl/private/STAR_psu_ac_th.crt
    SSLCertificateKeyFile /etc/ssl/private/STAR_psu_ac_th.key
    SSLCertificateChainFile /etc/ssl/private/STAR_psu_ac_th.ca-bundle

    RewriteEngine On
    RewriteRule /avl https://licensing.psu.ac.th

    <Directory /var/www/licensing>
    AllowOverride All
    Order deny,allow
    Deny from all
    Allow from 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16
    </Directory>
    </VirtualHost>
    </IfModule>

      • จะเห็นว่าไฟล์ชื่อไม่ตรงอยู่ไฟล์หนึ่งคือ STAR_psu_ac_th.key ก็เปลี่ยนชื่อให้ตรง เป็นอันเสร็จ
      • แต่ … เนื่องจากเป็น Cert. ใหม่ เพื่อเพิ่มความแข็งแรง เจ้าหน้าที่เครือข่ายจึงได้กำหนด Passphrase ไว้ด้วย ต้องแก้ไขแฟ้ม /etc/apache2/mods-enabled/ssl.conf ในบรรทัดที่เขียนว่า SSLPassPhraseDialog exec:/usr/share/apache2/ask-for-passphrase ให้แก้ /usr/share/apache2/ask-for-passphrase เป็น /etc/ssl/private/passphrase-script แล้วสร้างแฟ้ม /etc/ssl/private/passphrase-script มีข้อความว่า

    #!/bin/sh
    echo "passphrase ที่ได้รับแจ้งจาก Net@dmin"

      • chmod +x /etc/ssl/private/passphrase-script และทดสอบ script ด้วยว่าผลลัพธ์ที่ได้ตรงกับ passphrase ที่ Net@dmin แจ้งมา
      • restart apache2 ด้วยคำสั่ง sudo service apache2 restart ถ้า passphrase ที่ใส่ไว้ในแฟ้ม passphrase-script ถูกต้องจะ restart สำเร็จ
      • เป็นอันเสร็จ

    สิ่งที่ต้องแก้เพื่อให้ได้ A+ ในการทดสอบกับเว็บ https://www.ssllabs.com/ssltest/analyze.html

    • แก้ไขแฟ้ม /etc/apache2/mods-enabled/ssl.conf โดยแก้ไข/เพิ่ม ข้อความดังต่อไปนี้

    SSLCipherSuite ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:
    RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
    SSLHonorCipherOrder on
    SSLProtocol all -SSLv3 -SSLv2
    SSLCompression off

    • sudo a2enmod headers เพื่อให้ module headers ของ apache2 ทำงาน
    • แก้ไขแฟ้มของไซต์ที่เปิด ssl ไว้ จากตัวอย่างนี้คือ /etc/apache2/sites-enabled/licensing-ssl.conf โดยเพิ่มข้อความว่า
      Header add Strict-Transport-Security "max-age=15768000;includeSubDomains"
    • ตัวอย่าง

    <IfModule mod_ssl.c>
    <VirtualHost *:443>
    ServerName licensing.psu.ac.th
    ServerAdmin cc-server-admin@group.psu.ac.th
    DocumentRoot "/var/www/html/avl"
    ErrorLog ${APACHE_LOG_DIR}/licensing.ssl_error_log
    TransferLog ${APACHE_LOG_DIR}/licensing.ssl_access_log
    LogLevel warn
    SSLEngine on
    Header add Strict-Transport-Security "max-age=15768000;includeSubDomains"
    SSLCertificateFile /etc/ssl/private/STAR_psu_ac_th.crt
    SSLCertificateKeyFile /etc/ssl/private/STAR_psu_ac_th.key
    SSLCertificateChainFile /etc/ssl/private/STAR_psu_ac_th.ca-bundle
    </VirtualHost>
    </IfModule>

    • restart apache2 ด้วยคำสั่ง sudo service apache2 restart
    • ทั้งหมดนี้ทำ บน Ubuntu 14.04.1
    • ผลของการตั้งค่าตามนี้ จะทำให้ผู้ใช้ที่ยังใช้งาน Windows XP และ IE6 ไม่สามารถใช้งานเว็บไซต์ได้
    • จบ ขอให้สนุกครับ

    จุดสังเกตุเมื่อเปลี่ยน certificate แล้ว
    ก่อนเปลี่ยนบน Chrome เบราเซอร์
    https-sharedrive-chrome-before-update-cert

    หลังเปลี่ยนบน Chrome เบราเซอร์
    after

    ที่มา:

    http://www.bauer-power.net/2014/04/how-to-enable-http-strict-transport.html#.VJJ8pXtKW7A

    http://www.hackido.com/2009/10/quick-tip-auto-enter-password-for-your.html