ทำเว็บไซต์ให้ปลอดภัยขึ้นอีกนิดนึง ไม่ยากเกินไป ถ้าเขียนเว็บได้ก็น่าจะทำได้ #websecurity

Please do not leave the key in the lock

ช่วงนี้เห็นเว็บไซต์ที่เกี่ยวกับคนใกล้ตัวโดนแฮ็กบ้าง หรือบางอันไม่ได้โดนแฮ็ก แต่เหมือนเอาของไปวางไว้หน้าบ้านรอคนมาหยิบเอาไปบ้าง เลยขอโน๊ตๆ ไว้หน่อย ถึงวิธีการป้องกันตัวเองเบื้องต้น (มากๆ) ที่คนทำเว็บน่าจะพอทำเองได้ครับ

เครื่องมือตรวจสอบเบื้องต้น (ส่วนใหญ่ฟรี)

ใครเป็นคนดูแลเว็บ ลองใช้เครื่องมือในลิงก์นี้ตรวจสอบเบื้องต้นก่อนก็ได้ครับ ว่าเว็บไซต์เรายังโอเคไหม: 12 Online Free Tools to Scan Website Security Vulnerabilities & Malware

เข้าไล่มา 12 เครื่องมือ ผมก๊อปมาให้ดูตรงนี้อีกที (บางตัวก็ทำงานคล้ายๆ กัน)

  • Scan My Server – ตรวจหารูรั่วอย่าง SQL injection, PHP injection, HTTP Header injection, cross site scripting (XSS)
  • SUCURI – ตรวจหามัลแวร์ ลิงก์สแปม
  • Qualys SSL Server Test – ตรวจความปลอดภัยของการเข้ารหัสลับข้อมูลที่เว็บไซต์รับส่ง
  • Quttera – ตรวจหามัลแวร์และรูรั่วอื่นๆ
  • Detectify – ตรวจหาจุดอ่อน เช่นจุดอ่อนตามรายการ OWASP Top 10 ที่เว็บแอปโดนเจาะบ่อยๆ
  • SiteGuarding – ตรวจหามัลแวร์ ลิงก์สแปม
  • Web Inspector – ตรวจหา backdoor มัลแวร์ เฟรมหรือการเชื่อมต่อแปลกๆ
  • Acunetix – ตรวจหาความผิดปกติที่ระดับเครือข่าย อย่าง DNS รวมไปถึงการตรวจหารูรั่วอื่นด้วย
  • Asafa Web – ตรวจหาการใช้คุกกี้ที่ไม่ได้เข้ารหัสลับ clickjacking
  • Netsparker Cloud – ตรวจหารูรั่วประเภท injection, permission
  • UpGuard Web Scan – ตรวจหาความไม่ปลอดภัย โดยอาศัยข้อมูลที่บุคคลภายนอกสามารถดูได้ เช่น ตรวจว่ามีใครส่งอีเมลจากชื่อโดเมนเราได้ไหม
  • Tinfoil Security – ตรวจหาความไม่ปลอดภัย อย่างเช่นตามรายการ OWASP Top 10 และรูรั่วอื่นๆ

ที่ตรวจดูได้โดยไม่ต้องพึ่งผู้เชี่ยวชาญมากๆ ก็เช่น ติดมัลแวร์รึเปล่า การส่งข้อมูลได้เข้ารหัสลับ (https) ดีพอไหม พวกคุกกี้ของเว็บไซต์เราที่ไปฝากไว้กับเครื่องผู้ใช้นี่เว็บไซต์อื่นเข้ามาอ่านได้ไหม

