NGINX คือ ตอนที่ 7 : ความปลอดภัย (Security) ใน NGINX

  1. การจำกัดการเข้าถึง (Limiting Access) ทรัพยากรบางอย่าง
  2. การกำหนดค่าการจำกัดอัตรา (Rate Limiting)
  3. ลดการโจมตี HTTP
  4. HTTP Strict Transport Security (HSTS)
  5. รักษาความปลอดภัย NGINX ด้วยนโยบายความปลอดภัยเนื้อหา (CSP)

ในฐานะที่เป็นส่วนสำคัญของระบบนิเวศของการทำเว็บและทำแอพ NGINX ซึ่งเป็นเว็บเซิร์ฟเวอร์แบบโอเพ่นซอร์ส รีเวิร์สพร็อกซีเซิร์ฟเวอร์ และโหลดบาลานเซอร์ มีบทบาทสำคัญในการทำงานที่ราบรื่นของโครงสร้างพื้นฐานส่วนใหญ่ของอินเทอร์เน็ต อย่างไรก็ตาม ควบคู่ไปกับความนิยม การรับประกันความปลอดภัยกลายเป็นประเด็นสำคัญ โดยเฉพาะอย่างยิ่งสำหรับนักพัฒนาเว็บและแอป บทความนี้นำเสนอคำแนะนำในการเสริมความปลอดภัยใน NGINX เพื่อให้แน่ใจว่าการทำเว็บและทำแอพของคุณยังคงปลอดภัย

1. การจำกัดการเข้าถึง (Limiting Access) ทรัพยากรบางอย่าง

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

วิธีที่พบมากที่สุดคือการใช้คำสั่ง allow และ deny คำสั่งเหล่านี้สามารถใช้ได้ในบริบทของบล็อก location, directory, files, และ location ตัวอย่างเช่น หากต้องการจำกัดการเข้าถึง IP หนึ่ง นักพัฒนาสามารถใช้:

location /restricted_area/ {
  allow 192.168.1.1;
  deny all;
}

ในตัวอย่างนี้ เฉพาะที่อยู่ IP 192.168.1.1 เท่านั้นที่จะสามารถเข้าถึงไดเรกทอรี restricted_area ได้ IP อื่นๆ ทั้งหมดจะถูกปฏิเสธ

2. การกำหนดค่าการจำกัดอัตรา (Rate Limiting)

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

http {
  limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

  server {
    location /login/ {
      limit_req zone=one burst=5;
    }
  }
}

ที่นี่คำสั่ง limit_req_zone กำหนดโซนหน่วยความจำที่ใช้ร่วมกันที่เรียก one และกำหนดอัตราหนึ่งคำขอต่อวินาที จากนั้น คำสั่ง limit_req จะใช้โซนนี้ในบล็อก /login/ ตำแหน่ง และพารามิเตอร์ burst=5 จะอนุญาตให้ส่งคำขอได้สูงสุด 5 รายการพร้อมกัน ซึ่งจะถูกจัดคิวไว้

3. ลดการโจมตี HTTP

การโจมตีระดับ HTTP เช่น Slowloris และ DDoS เป็นภัยคุกคามทั่วไปที่นักพัฒนาเว็บและแอปต้องจัดการในการทำเว็บและทำแอพ การโจมตีเหล่านี้ออกแบบมาเพื่อครอบงำเซิร์ฟเวอร์โดยเปิดการเชื่อมต่อให้มากที่สุดเท่าที่จะเป็นไปได้ให้นานที่สุด ซึ่งอาจทำให้เกิดปัญหาด้านประสิทธิภาพที่รุนแรงได้

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

http {
  client_body_timeout 10;
  client_header_timeout 10;
  keepalive_timeout 5 5;
  send_timeout 10;
}

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

นอกจากนี้ เพื่อต่อสู้กับการโจมตี DDoS limit_connสามารถใช้คำสั่งได้ คำสั่งนี้อนุญาตให้นักพัฒนาจำกัดจำนวนการเชื่อมต่อพร้อมกันสำหรับเซสชันหรือคีย์ที่กำหนด:

http {
  limit_conn_zone $binary_remote_addr zone=addr:10m;

  server {
    location /download/ {
      limit_conn addr 1;
    }
  }
}

ในตัวอย่างนี้คำสั่ง limit_conn_zone กำหนดโซนหน่วยความจำที่ใช้ร่วมกันที่เรียกว่า addr ที่เก็บสถานะของที่อยู่ IP ของไคลเอ็นต์แต่ละรายการ จากนั้น คำสั่ง limit_conn จะจำกัดจำนวนการเชื่อมต่อต่อที่อยู่ IP ไว้ที่หนึ่งบล็อก /download/ ตำแหน่ง

4. HTTP Strict Transport Security (HSTS)

HTTP Strict Transport Security (HSTS) เป็นคุณลักษณะด้านความปลอดภัยที่บอกให้เบราว์เซอร์ขอหน้า HTTPS โดยอัตโนมัติ แม้ว่าผู้ใช้จะป้อน http ในแถบตำแหน่งเบราว์เซอร์ก็ตาม นอกจากนี้ยังไม่อนุญาตให้ผู้ใช้ข้ามข้อความเตือน นี่คือวิธีการตั้งค่าใน NGINX:

server {
  listen 443 ssl;
  server_name mywebsite.com;

  ssl_certificate /etc/nginx/ssl/mywebsite.com.crt;
  ssl_certificate_key /etc/nginx/ssl/mywebsite.com.key;

  add_header Strict-Transport-Security "max-age=31536000" always;
}

ในการกำหนดค่าข้างต้นคำสั่ง add_header จะเพิ่ม Strict-Transport-Security ส่วนหัวในการตอบกลับ หมายความว่านโยบาย max-age=31536000 HSTS จะมีผลบังคับใช้ในอีกหนึ่งปีข้างหน้า

5. รักษาความปลอดภัย NGINX ด้วยนโยบายความปลอดภัยเนื้อหา (CSP)

นโยบายความปลอดภัยของเนื้อหา (Content Security Policy) (CSP) เป็นส่วนหัวการตอบสนอง HTTP ที่จำกัดเบราว์เซอร์ไม่ให้โหลดเนื้อหาจากแหล่งอื่นนอกเหนือจากที่ระบุไว้อย่างชัดเจน สิ่งนี้ช่วยป้องกันการโจมตี Cross-Site Scripting (XSS) นี่คือตัวอย่างการตั้งค่า CSP พื้นฐาน:

server {
  add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline';";
}

ในการกำหนดค่านี้นโยบาย default-src 'self' หมายความว่าตามค่าเริ่มต้น ไซต์สามารถโหลดเนื้อหาจากต้นทางของตัวเองเท่านั้น นโยบาย script-src ระบุว่าสามารถโหลดสคริปต์ได้จากต้นทางของไซต์เท่านั้น และสามารถอินไลน์หรือประเมินได้ นโยบาย นี้อนุญาต style-src ให้โหลดสไตล์จากต้นทางของไซต์หรือเป็นแบบอินไลน์


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


NGINX คืออะไร

NGINX คือ ตอนที่ 6 : การกำหนดค่าขั้นสูง
NGINX คือ ตอนที่ 8 : NGINX Plus คืออะไร