Titkos kulcs elforgatá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 megoldás. Ezekben az esetekben hozzáférési kulcsokat vagy titkos kulcsokat használnak. Rendszeresen forgassa el a hozzáférési kulcsokat vagy titkos kulcsokat.
Ez az oktatóanyag bemutatja, hogyan automatizálható a titkos kulcsok rendszeres rotálása olyan adatbázisok és szolgáltatások esetében, amelyek egy hitelesítési hitelesítő adatokat használnak. Ez az oktatóanyag az Azure Event Grid-értesítés által aktivált függvény használatával elforgatja az Azure Key Vaultban tárolt SQL Server-jelszavakat:
- Harminc nappal a titkos kód lejárati dátuma előtt a 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 Vaultban.
- A függvényalkalmazás frissíti az SQL Servert az új jelszóval.
Feljegyzés
A 3. és a 4. lépés között eltérés lehet. Ez idő alatt a Key Vault titkos kulcsa nem tud hitelesíteni az SQL Serveren. Ha valamelyik lépés meghiúsul, az Event Grid két órán keresztül újrapróbálkozza.
Előfeltételek
- Azure-előfizetés – hozzon létre egyet ingyenesen.
- Azure Key Vault
- SQL Server
Ha nem rendelkezik meglévő Key Vault- és SQL Server-kiszolgálóval, használja ezt az üzembehelyezé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 Admin Login (SQL-rendszergazdai bejelentkezés) mezőbe írja be az SQL-rendszergazda bejelentkezési nevét.
- Válassza az Áttekintés + létrehozás lehetőséget.
- Válassza a Létrehozás elemet
Most már rendelkezik egy Key Vault- és egy SQL Server-példánysal. 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 függvényalkalmazást rendszer által felügyelt identitással a többi szükséges összetevő mellett, és telepítse az SQL Server jelszóforgató függvényeit
A függvényalkalmazáshoz az alábbi összetevők szükségesek:
- Egy Azure-alkalmazás szolgáltatáscsomag
- 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 Key Vault titkos kulcsainak eléréséhez
- Event Grid-esemény-előfizetés a SecretNearExpiry eseményhez
Válassza ki az Azure-sablon üzembehelyezési hivatkozását:
Az Erőforráscsoport listában válassza az akvrotation lehetőséget.
Az SQL Server nevére írja be az SQL Server nevét a elforgatni kívánt jelszóval
Írja be a kulcstartó nevét a Key Vault névbe
A függvényalkalmazás nevére írja be a függvényalkalmazás nevét
A titkos kódnévbe írja be a titkos kód nevét, ahol a jelszó tárolása történik
Az adattár URL-címében írja be a GitHub helyének függvénykódját (https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp.git)
Válassza az Áttekinté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 rendelkezni fog egy tárfiók, egy kiszolgálófarm és egy függvényalkalmazás. 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 az Azure Portalról, felügyelt identitás használata az App Service-hez és az Azure Functionshöz, valamint Key Vault hozzáférési szabályzat hozzárendelése az Azure Portal használatával.
Rotációs függvény
Az előző lépésben üzembe helyezett függvény egy esemény használatával aktiválja a titkos kulcsok forgását 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 kulcs rotálási 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 kulcs hozzáadása a Key Vaulthoz
Állítsa be a hozzáférési szabályzatot úgy, hogy titkos kulcsok 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 az SQL Server erőforrás-azonosítóját, az SQL Server bejelentkezési nevét és a titkos kód érvényességi időtartamát napokban. Adja meg a titkos kód nevét, az SQL Database kezdeti jelszavát (a "Simple123" példában), és adjon meg egy 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
A titkos kód rövid lejárati dátummal történő létrehozása 15 percen belül közzétesz egy SecretNearExpiry
eseményt, ami aktiválja a függvényt a titkos kód elforgatásához.
Tesztelés és ellenőrzés
Annak ellenőrzéséhez, hogy a titkos kulcs elforgatva lett-e, lépjen a Key Vault>titkos kulcsai közé:
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ő adatok ellenőrzéséhez hozzon létre egy webalkalmazást. Ez a webalkalmazás lekéri a titkos kulcsot a Key Vaultból, kinyeri az SQL-adatbázis adatait és hitelesítő adatait a titkos kódból, és teszteli a kapcsolatot az SQL Serverrel.
A webalkalmazáshoz az alábbi összetevők szükségesek:
- Webalkalmazás rendszer által felügyelt identitással
- Hozzáférési szabályzat a Key Vault titkos kulcsokhoz való hozzáféréséhez webalkalmazás által felügyelt identitáson keresztül
Válassza ki az Azure-sablon üzembehelyezési hivatkozását:
Válassza ki az akvrotation erőforráscsoportot.
Az SQL Server nevére írja be az SQL Server nevét a elforgatni kívánt jelszóval
Írja be a kulcstartó nevét a Key Vault névbe
A titkos kódnévbe írja be a titkos kód nevét, ahol a jelszó tárolása történik
Az adattár URL-címében írja be a webalkalmazás gitHub-helyét (https://github.com/Azure-Samples/KeyVault-Rotation-SQLPassword-Csharp-WebApp.git)
Válassza az Áttekinté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 csatlakoztatott igaz érték.