Mengaktifkan titik akhir TLS dalam kontainer sidecar
Artikel ini memperlihatkan cara membuat grup kontainer dengan kontainer aplikasi dan kontainer sidecar yang menjalankan penyedia TLS/SSL. Dengan menyiapkan grup kontainer dengan titik akhir TLS yang terpisah, Anda mengaktifkan koneksi TLS untuk aplikasi tanpa mengubah kode aplikasi.
Anda menyiapkan grup kontainer contoh yang terdiri dari dua kontainer:
- Kontainer aplikasi yang menjalankan aplikasi web sederhana menggunakan gambar aci-helloworld Microsoft publik.
- Kontainer sidecar yang menjalankan gambar Nginx publik, dikonfigurasi untuk menggunakan TLS.
Dalam contoh ini, grup kontainer hanya mengekspos port 443 untuk Nginx dengan alamat IP publiknya. Nginx merutekan permintaan HTTPS ke aplikasi web pendamping, yang mendengarkan secara internal di port 80. Anda dapat menyesuaikan contoh untuk aplikasi kontainer yang mendengarkan di port lain.
Lihat Langkah berikutnya untuk pendekatan lain guna mengaktifkan TLS dalam grup kontainer.
Prasyarat
Gunakan lingkungan Bash di Azure Cloud Shell. Untuk informasi selengkapnya, lihat Mulai Cepat untuk Bash di Azure Cloud Shell.
Jika Anda lebih suka menjalankan perintah referensi CLI secara lokal, instal Azure CLI. Jika Anda menjalankan Windows atau macOS, pertimbangkan untuk menjalankan Azure CLI dalam kontainer Docker. Untuk informasi lebih lanjut, lihat Cara menjalankan Azure CLI di kontainer Docker.
Jika Anda menggunakan instalasi lokal, masuk ke Azure CLI dengan menggunakan perintah login az. Untuk menyelesaikan proses autentikasi, ikuti langkah-langkah yang ditampilkan di terminal Anda. Untuk opsi masuk lainnya, lihat Masuk dengan Azure CLI.
Saat Anda diminta, instal ekstensi Azure CLI pada penggunaan pertama. Untuk informasi selengkapnya tentang ekstensi, lihat Menggunakan ekstensi dengan Azure CLI.
Jalankan versi az untuk menemukan versi dan pustaka dependen yang diinstal. Untuk meningkatkan ke versi terbaru, jalankan peningkatan az.
- Artikel ini memerlukan Azure CLI versi 2.0.55 atau terbaru. Jika menggunakan Azure Cloud Shell, versi terbaru sudah terinstal.
Membuat sertifikat yang ditandatangani sendiri
Untuk menyiapkan Nginx sebagai penyedia TLS, Anda memerlukan sertifikat TLS/SSL. Artikel ini memperlihatkan cara membuat dan menyiapkan sertifikat TLS/SSL yang ditandatangani sendiri. Untuk skenario produksi, Anda harus mendapatkan sertifikat dari otoritas sertifikat.
Untuk membuat sertifikat TLS/ SSL yang ditandatangani sendiri, gunakan alat OpenSSL yang tersedia di Azure Cloud Shell dan banyak distribusi Linux, atau gunakan alat klien yang sebanding dalam sistem operasi Anda.
Pertama, buat permintaan sertifikat (file .csr) di direktori kerja lokal:
openssl req -new -newkey rsa:2048 -nodes -keyout ssl.key -out ssl.csr
Ikuti perintah untuk menambahkan informasi identifikasi. Untuk Nama Umum, masukkan nama host yang terkait dengan sertifikat. Ketika diminta untuk kata sandi, tekan Enter tanpa mengetik, untuk melewati penambahan kata sandi.
Jalankan perintah berikut untuk membuat sertifikat yang ditandatangani sendiri (file .crt) dari permintaan sertifikat. Contohnya:
openssl x509 -req -days 365 -in ssl.csr -signkey ssl.key -out ssl.crt
Anda sekarang akan melihat tiga file di direktori: permintaan sertifikat (ssl.csr
), kunci pribadi (ssl.key
), dan sertifikat yang ditandatangani sendiri (ssl.crt
). Anda menggunakan ssl.key
dan ssl.crt
di langkah-langkah berikutnya.
Mengonfigurasi Nginx untuk menggunakan TLS
Membuat file konfigurasi Nginx
Di bagian ini, Anda akan membuat file konfigurasi bagi Nginx untuk menggunakan TLS. Mulailah dengan menyalin teks berikut ke dalam file baru bernama nginx.conf
. Di Azure Cloud Shell, Anda bisa menggunakan Visual Studio Code untuk membuat file di direktori kerja:
code nginx.conf
Di location
, pastikan untuk mengatur proxy_pass
dengan port yang benar untuk aplikasi Anda. Dalam contoh ini, kami mengatur port 80 untuk kontainer aci-helloworld
.
# nginx Configuration File
# https://wiki.nginx.org/Configuration
# Run as a less privileged user for security reasons.
user nginx;
worker_processes auto;
events {
worker_connections 1024;
}
pid /var/run/nginx.pid;
http {
#Redirect to https, using 307 instead of 301 to preserve post data
server {
listen [::]:443 ssl;
listen 443 ssl;
server_name localhost;
# Protect against the BEAST attack by not using SSLv3 at all. If you need to support older browsers (IE6) you may need to add
# SSLv3 to the list of protocols below.
ssl_protocols TLSv1.2;
# Ciphers set to best allow protection from Beast, while providing forwarding secrecy, as defined by Mozilla - https://wiki.mozilla.org/Security/Server_Side_TLS#Nginx
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:ECDHE-RSA-RC4-SHA:ECDHE-ECDSA-RC4-SHA:AES128:AES256:RC4-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!MD5:!PSK;
ssl_prefer_server_ciphers on;
# Optimize TLS/SSL by caching session parameters for 10 minutes. This cuts down on the number of expensive TLS/SSL handshakes.
# The handshake is the most CPU-intensive operation, and by default it is re-negotiated on every new/parallel connection.
# By enabling a cache (of type "shared between all Nginx workers"), we tell the client to re-use the already negotiated state.
# Further optimization can be achieved by raising keepalive_timeout, but that shouldn't be done unless you serve primarily HTTPS.
ssl_session_cache shared:SSL:10m; # a 1mb cache can hold about 4000 sessions, so we can hold 40000 sessions
ssl_session_timeout 24h;
# Use a higher keepalive timeout to reduce the need for repeated handshakes
keepalive_timeout 300; # up from 75 secs default
# remember the certificate for a year and automatically connect to HTTPS
add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains';
ssl_certificate /etc/nginx/ssl.crt;
ssl_certificate_key /etc/nginx/ssl.key;
location / {
proxy_pass http://localhost:80; # TODO: replace port if app listens on port other than 80
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
}
Rahasia dan file konfigurasi berkode base64
File konfigurasi Nginx berkode base64, sertifikat TLS/SSL, dan kunci TLS. Di bagian berikutnya, Anda akan memasukkan isi yang dikodekan dalam file YAML yang digunakan untuk menyebarkan grup kontainer.
cat nginx.conf | base64 > base64-nginx.conf
cat ssl.crt | base64 > base64-ssl.crt
cat ssl.key | base64 > base64-ssl.key
Menyebarkan grup kontainer
Sekarang sebarkan grup kontainer dengan menentukan konfigurasi kontainer dalam file YAML.
Membuat file YAML
Salin YAML berikut ke dalam file baru bernama deploy-aci.yaml
. Di Azure Cloud Shell, Anda bisa menggunakan Visual Studio Code untuk membuat file di direktori kerja:
code deploy-aci.yaml
Masukkan isi file berkode base64 yang ditunjukkan di secret
. Sebagai contoh, cat
masing-masing file berkode base64 untuk melihat isinya. Selama penyebaran, file-file ini ditambahkan ke volume rahasia dalam grup kontainer. Dalam contoh ini, volume rahasia dipasang ke kontainer Nginx.
api-version: 2019-12-01
location: westus
name: app-with-ssl
properties:
containers:
- name: nginx-with-ssl
properties:
image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine
ports:
- port: 443
protocol: TCP
resources:
requests:
cpu: 1.0
memoryInGB: 1.5
volumeMounts:
- name: nginx-config
mountPath: /etc/nginx
- name: my-app
properties:
image: mcr.microsoft.com/azuredocs/aci-helloworld
ports:
- port: 80
protocol: TCP
resources:
requests:
cpu: 1.0
memoryInGB: 1.5
volumes:
- secret:
ssl.crt: <Enter contents of base64-ssl.crt here>
ssl.key: <Enter contents of base64-ssl.key here>
nginx.conf: <Enter contents of base64-nginx.conf here>
name: nginx-config
ipAddress:
ports:
- port: 443
protocol: TCP
type: Public
osType: Linux
tags: null
type: Microsoft.ContainerInstance/containerGroups
Menyebarkan grup kontainer
Buat grup sumber daya dengan perintah az group create:
az group create --name myResourceGroup --location westus
Sebarkan grup kontainer dengan perintah az container create, meneruskan file YAML sebagai argumen.
az container create --resource-group <myResourceGroup> --file deploy-aci.yaml
Menampilkan status penyebaran
Untuk menampilkan status penyebaran, gunakan perintah az container show berikut:
az container show --resource-group <myResourceGroup> --name app-with-ssl --output table
Untuk penyebaran yang lancar, output akan terlihat seperti berikut:
Name ResourceGroup Status Image IP:ports Network CPU/Memory OsType Location
------------ --------------- -------- ------------------------------------------------------- ------------------- --------- --------------- -------- ----------
app-with-ssl myresourcegroup Running nginx, mcr.microsoft.com/azuredocs/aci-helloworld 52.157.22.76:443 Public 1.0 core/1.5 gb Linux westus
Memverifikasi koneksi TLS
Gunakan browser Anda untuk menavigasi ke alamat IP publik grup kontainer. Alamat IP yang ditunjukkan dalam contoh ini adalah 52.157.22.76
, jadi URL-nya adalah https://52.157.22.76. Anda harus menggunakan HTTPS untuk melihat aplikasi yang sedang berjalan, karena konfigurasi server Nginx. Upaya untuk menghubungkan melalui HTTP gagal.
Catatan
Karena contoh ini menggunakan sertifikat yang ditandatangani sendiri dan bukan sertifikat dari otoritas sertifikat, browser menampilkan peringatan keamanan saat menghubungkan ke situs melalui HTTPS. Anda mungkin perlu menerima peringatan atau menyesuaikan pengaturan browser atau sertifikat untuk melanjutkan ke halaman. Perilaku ini diharapkan.
Langkah berikutnya
Artikel ini memperlihatkan kepada Anda cara menyiapkan kontainer Nginx untuk mengaktifkan koneksi TLS ke aplikasi web yang sedang berjalan di grup kontainer. Anda dapat menyesuaikan contoh ini untuk aplikasi yang mendengarkan port selain port 80. Anda juga bisa memperbarui file konfigurasi Nginx untuk secara otomatis mengalihkan koneksi server di port 80 (HTTP) untuk menggunakan HTTPS.
Meskipun artikel ini menggunakan Nginx di sidecar, Anda bisa menggunakan penyedia TLS lain seperti Caddy.
Jika menyebarkan grup kontainer di jaringan virtual Azure, Anda bisa mempertimbangkan opsi lain untuk mengaktifkan titik akhir TLS untuk instans kontainer ujung belakang, termasuk: