Security Headers คือ HTTP Response Headers ที่ Web Server ส่งกลับไปพร้อมกับทุก Response เพื่อแจ้ง Browser ว่าควรจัดการเนื้อหาและความปลอดภัยอย่างไร การตั้งค่า Security Headers ที่ถูกต้องบน Nginx ช่วยป้องกันการโจมตีหลายรูปแบบ เช่น Clickjacking, XSS, MIME-sniffing และอื่นๆ โดยไม่ต้องเปลี่ยนโค้ดใน Application เลย
X-Frame-Options: ป้องกัน Clickjacking
Clickjacking คือการโจมตีที่ผู้โจมตีนำเว็บไซต์ของคุณไป Embed อยู่ใน iframe สามารถหลอกให้ผู้ใช้คลิกสิ่งที่ไม่ตั้งใจได้ Header X-Frame-Options แก้ปัญหานี้ได้:
add_header X-Frame-Options "SAMEORIGIN" always;
# SAMEORIGIN = อนุญาตเฉพาะ Embed จาก Origin เดียวกัน
# DENY = ไม่อนุญาตให้ใคร Embed เลย
Content-Security-Policy (CSP): ป้องกัน XSS
CSP คือ Header ที่กำหนดว่า Browser สามารถโหลด Script, CSS, รูปภาพ และ Resource อื่นๆ จากแหล่งใดได้บ้าง ช่วยป้องกัน XSS (Cross-Site Scripting) ได้อย่างมีประสิทธิภาพ:
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:;" always;
คำอธิบายค่า: default-src 'self' หมายความว่าโดยค่าเริ่มต้นเอาเฉพาะจาก Domain ตัวเอง จากนั้นแต่ละ Directive สามารถกำหนดเพิ่มเติมได้ตามความต้องการ
HTTP Strict Transport Security (HSTS): บังคับ HTTPS
HSTS บอก Browser ว่าต้องเชื่อมต่อเว็บนี้ด้วย HTTPS เท่านั้น ไม่ยอมให้ Downgrade มาเป็น HTTP แม้ผู้ใช้พิมพ์ http:// โดยตรง:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
# max-age=31536000 = จำ HTTPS ไว้ 1 ปี
# includeSubDomains = ครอบคลุม Subdomain ทั้งหมด
# preload = ขอเป็นส่วนหนึ่งของ HSTS Preload List ใน Browser
X-Content-Type-Options, Referrer-Policy และ Permissions-Policy
X-Content-Type-Options ป้องกัน MIME-sniffing ที่ Browser คาดเดา Content-Type เองอาจทำให้แสดงไฟล์เป็นประเภทที่ไม่ใช่:
add_header X-Content-Type-Options "nosniff" always;
Referrer-Policy ควบคุมข้อมูล Referrer ที่ส่งออกไปเมื่อผู้ใช้คลิก Link ไปเว็บอื่น:
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
Permissions-Policy กำหนดว่าเว็บไซต์อนุญาตให้ Browser เข้าถึงสิทธิ์พิเศษอะไรบ้าง เช่น Geolocation, Camera, Microphone:
add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always;
ตัวอย่าง Nginx Server Block ที่มี Security Headers ครบทุกตัว
นำ Security Headers ทั้งหมดใส่ใน server Block ของ Nginx:
server {
listen 443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
# Security Headers
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:;" always;
add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always;
root /var/www/example.com/public;
index index.html index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
หลังแก้ไข Config ให้ทดสอบและ Reload Nginx:
nginx -t && systemctl reload nginx
วิธีทดสอบ Security Headers
หลังตั้งค่าเสร็จแล้ว ทดสอบด้วยวิธีเหล่านี้:
- securityheaders.com — ไปที่ https://securityheaders.com ใส่ URL เว็บไซต์ จะได้รับคะแนนตั้งแต่ F ถึง A+ พร้อมคำแนะนำผลแต่ละ Header
- Mozilla Observatory — https://observatory.mozilla.org วิเคราะห์ความปลอดภัยทั่วไปของเว็บ
- curl — ตรวจสอบ Headers ผ่าน Command Line:
curl -I https://example.com
- Linux Ubuntu/CentOS/Debian ที่สามารถติดตั้งและตั้งค่า Nginx ได้เลย
- Dedicated IP เพื่อติดตั้ง SSL/TLS Certificate แบบสมบูรณ์
- SLA 99.99% รับประกันความเสถียรสูงสุด
สรุป
การตั้งค่า Nginx Security Headers เป็นสิ่งที่คุ้มค่าและทำได้ง่ายในไฟล์ Config ไม่กี่บรรทัด สามารถเพิ่มประสิทธิภาพด้านความปลอดภัยของเว็บไซต์ได้อย่างมีนัยสำคัญ ใช้ X-Frame-Options ป้องกัน Clickjacking, CSP ป้องกัน XSS, HSTS บังคับ HTTPS และ Header อื่นๆ ร่วมกันสร้างบังเกอความปลอดภัยสูงสุดให้ผู้เข้าชมเว็บไซต์บน VPS ของคุณ
