ยุคนี้ HTTPS คงยังไม่พอ มันต้อง #HSTS (extra security over HTTPS) มาตรฐานใหม่อินเทอร์เน็ต ที่ควรรู้

Choowong Sitaphong
Next-Hop Co., Ltd.
Published in
3 min readMay 21, 2018

เมื่อก่อนเราใช้ HTTP protocol ในการสื่อสาร ข้อเสีย ที่ชัดเจนเลยคือ หากโดนดักข้อมูล จะดักแล้วอ่านออกมาได้หมดแบบชิวๆเลยแหล่ะ

คราวนี้มันเลยเกิดทางสวรรค์ขึ้นมา คือ HTTPS เพื่อให้มีการเข้ารหัสระหว่างการรับส่งข้อมูล แต่ก็นั่นแหล่ะครับ มันก็มีคนผู้คิดค้นหาวิธีได้อีก ซึ่ง SSLstrip เป็นหนึ่งในวิธีที่นิยมใช้กันในการทำ Man-in-the-middle เพื่อดักข้อมูล โดยหั่น https ออกระหว่างทางให้กลายเป็น http แล้วคราวนี้ attacker ก็แอบอ่านได้เลยทันที

https://incognitolab.com/

อีกทั้งปัญหา Mixed content อีกบางเว็บ url เป็น https จริง แต่ดันฝังรูป js css หรือมีคนหลอกโพสต์ link ให้คลิกกลายเป็น http ธรรมดา cookie ก็หลุดอยู่ดี

เลยมีเจ้านี่ขึ้นมา แท่มมม

มาตรฐานอินเตอร์เน็ตออกใหม่มาชื่อ HTTP Strict Transport Security (HSTS)

ถ้าแปลตรงตัวเลย Strict ก็คือ เข้มงวด
Transport Security ก็คือ การส่งมูล
ดังนั้นรวมๆก็ควร การส่งข้อมูลแบบเข้มงวดขึ้น
โดยฝั่ง Server จะบังคับให้ Web Browser คุยผ่าน HTTPS เท่านั้น

มาดูกันดีกว่า ว่ามันทำงานยังไงจะได้เห็นภาพมากขึ้น
ปกติการขอ Request ระหว่าง Client กับ Web Server จะเป็นลักษณะดังนี้
HTTP — —Request — -> Web Server
HTTP <— —Response — - Web Server

HTTP — — Request — -> Web Server
HTTPS < — —Response — — Web Server

HSTS จะสนใจแค่เคสนี้ :
HTTPS — — Request — -> Web Server
HTTPS < — —Response — — Web Server

“ถ้าเธอจะคุยกับเราอ่ะ เธอมาแบบธรรมดา (HTTP) เราไม่คุยน่ะ ไปทำตัวเองให้ปลอดภัยมาก่อน (HTTPS) ตั้งแต่แรก แล้วเราค่อยมาคุยกันใหม่ (Policy Enforcement)”

แล้วคราวนี้มันจะไปบอก Web server ได้ไงล่ะ ว่าไม่ให้มาคุย HTTP แล้ว
สิ่งที่ทำได้คือ ใช้ Header ของ Response เวลาส่งกลับไปบอก
มาดูตัวอย่าง HSTS header กันดีกว่า ปกติจะมี Parameter หลายตัว แต่ส่วนใหญ่ก็จะใช้กันลักษณะประมาณนี้

Strict-Transport-Security: max-age=63072000; includeSubDomains; preload

โดยจะระบุเลยว่า
1. ต้องคุยกันแบบเป็น Strict-Transport-Security เท่านั้นนะ ต้องปลอดภัยน่ะ
2. max-age = บังคับใช้ HSTS อยู่กี่วินาที หลัง Request ไป เช่น ส่ง header กลับไปบอกว่า 1 ปี แสดงว่า Server จะไม่คุย HTTP กับ Web Browser เลย เป็นเวลา 1 ปี Browser ก็จะจำแล้ว Count Down ลงไปเรื่อยๆ จนกว่าจะหมดเวลา พอหมด ก็ส่งไปใหม่เป็น Loop เดิม
3. includeSubDomains บอกว่า หลังจากนี้ถ้าจะคุยกับ Sub Domains ของเรา ก็ต้องคุยแบบ HSTS ด้วยน่ะจ๊ะ

HSTS:
HTTP — — Request — -> Server (Nooooooooooooooooooo!)
HTTP < — — ส่งมาใหม่นะหนู๋ มาแบบ HTTPS น่ะ — — Server
HTTPS— — Request — -> Web Server (Oh Yessssssss!)
HTTPS < — — อยากได้นี่ใช้ไหม อ่ะทางปลอดภัยแล้ว เราส่งให้— — Server

อย่าลืมว่า Server ต้องใส่ SSL ถูกต้องแล้วด้วย และเปิด port 443 HTTPS

หากถามว่ามี Browser ไหนรองรับแล้วยัง ล่าสุด browser หลัก ทำงานได้หมดทุกตัว

https://caniuse.com/#search=HSTS

ต่างประเทศก็ทยอยทำไปเรียบร้อย ล่าสุด .gov ของอเมริกาทำ HSTS ใส่ใน browser กันแล้ว รวมถึง Facebook, Twitter, Google ก็มาครบเรียบร้อย

.gov
google
facebook

ส่วนในไทย ก็เห็นมีมาเรื่อยๆ เยอะขึ้นแล้วครับ ดูได้จากที่ส่งมาเช็คกับ Google Preload List พอหาดูเจอ ที่คุ้นๆ เช่น https://blognone.com , https://www.wpthaiuser.com/ กับ .co.th อีกประมาณ 12 บริษัท

ส่วนตัวคิดว่าในเว็บที่มีรับส่งข้อมูลปลอดภัยสูง ก็ควรจะบังคับใช้ HSTS ได้แล้ว อนาคตต่อไปจะเป็นต่อไปก็ต้องรอดูกัน

ปล. สำหรับ nexthop.co.th เองเราก็เปิด HSTS แล้ว ส่งข้อมูลไปแล้ว และมีชื่อใน Preload List (บรรทัดที่ 50147)

hstspreload.org
tools.ietf.org/html/rfc6797
2600-thailand

--

--