Gyakorlat – Egyéni alkalmazás konfigurálása a .NET-ben felügyelt identitás használatával
Az alkalmazások kapcsolati sztringjeit, hitelesítő adatait, jelszavait és egyéb bizalmas adatait tárolhatja az Azure Key Vaultban. A Key Vault eléréséhez hitelesítő adatokra van szüksége. Most, hogy az alkalmazás egy Azure-beli virtuális gépre vált, frissítheti a felügyelt identitások használatára, hogy hozzáférési jogkivonatot kapjon a Key Vaultban való hitelesítéshez.
A készletnyilvántartó alkalmazás egy Azure SQL Database-adatbázishoz csatlakozik. A helyszíni alkalmazás korábban konfigurációs fájlokban tárolta a kapcsolati sztringet. Az Azure-ba való migrálás részeként mostantól biztonságosan tárolhatja az összes hitelesítő adatot és kapcsolati sztring egy Azure Key Vaultban.
A készletkövető alkalmazás virtuális gépen (VM-en) fut, így használhatja a létrehozott rendszer által hozzárendelt felügyelt identitást. Egy olyan szabályzatot kell hozzáadnia a kulcstartóhoz, amely megadja a megfelelő engedélyeket a virtuális gépnek.
Ebben a gyakorlatban úgy fogja szerkeszteni az alkalmazást, hogy az új kulcstartót használja. Ezután megadja a felügyelt identitást a virtuális gép számára, hogy az alkalmazás le tudja kérni az adatbázis-kapcsolatot. Végül létrehoz és futtat egy alkalmazást a virtuális gépen a Key Vault eléréséhez és az információk lekéréséhez.
Alkalmazás létrehozása a titkos adatok Key Vaultból való beolvasásához
Jelentkezzen be a korábban létrehozott virtuális gépre.
ssh $publicIP
Megjegyzés:
Ha a környezeti változó
publicIP
nincs beállítva, állítsa alaphelyzetbe a következő parancs futtatásával:export publicIP=$(az vm show \ --name prodserver \ --resource-group <rgn>[Sandbox resource group]</rgn> \ --show-details \ --query [publicIps] \ --output tsv)
Ezután futtassa újra a
ssh $publicIP
parancsot.Ugrás az identity/secretapp mappára.
cd ~/identity/secretapp
Nyissa meg a Program.cs fájlt a nanoszerkesztővel.
nano Program.cs
Ez a fájl tartalmazza a mintaalkalmazás C#-forráskódját.
Vizsgálja meg a
Main
módszert.static async Task Main(string[] args) { await GetSecretFromKeyVault().ConfigureAwait(false); }
Ez a metódus az alkalmazás belépési pontja, amely csak meghívja a
GetSecretFromKeyVault
metódust.Görgessen le a
GetSecretFromKeyVault
metódusig. Vizsgálja meg a metódus első kódblokkját.private static async Task GetSecretFromKeyVault() { var keyVaultName = "<key vault name>"; Uri keyVaultUri = new Uri($"https://{keyVaultName}.vault.azure.net"); SecretClient secretClient = new SecretClient(keyVaultUri, new DefaultAzureCredential()); ... }
Írja felül a
"<key vault name>"
változót a saját kulcstartó nevével. Ez a kód aDefaultAzureCredential
használatával hitelesíti a kérelmet intéző ügyfelet. A kód a színfalak mögött lekéri a kódot futtató virtuális gép rendszer által felügyelt identitását. Ezután létrehoz egySecretClient
példányt, amely ezt a hitelesítési sémát fogja használni. Ezt aSecretClient
példányt használhatja a kulcstartóban lévő titkos kódok eléréséhez.Tekintse meg a kód következő részét.
var keyVaultSecretName = "<secret name>"; try { var secret = await secretClient.GetSecretAsync(keyVaultSecretName).ConfigureAwait(false); Console.WriteLine($"Secret: {secret.Value}"); } catch (Exception exp) { Console.WriteLine($"Something went wrong: {exp.Message}"); }
Cserélje a
<secret name>
értéket a kulcstartóban létrehozott titkos kód nevére ("DBCredentials"
).Ez a kódblokk meghívja a
SecretClient
GetSecretAsync
metódusát, hogy lekérjen egy adott titkos kódot, és megjelenítse annak értékét. Ha az ügyfélnek nincs engedélye a kulcs elérésére, akkor ez a kód kivételt okoz, és hibaüzenetet jelenít meg.Megjegyzés:
A kódban nincs jelszó, tanúsítvány vagy titkos ügyfélkód tárolva.
A módosítások mentéséhez nyomja le a Ctrl+O billentyűkombinációt, majd nyomja le az Enter billentyűt.
A nanoszerkesztő bezárásához nyomja le a Ctrl+X billentyűkombinációt.
Az alkalmazás tesztelése
Futtassa a következő parancsot az alkalmazás létrehozásához.
dotnet restore dotnet build
Ha megfelelően szerkesztette a programot, az alkalmazás fordításának hiba nélkül kell végbemennie.
Futtassa az alkalmazást.
dotnet run
Még nem engedélyezte a virtuális gép szolgáltatásneve számára a kulcstartó elérését. Ezért az alkalmazásnak hibaüzenettel kell válaszolnia:
Something went wrong: Operation returned an invalid status code 'Forbidden'
Engedélyek megadása ahhoz, hogy a szolgáltatásnév le tudja kérni a titkos kódokat a Key Vaultból
Zárja be a virtuális géphez való kapcsolatot.
exit
Az előző gyakorlat során feljegyezte a virtuális gép résztvevő-azonosítóját. Ha nem emlékszik rá, a következő parancs futtatásával keresheti meg a virtuális gép rendszer által hozzárendelt azonosítóját. (A
$VMNAME
változó az előző gyakorlatban a .) értékreprodserver
lett beállítva.az vm identity show \ --name $VMNAME \ --resource-group <rgn>[Sandbox resource group]</rgn>
Az alábbi kód egy példa a visszaadott értékre. Az azonosítók eltérőek lesznek.
{ "principalId": "aba6da53-9180-47fc-8fc4-4b35f154e845", "tenantId": "a95baa51-dcb1-4b9a-8312-8774a8afddbe", "type": "SystemAssigned", "userAssignedIdentities": null }
Adja meg ezt értéket a következő parancsban ahhoz, hogy az csak a résztvevő-azonosítót adja vissza.
Az egyszerű azonosítóval engedélyezheti a virtuális gép számára a kulcstartó titkos kulcsainak lekérését és listázását.
az keyvault set-policy \ --name $KVNAME \ --secret-permissions get list \ --object-id $(az vm identity show \ --name $VMNAME \ --resource-group <rgn>[Sandbox resource group]</rgn> \ --output tsv \ --query principalId)
A visszaadott érték JSON formátumú. Ez tartalmazza az azonosítót, a helyet, a nevet, és az összes társított tulajdonságot.
Az alkalmazás újbóli tesztelése
Jelentkezzen be a virtuális gépre.
ssh $publicIP
Váltson a
identity/secretapp
mappára.cd ~/identity/secretapp
Futtassa az alkalmazást.
dotnet run
Az alkalmazásnak ezúttal le kell kérnie a titkos kulcsot a Key Vaultból, és meg kell jelenítenie annak értékét.
Database connection string:: Server=tcp:prodserverSQL.database.windows.net,1433;Database=myDataBase;User ID=mylogin@myserver;Password=examplePassword;Trusted_Connection=False;Encrypt=True;