ذكري المظهر

تأمين nginx مع دعونا تشفير على أوبونتو 16.04

الدورة العربية لادارة السيرفرات لينوكس VPS Linux Nginx PHP Mysql

الدورة العربية لادارة السيرفرات لينوكس VPS Linux Nginx PHP Mysql

جدول المحتويات:

Anonim

Let's Encrypt هي مرجع شهادات مجاني ومفتوح تم تطويره بواسطة مجموعة أبحاث أمان الإنترنت (ISRG). الشهادات التي تصدرها Let's Encrypt موثوقة من قِبل جميع المتصفحات تقريبًا اليوم.

في هذا البرنامج التعليمي ، سنقدم إرشادات خطوة بخطوة حول كيفية تأمين Nginx باستخدام Let's Encrypt باستخدام أداة certbot على Ubuntu 16.04.

المتطلبات الأساسية

تأكد من أنك استوفيت الشروط التالية قبل المتابعة مع هذا البرنامج التعليمي:

  • لديك اسم مجال يشير إلى خادم IP العام الخاص بك. في هذا البرنامج التعليمي ، سنستخدم example.com . لديك تثبيت Nginx باتباع كيفية تثبيت Nginx على Ubuntu 16.04.

تثبيت Certbot

Certbot هي أداة مساعدة مكتوبة بلغة بيثون يمكنها أتمتة المهام للحصول على وتجديد شهادات دعونا تشفير SSL وتكوين خوادم الويب.

أولاً ، قم بتثبيت الحزمة software-properties-common التي توفر أداة add-apt-repository اللازمة لإضافة PPAs إضافية.

قم بتحديث فهرس الحزم وتثبيت software-properties-common مع:

sudo apt update sudo apt install software-properties-common

بمجرد اكتمال التثبيت ، أضف مستودع certbot PPA إلى نظامك باستخدام الأمر التالي:

sudo add-apt-repository ppa:certbot/certbot

قم بتحديث قائمة الحزم وتثبيت حزمة certbot:

sudo apt update sudo apt install certbot

إنشاء مجموعة قوية Dh (ديفي هيلمان)

يعد Diffie – Hellman key exchange (DH) طريقة لتبادل آمن لمفاتيح التشفير عبر قناة اتصال غير آمنة. إنشاء مجموعة جديدة من معلمات DH 2048 بت لتعزيز الأمن:

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048 إذا أردت ، يمكنك تغيير الحجم إلى 4096 بت ، لكن في هذه الحالة ، قد يستغرق الجيل أكثر من 30 دقيقة اعتمادًا على إنتروبيا النظام.

الحصول على شهادة دعونا تشفير SSL

للحصول على شهادة طبقة المقابس الآمنة لنطاقنا ، سنستخدم مكوّن Webroot الإضافي الذي يعمل عن طريق إنشاء ملف مؤقت للتحقق من صحة النطاق المطلوب في دليل ${webroot-path}/.well-known/acme-challenge . يقوم خادم Let's Encrypt بإرسال طلبات HTTP إلى الملف المؤقت للتحقق من أن المجال المطلوب يحل إلى الخادم حيث يتم تشغيل certbot.

ولجعل الأمر أكثر بساطة ، سنقوم بتعيين جميع طلبات HTTP الخاصة بـ .well-known/acme-challenge إلى دليل واحد ، /var/lib/letsencrypt .

ستنشئ الأوامر التالية الدليل وتجعله قابلاً للكتابة لخادم Nginx.

mkdir -p /var/lib/letsencrypt/.well-known chgrp www-data /var/lib/letsencrypt chmod g+s /var/lib/letsencrypt

لتجنب تكرار الشفرة ، قم بإنشاء المقترضين التاليين اللذين سنقوم بإدراجهما في جميع ملفات كتلة خادم Nginx.

/etc/nginx/snippets/letsencrypt.conf

location ^~ /.well-known/acme-challenge/ { allow all; root /var/lib/letsencrypt/; default_type "text/plain"; try_files $uri =404; } /etc/nginx/snippets/ssl.conf

