Titkos kód rotálásának automatizálása egy hitelesítési hitelesítő adatokat használó erőforrások esetében

Az Azure-szolgáltatások hitelesítésének legjobb módja egy felügyelt identitás használata, de vannak olyan forgatókönyvek, amelyekben ez nem lehetséges. Ezekben az esetekben hozzáférési kulcsokat vagy titkos kulcsokat használnak. Időnként el kell forgatnia a hozzáférési kulcsokat vagy titkos kulcsokat.

Ez az oktatóanyag bemutatja, hogyan automatizálhatja a titkos kódok rendszeres rotálását olyan adatbázisok és szolgáltatások esetében, amelyek egy hitelesítési hitelesítő adatokat használnak. Ez az oktatóanyag egy Azure Event Grid értesítés által aktivált függvény használatával elforgatja az Azure Key Vault-ben tárolt SQL Server jelszavakat:

Forgatási megoldás diagramja

  1. A titkos kód lejárati dátuma előtt 30 nappal Key Vault közzéteszi a "közel lejárati" eseményt az Event Gridben.
  2. Az Event Grid ellenőrzi az esemény-előfizetéseket, és HTTP POST használatával hívja meg az eseményre előfizetett függvényalkalmazás-végpontot.
  3. A függvényalkalmazás megkapja a titkos adatokat, létrehoz egy új véletlenszerű jelszót, és létrehoz egy új verziót a titkos kódhoz az új jelszóval a Key Vault.
  4. A függvényalkalmazás az új jelszóval frissíti SQL Server.

Megjegyzés

A 3. és a 4. lépés között késés lehet. Ez idő alatt az Key Vault titkos kódja nem fog tudni hitelesíteni a SQL Server. Ha valamelyik lépés meghiúsul, az Event Grid két órán keresztül újrapróbálkozásokat tesz.

Előfeltételek

Ha nem rendelkezik meglévő Key Vault és SQL Server, használhatja ezt az üzembe helyezési hivatkozást:

A képen egy

  1. Az Erőforráscsoport területen válassza az Új létrehozása lehetőséget. Adjon nevet a csoportnak, ebben az oktatóanyagban akvrotation-t használunk.
  2. Az SQL Rendszergazda Bejelentkezés területen írja be az SQL-rendszergazda bejelentkezési nevét.
  3. Válassza az Áttekintés + létrehozás lehetőséget.
  4. Kattintson a Létrehozás elemre.

Erőforráscsoport létrehozása

Most egy Key Vault és egy SQL Server példánya lesz. Ezt a beállítást az Azure CLI-ben az alábbi parancs futtatásával ellenőrizheti:

az resource list -o table -g akvrotation

Az eredmény a következő kimenetnek fog kinézni:

Name                     ResourceGroup         Location    Type                               Status
-----------------------  --------------------  ----------  ---------------------------------  --------
akvrotation-kv           akvrotation      eastus      Microsoft.KeyVault/vaults
akvrotation-sql          akvrotation      eastus      Microsoft.Sql/servers
akvrotation-sql/master   akvrotation      eastus      Microsoft.Sql/servers/databases
akvrotation-sql2         akvrotation      eastus      Microsoft.Sql/servers
akvrotation-sql2/master  akvrotation      eastus      Microsoft.Sql/servers/databases

SQL Server jelszóforgató függvény létrehozása és üzembe helyezése

Fontos

Ehhez a sablonhoz a kulcstartónak, az SQL Servernek és az Azure-függvénynek ugyanabban az erőforráscsoportban kell lennie.

Ezután hozzon létre egy rendszer által felügyelt identitással rendelkező függvényalkalmazást a többi szükséges összetevő mellett, és telepítse az SQL Server jelszóforgató függvényeit

A függvényalkalmazásnak a következő összetevőkre van szüksége:

  • Egy Azure App Service csomag
  • Függvényalkalmazás SQL-jelszóforgató függvényekkel eseményindítóval és HTTP-eseményindítóval
  • A függvényalkalmazás-eseményindítók kezeléséhez szükséges tárfiók
  • A függvényalkalmazás identitásának hozzáférési szabályzata a titkos kódok eléréséhez a Key Vault
  • Event Grid-esemény-előfizetés a SecretNearExpiry eseményhez
  1. Válassza az Azure-sablon üzembehelyezési hivatkozását:

    A képen egy

  2. Az Erőforráscsoport listában válassza az akvrotation lehetőséget.

  3. A SQL Server Név mezőbe írja be az elforgatni kívánt SQL Server nevet jelszóval

  4. A Key Vault Név mezőbe írja be a kulcstartó nevét

  5. A Függvényalkalmazás neve mezőbe írja be a függvényalkalmazás nevét

  6. A Titkos kód neve mezőbe írja be a titkos kód nevét, ahol a jelszó el lesz tárolva

  7. Az adattár URL-címében írja be a GitHub hely függvénykódját (https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp.git)

  8. Válassza a Felülvizsgálat és létrehozás lehetőséget.

  9. Válassza a Létrehozás lehetőséget.

