NGINX Ingress Controller adalah komponen penting yang digunakan untuk memproses permintaan eksternal dan mengarahkan lalu lintas ke layanan dalam kluster Kubernetes. Untuk meningkatkan keamanan transmisi data, Anda dapat mengonfigurasi enkripsi pada NGINX Ingress Controller. Topik ini menjelaskan metode konfigurasi keamanan dan verifikasi NGINX Ingress Controller.
Konfigurasi Enkripsi
Dalam NGINX Ingress Controller, Anda dapat meningkatkan keamanan dengan mengonfigurasi bidang ssl-protocols dan ssl-ciphers di ConfigMap.
Nama | Deskripsi | Bidang Implementasi |
Versi protokol TLS kustom | Menentukan protokol SSL yang diizinkan. Secara default, TLSv1.2 dan TLSv1.3 digunakan. |
|
Suite sandi kustom | Menetapkan daftar sandi yang akan diaktifkan. Sandi harus dalam format yang dapat dikenali oleh pustaka OpenSSL. NGINX Ingress controller memiliki konfigurasi suite sandi default yang mendukung berbagai klien TLS. Untuk menentukan suite sandi yang lebih aman, Anda dapat menentukan |
Catatan Urutan suite sandi penting karena menentukan algoritma mana yang lebih disukai. Jika Anda tidak memiliki persyaratan khusus, kami menyarankan Anda untuk tetap menggunakan konfigurasi default. |
Prasyarat
NGINX Ingress Controller telah terpasang dan berjalan dengan baik di kluster. Untuk informasi lebih lanjut, lihat Kelola NGINX Ingress Controller.
Dapatkan file kubeconfig dari kluster dan gunakan kubectl untuk terhubung ke kluster.
Prosedur
Anda dapat menggunakan konsol atau kubectl untuk mengonfigurasi enkripsi.
Gunakan konsol
Masuk ke Konsol ACK. Di panel navigasi sisi kiri, klik Clusters.
Di halaman Clusters, klik nama kluster yang ingin Anda ubah. Di panel navigasi sisi kiri, pilih .
Di bagian atas halaman ConfigMap, pilih kube-system dari daftar drop-down Namespace. Kemudian, masukkan nginx-configuration di kotak pencarian Name dan klik ikon pencarian. Temukan nginx-configuration dan klik Edit di kolom Actions.
Di halaman edit, klik + Add, isi name dan value sesuai petunjuk, dan klik OK.
Gunakan kubectl
Jalankan perintah berikut untuk memperbarui ConfigMap:
kubectl edit cm -n kube-system nginx-configurationapiVersion: v1
kind: ConfigMap
metadata:
name: nginx-configuration
namespace: kube-system
data:
ssl-protocols: "TLSv1.2 TLSv1.3" # Hanya izinkan TLSv1.2 dan TLSv1.3.
ssl-ciphers: "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384" # Daftar suite sandi default.Verifikasi keamanan versi TLS dan suite sandi
Metode 1: Unduh alat testssl.sh dari testssl.sh, dan jalankan perintah berikut:
./testssl.sh <nama domain situs Anda>Output yang diharapkan:
Jika suite sandi yang tidak kuat atau versi protokol TLS yang tidak aman (lebih rendah) terdeteksi, mereka akan ditandai merah sebagai peringatan.
Pengujian protokol melalui soket kecuali NPN+ALPN SSLv2 tidak ditawarkan (OK) SSLv3 tidak ditawarkan (OK) TLS 1 tidak ditawarkan TLS 1.1 tidak ditawarkan TLS 1.2 ditawarkan (OK) TLS 1.3 ditawarkan (OK): final NPN/SPDY tidak ditawarkan ALPN/HTTP2 h2, http/1.1 (ditawarkan) Pengujian kategori sandi NULL ciphers (tanpa enkripsi) tidak ditawarkan (OK) Anonymous NULL Ciphers (tanpa otentikasi) tidak ditawarkan (OK) Export ciphers (tanpa ADH+NULL) tidak ditawarkan (OK) LOW: 64 Bit + DES, RC[2,4] (tanpa ekspor) tidak ditawarkan (OK) Triple DES Ciphers / IDEA tidak ditawarkan CBC ciphers usang (AES, ARIA dll.) tidak ditawarkan Enkripsi kuat (AEAD ciphers) ditawarkan (OK) Pengujian robust (perfect) forward secrecy, (P)FS -- mengabaikan Null Authentication/Encryption, 3DES, RC4 PFS ditawarkan (OK) TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256 ECDHE-RSA-AES256-GCM-SHA384 ECDHE-RSA-CHACHA20-POLY1305 TLS_AES_128_GCM_SHA256 ECDHE-RSA-AES128-GCM-SHA256 Kurva eliptis ditawarkan: prime256v1 secp384r1 secp521r1 X25519 X448 Grup medan terbatas: ffdhe2048 ffdhe3072 ffdhe4096 ffdhe6144 ffdhe8192 Pengujian preferensi server Apakah server memiliki urutan sandi? ya (OK) -- TLS 1.3 dan di bawahnya Protokol yang dinegosiasikan TLSv1.3 Sandi yang dinegosiasikan TLS_AES_256_GCM_SHA384, 253 bit ECDH (X25519) Urutan sandi TLSv1.2: ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES256-GCM-SHA384 ECDHE-RSA-CHACHA20-POLY1305 TLSv1.3: TLS_AES_256-GCM-SHA384 TLS_CHACHA20-POLY1305-SHA256 TLS_AES_128-GCM-SHA256 ...Metode 2: Masukkan nama domain situs Anda di situs web online untuk verifikasi.
Lihat suite sandi yang dikonfigurasi
Jalankan perintah berikut untuk melihat suite sandi yang dikonfigurasi:
kubectl -n kube-system exec deploy/nginx-ingress-controller -- nginx -T |grep ssl_ciphersOutput yang diharapkan:
Defaulted container "nginx-ingress-controller" out of: nginx-ingress-controller, init-sysctl (init)
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
nginx: configuration file /etc/nginx/nginx.conf test is successfulFAQ
Apakah mendukung Algoritma ShangMi (SM)?
ACK NGINX Ingress Controller menggunakan NGINX Ingress Controller yang disediakan oleh komunitas, yang tidak mendukung Algoritma SM.
Algoritma suite sandi apa yang didukung oleh NGINX Ingress controller?
Nginx menggunakan OpenSSL untuk enkripsi dan dekripsi. Anda dapat menjalankan perintah nginx -V untuk melihat versi Nginx dan OpenSSL yang sesuai, dan menjalankan perintah openssl ciphers untuk melihat suite sandi yang didukung. Jalankan perintah kubectl exec -itn kube-system <nginx-ingress-pod-name> bash untuk masuk ke kontainer.
Masuk ke kontainer NGINX Ingress Controller dan jalankan perintah
nginx -V:nginx-ingress-controller-5c455d7d9f-nr7dd:/etc/nginx$ nginx -VOutput yang diharapkan:
nginx version: nginx/1.21.6 built by gcc 12.2.1 20220924 (Alpine 12.2.1_git20220924-r10) built with OpenSSL 3.1.3 19 Sep 2023 (running with OpenSSL 3.1.5 30 Jan 2024) TLS SNI support enabled configure arguments: --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf --modules-path=/etc/nginx/modules --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-compat --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_addition_module --with-http_geoip_module --with-http_gzip_static_module --with-http_sub_module --with-http_v2_module --with-stream --with-stream_ssl_module --with-stream_realip_module --with-stream_ssl_preread_module --with-threads --with-http_secure_link_module --with-http_gunzip_module --with-file-aio --without-mail_pop3_module --without-mail_smtp_module --without-mail_imap_module --without-http_uwsgi_module --without-http_scgi_module --with-cc-opt='-g -O3 -flto -fPIE -fstack-protector-strong -Wformat -Werror=format-security -Wno-deprecated-declarations -fno-strict-aliasing -D_FORTIFY_SOURCE=2 --param=ssp-buffer-size=4 -DTCP_FASTOPEN=23 -fPIC -I/root/.hunter/_Base/d45d77d/aab92d8/3b7ee27/Install/include -Wno-cast-function-type -m64 -mtune=generic' --with-ld-opt='-flto -fPIE -fPIC -pie -Wl,-z,relro -Wl,-z,now -L/root/.hunter/_Base/d45d77d/aab92d8/3b7ee27/Install/lib' --user=www-data --group=www-data --add-module=/tmp/build/ngx_devel_kit-0.3.2 --add-module=/tmp/build/set-misc-nginx-module-0.33 --add-module=/tmp/build/headers-more-nginx-module-0.34 --add-module=/tmp/build/ngx_http_substitutions_filter_module-b8a71eacc7f986ba091282ab8b1bbbc6ae1807e0 --add-module=/tmp/build/lua-nginx-module-0.10.25 --add-module=/tmp/build/stream-lua-nginx-module-0.0.13 --add-module=/tmp/build/lua-upstream-nginx-module-8aa93ead98ba2060d4efd594ae33a35d153589bf --add-dynamic-module=/tmp/build/nginx-http-auth-digest-1.0.0 --add-dynamic-module=/tmp/build/nginx-opentracing-0.19.0/opentracing --add-dynamic-module=/tmp/build/ModSecurity-nginx-1.0.3 --add-dynamic-module=/tmp/build/ngx_http_geoip2_module-a26c6beed77e81553686852dceb6c7fdacc5970d --add-dynamic-module=/tmp/build/ngx_brotliMasuk ke kontainer NGINX Ingress Controller dan jalankan perintah
openssl ciphers:nginx-ingress-controller-5c455d7d9f-nr7dd:/etc/nginx$ openssl ciphersOutput yang diharapkan:
TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES256-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES128-SHA:RSA-PSK-AES256-GCM-SHA384:DHE-PSK-AES256-GCM-SHA384:RSA-PSK-CHACHA20-POLY1305:DHE-PSK-CHACHA20-POLY1305:ECDHE-PSK-CHACHA20-POLY1305:AES256-GCM-SHA384:PSK-AES256-GCM-SHA384:PSK-CHACHA20-POLY1305:RSA-PSK-AES128-GCM-SHA256:DHE-PSK-AES128-GCM-SHA256:AES128-GCM-SHA256:PSK-AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:ECDHE-PSK-AES256-CBC-SHA384:ECDHE-PSK-AES256-CBC-SHA:SRP-RSA-AES-256-CBC-SHA:SRP-AES-256-CBC-SHA:RSA-PSK-AES256-CBC-SHA384:DHE-PSK-AES256-CBC-SHA384:RSA-PSK-AES256-CBC-SHA:DHE-PSK-AES256-CBC-SHA:AES256-SHA:PSK-AES256-CBC-SHA384:PSK-AES256-CBC-SHA:ECDHE-PSK-AES128-CBC-SHA256:ECDHE-PSK-AES128-CBC-SHA:SRP-RSA-AES-128-CBC-SHA:SRP-AES-128-CBC-SHA:RSA-PSK-AES128-CBC-SHA256:DHE-PSK-AES128-CBC-SHA256:RSA-PSK-AES128-CBC-SHA:DHE-PSK-AES128-CBC-SHA:AES128-SHA:PSK-AES128-CBC-SHA256:PSK-AES128-CBC-SHAMasuk ke kontainer NGINX Ingress Controller dan jalankan perintah
openssl ciphers -tls1_2 -v. Output berikut menunjukkan bahwa hanya suite sandi dengan TLS 1.2 yang didukung.nginx-ingress-controller-5c455d7d9f-nr7dd:/etc/nginx$ openssl ciphers -tls1_2 -vOutput yang diharapkan:
TLS_AES_256_GCM_SHA384 TLSv1.3 Kx=any Au=any Enc=AESGCM(256) Mac=AEAD TLS_CHACHA20_POLY1305_SHA256 TLSv1.3 Kx=any Au=any Enc=CHACHA20/POLY1305(256) Mac=AEAD TLS_AES_128_GCM_SHA256 TLSv1.3 Kx=any Au=any Enc=AESGCM(128) Mac=AEAD ECDHE-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AESGCM(256) Mac=AEAD ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(256) Mac=AEAD DHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=DH Au=RSA Enc=AESGCM(256) Mac=AEAD ECDHE-ECDSA-CHACHA20-POLY1305 TLSv1.2 Kx=ECDH Au=ECDSA Enc=CHACHA20/POLY1305(256) Mac=AEAD ECDHE-RSA-CHACHA20-POLY1305 TLSv1.2 Kx=ECDH Au=RSA Enc=CHACHA20/POLY1305(256) Mac=AEAD ...
Bagaimana cara mendapatkan nama OpenSSL yang sesuai menggunakan nama standar IANA/RFC?
Penamaan suite sandi mengikuti dua aturan: penamaan OpenSSL ringkas, sedangkan penamaan IANA/RFC lebih rinci. Sebagai contoh, AES128-SHA di OpenSSL sesuai dengan TLS_RSA_WITH_AES_128_CBC_SHA di IANA/RFC.
Jika Anda mengetahui nama suite sandi IANA dan perlu mendapatkan nama OpenSSL-nya, Anda dapat menggunakan dua metode berikut:
Dapatkan nama OpenSSL yang sesuai dari situs OpenSSL.
Jalankan perintah
openssl ciphers -convert <nama suite sandi IANA yang diketahui>untuk mendapatkan nama konversi yang sesuai:nginx-ingress-controller-5c455d7d9f-nr7dd:/etc/nginx$ openssl ciphers -convert TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 OpenSSL cipher name: ECDHE-RSA-AES128-GCM-SHA256