ค้นหาเว็บไซต์

วิธีรักษาความปลอดภัย Nginx ด้วย SSL และเข้ารหัสใน FreeBSD


ในคู่มือนี้ เราจะพูดถึงวิธีการรักษาความปลอดภัยเว็บเซิร์ฟเวอร์ Nginx ใน FreeBSD ด้วยใบรับรอง TLS/SSL ที่นำเสนอโดย Let's Encrypt Certificate อำนาจ. นอกจากนี้เรายังจะแสดงวิธีต่ออายุใบรับรอง Lets 'Encrypt โดยอัตโนมัติก่อนวันหมดอายุ

TLS เป็นตัวย่อสำหรับ Transport Layer Security เป็นโปรโตคอลที่ทำงานภายใต้โปรโตคอล HTTP และใช้ใบรับรองและคีย์เพื่อห่อหุ้มแพ็กเก็ตและ เข้ารหัสข้อมูลที่แลกเปลี่ยนระหว่างเซิร์ฟเวอร์และไคลเอนต์ หรือในกรณีนี้ระหว่างเว็บเซิร์ฟเวอร์ Nginx และเบราว์เซอร์ของไคลเอนต์ เพื่อความปลอดภัยในการเชื่อมต่อ ดังนั้นบุคคลที่สามซึ่งอาจขัดขวางการรับส่งข้อมูลไม่สามารถถอดรหัสได้ การส่งผ่าน

อ่านเพิ่มเติม: ติดตั้ง Let's Encrypt สำหรับ Apache บน FreeBSD

กระบวนการรับใบรับรอง Let's Encrypt ฟรีใน FreeBSD สามารถทำให้ง่ายขึ้นอย่างมากโดยการติดตั้งยูทิลิตี้ไคลเอนต์ certboot ซึ่งเป็นไคลเอนต์ Let's Encrypt อย่างเป็นทางการที่ใช้ สำหรับการสร้างและดาวน์โหลดใบรับรอง

ความต้องการ

  1. ติดตั้งสแต็ก FBEMP (Nginx, MariaDB และ PHP) ใน FreeBSD

ขั้นตอนที่ 1: กำหนดค่า Nginx TLS/SSL

1. ตามค่าเริ่มต้น การกำหนดค่าเซิร์ฟเวอร์ TLS/SSL ไม่ได้เปิดใช้งานใน FreeBSD เนื่องจากคำสั่งบล็อกเซิร์ฟเวอร์ TLS ถูกแสดงความคิดเห็นในไฟล์การกำหนดค่าเริ่มต้นของ Nginx

ในการเปิดใช้งานเซิร์ฟเวอร์ TLS ใน Nginx ให้เปิดไฟล์การกำหนดค่า nginx.conf ค้นหาบรรทัดที่กำหนดจุดเริ่มต้นของ เซิร์ฟเวอร์ SSL และอัปเดตทั้งบล็อกให้มีลักษณะเหมือนในตัวอย่างด้านล่าง

nano /usr/local/etc/nginx/nginx.conf

ข้อความที่ตัดตอนมาจากบล็อก Nginx HTTPS:

server {
       listen 443 ssl  default_server;
       server_name  www.yourdomain.com;
	
	access_log /var/log/nginx/access.log;
	error_log /var/log/nginx/error.log;
	error_page   500 502 503 504  /50x.html;
        
	location = /50x.html {
            root   /usr/local/www/nginx-dist;
        }
	
	location / {
	    root   /usr/local/www/nginx;
       	    index  index.html index.htm;
	    try_files $uri $uri/ /index.php?$args;
				}

	ssl_certificate "/usr/local/etc/letsencrypt/live/www.yourdomain.com/cert.pem";
	ssl_certificate_key "/usr/local/etc/letsencrypt/live/www.yourdomain.com/privkey.pem";
	ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
	ssl_dhparam /usr/local/etc/nginx/dhparam.pem;
	ssl_session_cache shared:SSL:1m;
	ssl_session_timeout 10m;
	ssl_ciphers HIGH:!aNULL:!MD5;
	ssl_prefer_server_ciphers  on;

	# Use gzip compression
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 5;
gzip_buffers 16 8k;
gzip_http_version 1.0;

	# Set a variable to work around the lack of nested conditionals
	
	set $cache_uri $request_uri;
	
	location ~ /.well-known {
	allow all;
		}
    


        location ~ \.php$ {
        root	/usr/local/www/nginx;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        #fastcgi_param  SCRIPT_FILENAME /scripts$fastcgi_script_name;
        fastcgi_param SCRIPT_FILENAME $request_filename;    
		include        fastcgi_params;
        }	
    }

