Security
น้องๆ เคยสงสัยไหมว่าทำไมเวลาเข้าเว็บธนาคาร หรือเว็บที่เราต้องใส่ข้อมูลส่วนตัวถึงมีรูปแม่กุญแจเขียวๆ ขึ้นที่ address bar? นั่นแหละคือ HTTPS หรือ Hypertext Transfer Protocol Secure มันคือเวอร์ชั่นที่ปลอดภัยกว่าของ HTTP ที่เราใช้กันทั่วไปนั่นเอง สมัยผมทำร้านเน็ตเมื่อ 20 กว่าปีที่แล้ว HTTPS ยังไม่แพร่หลายเท่าตอนนี้ แต่ปัจจุบันมันกลายเป็นมาตรฐานไปแล้ว เพราะมันช่วยปกป้องข้อมูลของเราจากการถูกดักจับ
คิดภาพตามนะ สมัยก่อนเวลาเราส่งข้อมูลผ่าน HTTP มันเหมือนเราส่งจดหมายเปล่าๆ ใครๆ ก็อ่านได้ แต่พอเป็น HTTPS มันเหมือนเราใส่จดหมายในซองล็อคอย่างดี ส่งไปถึงปลายทางได้อย่างปลอดภัย ไม่ต้องกลัวใครแอบอ่านระหว่างทาง
เรื่องนี้สำคัญมาก เพราะ HTTPS ช่วยป้องกันข้อมูลสำคัญของเราจากการถูกขโมย ไม่ว่าจะเป็น username, password, เลขบัตรเครดิต หรือข้อมูลส่วนตัวอื่นๆ สมัยก่อนเคยมีเคสที่ลูกค้าในร้านโดนแฮก account เพราะใช้ HTTP ในการ login พอมารู้ตัวอีกทีเงินในบัญชีหายไปแล้ว น่าเสียดายมากๆ
นอกจากนี้ HTTPS ยังช่วยยืนยันว่าเว็บที่เรากำลังเข้าเป็นเว็บจริง ไม่ใช่เว็บปลอมที่สร้างขึ้นมาเพื่อหลอกเอาข้อมูลของเรา (Phishing) เพราะ HTTPS ต้องมี Certificate ที่ออกโดยหน่วยงานที่เชื่อถือได้ ซึ่งเป็นการยืนยันตัวตนของเว็บไซต์
หลักการทำงานของ HTTPS คือการเข้ารหัส (Encryption) ข้อมูลที่ส่งระหว่าง browser ของเรากับ server ของเว็บไซต์ โดยใช้โปรโตคอลที่เรียกว่า Transport Layer Security (TLS) หรือ Secure Sockets Layer (SSL) ซึ่งเป็นรุ่นก่อนหน้า TLS
ขั้นตอนการทำงานคร่าวๆ มีดังนี้:
ฟังดูอาจจะซับซ้อน แต่เบื้องหลังมันคือการใช้คณิตศาสตร์ที่ซับซ้อนในการเข้ารหัสและถอดรหัสข้อมูล ทำให้คนที่ไม่ได้รับอนุญาตไม่สามารถอ่านข้อมูลได้ ถึงแม้จะดักจับข้อมูลได้ก็ตาม
| คุณสมบัติ | HTTP | HTTPS |
|---|---|---|
| การเข้ารหัส | ไม่มี | มี (ใช้ TLS/SSL) |
| ความปลอดภัย | ต่ำ | สูง |
| Port | 80 | 443 |
| SEO | ต่ำกว่า | สูงกว่า (Google ให้ความสำคัญกับ HTTPS) |
| การยืนยันตัวตน | ไม่มี | มี (ใช้ Certificate) |
จากตารางจะเห็นว่า HTTPS มีข้อดีกว่า HTTP ในทุกด้าน โดยเฉพาะเรื่องความปลอดภัย ซึ่งสำคัญมากๆ ในยุคที่ข้อมูลส่วนตัวมีค่าอย่างในปัจจุบัน
การติดตั้ง HTTPS ให้เว็บไซต์อาจจะดูยุ่งยาก แต่ปัจจุบันมีเครื่องมือและบริการที่ช่วยให้การติดตั้งง่ายขึ้นมาก สมัยก่อนต้องทำเองหมดทุกอย่าง ปวดหัวสุดๆ
CA คือหน่วยงานที่ออก Certificate ให้กับเว็บไซต์ เราต้องเลือก CA ที่น่าเชื่อถือและมี Certificate ที่เหมาะสมกับเว็บไซต์ของเรา เช่น Let's Encrypt (ฟรี), Comodo, DigiCert เป็นต้น สมัยนี้ Let's Encrypt เป็นที่นิยมเพราะฟรีและใช้งานง่าย
CSR คือไฟล์ที่ประกอบด้วยข้อมูลเกี่ยวกับเว็บไซต์ของเรา เช่น ชื่อโดเมน ชื่อองค์กร ที่อยู่ และ public key เราต้องสร้าง CSR บน server ของเรา แล้วส่งให้ CA เพื่อขอ Certificate
ตัวอย่างคำสั่งสร้าง CSR ด้วย OpenSSL:
openssl req -new -newkey rsa:2048 -nodes -keyout yourdomain.key -out yourdomain.csr
หลังจากรันคำสั่งนี้ จะมีไฟล์ yourdomain.key (private key) และ yourdomain.csr (CSR) สร้างขึ้นมา เก็บ private key ไว้ให้ดี ห้ามให้ใครรู้เด็ดขาด
เมื่อได้ CSR แล้ว เราก็ส่งไปให้ CA ที่เราเลือกไว้ CA จะตรวจสอบข้อมูลใน CSR แล้วออก Certificate ให้เรา
เมื่อได้ Certificate มาแล้ว เราต้องติดตั้ง Certificate บน server ของเรา โดยทั่วไปจะต้อง copy Certificate และ intermediate Certificate (ถ้ามี) ไปไว้ในตำแหน่งที่เหมาะสม แล้วแก้ไข configuration ของ web server (เช่น Apache, Nginx) ให้ชี้ไปยัง Certificate เหล่านั้น
ตัวอย่าง configuration ของ Apache:
<VirtualHost *:443>
ServerName yourdomain.com
DocumentRoot /var/www/yourdomain
SSLEngine on
SSLCertificateFile /etc/ssl/certs/yourdomain.crt
SSLCertificateKeyFile /etc/ssl/private/yourdomain.key
SSLCertificateChainFile /etc/ssl/certs/yourdomain_intermediate.crt
<Directory /var/www/yourdomain>
AllowOverride All
</Directory>
</VirtualHost>
หลังจากแก้ไข configuration แล้ว อย่าลืม restart web server ด้วยนะ
เพื่อให้แน่ใจว่าทุกคนเข้าเว็บไซต์ของเราผ่าน HTTPS เราควร redirect traffic จาก HTTP ไป HTTPS โดยอัตโนมัติ ทำได้โดยแก้ไข configuration ของ web server
ตัวอย่าง configuration ของ Apache:
<VirtualHost *:80>
ServerName yourdomain.com
Redirect permanent / https://yourdomain.com/
</VirtualHost>
เมื่อทำตามขั้นตอนเหล่านี้แล้ว เว็บไซต์ของเราก็จะรองรับ HTTPS อย่างเต็มรูปแบบ
หลังจากติดตั้ง HTTPS แล้ว เราควรตรวจสอบให้แน่ใจว่าทุกอย่างทำงานได้อย่างถูกต้อง
มี online tools มากมายที่ช่วยตรวจสอบ HTTPS configuration ของเว็บไซต์ของเรา เช่น SSL Labs SSL Server Test, Qualys SSL Labs เป็นต้น เครื่องมือเหล่านี้จะตรวจสอบ Certificate, Cipher Suites, Protocol Versions และอื่นๆ เพื่อหาช่องโหว่
เราสามารถตรวจสอบ HTTPS configuration ด้วย browser ของเราได้ โดยสังเกตที่ address bar ถ้ามีรูปแม่กุญแจสีเขียวแสดงว่า HTTPS ทำงานได้ถูกต้อง แต่ถ้ามีเครื่องหมายเตือนแสดงว่ามีปัญหา
Mixed content คือการที่เว็บไซต์ HTTPS โหลด resources (เช่น รูปภาพ, CSS, JavaScript) ผ่าน HTTP ซึ่งทำให้เกิดช่องโหว่ด้านความปลอดภัย เราควรตรวจสอบให้แน่ใจว่า resources ทั้งหมดโหลดผ่าน HTTPS เท่านั้น
ถ้าเจอ mixed content browser ส่วนใหญ่จะ block resources เหล่านั้น หรือแสดงเครื่องหมายเตือน
สมัยนี้เว็บที่ยังไม่เป็น HTTPS นี่ถือว่าเชยมากๆ แถม Google ยังลดอันดับ SEO อีกด้วย SiamCafe Blog เราก็เลยเน้นเรื่องนี้เป็นพิเศษ
ดูวิดีโอเพิ่มเติมเกี่ยวกับHTTPS ทำงานยังไง ทำไมต้องมี:
สมัยก่อน HTTPS อาจจะทำให้เว็บไซต์ช้าลงบ้าง แต่ปัจจุบันด้วยเทคโนโลยีที่พัฒนาขึ้น ความแตกต่างแทบไม่มีแล้ว แถม HTTPS ยังช่วยเพิ่มความน่าเชื่อถือของเว็บไซต์ ทำให้ผู้ใช้มั่นใจมากขึ้น
Certificate ส่วนใหญ่มีอายุ 1-3 ปี เราต้อง renew Certificate ก่อนหมดอายุ มิฉะนั้น browser จะแสดงคำเตือนว่า Certificate ไม่ถูกต้อง
HTTPS ไม่ได้ป้องกันการถูก DDoS โดยตรง แต่ HTTPS ช่วยปกป้องข้อมูลของเราจากการถูกดักจับ ซึ่งเป็นสิ่งสำคัญในการป้องกันการโจมตีอื่นๆ เช่น การขโมย session cookie
ถ้าอยากรู้เรื่อง Security เพิ่มเติม ลองเข้าไปอ่านบทความใน SiamCafe Blog ได้นะ มีเรื่องน่าสนใจเยอะเลย
สมัยผมทำร้านเน็ต เลือก SSL Certificate นี่ปวดหัวมาก! มีหลายแบบ Single Domain, Wildcard, Multi-Domain ต้องดูว่าเราจะใช้กับอะไรบ้าง ถ้ามีหลาย subdomain ก็เล่น Wildcard ไปเลย คุ้มกว่าเยอะ ไม่งั้นเดี๋ยวต้องมานั่ง generate CSR ใหม่เรื่อยๆ เสียเวลา
เดี๋ยวนี้มี Let's Encrypt ให้ใช้ฟรีด้วยนะ แต่ต้อง automate renew ให้ดีๆ ไม่งั้น certificate หมดอายุ ลูกค้าเข้าเว็บไม่ได้ โดนด่าแน่นอน
หลังจากติดตั้ง Certificate แล้ว ต้อง redirect ทุก traffic ที่เป็น HTTP ไป HTTPS ให้หมด ไม่งั้นคนก็ยังเข้าเว็บแบบไม่ secure ได้อยู่ดี สมัยก่อนผมใช้ .htaccess ทำ redirect แบบนี้
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%$1 [R=301,L]
โค้ดนี้จะ redirect ทุกอย่างจาก HTTP ไป HTTPS แบบถาวร (301) อย่าลืม test ให้ดีก่อน deploy จริงนะ
Cipher Suites คือชุด algorithm ที่ใช้ในการเข้ารหัสข้อมูล มันจะมีพวก algorithm ที่อ่อนแอ หรือเก่าแล้ว ที่ควรปิดการใช้งานไป เพื่อความปลอดภัยที่มากขึ้น เว็บสมัยใหม่ควร support TLS 1.2 เป็นอย่างน้อย และควรปิด TLS 1.0 กับ 1.1 ไปเลย
Nginx Config ตัวอย่าง:
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
อันนี้แล้วแต่เซิร์ฟเวอร์ที่เราใช้ ต้องไปดูวิธีการตั้งค่าใน documentation ของแต่ละตัวอีกที
CSP เหมือนเป็นเกราะอีกชั้น ที่ช่วยป้องกันพวก XSS attack ได้ มันจะช่วยกำหนดว่า browser สามารถโหลด resources (เช่น รูป, script, stylesheet) จาก domain ไหนได้บ้าง ถ้ามี script แปลกปลอมพยายาม inject เข้ามา browser ก็จะ block ไว้
Content-Security-Policy: default-src 'self'; script-src 'self' https://example.com;
ตัวอย่างนี้คือ อนุญาตให้โหลด script จาก domain ตัวเอง และจาก example.com เท่านั้น
สมัยก่อนอาจจะใช่ เพราะต้องเสียเวลาในการเข้ารหัส แต่ปัจจุบัน hardware แรงขึ้นเยอะ และ protocol ก็ optimize มากขึ้น ทำให้ความแตกต่างน้อยมาก จนแทบไม่รู้สึก ถ้า configuration ถูกต้องนะ
ถ้าเว็บช้า อาจจะเป็นเพราะสาเหตุอื่นมากกว่า เช่น รูปใหญ่เกินไป, script เยอะเกินไป, หรือ server ไม่แรงพอ
Certificate ส่วนใหญ่มีอายุแค่ 1-2 ปี เพื่อความปลอดภัย ถ้า certificate โดน compromise ไป hacker ก็จะมีเวลาจำกัดในการใช้งาน certificate นั้น
การ renew certificate บ่อยๆ ยังช่วยให้เรา update algorithm ที่ใช้ในการเข้ารหัสให้ทันสมัยอยู่เสมอด้วย
จำเป็น! Cloudflare ช่วยป้องกันหน้าบ้าน แต่ข้อมูลระหว่าง Cloudflare กับ Server เราก็ยังต้องเข้ารหัสอยู่ดี ถ้าไม่มี SSL Certificate ที่ Server ข้อมูลก็จะถูกส่งแบบไม่เข้ารหัส และอาจถูกดักจับได้
Cloudflare มี option ให้ใช้ SSL/TLS แบบ "Flexible" ซึ่งจะเข้ารหัสแค่ระหว่าง browser กับ Cloudflare แต่ระหว่าง Cloudflare กับ Server จะไม่เข้ารหัส อันนี้ไม่แนะนำนะ ควรใช้แบบ "Full" หรือ "Full (strict)" จะปลอดภัยกว่า
HTTPS ช่วยป้องกันการดักจับข้อมูลระหว่างทาง (Man-in-the-middle attack) ทำให้ hacker ไม่สามารถอ่านข้อมูลที่เราส่งไปมากับ server ได้ เช่น username, password, credit card number
HTTPS ยังช่วยยืนยันว่าเรากำลังคุยกับ server ที่ถูกต้องจริงๆ ไม่ใช่ server ปลอมที่ hacker สร้างขึ้นมาหลอก
นอกจากนี้ HTTPS ยังช่วยเพิ่มความน่าเชื่อถือให้กับเว็บไซต์ของเราด้วย Google ก็ให้คะแนนเว็บไซต์ที่ใช้ HTTPS มากกว่า
HTTPS ไม่ใช่แค่เรื่องของ security อย่างเดียว แต่เป็นเรื่องของความน่าเชื่อถือ และประสบการณ์ที่ดีของผู้ใช้งานด้วย สมัยผมทำร้านเน็ต การมี HTTPS ทำให้ลูกค้ามั่นใจที่จะใช้บริการของเรามากขึ้น
ถึงแม้การติดตั้งและดูแล HTTPS จะมีรายละเอียดเยอะ แต่ก็คุ้มค่าที่จะลงทุน เพราะมันช่วยปกป้องข้อมูลของลูกค้า และสร้างความเชื่อมั่นให้กับธุรกิจของเรา iCafeForex ก็ให้ความสำคัญกับเรื่องนี้มากๆ
หวังว่าบทความนี้จะเป็นประโยชน์กับทุกคนนะ ถ้ามีคำถามอะไรเพิ่มเติม ถามมาได้เลย หรือจะไปอ่านบทความอื่นๆ ใน SiamCafe Blog ก็ได้