Nginx Security Headers: เพิ่ม Security ให้เว็บไซต์บน VPS

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 ของคุณ