วิธีตั้งค่า Nginx web server ให้ได้คะแนน A+ จาก ssllabs.com

การปรับแต่ง nginx webserver เพื่อให้เว็บไซต์ของเรามีความแข็งแรงและปลอดภัยมากยิ่งขึ้นด้วยคะแนน A+ จากเว็บไซต์ https://www.ssllabs.com หลังจากที่เราได้ทำการติดตั้ง ssl certificate เพื่อเปิดใช้งาน HTTPS ไปแล้วในบทความที่ผ่านมา HOW TO: การติดตั้ง SSL Certificates สำหรับ Nginx บน Docker container ต่อไปจะเป็นการปรับแต่ง nginx webserver เพื่อให้ได้คะแนน A+ ดังตัวอย่างจากเว็บไซต์ดังต่อไปนี้

ssllabs_com-www_google_com-result

ssllabs_com-www_sixcert_co-result

Requirements

  1. SSL Certificates file (.crt or .pem) ซึ่งที่เว็บไซต์ sixcert.co มีให้เลือกใช้งานหลากหลายตามความต้องการใช้งาน เช่น Domain Validated (DV), Organization Validated (OV), Extended Validation (EV), Wildcard (WC)
  2. Private Key file (.key)
  3. Docker Engine เพื่อให้ง่ายสำหรับการติดตั้ง
  4. Docker Compose
  5. Docker Images (nginx, php-fpm)

Project Layout

Getting Started

  1. หลังที่ได้ทำการติดตั้ง docker-engine และ docker-compose เรียบร้อยแล้วให้ทำการ download docker images (nginx, php-fpm) โดยใช้ command ดังนี้
    $ docker pull nginx
    $ docker pull php:7.2-fpm-alpine
    
  2. สร้างไฟล์ docker-compose.yaml เพื่อกำหนดค่าให้ container ต่างๆดังนี้
  3. สร้างไฟล์ nginx.conf สำหรับกำหนดค่าและปรับแต่ง nginx webserver ภายใต้ directory ./nginx/ ดังนี้

    คำอธิบาย

    • กำหนดค่า SSL โดยการเปิดใช้งานแค่ TLSv1.1 และ TLSv1.2 เท่านั้น กำหนด Ciphers เท่าที่ต้องการใช้งานเท่านั้นที่เหลือทำการปิดให้หมด
    • สำหรับใครที่ต้องการ enable ciphers เพื่อให้รองรับกับมาตรฐาน PCI DSS สามารถดูข้อมูลเพิ่มเติมได้จาก Nginx best practices
      ...
      # SSL Settings
      ssl_protocols TLSv1.1 TLSv1.2;
      ssl_prefer_server_ciphers on;
      ssl_ciphers EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH;
      ssl_ecdh_curve secp384r1;
      ssl_buffer_size 4k;
      ...
      
    • เปิดใช้งาน OCSP (Online Certificate Status Protocol) stapling เพื่อให้ nginx สามารถตรวจสอบสถานะ certificate จาก CA และส่ง status ให้กับ client พร้อม time stamp
      ...
      # OCSP Stapling
      ssl_stapling on;
      ssl_stapling_verify on;
      ssl_trusted_certificate /etc/nginx/ssl/trustchain.pem;
      resolver 8.8.8.8 8.8.4.4 valid=300s;
      resolver_timeout 5s;
      ...
      
    • เปิดใช้งาน HSTS (HTTP Strict Transport Security) เพื่อกำหนดให้ client ทำการ connect มาที่เว็บไซต์เราด้วย https เท่านั้น
      ...
      # Enable HSTS
      add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
      ...
      
  4. สร้างไฟล์ nginx vhost configuration สำหรับเว็บไซต์ของเราไว้ใน directory ./nginx-docker/nginx/conf.d/ ตัวอย่างเช่น vhost-sixcert_co.conf โดยมีข้อมูลดังนี้
  5. นำไฟล์ ssl certificate ที่ได้รับวางไว้ใน directory ./nginx-docker/nginx/ssl/ ซึ่งจะเป็น location ที่อยู่บน docker-engine
  6. ทำการ start container เพื่อทดสอบใช้งาน
    $ docker-compose up -d
    
  7. ตรวจสอบสถานะปัจจุบันของ container ที่ได้ทำการ start ดังนี้
    $ docker-compose ps
    
  8. สุดท้ายไปตรวจสอบผลการ configuration ของเราได้ที่ Qualys SSL Labsssllabs_com-website-2.png

Links

  1. Nginx Container
  2. PHP Container
  3. Qualys SSL Labs
  4. Generate Mozilla Security Recommended Web Server Configuration Files