Security
น้องๆ หลายคนอาจจะสงสัยว่า Api Gateway Security Best Practices คืออะไร? ทำไมพี่บอมต้องมาพูดเรื่องนี้? เอาแบบง่ายๆ เลยนะ มันคือชุดแนวทางปฏิบัติที่ดีที่สุดในการรักษาความปลอดภัยของ Api Gateway ของเรานั่นเอง
Api Gateway เนี่ย มันเหมือนประตูหน้าบ้านของระบบเรา ใครจะเข้ามาใช้บริการอะไร ก็ต้องผ่านมันไปก่อน ทีนี้ลองคิดดูสิ ถ้าประตูหน้าบ้านเราไม่แข็งแรง คนร้ายก็เข้ามาขโมยของได้ง่ายๆ Api Gateway ที่ไม่ปลอดภัยก็เหมือนกัน Hacker ก็จะเจาะเข้ามาขโมยข้อมูล หรือทำให้ระบบเราล่มได้
สมัยพี่ทำร้านเน็ต SiamCafe.net เนี่ย (ตั้งแต่ปี 1997 แน่ะ!) เรื่อง Security นี่สำคัญสุดๆ ลูกค้าจ่ายเงินมาใช้บริการ เราต้องดูแลข้อมูลเค้าให้ดีที่สุด ยุคนี้ก็เหมือนกัน Api Gateway ก็คือหัวใจของระบบ Security เราต้องทำให้มันแข็งแกร่งที่สุด
API หรือ Application Programming Interface เนี่ย มันคือตัวกลางที่ทำให้โปรแกรมต่างๆ คุยกันได้ เหมือนล่ามที่แปลภาษาให้โปรแกรมสองตัวเข้าใจกัน เช่น แอปมือถือเราอยากได้ข้อมูลจาก Facebook ก็ต้องผ่าน API ของ Facebook นั่นแหละ
Api Gateway คือประตูหน้าบ้านที่คอยจัดการ Traffic ที่เข้ามายัง API ของเรา มันทำหน้าที่หลายอย่าง เช่น Authentication (ยืนยันตัวตน), Authorization (ตรวจสอบสิทธิ์), Rate Limiting (จำกัดจำนวนการเรียก API), และอื่นๆ อีกมากมาย
สมัยก่อนที่ยังไม่มี Api Gateway เนี่ย เวลาเราสร้าง API หลายตัว แต่ละตัวก็ต้องดูแลเรื่อง Security เองหมด ซึ่งมันยุ่งยากมาก Api Gateway เลยเข้ามาช่วยแก้ปัญหานี้ โดยรวม Security ไว้ที่เดียว ทำให้การจัดการง่ายขึ้น และลดความซับซ้อนของระบบ
เอาล่ะ ทีนี้มาดูวิธีใช้งาน Api Gateway กันบ้าง เริ่มต้นยังไงดี? จริงๆ แล้วมันขึ้นอยู่กับ Platform ที่น้องๆ เลือกใช้นะ แต่หลักการพื้นฐานก็คล้ายๆ กัน
สมัยพี่ทำ SiamCafe.net พี่เคยเจอปัญหาลูกค้าโดน Hack Account บ่อยมาก เพราะ Password ง่ายเกินไป ยุคนี้ก็เหมือนกัน Api Key หรือ Token ที่ใช้ยืนยันตัวตน ต้องแข็งแกร่งพอที่จะป้องกันการ Hack ได้
Authentication คือการยืนยันว่า User คือใคร ส่วน Authorization คือการตรวจสอบว่า User มีสิทธิ์ทำอะไรได้บ้าง สองอย่างนี้ต้องทำงานร่วมกัน เพื่อให้แน่ใจว่าคนที่เข้ามาใช้ API ของเรา คือคนที่ได้รับอนุญาตจริงๆ
ตัวอย่าง Code (อาจจะแตกต่างกันไปตาม Platform):
// Authentication (ตัวอย่างง่ายๆ)
function authenticate(apiKey) {
// ตรวจสอบว่า apiKey ถูกต้องหรือไม่
if (apiKey === "YOUR_API_KEY") {
return true;
} else {
return false;
}
}
// Authorization (ตัวอย่างง่ายๆ)
function authorize(userRole, resource) {
// ตรวจสอบว่า userRole มีสิทธิ์เข้าถึง resource นี้หรือไม่
if (userRole === "admin" || resource === "public") {
return true;
} else {
return false;
}
}
Rate Limiting คือการจำกัดจำนวนครั้งที่ User สามารถเรียก API ได้ในระยะเวลาที่กำหนด เพื่อป้องกันการโจมตีแบบ Denial of Service (DoS) หรือการใช้งาน API เกินขีดจำกัด
สมัยพี่ทำร้านเน็ต เคยมีลูกค้าโหลด BitTorrent ทั้งวันทั้งคืน ทำให้เน็ตคนอื่นช้า พี่เลยต้องจำกัด Bandwidth ของแต่ละเครื่อง Rate Limiting ก็คล้ายๆ กัน แต่ทำกับ API แทน
Input Validation คือการตรวจสอบข้อมูลที่ User ส่งเข้ามา ว่าถูกต้องตามรูปแบบที่กำหนดหรือไม่ เพื่อป้องกันการโจมตีแบบ Injection เช่น SQL Injection หรือ Cross-Site Scripting (XSS)
ดูวิดีโอเพิ่มเติมเกี่ยวกับApi Gateway Security Best Practices:
จริงๆ แล้วมีทางเลือกอื่นในการรักษาความปลอดภัย API นอกจาก Api Gateway นะ แต่ละทางเลือกก็มีข้อดีข้อเสียแตกต่างกันไป
สมัยก่อนที่ยังไม่มี Api Gateway พี่เคยเขียน Code ตรวจสอบ Security เองทุก API ซึ่งมันเสียเวลามาก Api Gateway เลยเข้ามาช่วยให้ชีวิตง่ายขึ้นเยอะ
| ทางเลือก | ข้อดี | ข้อเสีย |
|---|---|---|
| Api Gateway | รวม Security ไว้ที่เดียว, จัดการง่าย, Scaling ง่าย | อาจมีค่าใช้จ่าย, ต้องเรียนรู้การใช้งาน |
| Custom Security Code | ยืดหยุ่นสูง, ควบคุมได้ทุกอย่าง | เสียเวลาพัฒนา, ดูแลรักษายาก, มีโอกาสผิดพลาดสูง |
| Web Application Firewall (WAF) | ป้องกันการโจมตีระดับ Web Application | อาจจะไม่ครอบคลุมทุกด้านของ API Security |
น้องๆ ลองพิจารณาดูนะ ว่าทางเลือกไหนเหมาะสมกับระบบของตัวเองมากที่สุด ที่สำคัญคือต้องเข้าใจข้อดีข้อเสียของแต่ละทางเลือก SiamCafe Blog มีบทความเกี่ยวกับ Security อีกเยอะ ลองเข้าไปอ่านดูได้
สุดท้ายนี้ อย่าลืมอัพเดท Security Patch ของ Api Gateway และ Software อื่นๆ ที่เกี่ยวข้องอยู่เสมอ เพราะ Hacker ก็พัฒนาวิธีการโจมตีอยู่ตลอดเวลา เราต้องตามให้ทัน
หวังว่าบทความนี้จะเป็นประโยชน์กับน้องๆ นะ ถ้ามีคำถามอะไร ถามพี่ได้เลย หรือเข้าไปอ่านบทความอื่นๆ ใน SiamCafe Blog ได้เลยนะ
# ตัวอย่าง configuration ใน nginx
http {
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=5r/s;
server {
location /api/ {
limit_req zone=mylimit burst=10 nodelay;
proxy_pass http://backend_server;
}
}
}
ง่ายๆ คือ กำหนดว่า IP นึงส่ง request ได้กี่ครั้งต่อวินาที ถ้าเกินก็ block ไปเลย
# ตัวอย่างการใช้ JWT (JSON Web Token)
# ใน backend server (pseudo-code)
function verify_token(token):
try:
payload = decode_jwt(token, secret_key)
user_id = payload['user_id']
roles = payload['roles']
return user_id, roles
except:
return None, None
JWT นี่แหละ ตัวช่วยสำคัญในการจัดการ authentication และ authorization
# ตัวอย่าง validation ใน Python (Flask)
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/api/users', methods=['POST'])
def create_user():
data = request.get_json()
if not data or 'username' not in data or 'email' not in data:
return jsonify({'error': 'Missing required fields'}), 400
username = data['username']
email = data['email']
if not isinstance(username, str) or len(username) < 3:
return jsonify({'error': 'Invalid username'}), 400
if '@' not in email:
return jsonify({'error': 'Invalid email'}), 400
# ... สร้าง user ใน database ...
return jsonify({'message': 'User created successfully'}), 201
Validation นี่สำคัญกว่าที่คิดนะ ป้องกันได้หลายอย่างเลย
| API Gateway | Open Source? | เหมาะกับ |
|---|---|---|
| Kong | Yes | Microservice architecture |
| Apigee | No | Enterprise-level API management |
| AWS API Gateway | No | AWS-based applications |