บล็อกด้านบน นอกเหนือจากบล็อก SSL แล้ว ยังมีคำสั่งบางส่วนสำหรับเปิดใช้งานการบีบอัด gzip และ FastCGI Process Manager ซึ่งใช้สำหรับส่งโค้ด PHP ไปยัง PHP-FPM< เกตเวย์เพื่อเรียกใช้เว็บแอปพลิเคชันแบบไดนามิก

หลังจากที่คุณเพิ่มโค้ดด้านบนลงในไฟล์การกำหนดค่าหลัก Nginx แล้ว อย่ารีสตาร์ท daemon หรือใช้การตั้งค่าก่อนที่จะติดตั้งและรับใบรับรอง Let's Encrypt สำหรับโดเมนของคุณ

ขั้นตอนที่ 2: ติดตั้งไคลเอนต์ Certbot ใน FreeBSD

2. กระบวนการติดตั้งยูทิลิตี้ไคลเอนต์ Let's Encrypt certbot ใน FreeBSD เกี่ยวข้องกับการดาวน์โหลดซอร์สโค้ดสำหรับ py-certbot และคอมไพล์ในเครื่องโดยการออก คำสั่งด้านล่าง

cd /usr/ports/security/py-certbot
make install clean

3. การคอมไพล์ยูทิลิตี py-certbot ใช้เวลานานมากเมื่อเทียบกับการติดตั้งแพ็คเกจไบนารีทั่วไป ในช่วงเวลานี้ จำเป็นต้องดาวน์โหลดชุดการขึ้นต่อกันเพื่อคอมไพล์ใน FreeBSD

นอกจากนี้ ชุดข้อความแจ้งเตือนจะปรากฏบนหน้าจอของคุณ โดยขอให้คุณเลือกแพ็คเกจที่จะใช้ในเวลารวบรวมสำหรับการขึ้นต่อกันแต่ละครั้ง ที่หน้าจอแรก ให้เลือกเครื่องมือต่อไปนี้โดยกดปุ่ม [space] เพื่อรวบรวมการขึ้นต่อกันของ python27 ดังที่แสดงในภาพด้านล่าง

  • IPV6
  • ลิฟฟี่
  • สนช
  • พีมัลลอค
  • ด้าย
  • UCS4 สำหรับการสนับสนุน Unicode

4. ถัดไป เลือก DOCS และ THREADS สำหรับการพึ่งพา gettext-tools แล้วกด ตกลง เพื่อดำเนินการต่อดังภาพด้านล่าง

5. ในหน้าจอถัดไป ปล่อยให้ตัวเลือก TESTS ปิดการใช้งานสำหรับ libffi-3.2.1 และกด ตกลง เพื่อย้าย ไกลออกไป.

6. จากนั้นกด space เพื่อเลือก DOCS สำหรับการขึ้นต่อกันของ py27-enum34 ซึ่งจะติดตั้งเอกสารประกอบสำหรับสิ่งนี้ เครื่องมือ แล้วกด ตกลง เพื่อดำเนินการต่อ ดังที่แสดงในภาพหน้าจอด้านล่าง

7. สุดท้าย เลือกที่จะติดตั้งตัวอย่างตัวอย่างสำหรับการพึ่งพา py27-openssl โดยการกดปุ่ม [space] แล้วกด ตกลง เพื่อเสร็จสิ้นกระบวนการรวบรวมและติดตั้งสำหรับไคลเอนต์ py-certbot

8. หลังจากกระบวนการคอมไพล์และติดตั้งยูทิลิตี้ py-certbot เสร็จสิ้น ให้รันคำสั่งด้านล่างเพื่ออัปเกรดเครื่องมือเป็นเวอร์ชันล่าสุดของแพ็คเกจดังที่แสดงใน ด้านล่างภาพหน้าจอ

pkg install py27-certbot

9. เพื่อหลีกเลี่ยงปัญหาบางอย่างที่อาจเกิดขึ้นขณะรับใบรับรอง Let's Encrypt ฟรี ข้อผิดพลาดที่พบบ่อยที่สุดคือ “pkg_resources.DistributionNotFound ” ตรวจสอบให้แน่ใจว่ามีการขึ้นต่อกันสองรายการต่อไปนี้อยู่ในระบบของคุณด้วย: py27-salt และ py27-acme

pkg install py27-salt
pkg install py27-acme

ขั้นตอนที่ 3: ติดตั้ง Let's Encrypt Certificate สำหรับ Nginx บน FreeBSD

10. หากต้องการรับใบรับรอง Let's Encrypt แบบสแตนด์อโลนสำหรับโดเมนของคุณ ให้เรียกใช้คำสั่งต่อไปนี้และระบุชื่อโดเมนและโดเมนย่อยทั้งหมดที่คุณต้องการรับใบรับรองโดยระบุ -d ธง

certbot certonly --standalone -d yourdomain.com -d www.yourdomain.com

