Security Principles

🤔 หลักการขั้นพื้นฐานของความปลอดภัยคืออะไรน๊า ?

หลังจากที่แมวน้ำเล่านิทาน การเข้ารหัส และ การรักษาความลับ ไปเรียบร้อยแล้ว คราวนี้ก็มาถึงคราวที่เราควรจะต้องรู้หลักพื้นฐานในการรักษาความปลอดภัยกันบ้างละนะ นั่นก็คือ Security Principles นั่นเอง

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

🤔 Security Principles คือไย ?

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

💖 เข้าใจให้ตรงกันก่อน

ในการทำ Security หลายคนจะเข้าใจผิดว่า การยืนยันด้วยใบหน้าจะปลอดภัยกว่าการใส่รหัสผ่าน หรือ การยืนยันตัวตนด้วยเสียงจะดีกว่าการใส่ PIN บลาๆ ซึ่งจริงๆแล้วของพวกนั้นในแง่ของ security เขามองเป็นของ 3 มิติไว้ตามนี้คือ

🤨 คุณคือใคร ? (What you are ?)

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

🤨 คุณมีอะไร ? (What you have ?)

คือสิ่งของที่ผู้ใช้ที่ถูกต้องเท่านั้นถึงจะมีสิ่งของพวกนั้นได้ เช่น บัตรผ่าน, กุญแจ, เครดิตการ์ด

🤨 คุณรู้อะไร ? (What you know ?)

คือความลับที่มีแค่เจ้าตัวเท่านั้นที่รู้ เช่น PIN, Password

แล้วในการทำ Security จริงๆนั้นเราจะต้องใช้ของทั้ง 3 อย่าง หรืออย่างน้อย 2 อย่าง เพื่อใช้ในการรักษาความปลอดภัย เพราะอย่างใดอย่างหนึ่งไม่พอ

ตัวอย่างที่ไม่ดี - ระบบถามวันเดือนปีเกิด ถามที่อยู่ ถามวันหมดอายุบัตรประชาชน ซึ่งฟังๆแล้วก็เข้าท่านะ แต่ของทั้ง 3 อย่างที่ถามนั้นคือ What you know? เพียงอย่างเดียว ซึ่งถ้าคนร้ายได้บัตรประชาชนไปคำตอบทั้งหมดอาจจะอยู่ในบัตรใบนั้นใบเดียวก็ได้

ตัวอย่างที่ดี - ระบบให้สแกนดวงตา (What you are?) ให้ทาบบัตรผ่าน (What you have?) และถามวันเกิด (What you know?) ซึ่งจะเห็นว่าคนร้ายที่จะแอบสวมรอยนั้นจะต้องหาของ 3 อย่างที่ไม่เกี่ยวข้องกันมาให้ได้ ซึ่งจะทำให้การหลอกทำได้ยากขึ้น

ดังนั้นถ้าถามว่าอะไรปลอดภัยกว่ากัน ระหว่าง PIN กับ Face คำตอบในเชิง security คือ ให้ดูจากจำนวน Layers ที่ใช้ ยิ่งใช้หลาย Layers มาผสมกันก็จะยิ่งทำให้ระบบมีความปลอดภัยมากยิ่งขึ้นนั่นเอง

เอาล่ะก็น่าจะพอเห็นภาพคร่าวๆละ ดังนั้นเราไปไล่ดูกันเบยว่า Security Principles มีอะไรกันบ้าง

Security Principles ที่เอามาเล่าให้ฟังในรอบนี้ ไม่ได้เอามาครบทุกข้อนะ

🧅 ป้องกันทุกระดับชั้น (Defense in Depth)

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

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

😵 พรางตัว (Security by Obscurity)

เป็นการซ่อนของที่ไม่อยากให้คนร้ายรู้ ทำให้เขาหาได้ยากขึ้น เช่นปรกติทั่วโลกจะรู้กันว่า port 22 จะใช้ในการทำ Remote เราก็ทำการเปลี่ยนไปใช้ port อื่นที่ชาวบ้านไม่ใช้กันแทน เพียงเท่านี้คนร้ายที่หวังจะโจมตีผ่าน port 22 ก็จะ งง แนะนำให้ดูวีดีโอด้านล่างแล้วจะเข้าใจมันแจ่มแจ้ง (โคตรฮา 2 นาที)

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

🥞 แบ่งส่วนรับผิดชอบ (Segregation of Duties)

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

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

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

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

ข้อควรระวัง ข้อดีของการกระจายอำนาจคือทำให้โกงยากขึ้น แต่ก็แลกมากับความซับซ้อน และความล่าช้า

⚔️ จำกัดวง (Minimize surface attack)

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

ดังนั้นวิธีการรับมือที่ง่ายสุดคือ การจำกัดวง เช่น ระบบเราแทนที่จะรับชำระบัตรเครดิตจากไหนก็ได้มั่วซั่ว เราก็จำกัดวงเฉพาะร้านที่ลงทะเบียนกับเราเท่านั้น โอกาสการถูกโจมตีสำเร็จก็จะน้อยลง เพราะมันถูก scope ไว้แล้ว

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

🕵️ ให้เท่าที่จำเป็น (Least Privilege)

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

ส่วนใหญ่จะละเมิดเรื่องพวกนี้เพราะ ขี้เกียจ หรือ ประมาท เช่น

  • ใช้ public ไปซะทุกเรื่อง

  • เข้าใช้งานในสิทธิ์สูงสุด root / administrator เพราะขี้เกียจถูกจำกัดสิทธิ์

  • Module A ขอข้อมูล { ก } มา แต่เราดันส่งข้อมูล { ก, ข } ไปให้เขา เพราะเรารู้ว่า ถ้า module A ตรวจข้อมูล { ก } แล้วผลลัพท์คือ ผ่าน เดี๋ยวมันก็จะขอข้อมูล { ข } มาอยู่ดี เราเลยส่ง { ข } ไปด้วยเลย ทั้งๆที่ถ้าผลลัพท์คือไม่ผ่านแล้วล่ะก็ module A ก็จะไม่ขอข้อมูล { ข }

🔒 ปลอดภัยไว้ก่อน (Secure by Default)

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

🎯 สรุป

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

จากที่โม้มาทั้งหมดการทำ Security ไม่ได้มีแค่ในระดับโค้ดเพียงอย่างเดียว เพราะทุกอย่างที่เกี่ยวข้องกับระบบสามารถถูกโจมตีได้เสมอ เช่น Hardware, OS, Software บลาๆ ดังนั้นให้ดูให้ดีว่าจุดไหนคือจุดที่เกี่ยวข้องกับ sensitive data ของเรา ก็ค่อยๆไล่ทำจากจุดนั้นออกมาข้างนอกเรื่อยๆก่อนก็ยังพอรับได้

Last updated