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
Použijte prostředí Bash v Azure Cloud Shellu. Další informace najdete v tématu Rychlý start pro Bash v Azure Cloud Shellu.
Pokud dáváte přednost místnímu spouštění referenčních příkazů rozhraní příkazového řádku, nainstalujte Azure CLI. Pokud používáte Windows nebo macOS, zvažte spuštění Azure CLI v kontejneru Docker. Další informace najdete v tématu Jak spustit Azure CLI v kontejneru Dockeru.
Pokud používáte místní instalaci, přihlaste se k Azure CLI pomocí příkazu az login. Pokud chcete dokončit proces ověřování, postupujte podle kroků zobrazených na terminálu. Další možnosti přihlášení najdete v tématu Přihlášení pomocí Azure CLI.
Po zobrazení výzvy nainstalujte rozšíření Azure CLI při prvním použití. Další informace o rozšířeních najdete v tématu Využití rozšíření v Azure CLI.
Spuštěním příkazu az version zjistěte verzi a závislé knihovny, které jsou nainstalované. Pokud chcete upgradovat na nejnovější verzi, spusťte az upgrade.
- 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 location
nastavit 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.
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ří:
- Proxy služby Azure Functions
- Azure API Management
- Aplikace Azure lication Gateway – viz ukázková šablona nasazení.