11. ในขณะที่สร้างใบรับรอง คุณจะถูกขอให้ป้อนที่อยู่อีเมลของคุณและยอมรับข้อกำหนดในการให้บริการของ Let's Encrypt พิมพ์ a จากแป้นพิมพ์เพื่อยอมรับและดำเนินการต่อ จากนั้นระบบจะถามว่าคุณยินดีที่จะแชร์ที่อยู่อีเมลของคุณกับพันธมิตร Let's Encrypt หรือไม่

ในกรณีที่คุณไม่ต้องการเปิดเผยที่อยู่อีเมลของคุณ เพียงพิมพ์คำ no ในข้อความแจ้งแล้วกดปุ่ม [enter] เพื่อดำเนินการต่อ หลังจากได้รับใบรับรองสำหรับโดเมนของคุณเรียบร้อยแล้ว คุณจะได้รับหมายเหตุสำคัญซึ่งจะแจ้งให้คุณทราบว่าใบรับรองถูกจัดเก็บไว้ที่ใดในระบบของคุณและหมดอายุเมื่อใด

12. ในกรณีที่คุณต้องการได้รับใบรับรอง Let's Encrypt โดยใช้ปลั๊กอิน “webroot” โดยการเพิ่มไดเร็กทอรี webroot ของเซิร์ฟเวอร์ Nginx สำหรับโดเมนของคุณ ให้ใช้คำสั่งต่อไปนี้ด้วยแฟล็ก --webroot และ -w ตามค่าเริ่มต้น หากคุณไม่ได้เปลี่ยนเส้นทาง Nginx webroot ควรอยู่ในเส้นทางระบบ /usr/local/www/nginx/

certbot certonly --webroot -w /usr/local/www/nginx/ -d yourdomain.com -d www.yourdomain.com

เช่นเดียวกับในขั้นตอน --strandalone สำหรับการขอรับใบรับรอง ขั้นตอน --webroot จะขอให้คุณระบุที่อยู่อีเมลสำหรับการต่ออายุใบรับรองและประกาศด้านความปลอดภัย เพื่อกด a เพื่อยอมรับข้อกำหนดและเงื่อนไขของ Let's Encrypt และ no หรือ yes หรือไม่เปิดเผยที่อยู่อีเมล Let's Encrypt Partners ดังที่แสดงในตัวอย่างด้านล่าง

โปรดทราบว่าไคลเอนต์ Certbot สามารถตรวจจับที่อยู่อีเมลปลอมได้ และจะไม่อนุญาตให้คุณสร้างใบรับรองต่อไปจนกว่าคุณจะระบุที่อยู่อีเมลจริง

