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:
- 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.
- 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.
- 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.
- 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
- Azure-előfizetés – hozzon létre egyet ingyen.
- Azure Key Vault
- SQL Server
Ha nem rendelkezik meglévő Key Vault és SQL Server, használhatja ezt az üzembe helyezési hivatkozást:
- 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.
- Az SQL Rendszergazda Bejelentkezés területen írja be az SQL-rendszergazda bejelentkezési nevét.
- Válassza az Áttekintés + létrehozás lehetőséget.
- Kattintson a Létrehozás elemre.
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
Válassza az Azure-sablon üzembehelyezési hivatkozását:
Az Erőforráscsoport listában válassza az akvrotation lehetőséget.
A SQL Server Név mezőbe írja be az elforgatni kívánt SQL Server nevet jelszóval
A Key Vault Név mezőbe írja be a kulcstartó nevét
A Függvényalkalmazás neve mezőbe írja be a függvényalkalmazás nevét
A Titkos kód neve mezőbe írja be a titkos kód nevét, ahol a jelszó el lesz tárolva
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)
Válassza a Felülvizsgálat és létrehozás lehetőséget.
Válassza a 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:
Nyissa meg az sqlPassword titkos kódot, és tekintse meg az eredeti és elforgatott verziókat:
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
Válassza az Azure-sablon üzembehelyezési hivatkozását:
Válassza ki az akvrotation erőforráscsoportot .
A SQL Server Név mezőbe írja be az elforgatni kívánt SQL Server nevet jelszóval
A Key Vault Név mezőbe írja be a kulcstartó nevét
A Titkos kód neve mezőbe írja be a titkos kód nevét, ahol a jelszó található
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)
Válassza a Felülvizsgálat és létrehozás lehetőséget.
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.