Włącz punkt końcowy TLS w kontenerze przyczepy
W tym artykule pokazano, jak utworzyć grupę kontenerów z kontenerem aplikacji i kontenerem przyczepki z uruchomionym dostawcą protokołu TLS/SSL. Konfigurując grupę kontenerów z oddzielnym punktem końcowym protokołu TLS, można włączyć połączenia TLS dla aplikacji bez zmieniania kodu aplikacji.
Skonfigurowaliśmy przykładową grupę kontenerów składającą się z dwóch kontenerów:
- Kontener aplikacji, który uruchamia prostą aplikację internetową przy użyciu publicznego obrazu aci-helloworld firmy Microsoft.
- Kontener przyczepki z publicznym obrazem Nginx skonfigurowany do używania protokołu TLS.
W tym przykładzie grupa kontenerów uwidacznia tylko port 443 dla serwera Nginx przy użyciu publicznego adresu IP. Serwer Nginx kieruje żądania HTTPS do towarzyszącej aplikacji internetowej, która nasłuchuje wewnętrznie na porcie 80. Możesz dostosować przykład dla aplikacji kontenerów, które nasłuchują na innych portach.
Zobacz Następne kroki , aby zapoznać się z innymi metodami włączania protokołu TLS w grupie kontenerów.
Wymagania wstępne
Użyj środowiska powłoki Bash w usłudze Azure Cloud Shell. Aby uzyskać więcej informacji, zobacz Szybki start dotyczący powłoki Bash w usłudze Azure Cloud Shell.
Jeśli wolisz uruchamiać polecenia referencyjne interfejsu wiersza polecenia lokalnie, zainstaluj interfejs wiersza polecenia platformy Azure. Jeśli korzystasz z systemu Windows lub macOS, rozważ uruchomienie interfejsu wiersza polecenia platformy Azure w kontenerze Docker. Aby uzyskać więcej informacji, zobacz Jak uruchomić interfejs wiersza polecenia platformy Azure w kontenerze platformy Docker.
Jeśli korzystasz z instalacji lokalnej, zaloguj się do interfejsu wiersza polecenia platformy Azure za pomocą polecenia az login. Aby ukończyć proces uwierzytelniania, wykonaj kroki wyświetlane w terminalu. Aby uzyskać inne opcje logowania, zobacz Logowanie się przy użyciu interfejsu wiersza polecenia platformy Azure.
Po wyświetleniu monitu zainstaluj rozszerzenie interfejsu wiersza polecenia platformy Azure podczas pierwszego użycia. Aby uzyskać więcej informacji na temat rozszerzeń, zobacz Korzystanie z rozszerzeń w interfejsie wiersza polecenia platformy Azure.
Uruchom polecenie az version, aby znaleźć zainstalowane wersje i biblioteki zależne. Aby uaktualnić do najnowszej wersji, uruchom polecenie az upgrade.
- Ten artykuł wymaga wersji 2.0.55 lub nowszej interfejsu wiersza polecenia platformy Azure. W przypadku korzystania z usługi Azure Cloud Shell najnowsza wersja jest już zainstalowana.
Tworzenie certyfikatu z podpisem własnym
Aby skonfigurować serwer Nginx jako dostawcę protokołu TLS, potrzebny jest certyfikat TLS/SSL. W tym artykule pokazano, jak utworzyć i skonfigurować certyfikat TLS/SSL z podpisem własnym. W przypadku scenariuszy produkcyjnych należy uzyskać certyfikat od urzędu certyfikacji.
Aby utworzyć certyfikat TLS/SSL z podpisem własnym, użyj narzędzia OpenSSL dostępnego w usłudze Azure Cloud Shell i wielu dystrybucjach systemu Linux lub użyj porównywalnego narzędzia klienckiego w systemie operacyjnym.
Najpierw utwórz żądanie certyfikatu (plik .csr) w lokalnym katalogu roboczym:
openssl req -new -newkey rsa:2048 -nodes -keyout ssl.key -out ssl.csr
Postępuj zgodnie z monitami, aby dodać informacje identyfikacyjne. W polu Nazwa pospolita wprowadź nazwę hosta skojarzona z certyfikatem. Po wyświetleniu monitu o hasło naciśnij Enter bez wpisywania, aby pominąć dodawanie hasła.
Uruchom następujące polecenie, aby utworzyć certyfikat z podpisem własnym (plik crt) z żądania certyfikatu. Na przykład:
openssl x509 -req -days 365 -in ssl.csr -signkey ssl.key -out ssl.crt
Powinny być teraz widoczne trzy pliki w katalogu: żądanie certyfikatu (ssl.csr
), klucz prywatny (ssl.key
) i certyfikat z podpisem własnym (ssl.crt
). Użyj polecenia ssl.key
i ssl.crt
w kolejnych krokach.
Konfigurowanie serwera Nginx do używania protokołu TLS
Tworzenie pliku konfiguracji serwera Nginx
W tej sekcji utworzysz plik konfiguracji dla serwera Nginx do używania protokołu TLS. Zacznij od skopiowania następującego tekstu do nowego pliku o nazwie nginx.conf
. W usłudze Azure Cloud Shell możesz użyć programu Visual Studio Code do utworzenia pliku w katalogu roboczym:
code nginx.conf
W location
pliku upewnij się, że ustawiono proxy_pass
prawidłowy port dla aplikacji. W tym przykładzie ustawiliśmy port 80 dla kontenera 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;
}
}
}
Kodowanie wpisów tajnych i pliku konfiguracji base64
Base64 koduje plik konfiguracji Nginx, certyfikat TLS/SSL i klucz TLS. W następnej sekcji wprowadzisz zakodowaną zawartość w pliku YAML używanym do wdrożenia grupy kontenerów.
cat nginx.conf | base64 > base64-nginx.conf
cat ssl.crt | base64 > base64-ssl.crt
cat ssl.key | base64 > base64-ssl.key
Wdrażanie grupy kontenerów
Teraz wdróż grupę kontenerów, określając konfiguracje kontenera w pliku YAML.
Tworzenie pliku YAML
Skopiuj następujący kod YAML do nowego pliku o nazwie deploy-aci.yaml
. W usłudze Azure Cloud Shell możesz użyć programu Visual Studio Code do utworzenia pliku w katalogu roboczym:
code deploy-aci.yaml
Wprowadź zawartość plików zakodowanych w formacie base64, gdzie wskazano w obszarze secret
. Na przykład cat
każdy z plików zakodowanych w formacie base64 w celu wyświetlenia jego zawartości. Podczas wdrażania te pliki są dodawane do woluminu tajnego w grupie kontenerów. W tym przykładzie wolumin tajny jest instalowany w kontenerze 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
Wdrażanie grupy kontenerów
Utwórz grupę zasobów za pomocą polecenia az group create :
az group create --name myResourceGroup --location westus
Wdróż grupę kontenerów za pomocą polecenia az container create , przekazując plik YAML jako argument.
az container create --resource-group <myResourceGroup> --file deploy-aci.yaml
Wyświetlanie stanu wdrożenia
Aby wyświetlić stan wdrożenia, użyj następującego polecenia az container show :
az container show --resource-group <myResourceGroup> --name app-with-ssl --output table
W przypadku pomyślnego wdrożenia dane wyjściowe są podobne do następujących:
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
Weryfikowanie połączenia TLS
Użyj przeglądarki, aby przejść do publicznego adresu IP grupy kontenerów. Adres IP pokazany w tym przykładzie to 52.157.22.76
, więc adres URL to https://52.157.22.76. Aby wyświetlić uruchomioną aplikację, musisz użyć protokołu HTTPS ze względu na konfigurację serwera Nginx. Próby nawiązania połączenia za pośrednictwem protokołu HTTP kończą się niepowodzeniem.
Uwaga
Ponieważ w tym przykładzie użyto certyfikatu z podpisem własnym, a nie certyfikatu z urzędu certyfikacji, przeglądarka wyświetla ostrzeżenie o zabezpieczeniach podczas nawiązywania połączenia z witryną za pośrednictwem protokołu HTTPS. Może być konieczne zaakceptowanie ostrzeżenia lub dostosowanie ustawień przeglądarki lub certyfikatu, aby przejść do strony. To zachowanie jest oczekiwane.
Następne kroki
W tym artykule pokazano, jak skonfigurować kontener Nginx w celu włączenia połączeń TLS z aplikacją internetową działającą w grupie kontenerów. Ten przykład można dostosować dla aplikacji, które nasłuchują na portach innych niż port 80. Możesz również zaktualizować plik konfiguracji Nginx, aby automatycznie przekierowywać połączenia serwera na porcie 80 (HTTP) do korzystania z protokołu HTTPS.
Chociaż w tym artykule jest używany serwer Nginx w przyczepce, możesz użyć innego dostawcy protokołu TLS, takiego jak Caddy.
Jeśli wdrożysz grupę kontenerów w sieci wirtualnej platformy Azure, możesz rozważyć inne opcje włączenia punktu końcowego TLS dla wystąpienia kontenera zaplecza, w tym:
- Serwery proxy usługi Azure Functions
- Azure API Management
- aplikacja systemu Azure Gateway — zobacz przykładowy szablon wdrożenia.