Bagikan melalui


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

  • 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.

Cuplikan layar browser memperlihatkan aplikasi yang sedang berjalan dalam instans kontainer Azure

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: