Sdílet prostřednictvím


Povolení koncového bodu TLS v kontejneru sajdkáry

Tento článek ukazuje, jak vytvořit skupinu kontejnerů s kontejnerem aplikace a kontejnerem sajdkár, na kterém běží zprostředkovatel TLS/SSL. Nastavením skupiny kontejnerů s samostatným koncovým bodem TLS povolíte připojení TLS pro vaši aplikaci beze změny kódu aplikace.

Nastavíte ukázkovou skupinu kontejnerů skládající se ze dvou kontejnerů:

  • Kontejner aplikace, který spouští jednoduchou webovou aplikaci pomocí veřejné image Microsoft aci-helloworld.
  • Kontejner sajdkár se spuštěnou veřejnou imagí Nginx nakonfigurovaný tak, aby používal protokol TLS.

V tomto příkladu skupina kontejnerů zveřejňuje pouze port 443 pro Nginx s veřejnou IP adresou. Nginx směruje požadavky HTTPS do doprovodné webové aplikace, která interně naslouchá na portu 80. Můžete přizpůsobit příklad pro kontejnerové aplikace, které naslouchají na jiných portech.

Další kroky pro další přístupy k povolení protokolu TLS ve skupině kontejnerů

Požadavky

  • Tento článek vyžaduje verzi 2.0.55 nebo novější azure CLI. Pokud používáte Azure Cloud Shell, je už nainstalovaná nejnovější verze.

Vytvoření certifikátu podepsaného jeho držitelem (self-signed certificate)

Pokud chcete nastavit Nginx jako poskytovatele protokolu TLS, potřebujete certifikát TLS/SSL. Tento článek ukazuje, jak vytvořit a nastavit certifikát TLS/SSL podepsaný svým držitelem. V produkčních scénářích byste měli získat certifikát od certifikační autority.

Pokud chcete vytvořit certifikát TLS/SSL podepsaný svým držitelem, použijte nástroj OpenSSL dostupný v Azure Cloud Shellu a mnoha distribucích Linuxu nebo použijte srovnatelný klientský nástroj ve vašem operačním systému.

Nejprve vytvořte žádost o certifikát (soubor .csr) v místním pracovním adresáři:

openssl req -new -newkey rsa:2048 -nodes -keyout ssl.key -out ssl.csr

Podle pokynů přidejte identifikační údaje. Jako běžný název zadejte název hostitele přidružený k certifikátu. Když se zobrazí výzva k zadání hesla, stiskněte enter bez psaní a přeskočte přidání hesla.

Spuštěním následujícího příkazu vytvořte certifikát podepsaný svým držitelem (soubor .crt) z žádosti o certifikát. Příklad:

openssl x509 -req -days 365 -in ssl.csr -signkey ssl.key -out ssl.crt

V adresáři byste teď měli vidět tři soubory: žádost o certifikát (ssl.csr), privátní klíč (ssl.key) a certifikát podepsaný svým držitelem (ssl.crt). Použijete ssl.key a ssl.crt v dalších krocích.

Konfigurace Nginx pro použití protokolu TLS

Vytvoření konfiguračního souboru Nginx

V této části vytvoříte konfigurační soubor pro Nginx, který bude používat protokol TLS. Začněte zkopírováním následujícího textu do nového souboru s názvem nginx.conf. V Azure Cloud Shellu můžete pomocí editoru Visual Studio Code vytvořit soubor v pracovním adresáři:

code nginx.conf

Nezapomeňte locationnastavit proxy_pass správný port pro vaši aplikaci. V tomto příkladu aci-helloworld nastavíme port 80 pro kontejner.

# 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;
        }
    }
}

Kódování tajných kódů a konfiguračního souboru s kódováním Base64

Kódování Base64 konfiguračního souboru Nginx, certifikátu TLS/SSL a klíče TLS V další části zadáte kódovaný obsah do souboru YAML použitého k nasazení skupiny kontejnerů.

cat nginx.conf | base64 > base64-nginx.conf
cat ssl.crt | base64 > base64-ssl.crt
cat ssl.key | base64 > base64-ssl.key

Nasazení skupiny kontejnerů

Teď nasaďte skupinu kontejnerů zadáním konfigurací kontejneru v souboru YAML.

Vytvoření souboru YAML

Zkopírujte následující YAML do nového souboru s názvem deploy-aci.yaml. V Azure Cloud Shellu můžete pomocí editoru Visual Studio Code vytvořit soubor v pracovním adresáři:

code deploy-aci.yaml

Zadejte obsah souborů s kódováním base64, kde je uvedeno v části secret. Například cat každý ze souborů s kódováním Base64 zobrazí jeho obsah. Během nasazování se tyto soubory přidají do tajného svazku ve skupině kontejnerů. V tomto příkladu se tajný svazek připojí ke kontejneru 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

Nasazení skupiny kontejnerů

Pomocí příkazu az group create vytvořte skupinu prostředků:

az group create --name myResourceGroup --location westus

Nasaďte skupinu kontejnerů pomocí příkazu az container create a předáte soubor YAML jako argument.

az container create --resource-group <myResourceGroup> --file deploy-aci.yaml

Zobrazení stavu nasazení

Pokud chcete zobrazit stav nasazení, použijte následující příkaz az container show :

az container show --resource-group <myResourceGroup> --name app-with-ssl --output table

V případě úspěšného nasazení se výstup podobá následujícímu:

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

Ověření připojení TLS

Pomocí prohlížeče přejděte na veřejnou IP adresu skupiny kontejnerů. IP adresa zobrazená v tomto příkladu je 52.157.22.76, takže adresa URL je https://52.157.22.76. Ke zobrazení spuštěné aplikace musíte použít protokol HTTPS, protože konfigurace serveru Nginx. Pokusy o připojení přes protokol HTTP selžou.

Snímek obrazovky prohlížeče s aplikací spuštěnou v instanci kontejneru Azure

Poznámka:

Vzhledem k tomu, že tento příklad používá certifikát podepsaný svým držitelem a ne certifikát od certifikační autority, prohlížeč při připojování k webu přes HTTPS zobrazí upozornění zabezpečení. Možná budete muset přijmout upozornění nebo upravit nastavení prohlížeče nebo certifikátu, abyste mohli pokračovat na stránku. Toto chování se očekává.

Další kroky

Tento článek vám ukázal, jak nastavit kontejner Nginx tak, aby umožňoval připojení TLS k webové aplikaci spuštěné ve skupině kontejnerů. Tento příklad můžete přizpůsobit pro aplikace, které naslouchají na jiných portech než na portu 80. Můžete také aktualizovat konfigurační soubor Nginx tak, aby automaticky přesměrovává připojení serveru na portu 80 (HTTP), aby používal protokol HTTPS.

I když tento článek používá Nginx na sajdkáře, můžete použít jiného zprostředkovatele TLS, jako je Caddy.

Pokud nasadíte skupinu kontejnerů ve virtuální síti Azure, můžete zvážit další možnosti povolení koncového bodu TLS pro instanci back-endového kontejneru, mezi které patří: