Samouczek: zabezpieczanie połączenia usługi Cognitive Service z App Service JavaScript przy użyciu Key Vault

Azure App Service mogą używać tożsamości zarządzanych do nawiązywania połączeń z usługami zaplecza bez parametrów połączenia, co eliminuje wpisy tajne połączeń w celu zarządzania łącznością zaplecza i zabezpieczania ich w środowisku produkcyjnym. W przypadku usług zaplecza, które nie obsługują tożsamości zarządzanych i nadal wymagają wpisów tajnych połączenia, można użyć Key Vault do zarządzania wpisami tajnymi połączeń. W tym samouczku użyto usług Azure AI jako przykładu, aby pokazać, jak to działa w praktyce. Po zakończeniu będziesz mieć aplikację, która wykonuje programowe wywołania usług Azure AI bez przechowywania wpisów tajnych połączenia wewnątrz App Service.

Porada

Usługi azure AI obsługują uwierzytelnianie za pośrednictwem tożsamości zarządzanych, ale w tym samouczku użyto uwierzytelniania klucza subskrypcji , aby zademonstrować, jak można nawiązać połączenie z usługą platformy Azure, która nie obsługuje tożsamości zarządzanych z usług App Services.

Diagram architektury dla scenariusza samouczka.

Z tą architekturą:

  • Łączność z Key Vault jest zabezpieczona przez tożsamości zarządzane
  • App Service uzyskuje dostęp do wpisów tajnych przy użyciu odwołań Key Vault jako ustawień aplikacji.
  • Dostęp do magazynu kluczy jest ograniczony do aplikacji. Współautorzy aplikacji, tacy jak administratorzy, mogą mieć pełną kontrolę nad zasobami App Service i jednocześnie nie mają dostępu do wpisów tajnych Key Vault.
  • Jeśli kod aplikacji uzyskuje już dostęp do wpisów tajnych połączenia za pomocą ustawień aplikacji, nie jest wymagana żadna zmiana.

Czego się nauczysz:

  • Włączanie tożsamości zarządzanych
  • Nawiązywanie połączenia z usługą Key Vault przy użyciu tożsamości zarządzanych
  • Używanie odwołań do usługi Key Vault
  • Uzyskiwanie dostępu do usług azure AI

Wymagania wstępne

Przygotuj środowisko dla interfejsu wiersza polecenia platformy Azure.

Tworzenie aplikacji z łącznością z usługami Azure AI

  1. Utwórz grupę zasobów zawierającą wszystkie zasoby:

    # Save resource group name as variable for convenience
    groupName=myKVResourceGroup
    region=westeurope
    
    az group create --name $groupName --location $region
    
  2. Utwórz zasób usług Azure AI. Zastąp ciąg< cs-resource-name> wybraną unikatową nazwą.

    # Save resource name as variable for convenience. 
    csResourceName=<cs-resource-name>
    
    az cognitiveservices account create --resource-group $groupName --name $csResourceName --location $region --kind TextAnalytics --sku F0 --custom-domain $csResourceName
    

    Uwaga

    --sku F0 Tworzy zasób usług Azure AI w warstwie Bezpłatna. Każda subskrypcja jest ograniczona do limitu przydziału jednego zasobu w warstwie TextAnalytics Bezpłatna. Jeśli już przekroczono limit przydziału, użyj --sku S zamiast tego.

Konfigurowanie aplikacji JavaScript

Sklonuj przykładowe repozytorium lokalnie i wdróż przykładową aplikację w App Service. Zastąp <ciąg app-name> unikatową nazwą.

# Clone and prepare sample application
git clone https://github.com/Azure-Samples/app-service-language-detector.git
cd app-service-language-detector/javascript
zip default.zip *.*

# Save app name as variable for convenience
appName=<app-name>

az appservice plan create --resource-group $groupName --name $appName --sku FREE --location $region --is-linux
az webapp create --resource-group $groupName --plan $appName --name $appName --runtime "node|14-lts"
az webapp config appsettings set --resource-group $groupName --name $appName --settings SCM_DO_BUILD_DURING_DEPLOYMENT=true
az webapp deployment source config-zip --resource-group $groupName --name $appName --src ./default.zip

Poprzednie polecenia:

  • Tworzenie planu usługi App Service dla systemu Linux
  • Tworzenie aplikacji internetowej dla Node.js 14 LTS
  • Konfigurowanie aplikacji internetowej w celu zainstalowania pakietów npm we wdrożeniu
  • Przekaż plik zip i zainstaluj pakiety npm