ssl_dhparam /etc/ssl/certs/dhparam.pem; ssl_session_timeout 1d; ssl_session_cache shared:SSL:50m; ssl_session_tickets off; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS'; ssl_prefer_server_ciphers on; ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 8.8.4.4 valid=300s; resolver_timeout 30s; add_header Strict-Transport-Security "max-age=15768000; includeSubdomains; preload"; add_header X-Frame-Options SAMEORIGIN; add_header X-Content-Type-Options nosniff;

يشتمل المقتطف أعلاه على الخلاصة الموصى بها من قِبل Mozilla ، وتمكين OCSP Stapling ، HTTP Strict Transport Security (HSTS) ويفرض القليل من رؤوس HTTP التي تركز على الأمان.

بمجرد إنشاء المقتطفات ، افتح كتلة خادم المجال وقم بتضمين مقتطف letsencrypt.conf كما هو موضح أدناه:

/etc/nginx/sites-available/example.com.conf

server { listen 80; server_name example.com www.example.com; include snippets/letsencrypt.conf; }

قم بتنشيط كتلة الخادم عن طريق إنشاء رابط رمزي من sites-available إلى sites-enabled :

sudo ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled/example.com.conf

أعد تحميل تكوين Nginx لتصبح التغييرات نافذة المفعول:

sudo systemctl reload nginx

قم بتشغيل البرنامج النصي certbot باستخدام المكون الإضافي webroot والحصول على ملفات شهادة SSL:

sudo certbot certonly --agree-tos --email [email protected] --webroot -w /var/lib/letsencrypt/ -d example.com -d www.example.com

إذا تم الحصول على شهادة SSL بنجاح ، فسوف يقوم certbot بطباعة الرسالة التالية:

IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/example.com/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/example.com/privkey.pem Your cert will expire on 2018-04-23. 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" - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF:

الآن بعد أن أصبح لدينا ملفات الشهادة ، قم بتحرير كتلة خادم المجال كما يلي:

/etc/nginx/sites-available/example.com.conf

server { listen 80; server_name www.example.com example.com; include snippets/letsencrypt.conf; return 301 https://$host$request_uri; } server { listen 443 ssl http2; server_name www.example.com; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem; include snippets/ssl.conf; include snippets/letsencrypt.conf; return 301 https://example.com$request_uri; } server { listen 443 ssl http2; server_name example.com; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem; include snippets/ssl.conf; include snippets/letsencrypt.conf; #… other code }

من خلال التكوين أعلاه ، فإننا نلزم HTTPS ونعيد توجيه إصدار www من المجال إلى الإصدار non www .

أعد تحميل خدمة Nginx لتصبح التغييرات نافذة المفعول:

sudo systemctl reload nginx

تجديد شهادة SSL

شهادات تشفير دعونا صالحة لمدة 90 يوما. لتجديد الشهادات تلقائيًا قبل انتهاء صلاحيتها ، تنشئ حزمة certbot cronjob والتي ستعمل مرتين يوميًا وستجدد تلقائيًا أي شهادة قبل 30 يومًا من انتهاء صلاحيتها.

نظرًا لأننا نستخدم البرنامج المساعد certbot webroot بمجرد تجديد الشهادة ، يتعين علينا أيضًا إعادة تحميل خدمة nginx. للقيام بذلك إلحاق --renew-hook "systemctl reload nginx" إلى ملف /etc/cron.d/certbot بحيث يبدو كما يلي:

/etc/cron.d/certbot

0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && certbot -q renew --renew-hook "systemctl reload nginx"

لاختبار عملية التجديد ، استخدم مفتاح --dry-run :

sudo certbot renew --dry-run

إذا لم تكن هناك أخطاء ، فهذا يعني أن عملية التجديد كانت ناجحة.

استنتاج

في هذا البرنامج التعليمي ، استخدمت عميل Let's Encrypt ، certbot للحصول على شهادات SSL لنطاقك. لقد أنشأت أيضًا مقتطفات Nginx لتجنب تكرار الشفرة وقمت بتهيئة Nginx لاستخدام الشهادات. في نهاية البرنامج التعليمي ، قمت بإعداد cronjob لتجديد الشهادة تلقائيًا.

دعونا نحقق nginx ubuntu certbot ssl