GNU/Linux >> Belajar Linux >  >> Linux

Cara Mengamankan Nginx dengan Let's Encrypt SSL Certificate

Let's Encrypt adalah otoritas sertifikat (CA) gratis, open source dan otomatis yang dipelopori oleh Internet Security Research Group (ISRG) dan menawarkan sertifikat SSL/TLS untuk mengenkripsi komunikasi yang melibatkan dua pihak.

Sertifikat SSL di situs web Anda tidak hanya akan meningkatkan keamanan situs web Anda melalui enkripsi tetapi juga meningkatkan peringkat SEO situs Anda karena Google telah mewajibkan untuk menyertakan sertifikat SSL untuk peringkat SEO yang lebih baik.

Pada artikel ini, kami akan menanyakan cara mengamankan server NGINX dengan Let's Encrypt SSL certificate di Ubuntu 18.04.

Prasyarat

  • Anda memiliki hak istimewa untuk membuka sesi SSH di server Ubuntu 18.04 baik dengan menggunakan pengguna root atau dengan menggunakan pengguna yang mendukung sudo.
  • Anda telah menginstal NGINX dengan mengikuti tutorial kami dari sini.
  • Nama domain terdaftar.
  • DNS Catatan yang mengarah ke alamat IP server Anda berdasarkan nama domain yang ingin Anda gunakan.
Tutorial ini membutuhkan penggunaan nama domain. Setiap kali Anda melihat variabel SUBDOMAIN, DOMAIN, atau TLD, ganti dengan nilai Anda sendiri.

Instal Let's Encrypt Client library

Langkah pertama yang perlu Anda selesaikan adalah menginstal pustaka klien Let's Encrypt yang pada gilirannya akan digunakan untuk meminta sertifikat dari otoritas LE. Salah satu cara untuk melakukannya adalah dengan mengkloning library klien Let's Encrypt dari repositori resminya di server Anda.

Dimungkinkan juga untuk menginstal yang sama dari repositori resmi Ubuntu. Di repositori Ubuntu, pustaka klien dikenal sebagai certbot disediakan oleh pengembang Let's Encrypt. Tetapi kita akan memilih metode instalasi sebelumnya yaitu dengan mengkloning repositori Github dari Let's Encrypt.

Untuk melakukan itu, navigasikan ke folder instalasi yang Anda pilih dan klon repositori. Saya telah memilih folder instalasi sebagai /usr/local , Anda dapat memilih beberapa folder lain sesuai lingkungan Anda.


# apt-get install git
# cd /usr/local
# git clone https://github.com/letsencrypt/letsencrypt

Ubah ke folder letsencrypt, Anda akan menemukan semua folder dan file kloning termasuk certbot yang dibutuhkan oleh Let's encrypt untuk mengambilkan sertifikat untuk Anda.

Daftar Lets Encrypt Folder

Konfigurasi Let's Encrypt untuk memverifikasi domain Anda

Dalam proses mengambil sertifikat, klien Let's Encrypt membuat file sementara di .well-known/acme-challenge map. File ini berisi token untuk memvalidasi fakta bahwa Anda benar-benar memiliki domain yang ingin Anda ambil sertifikatnya. Ingat folder tersebut berada di bawah root web domain.

Oleh karena itu, sangat penting bahwa Let's Encrypt dapat mengakses file sementara untuk memverifikasi domain. Untuk memberikan akses, Anda perlu mengonfigurasi NGINX karena ini adalah pemilik root web untuk domain tersebut. Tambahkan blok lokasi khusus untuk folder /.well-known/acme-challenge yang memungkinkan Let's Encrypt menempatkan token untuk verifikasi domain. Untuk melakukannya, Edit file konfigurasi NGINX untuk host virtual Anda. Jangan lupa untuk menyesuaikan folder root sesuai lingkungan Anda.



    server {
            listen 80;
            server_name SUBDOMAIN.DOMAIN.TLD;
            root /var/www/html/wordpress;
            ...
            ...
            ...
            location /.well-known/acme-challenge {
               allow all; 
               default_type "text/plain";
            }
           ...
           ...
    }

Verifikasi bahwa file konfigurasi sudah benar secara sintaksis dan mulai ulang NGINX:


# nginx -t 
# systemctl restart nginx

Konfigurasikan Firewall UFW

Ubuntu 18.04 dikirimkan dengan pengelola firewall default UFW dan jika Anda telah mengaktifkannya dan berjalan di server Anda, maka tidak ada koneksi HTTP atau HTTPS yang akan diizinkan untuk mencapai server NGINX.