ส่วนใหญ่จะฟรี บางอันต้องลงทะเบียนก่อน หรือต้องยืนยันสิทธิ์ก่อนว่าเราเป็นผู้ดูแลของเว็บไซต์นั้นจริงๆ (ด้วยการเอาไฟล์บางอย่างไปวางไว้ในเครื่องเรา – ยังไงก็ตรวจสอบดีๆ ก่อนจะเอาไฟล์อะไรไปวางนะครับ มันควรจะเป็น text/html file ที่เราเปิดเข้าไปอ่านๆ ได้ ถ้าดูแปลกๆ ก็อย่าทำต่อ)

* สำหรับตัวที่มีการทดสอบ SQL injection ให้ระวังด้วยว่ามันจะพยายามยิงอะไรบางอย่างเข้าไปในฐานข้อมูลของคุณ เพื่อจะทดสอบ แปลว่ามันอาจจะทำให้เกิดขยะในฐานข้อมูลได้  ดังนั้นไม่ควรทดสอบกับระบบที่ใช้อยู่จริง (on production) นะครับ ให้ทดสอบกับระบบที่เอาไว้ทดสอบเท่านั้น ถ้าเจอรูก็รีบอุด พอแน่ใจแล้วค่อยไปอัปเดตโค้ดในส่วนของ production ครับ [ขอบคุณคุณ Thitipong Samranvarnich ในกลุ่มสมาคมโปรแกรมเมอร์ไทย ที่เตือนเรื่องนี้ครับ]

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

ทีนี้ถ้าสมมติว่าพบสิ่งปกติ แล้วอยากแก้ไข ถ้าไม่มั่นใจจะทำเอง ก็อาจจะต้องเรียกหาคนที่ทำเป็นมาทำน่ะครับ

(แต่ถ้าไม่พบ ก็ไม่ได้แปลว่าไม่มีนะครับ อาจจะแค่หาไม่เจอ)

ป้องกันคนมาดูภาพหรือไฟล์ที่ยังไม่พร้อมเผยแพร่

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

ถ้าเว็บเซิร์ฟเวอร์ใช้ Apache HTTP Server ก็ทำได้ด้วยการแก้ไขไฟล์ .htaccess โดยเพิ่มบรรทัด

Options -Indexes

ทีนี้ก็จะยังมีปัญหาอยู่บ้าง คือถ้าคนรู้ชื่อไฟล์ (อาจจะเดาไปเรื่อยๆ) เขาก็จะยังดูได้อยู่ดี

อันนึงที่ทำได้ก็คือ อย่าตั้งขึ้นไฟล์ให้มันเดาง่ายนัก (พวกรันเลขเรียงลำดับไปเรื่อยๆ นี่เดาสบายเลย)

อีกวิธีคือ ป้องกันการ hot link ไม่ให้คนเข้าถึงได้โดยตรง (พิมพ์ url ชื่อไฟล์ในเบราว์เซอร์ตรงๆ จะดูไม่ได้ ) แต่ถ้าภาพไหนถูกโหลดจากหน้าเว็บของโดเมนนั้นเอง จะโหลดดูได้ (ซึ่งกรณีหลังนี้ เป็นเรื่องที่เราต้องการให้ทำได้ เพราะเราเป็นคนเผยแพร่เอง)

แต่ปลอดภัยที่สุดคือ อะไรที่ไม่อยากให้คนเห็น ลับมาก อย่าเพิ่งไปอัปขึ้นเว็บเซิร์ฟเวอร์ครับ lol

Please do not leave the key in the lock

ปกปิดข้อมูลเว็บเซิร์ฟเวอร์

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

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

ถ้าเราปกปิดข้อมูลเกี่ยวกับเว็บไซต์เราเสียหน่อย ก็จะลดโอกาสเป็นเป้าไปไ้ด้บ้างจากนักเจาะที่ฉวยโอกาส

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

ยังไงก็ควรหมั่นอัปเดตรุ่นของซอฟต์แวร์ที่เขาแก้ไขเรื่องความปลอดภัยครับ

WordPress และ CMS อื่นๆ