ตัวอย่างเซอร์บอต:
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel):[email   #A fake email address will be detected
There seem to be problems with that address. Enter email address (used for
urgent renewal and security notices)  If you really want to skip this, you can
run the client with --register-unsafely-without-email but make sure you then
backup your account key from /etc/letsencrypt/accounts   (Enter 'c' to cancel):[email 

-------------------------------------------------------------------------------
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf. You must agree
in order to register with the ACME server at
https://acme-v01.api.letsencrypt.org/directory
-------------------------------------------------------------------------------
(A)gree/(C)ancel: a ------------------------------------------------------------------------------- Would you be willing to share your email address with the Electronic Frontier Foundation, a founding partner of the Let's Encrypt project and the non-profit organization that develops Certbot? We'd like to send you email about EFF and our work to encrypt the web, protect its users and defend digital rights. ------------------------------------------------------------------------------- (Y)es/(N)o: n Obtaining a new certificate Performing the following challenges: http-01 challenge for www.domain.com Using the webroot path /usr/local/www/nginx/ for all unmatched domains. Waiting for verification... Cleaning up challenges IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at /usr/local/etc/letsencrypt/live/www.yourdomain.com/fullchain.pem. Your cert will expire on 2017-12-28. To obtain a new or tweaked version of this certificate in the future, simply run certbot again. To non-interactively renew *all* of your certificates, run "certbot renew" - Your account credentials have been saved in your Certbot configuration directory at /usr/local/etc/letsencrypt. You should make a secure backup of this folder now. This configuration directory will also contain certificates and private keys obtained by Certbot so making regular backups of this folder is ideal. - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le

ขั้นตอนที่ 4: อัปเดตใบรับรอง Nginx TLS

13. ตำแหน่งของใบรับรองและคีย์ Let's Encrypt ที่ได้รับใน FreeBSD คือเส้นทางของระบบ /usr/local/etc/letsencrypt/live/www.yourdomain.com/ คำสั่ง ls เพื่อแสดงส่วนประกอบของใบรับรอง Let's Encrypt ของคุณ: ไฟล์ลูกโซ่ ไฟล์ fullchain คีย์ส่วนตัว และไฟล์ใบรับรอง ดังแสดงในตัวอย่างต่อไปนี้

ls /usr/local/etc/letsencrypt/live/www.yourdomain.com/

14. ในการติดตั้งใบรับรอง Let's Encrypt สำหรับโดเมนของคุณในเว็บเซิร์ฟเวอร์ Nginx ให้เปิดไฟล์การกำหนดค่าหลักของ Nginx หรือไฟล์การกำหนดค่าสำหรับเซิร์ฟเวอร์ Nginx TLS ในกรณีที่เป็นไฟล์แยกต่างหาก และแก้ไขบรรทัดด้านล่าง เพื่อสะท้อนถึงเส้นทางของ Let's Encrypt ที่ออกใบรับรองดังภาพด้านล่าง

nano /usr/local/etc/nginx/nginx.conf

อัปเดตบรรทัดต่อไปนี้ให้มีลักษณะเหมือนในตัวอย่างนี้:

ssl_certificate "/usr/local/etc/letsencrypt/live/www.yourdomain.com/cert.pem";
	ssl_certificate_key "/usr/local/etc/letsencrypt/live/www.yourdomain.com/privkey.pem";

15. นอกจากนี้ หากมีบรรทัด ssl_dhparam อยู่ในการกำหนดค่า Nginx SSL คุณควรสร้างบิต 2048 ใหม่ คีย์ Diffie–Hellman พร้อมด้วยคำสั่งต่อไปนี้:

openssl dhparam –out /usr/local/etc/nginx/dhparam.pem 2048 

16. สุดท้ายนี้ เพื่อเปิดใช้งานการกำหนดค่า Nginx TLS ขั้นแรกให้ตรวจสอบการกำหนดค่าส่วนกลางของ Nginx เพื่อหาข้อผิดพลาดทางไวยากรณ์ที่เป็นไปได้ จากนั้นรีสตาร์ทบริการ Nginx เพื่อใช้การกำหนดค่า SSL โดยออกคำสั่งต่อไปนี้

nginx -t
service nginx restart

17. ยืนยันว่า Nginx daemon เชื่อมโยงกับพอร์ต 443 หรือไม่โดยออกคำสั่งต่อไปนี้ซึ่งสามารถแสดงรายการซ็อกเก็ตเครือข่ายที่เปิดอยู่ทั้งหมดในระบบในสถานะการฟัง

netstat -an -p tcp| grep LISTEN
sockstat -4 

18. คุณยังสามารถเยี่ยมชมที่อยู่โดเมนของคุณผ่านโปรโตคอล HTTPS โดยเปิดเบราว์เซอร์และพิมพ์ที่อยู่ต่อไปนี้เพื่อยืนยันว่าใบรับรอง Let’s Encrypt ทำงานตามที่คาดไว้ เนื่องจากคุณใช้ใบรับรองที่สร้างโดยผู้ออกใบรับรองที่ถูกต้อง จึงไม่ควรแสดงข้อผิดพลาดในเบราว์เซอร์

https://www.yourdomain.com

19. ยูทิลิตี้ Openssl ยังช่วยให้คุณค้นหาข้อมูลเกี่ยวกับใบรับรองที่ได้รับจาก Let's Encrypt CA โดยการรันคำสั่งด้วยตัวเลือกต่อไปนี้

openssl s_client -connect www.yourdomain.com:443

ในกรณีที่คุณต้องการบังคับให้ Nginx ส่งคำขอ http ทั้งหมดไปยัง https ที่ได้รับสำหรับโดเมนของคุณบนพอร์ต 80 ไปยัง HTTPS ให้เปิดไฟล์การกำหนดค่า Nginx ค้นหาคำสั่งเซิร์ฟเวอร์สำหรับพอร์ต 80 และเพิ่มบรรทัดด้านล่างหลังคำสั่ง server_name ดังแสดงในตัวอย่างด้านล่าง

rewrite ^(.*) https://www.yourdomain.com$1 permanent;

20. การตั้งค่าการต่ออายุอัตโนมัติสำหรับใบรับรองที่ออกโดยหน่วยงาน Let's Encrypt ก่อนที่จะหมดอายุ สามารถทำได้โดยการกำหนดเวลาให้งาน cron ทำงานวันละครั้งโดยออกคำสั่งต่อไปนี้

crontab -e

งาน Cron เพื่อต่ออายุใบรับรอง

0 0 * * * certbot renew >> /var/log/letsencrypt.log

นั่นคือทั้งหมด! ขณะนี้ Nginx สามารถให้บริการเว็บแอปพลิเคชันที่ปลอดภัยแก่ผู้เยี่ยมชมของคุณโดยใช้ใบรับรอง Let's Encrypt ฟรี