Mungkin juga Anda mencoba menginstal sertifikat di server yang dikonfigurasi sebelumnya dan aturan firewall sudah ada. Tentu saja, Anda dapat membuat daftar aturan firewall menggunakan ufw status perintah di server Anda sebelum melanjutkan dengan mengaktifkan koneksi HTTP dan HTTPS di server Ubuntu 18.04 Anda.

Jalankan rangkaian perintah berikut di terminal untuk mengizinkan koneksi HTTP dan HTTPS di server Anda.


# ufw status
# ufw allow http
# ufw allow https
# ufw reload

Minta Mari Mengenkripsi Sertifikat SSL

Mari kita meminta sertifikat SSL untuk domain yang dipilih menggunakan klien Let's Encrypt yang telah kita kloning sebelumnya. Meskipun ada banyak opsi konfigurasi yang tersedia yang dapat digunakan dengan skrip Let's Encrypt saat meminta sertifikat, kami hanya akan menggunakan opsi berikut.

  1. tentu saja :Opsi ini memberi tahu skrip letsencrypt untuk mendapatkan sertifikat SSL saja. Kami akan melakukan konfigurasi NGINX secara manual nanti.
  2. root web :Opsi ini menentukan plugin webroot yang akan digunakan dalam proses validasi nama domain.
  3. jalur webroot :Opsi ini menetapkan akar domain dan harus diarahkan ke lokasi situs web yang telah Anda konfigurasikan dalam konfigurasi NGINX.
  4. setuju :Berarti menyetujui persyaratan layanan Let's Encrypt.
  5. email :Email digunakan untuk menerima pemberitahuan kedaluwarsa dari Let's Encrypt tetapi juga dapat digunakan untuk memulihkan kunci yang hilang.
  6. d :Opsi ini menentukan nama domain yang sertifikatnya akan diminta.

Sekarang menggabungkan opsi di atas bersama dengan skrip klien letsencrypt, minta sertifikat menggunakan perintah berikut:


# cd /usr/local/letsencrypt
# ./letsencrypt-auto certonly --agree-tos --email [email protected] --webroot --webroot-path /var/www/html/wordpress -d SUBDOMAIN.DOMAIN.TLD

Diambil Mari Mengenkripsi Sertifikat Berhasil

Skrip Let's Encrypt akan menampilkan catatan kecil setelah sertifikat SSL berhasil diambil dan sertifikat akan disimpan di /etc/letsencrypt/live folder.

Konfigurasi NGINX untuk Let's Encrypt SSL Certificate

Pada tahap ini, rantai sertifikat Let's Encrypt telah berhasil disimpan di server Anda. Sekarang lanjutkan dengan mengonfigurasi file host virtual untuk server web NGINX berkemampuan SSL aman.

Buat Kunci Diffie-Hellman

Meskipun menggunakan kunci Diffie-Hellman adalah opsional saat mengonfigurasi sertifikat Let's Encrypt dengan NGINX, tetapi ini terutama digunakan sebagai metode pertukaran kunci kriptografi secara aman untuk digunakan dalam sertifikat Let's encrypt.


# mkdir -p /etc/nginx/ssl
# cd /etc/nginx/ssl
# openssl dhparam -out /etc/nginx/ssl/dhparam.pem 4096

Saya telah menempatkan file parameter DH di /etc/nginx/ssl direktori hanya untuk kenyamanan. Anda dapat menempatkan file di beberapa lokasi lain.

Konfigurasikan parameter SSL

Selanjutnya, tambahkan parameter untuk koneksi SSL seperti versi protokol, rangkaian sandi, sesi, header yang harus didukung server Anda dalam file terpisah.

Ini akan menyiapkan rangkaian sandi yang kuat yang memungkinkan Kerahasiaan Teruskan bila memungkinkan. Selanjutnya, kami juga akan mengaktifkan HSTS dan HPKP untuk memperkuat server NGINX untuk koneksi SSL. Ini akan memungkinkan konfigurasi SSL yang kuat dan bukti masa depan untuk mendapatkan nilai A+ pada Pengujian SSL Qualys Labs .


# vi /etc/nginx/conf.d/ssl.conf
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
server_tokens off;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
#Online Certificate Status Protocol Stapling
ssl_stapling on;
ssl_stapling_verify on;
ssl_session_tickets off;
#HTTP Strict Transport Security
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
ssl_trusted_certificate /etc/letsencrypt/live/SUBDOMAIN.DOMAIN.TLD/chain.pem;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
add_header X-Frame-Options DENY;
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options nosniff;
add_header X-Robots-Tag none;

Edit host virtual NGINX

Terakhir, edit blok server NGINX untuk domain pilihan Anda. Arahkan ke lokasi default untuk blok server NGINX yaitu /etc/nginx/sites-available dan edit file host virtual NGINX.


# vi /etc/nginx/sites-available/your_nginx_file.conf