Konfigurowanie wpisów tajnych jako ustawień aplikacji

  1. Skonfiguruj wpisy tajne usług Azure AI jako ustawienia CS_ACCOUNT_NAME aplikacji i CS_ACCOUNT_KEY.

    # Get subscription key for Cognitive Services resource
    csKey1=$(az cognitiveservices account keys list --resource-group $groupName --name $csResourceName --query key1 --output tsv)
    
    az webapp config appsettings set --resource-group $groupName --name $appName --settings CS_ACCOUNT_NAME="$csResourceName" CS_ACCOUNT_KEY="$csKey1"
    
  2. W przeglądarce przejdź do aplikacji wdrażania pod adresem <app-name>.azurewebsites.net i wypróbuj narzędzie do wykrywania języka z ciągami w różnych językach.

    Zrzut ekranu przedstawiający wdrożona aplikację do wykrywania języka w App Service.

    Jeśli spojrzysz na kod aplikacji, możesz zauważyć, że dane wyjściowe debugowania dla wykrywania będą mieć taki sam kolor czcionki jak tło. Możesz go zobaczyć, próbując wyróżnić biały znak bezpośrednio poniżej wyniku.

Bezpieczna łączność zaplecza

W tej chwili wpisy tajne połączenia są przechowywane jako ustawienia aplikacji w aplikacji App Service. Takie podejście już zabezpiecza wpisy tajne połączeń z bazy kodu aplikacji. Jednak każdy współautor, który może zarządzać aplikacją, może również zobaczyć ustawienia aplikacji. W tym kroku przeniesiesz wpisy tajne połączenia do magazynu kluczy i zablokujesz dostęp, aby zarządzać nim tylko wtedy, gdy tylko aplikacja App Service może ją odczytać przy użyciu tożsamości zarządzanej.

  1. Utwórz magazyn kluczy. Zastąp <ciąg vault-name> unikatową nazwą.

    # Save app name as variable for convenience
    vaultName=<vault-name>
    
    az keyvault create --resource-group $groupName --name $vaultName --location $region --sku standard --enable-rbac-authorization
    

    Parametr --enable-rbac-authorizationustawia kontrolę dostępu opartą na rolach (RBAC) platformy Azure jako model uprawnień. To ustawienie domyślnie unieważnia wszystkie uprawnienia zasad dostępu.

  2. Nadaj sobie rolę RBAC oficera RBAC Key Vault Secrets Officer dla magazynu.

    vaultResourceId=$(az keyvault show --name $vaultName --query id --output tsv)
    myId=$(az ad signed-in-user show --query id --output tsv)
    az role assignment create --role "Key Vault Secrets Officer" --assignee-object-id $myId --assignee-principal-type User --scope $vaultResourceId
    
  3. Włącz tożsamość zarządzaną przypisaną przez system dla aplikacji i nadaj jej rolę RBAC użytkownika wpisów tajnych Key Vault dla magazynu.

    az webapp identity assign --resource-group $groupName --name $appName --scope $vaultResourceId --role  "Key Vault Secrets User"
    
  4. Dodaj nazwę zasobu usługi Azure AI i klucz subskrypcji jako wpisy tajne do magazynu i zapisz ich identyfikatory jako zmienne środowiskowe w następnym kroku.

    csResourceKVUri=$(az keyvault secret set --vault-name $vaultName --name csresource --value $csResourceName --query id --output tsv)
    csKeyKVUri=$(az keyvault secret set --vault-name $vaultName --name cskey --value $csKey1 --query id --output tsv)
    
  5. Wcześniej należy ustawić wpisy tajne jako ustawienia CS_ACCOUNT_NAME aplikacji i CS_ACCOUNT_KEY w aplikacji. Teraz należy ustawić je jako odwołania do magazynu kluczy .

    az webapp config appsettings set --resource-group $groupName --name $appName --settings CS_ACCOUNT_NAME="@Microsoft.KeyVault(SecretUri=$csResourceKVUri)" CS_ACCOUNT_KEY="@Microsoft.KeyVault(SecretUri=$csKeyKVUri)"
    
  6. W przeglądarce przejdź ponownie do <app-name>.azurewebsites.net adresu . Jeśli z powrotem otrzymasz wyniki wykrywania, łączysz się z punktem końcowym usług Azure AI za pomocą odwołań do magazynu kluczy.

Gratulacje, twoja aplikacja łączy się teraz z usługami Azure AI przy użyciu wpisów tajnych przechowywanych w magazynie kluczy bez żadnych zmian w kodzie aplikacji.

Czyszczenie zasobów

W poprzednich krokach utworzono zasoby platformy Azure w grupie zasobów. Jeśli te zasoby nie będą raczej potrzebne w przyszłości, usuń grupę zasobów, uruchamiając następujące polecenie w usłudze Cloud Shell:

az group delete --name $groupName

Wykonanie tego polecenia może potrwać około minutę.

Następne kroki