Válassza a Véleményezés+létrehozás lehetőséget

Az előző lépések elvégzése után egy tárfiók, egy kiszolgálófarm és egy függvényalkalmazás lesz a rendelkezésére. Ezt a beállítást az Azure CLI-ben az alábbi parancs futtatásával ellenőrizheti:

az resource list -o table -g akvrotation

Az eredmény a következő kimenethez hasonlóan fog kinézni:

Name                     ResourceGroup         Location    Type                               Status
-----------------------  --------------------  ----------  ---------------------------------  --------
akvrotation-kv           akvrotation       eastus      Microsoft.KeyVault/vaults
akvrotation-sql          akvrotation       eastus      Microsoft.Sql/servers
akvrotation-sql/master   akvrotation       eastus      Microsoft.Sql/servers/databases
cfogyydrufs5wazfunctions akvrotation       eastus      Microsoft.Storage/storageAccounts
akvrotation-fnapp        akvrotation       eastus      Microsoft.Web/serverFarms
akvrotation-fnapp        akvrotation       eastus      Microsoft.Web/sites
akvrotation-fnapp        akvrotation       eastus      Microsoft.insights/components

További információ arról, hogyan hozhat létre függvényalkalmazást, és hogyan használhat felügyelt identitást a Key Vault eléréséhez: Függvényalkalmazás létrehozása a Azure Portal, Felügyelt identitás használata App Service és Azure Functions esetén, valamint Key Vault hozzáférési szabályzat hozzárendelése a következővel: Azure Portal.

Rotációs függvény

Az előző lépésben üzembe helyezett függvény egy eseményt használ egy titkos kód rotálásának elindításához a Key Vault és az SQL-adatbázis frissítésével.

Függvény eseményindító eseménye

Ez a függvény beolvassa az eseményadatokat, és futtatja a rotációs logikát:

public static class SimpleRotationEventHandler
{
   [FunctionName("AKVSQLRotation")]
   public static void Run([EventGridTrigger]EventGridEvent eventGridEvent, ILogger log)
   {
      log.LogInformation("C# Event trigger function processed a request.");
      var secretName = eventGridEvent.Subject;
      var secretVersion = Regex.Match(eventGridEvent.Data.ToString(), "Version\":\"([a-z0-9]*)").Groups[1].ToString();
      var keyVaultName = Regex.Match(eventGridEvent.Topic, ".vaults.(.*)").Groups[1].ToString();
      log.LogInformation($"Key Vault Name: {keyVaultName}");
      log.LogInformation($"Secret Name: {secretName}");
      log.LogInformation($"Secret Version: {secretVersion}");

      SecretRotator.RotateSecret(log, secretName, keyVaultName);
   }
}

Titkos kulcsok rotálásának logikája

Ez a rotációs módszer beolvassa az adatbázis adatait a titkos kódból, létrehozza a titkos kód új verzióját, és frissíti az adatbázist az új titkos kóddal:

    public class SecretRotator
    {
		private const string CredentialIdTag = "CredentialId";
		private const string ProviderAddressTag = "ProviderAddress";
		private const string ValidityPeriodDaysTag = "ValidityPeriodDays";

		public static void RotateSecret(ILogger log, string secretName, string keyVaultName)
        {
            //Retrieve Current Secret
            var kvUri = "https://" + keyVaultName + ".vault.azure.net";
            var client = new SecretClient(new Uri(kvUri), new DefaultAzureCredential());
            KeyVaultSecret secret = client.GetSecret(secretName);
            log.LogInformation("Secret Info Retrieved");

            //Retrieve Secret Info
            var credentialId = secret.Properties.Tags.ContainsKey(CredentialIdTag) ? secret.Properties.Tags[CredentialIdTag] : "";
            var providerAddress = secret.Properties.Tags.ContainsKey(ProviderAddressTag) ? secret.Properties.Tags[ProviderAddressTag] : "";
            var validityPeriodDays = secret.Properties.Tags.ContainsKey(ValidityPeriodDaysTag) ? secret.Properties.Tags[ValidityPeriodDaysTag] : "";
            log.LogInformation($"Provider Address: {providerAddress}");
            log.LogInformation($"Credential Id: {credentialId}");

            //Check Service Provider connection
            CheckServiceConnection(secret);
            log.LogInformation("Service  Connection Validated");
            
            //Create new password
            var randomPassword = CreateRandomPassword();
            log.LogInformation("New Password Generated");

            //Add secret version with new password to Key Vault
            CreateNewSecretVersion(client, secret, randomPassword);
            log.LogInformation("New Secret Version Generated");

            //Update Service Provider with new password
            UpdateServicePassword(secret, randomPassword);
            log.LogInformation("Password Changed");
            log.LogInformation($"Secret Rotated Successfully");
        }
}

