Samouczek: zabezpieczanie serwera internetowego przy użyciu certyfikatów TLS/SSL

Dotyczy: ✔️ Maszyny wirtualne z systemem Linux

Aby zabezpieczyć serwery internetowe, certyfikat protokołu Transport Layer Security (TLS), znany wcześniej jako Secure Sockets Layer (SSL), może służyć do szyfrowania ruchu internetowego. Te certyfikaty TLS/SSL można przechowywać w usłudze Azure Key Vault i zezwalać na bezpieczne wdrożenia certyfikatów na maszynach wirtualnych z systemem Linux na platformie Azure. Ten samouczek zawiera informacje na temat wykonywania następujących czynności:

  • Tworzenie usługi Azure Key Vault
  • Generowanie lub przekazywanie certyfikatu do usługi Key Vault
  • Tworzenie maszyny wirtualnej i instalowanie serwera sieci Web NGINX
  • Wstrzykiwanie certyfikatu do maszyny wirtualnej i konfigurowanie serwera NGINX za pomocą powiązania TLS

W tym samouczku jest używany interfejs wiersza polecenia w usłudze Azure Cloud Shell, który jest stale aktualizowany do najnowszej wersji. Aby otworzyć Cloud Shell, wybierz pozycję Wypróbuj w górnej części dowolnego bloku kodu.

Jeśli zdecydujesz się zainstalować interfejs wiersza polecenia i korzystać z niego lokalnie, ten samouczek wymaga uruchomienia interfejsu wiersza polecenia platformy Azure w wersji 2.0.30 lub nowszej. Uruchom polecenie az --version, aby dowiedzieć się, jaka wersja jest używana. Jeśli konieczna będzie instalacja lub uaktualnienie, zobacz Instalowanie interfejsu wiersza polecenia platformy Azure.

Omówienie

Usługa Azure Key Vault chroni klucze kryptograficzne i klucze tajne, takie jak certyfikaty lub hasła. Usługa Key Vault pomaga uprościć proces zarządzania certyfikatami i pozwala zachować kontrolę nad kluczami, które uzyskują dostęp do tych certyfikatów. Możesz utworzyć certyfikat z podpisem własnym wewnątrz usługi Key Vault lub przekazać istniejący zaufany certyfikat, który już posiadasz.

Zamiast używania niestandardowego obrazu maszyny wirtualnej, który zawiera wbudowane certyfikaty, należy wstrzyknąć certyfikaty do uruchomionej maszyny wirtualnej. Ten proces zapewnia, że podczas wdrażania na serwerze sieci Web zostaną zainstalowane najbardziej aktualne certyfikaty. Jeśli odnowisz lub zamienisz certyfikat, nie musisz też tworzyć nowego niestandardowego obrazu maszyny wirtualnej. Najnowsze certyfikaty są automatycznie wstrzykiwane podczas tworzenia większej liczby maszyn wirtualnych. W trakcie całego procesu certyfikaty nigdy nie opuszczają platformy Azure oraz nie są udostępniane w skrypcie, historii wiersza polecenia ani w szablonie.

Tworzenie usługi Azure Key Vault

Aby można było utworzyć usługę Key Vault i certyfikaty, utwórz grupę zasobów za pomocą polecenia az group create. Poniższy przykład obejmuje tworzenie grupy zasobów o nazwie myResourceGroupSecureWeb w lokalizacji eastus:

az group create --name myResourceGroupSecureWeb --location eastus

Następnie utwórz usługę Key Vault za pomocą polecenia az keyvault create i włącz ją do użycia podczas wdrażania maszyny wirtualnej. Każda usługa Key Vault wymaga unikatowej nazwy, która powinna zawierać tylko małe litery. Zastąp ciąg< mykeyvault> w poniższym przykładzie własną unikatową nazwą Key Vault:

keyvault_name=<mykeyvault>
az keyvault create \
    --resource-group myResourceGroupSecureWeb \
    --name $keyvault_name \
    --enabled-for-deployment

Generowanie certyfikatu i zapisywanie go w usłudze Key Vault

Do użycia w środowisku produkcyjnym należy zaimportować prawidłowy certyfikat podpisany przez zaufanego dostawcę, używając polecenia az keyvault certificate import. W tym samouczku poniższy przykład przedstawia, jak można wygenerować certyfikat z podpisem własnym za pomocą polecenia az keyvault certificate create z użyciem domyślnych zasad certyfikatów:

az keyvault certificate create \
    --vault-name $keyvault_name \
    --name mycert \
    --policy "$(az keyvault certificate get-default-policy)"

Przygotowywanie certyfikatu do użycia z maszyną wirtualną

Aby użyć certyfikatu podczas tworzenia maszyny wirtualnej, uzyskaj identyfikator certyfikatu za pomocą polecenia az keyvault secret list-versions. Przekonwertuj certyfikat za pomocą polecenia az vm secret format. W poniższym przykładzie przypisano dane wyjściowe tych poleceń do zmiennych w celu łatwiejszego użycia w następnych krokach:

secret=$(az keyvault secret list-versions \
          --vault-name $keyvault_name \
          --name mycert \
          --query "[?attributes.enabled].id" --output tsv)
vm_secret=$(az vm secret format --secrets "$secret" -g myResourceGroupSecureWeb --keyvault $keyvault_name)

Tworzenie konfiguracji cloud-init do zabezpieczenia serwera NGINX

Cloud-init to powszechnie używana metoda dostosowywania maszyny wirtualnej z systemem Linux podczas jej pierwszego rozruchu. Za pomocą pakietu cloud-init można instalować pakiety i zapisywać pliki lub konfigurować użytkowników i zabezpieczenia. Podczas uruchamiania w trybie cloud-init podczas początkowego procesu rozruchu nie ma dodatkowych kroków ani agentów wymaganych do zastosowania konfiguracji.

Podczas tworzenia maszyny wirtualnej certyfikaty i klucze są przechowywane w chronionym katalogu /var/lib/agentawaagent/. Aby zautomatyzować dodawanie certyfikatu do maszyny wirtualnej i konfigurowanie serwera sieci Web, użyj pakietu cloud-init. W tym przykładzie zainstalujesz i skonfigurujesz serwer sieci Web NGINX. Ten sam proces można zastosować do zainstalowania i skonfigurowania serwera Apache.

Utwórz plik o nazwie cloud-init-web-server.txt i wklej następującą konfigurację:

#cloud-config
package_upgrade: true
packages:
  - nginx
write_files:
  - owner: www-data:www-data
  - path: /etc/nginx/sites-available/default
    content: |
      server {
        listen 443 ssl;
        ssl_certificate /etc/nginx/ssl/mycert.cert;
        ssl_certificate_key /etc/nginx/ssl/mycert.prv;
      }
runcmd:
  - secretsname=$(find /var/lib/waagent/ -name "*.prv" | cut -c -57)
  - mkdir /etc/nginx/ssl
  - cp $secretsname.crt /etc/nginx/ssl/mycert.cert
  - cp $secretsname.prv /etc/nginx/ssl/mycert.prv
  - service nginx restart

Tworzenie bezpiecznej maszyny wirtualnej

Utwórz maszynę wirtualną za pomocą polecenia az vm create. Dane certyfikatu są wstrzykiwane z usługi Key Vault za pomocą parametru --secrets. Konfiguracja pakietu cloud-init jest przekazywana za pomocą parametru --custom-data:

az vm create \
    --resource-group myResourceGroupSecureWeb \
    --name myVM \
    --image Ubuntu2204 \
    --admin-username azureuser \
    --generate-ssh-keys \
    --custom-data cloud-init-web-server.txt \
    --secrets "$vm_secret"

Utworzenie maszyny wirtualnej, zainstalowanie pakietów i uruchomienie aplikacji potrwa kilka minut. Podczas tworzenia maszyny wirtualnej zanotuj wartość publicIpAddress wyświetlaną w wierszu polecenia platformy Azure. Ten adres służy do uzyskiwania dostępu do witryny w przeglądarce sieci Web.

Aby zezwolić na bezpieczny ruch internetowy do maszyny wirtualnej, otwórz port 443 z Internetu za pomocą polecenia az vm open-port:

az vm open-port \
    --resource-group myResourceGroupSecureWeb \
    --name myVM \
    --port 443

Testowanie bezpiecznej aplikacji internetowej

Teraz możesz otworzyć przeglądarkę internetową i wprowadzić https://< publicIpAddress> na pasku adresu. Podaj własny publiczny adres IP z procesu tworzenia maszyny wirtualnej. Jeśli został użyty certyfikat z podpisem własnym, zaakceptuj ostrzeżenie dotyczące zabezpieczeń:

Akceptowanie ostrzeżenia dotyczącego zabezpieczeń w przeglądarce sieci Web

Zostanie wyświetlona zabezpieczona witryna serwera NGINX, tak jak w poniższym przykładzie:

Wyświetlanie uruchomionej zabezpieczonej witryny serwera NGINX

Następne kroki

W tym samouczku zabezpieczyliśmy serwer internetowy NGINX przy użyciu certyfikatu TLS/SSL przechowywanego w usłudze Azure Key Vault. W tym samouczku omówiono:

  • Tworzenie usługi Azure Key Vault
  • Generowanie lub przekazywanie certyfikatu do usługi Key Vault
  • Tworzenie maszyny wirtualnej i instalowanie serwera sieci Web NGINX
  • Wstrzykiwanie certyfikatu do maszyny wirtualnej i konfigurowanie serwera NGINX za pomocą powiązania TLS

Użyj tego linku, aby wyświetlić przykłady wstępnie utworzonych skryptów maszyn wirtualnych.