> For the complete documentation index, see [llms.txt](https://www.saladpuk.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://www.saladpuk.com/basic/security101/security-principles.md).

# Security Principles

หลังจากที่แมวน้ำเล่านิทาน [**การเข้ารหัส**](https://www.saladpuk.com/basic/security101) และ [**การรักษาความลับ**](https://www.saladpuk.com/basic/security101/secure-password) ไปเรียบร้อยแล้ว คราวนี้ก็มาถึงคราวที่เราควรจะต้องรู้หลักพื้นฐานในการรักษาความปลอดภัยกันบ้างละนะ นั่นก็คือ **Security Principles** นั่นเอง

{% hint style="info" %}
**แนะนำให้อ่าน**\
บทความนี้เป็นส่วนหนึ่งของคอร์ส [👦 Security พื้นฐาน](https://saladpuk.gitbook.io/learn/basic/security101) ถ้าเพื่อนๆสนใจอยากรู้หลักในการรักษาความปลอดภัยตั้งแต่เริ่มต้นเลย ก็กดอ่านที่ตัวสีฟ้าๆได้เลยนะ
{% endhint %}

## 🤔 Security Principles คือไย ?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

{% hint style="warning" %}
Security Principles ที่เอามาเล่าให้ฟังในรอบนี้ **ไม่ได้เอามาครบทุกข้อนะ**&#x20;
{% endhint %}

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

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

![กำแพงจะเทพแค่ไหน ตรวจละเอียดยิบก็เท่านั้น ถ้ามีคนร้ายหลุดไปได้ก็จบ](/files/-M3V-w0SwRuz5cHq8HiI)

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

![คนร้ายจะเจาะเข้าไปก็ยาก เพราะต่อให้ผ่านกำแพงแรกได้ก็ต้องเจอตรวจอีกหลายชั้น](/files/-M3V0qjnnuSl5MGzorIJ)

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

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

{% embed url="<https://www.youtube.com/watch?v=ZkQNP2cqG2I>" %}

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

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

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

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

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

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

{% hint style="danger" %}
**ข้อควรระวัง**\
ข้อดีของการกระจายอำนาจคือทำให้โกงยากขึ้น แต่ก็แลกมากับความซับซ้อน และความล่าช้า
{% endhint %}

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

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

![บ้านนี้หมาป่าเห็นก็ยิ้มอ่อน มีช่องให้เข้าเต็มไปหมด](/files/-M3VOAJ-_cmeRtEHFKx-)

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

![จำกัดช่องทางเท่าที่จำเป็น](/files/-M3VQXI8CR-lzwW26khs)

{% hint style="success" %}
**มุมชวนคิด**\
ช่องทางในการทำงานเยอะ บางมุมก็สะดวกขึ้นเพราะมีทางเลือกเยอะ แต่ความเสี่ยงก็สูงขึ้นเป็นทวีคูณ และบางทีอาจจะเป็นข้อเสียที่เปิดไว้เยอะๆ เพราะทีมอาจจะสับสนว่าสรุปใช้ช่องไหนกันแน่ก็เป็นได้ ดังนั้นควรตกลงและใช้เท่าที่จำเป็นจริงๆเท่านั้นจะดีกั่วมุ๊ย ?
{% endhint %}

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

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

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

* ใช้ public ไปซะทุกเรื่อง
* เข้าใช้งานในสิทธิ์สูงสุด root / administrator เพราะขี้เกียจถูกจำกัดสิทธิ์
* Module A ขอข้อมูล { ก } มา แต่เราดันส่งข้อมูล { ก, ข } ไปให้เขา เพราะเรารู้ว่า ถ้า module A ตรวจข้อมูล { ก } แล้วผลลัพท์คือ ผ่าน เดี๋ยวมันก็จะขอข้อมูล { ข } มาอยู่ดี เราเลยส่ง { ข } ไปด้วยเลย ทั้งๆที่ถ้าผลลัพท์คือไม่ผ่านแล้วล่ะก็ module A ก็จะไม่ขอข้อมูล { ข }

![](/files/-M3VX17Eqfru3UlM5prE)

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

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

![memecenter.com](/files/-M3VXqQCUocCzGcx4qfe)

## 🎯 สรุป

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

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