A teljes kódot a GitHubon találja.

Titkos kód hozzáadása a Key Vault

Állítsa be a hozzáférési szabályzatot úgy, hogy titkos kódok kezelésére vonatkozó engedélyeket adjon a felhasználóknak:

az keyvault set-policy --upn <email-address-of-user> --name akvrotation-kv --secret-permissions set delete get list

Hozzon létre egy új titkos kulcsot, amely tartalmazza a SQL Server erőforrás-azonosítót, a SQL Server bejelentkezési nevet és a titkos kód érvényességi időtartamát napokban. Adja meg a titkos kód nevét, az SQL-adatbázis kezdeti jelszavát (a "Simple123" példában), és adja meg a holnapra beállított lejárati dátumot.

$tomorrowDate = (get-date).AddDays(+1).ToString("yyy-MM-ddThh:mm:ssZ")
az keyvault secret set --name sqlPassword --vault-name akvrotation-kv --value "Simple123" --tags "CredentialId=sqlAdmin" "ProviderAddress=<sql-database-resource-id>" "ValidityPeriodDays=90" --expires $tomorrowDate

Egy rövid lejárati dátummal rendelkező titkos kód létrehozása 15 percen belül közzétesz egy eseményt SecretNearExpiry , amely aktiválja a függvényt a titkos kód elforgatásához.

Tesztelés és ellenőrzés

Ha ellenőrizni szeretné, hogy a titkos kód elforgatva lett-e, lépjen a Key Vault>Secrets lapra:

Képernyőkép Key Vault Titkos kódok eléréséhez>.

Nyissa meg az sqlPassword titkos kódot, és tekintse meg az eredeti és elforgatott verziókat:

Ugrás a Titkos kódokra

Webalkalmazás létrehozása

Az SQL hitelesítő adatainak ellenőrzéséhez hozzon létre egy webalkalmazást. Ez a webalkalmazás lekéri Key Vault titkos kódját, kinyeri az SQL-adatbázis adatait és hitelesítő adatait a titkos kódból, és teszteli a kapcsolatot a SQL Server.

A webalkalmazásnak a következő összetevőkre van szüksége:

  • Rendszer által felügyelt identitással rendelkező webalkalmazás
  • Hozzáférési szabályzat az Key Vault titkos kulcsaihoz való hozzáféréshez webalkalmazás által felügyelt identitáson keresztül
  1. Válassza az Azure-sablon üzembehelyezési hivatkozását:

    A képen egy

  2. Válassza ki az akvrotation erőforráscsoportot .

  3. A SQL Server Név mezőbe írja be az elforgatni kívánt SQL Server nevet jelszóval

  4. A Key Vault Név mezőbe írja be a kulcstartó nevét

  5. A Titkos kód neve mezőbe írja be a titkos kód nevét, ahol a jelszó található

  6. Az adattár URL-címében írja be a webalkalmazás-kód GitHub-helyét (https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp-WebApp.git)

  7. Válassza a Felülvizsgálat és létrehozás lehetőséget.

  8. Válassza a Létrehozás lehetőséget.

A webalkalmazás megnyitása

Nyissa meg az üzembe helyezett alkalmazás URL-címét:

'https://akvrotation-app.azurewebsites.net/'

Amikor az alkalmazás megnyílik a böngészőben, megjelenik a Generált titkos kód érték és az adatbázishoz csatlakoztatottigaz érték.

Tudjon meg többet