ใครใช้เวิร์ดเพรส ลองดูหน้านี้ครับ มีอะไรที่พอทำตามได้บ้าง เช่นการตั้ง permission ของ directory ต่างๆ การปิดไม่ใช้แก้ไขไฟล์ของเวิร์ดเพรสผ่านหน้า dashboard ได้
https://codex.wordpress.org/Hardening_WordPress

คนใช้ Joomla, Drupal หรือ CMS อื่นๆ ลองเสิร์ชดูครับ ผมว่ามีแน่ๆ
https://docs.joomla.org/Security
https://www.keycdn.com/blog/drupal-security/

พอทำได้เบื้องต้นไปก่อน-แต่ในระยะยาวก็ต้องลงทุนน่ะ

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

แน่นอนว่าถ้าจะให้ดี ก็ควรปรึกษากับคนที่ชำนาญเรื่องความปลอดภัยของเว็บไซต์ (ซึ่งก็อาจจะมีค่าใช้จ่ายน่ะแหละ แต่อันนี้ก็ต้องไปอธิบายกันในองค์กรว่า มันสำคัญยังไง ทำไมถึงควรจ่าย – คิดมันอยู่ในหมวดเดียวกับรปภ.ไรงี้ได้ไหม อันนั้นยังจ่ายได้เลย :p)

คำเตือน

ผมไม่ใช่ผู้เชี่ยวชาญด้านนี้ ไม่ต้องมาถามผมเรื่องนี้ lol
ทั้งหมดนี้อาศัยจำจากเพื่อนๆ ที่เขาทำงานพวกนี้ และอ่านๆ เอาในเน็ตทั้งนั้น

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

ชุมชนความปลอดภัยเว็บ

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

https://www.facebook.com/groups/2600Thailand/
https://www.facebook.com/groups/owaspthailand/

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

อีกกรุ๊ปในเฟซบุ๊กที่ก็เข้าไปถามได้เหมือนกัน คือกลุ่มสมาคมโปรแกรมเมอร์ไทยครับ กลุ่มนี้ใหญ่และหลากหลายครับ https://www.facebook.com/groups/ThaiPGAssociateSociety/

เพิ่มเติม

  • คำแนะนำในการเก็บรหัสผ่านในระบบสำหรับนักพัฒนาซอฟต์แวร์ และผู้ดูแลระบบไอที@FordAntiTrust แนะนำวิธีการเก็บ “ข้อมูลตัวแทนรหัสผ่าน” ที่ทำให้เราไม่จำเป็นต้องเก็บรหัสผ่านต้นฉบับ ทำให้แม้ระบบถูกเจาะหรือข้อมูลรั่ว ข้อมูลที่หลุดไปก็ไม่ใช้รหัสผ่านที่เอาไปใช้ได้ทันที ต้องใช้เวลาในการย้อนรอยหารหัสผ่านจริงๆ ทำให้ผู้ใช้พอมีเวลาบ้างในการเปลี่ยนไปใช้รหัสผ่านใหม่
  • การออกแบบระบบให้รับ Request เยอะๆ — อันนี้ไม่ใช่ระดับพื้นฐานละ แต่เห็นว่าน่าสนใจดี เผื่อใช้เป็น reference เอาไปคุยตอนจ้างคนมาทำระบบ — คุณ ijemmy อธิบายแนวคิดเอาไว้ในโพสต์นี้ครับ (เรื่องจริงๆ ก็มีมุม security เหมือนกัน คือมุม availability หรือความพร้อมใช้ของระบบ ออกแบบยังไงให้ระบบไม่ล่มตอนมีคนใช้เยอะๆ พร้อมๆ กัน)

(เผยแพร่ครั้งแรกในเฟซบุ๊ก 1 พ.ค. 2018)

ภาพประกอบ “Key locker” โดย Jonathan O’Donnell สัญญาอนุญาตครีเอทีฟคอมมอนส์แบบแสดงที่มา-อนุญาตแบบเดียวกัน


Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.