server {
         listen 80;
         listen [::]:80;
         server_name SUBDOMAIN.DOMAIN.TLD;
         return 301 https://$host$request_uri;
}
...
...

Blok server di atas menginstruksikan NGINX untuk mendengarkan setiap permintaan masuk di port 80 untuk domain SUBDOMAIN.DOMAIN.TLD dan arahkan sama ke bagian https, konfigurasi yang diberikan di bawah ini.


...
...
server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;

        root   /var/www/html/wordpress;
        index index.html index.php index.htm;

        server_name  SUBDOMAIN.DOMAIN.TLD;
        error_log /var/log/nginx/SUBDOMAIN.DOMAIN.TLD-error.log debug;
        access_log /var/log/nginx/SUBDOMAIN.DOMAIN.TLD-access.log;

        ssl_certificate /etc/letsencrypt/live/SUBDOMAIN.DOMAIN.TLD/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/SUBDOMAIN.DOMAIN.TLD/privkey.pem;

        include /etc/nginx/conf.d/ssl.conf;

        location /.well-known/acme-challenge {
               allow all;
               default_type "text/plain";
        }

        location / {
            try_files $uri $uri/ =404;
        }

        location = /favicon.ico {
                log_not_found off;
                access_log off;
        }

        location = /robots.txt {
                allow all;
                log_not_found off;
                access_log off;
        }

        location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
                expires max;
                log_not_found off;
        }
}

Periksa file konfigurasi apakah ada kesalahan sintaksis:


# nginx -t 

Untuk mengaktifkan blok server, buat tautan simbolis dari file konfigurasi host virtual di atas di dalam /etc/nginx/sites-enabled folder.


# cd /etc/nginx/sites-enabled
# ln -s ../sites-available/your_nginx_file.conf .

Muat ulang NGINX untuk menerapkan setelan baru:


# systemctl reload nginx

Untuk menganalisis konfigurasi pengaturan SSL di atas, arahkan browser Anda ke SSL Labs Test dan ketik nama domain Anda dan klik 'Kirim'. Tunggu sebentar untuk melihat ringkasan tes. Peringkat A+ berarti, kami telah menyertakan sebagian besar opsi SSL dalam proses mengamankan server NGINX.

Perpanjangan otomatis sertifikat Let's Encrypt

Sertifikat Let's Encrypt berlaku selama 90 hari. Alasan untuk ini adalah untuk membatasi kerusakan dari kompromi utama dan mendorong otomatisasi.

Untuk mengotomatiskan proses perpanjangan sertifikat, buat cronjob menggunakan crontab dan tambahkan baris skrip yang akan dijalankan sekali setiap minggu untuk memperbarui sertifikat saat akan kedaluwarsa.


# crontab -e
45 4 * * 6 cd /usr/local/letsencrypt/ && ./certbot-auto renew && systemctl restart nginx

Skrip satu baris di atas akan berjalan setiap hari Sabtu untuk memeriksa apakah sertifikat siap diperbarui dan jika demikian, skrip akan memperbarui sertifikat diikuti dengan memulai ulang server NGINX.

Perhatikan bahwa itu tidak sepenuhnya dioptimalkan karena server NGINX akan dimulai ulang meskipun sertifikat tidak diperpanjang. Opsi terbaik adalah menulis skrip khusus untuk memperbarui sertifikat SSL dan memulai ulang server NGINX jika sertifikat benar-benar diperbarui.

Kesimpulan

Dalam artikel ini, kami mempelajari cara menginstal pustaka klien Let's Encrypt, meminta sertifikat untuk domain Anda, dan cara mengonfigurasi sertifikat SSL Let's Encrypt dengan NGINX. Selanjutnya, Contoh cronjob juga menunjukkan kepada Anda bagaimana menangani proses perpanjangan sertifikat secara teratur.


Linux
  1. Cara mengamankan akun yang mendukung cPanel dengan sertifikat SSL Lets Encrypt

  2. Cara Mengamankan Nginx dengan SSL dan Let's Encrypt di FreeBSD

  3. Cara mengatur WSO2 dengan sertifikat Let's Encrypt

  1. Amankan Nginx dengan Let's Encrypt SSL di Debian 10/11

  2. Amankan Nginx dengan Let's Encrypt di Ubuntu 18.04 - Bagaimana cara melakukannya?

  3. Cara Menginstal Let's Encrypt SSL dengan Apache di Debian 11

  1. Cara Mengatur Let's Encrypt SSL Certificate dengan Nginx di Debian 10 / Debian 9

  2. Cara Mengamankan Nginx dengan Let's Encrypt di Ubuntu 20.04

  3. Cara mendapatkan sertifikat SSL gratis dengan SSL It! dan Ayo Enkripsi di Plesk