Key Vault ve App Service için Azure İşlevleri

Bu konu başlığında, kod değişikliğine gerek kalmadan Azure Key Vault uygulamanıza App Service Azure İşlevleri gizli dizilerle nasıl çalışabilirsiniz? Azure Key Vault, erişim ilkeleri ve denetim geçmişi üzerinde tam denetime sahip merkezi gizli dizi yönetimi sağlayan bir hizmettir.

Uygulamanıza Key Vault

Gizli dizileri farklı Key Vault için bir kasa oluşturmalı ve uygulamanıza erişim izni verebilirsiniz.

  1. hızlı başlangıç bilgilerine göz atarak Key Vault oluşturun.

  2. Uygulamanıza bir yönetilen kimlik oluşturun.

    Key Vault, varsayılan olarak uygulamanın sistem tarafından atanan kimliğini kullanır, ancak kullanıcı tarafından atanan bir kimlik belirtebilirsiniz.

  3. Daha önce oluşturduğunuz uygulama Key Vault bir erişim ilkesi oluşturun. Bu ilkede "Get" gizli bilgi iznini etkinleştirin. "Yetkili uygulama" veya ayarları applicationId yapılandırmazsanız, bu bir yönetilen kimlikle uyumlu değildir.

Ağ ile kısıtlanmış kasalara erişme

Kasanız ağ kısıtlamalarıyla yapılandırılmışsa,uygulamanın ağ erişimi olduğundan da emin olun.

  1. Uygulamanın ağ özellikleri ve ağ seçeneklerinde açıklandığı gibi, App Service Azure İşlevleri olduğundan emin olun.

    Ayrıca özel uç noktaları kullanmaya çalışan Linux uygulamaları, uygulamanın sanal ağ üzerinden tüm trafik rotalarına sahip olacak şekilde açıkça yapılandırılmasını gerektirir. Bu gereksinim gelecek bir güncelleştirmede kaldırılacaktır. Bunu ayarlamak için aşağıdaki CLI komutunu kullanın:

    az webapp config set --subscription <sub> -g <rg> -n <appname> --generic-configurations '{"vnetRouteAllEnabled": true}'
    
  2. Kasanın, uygulamanıza erişecek ağ veya alt ağ için yapılandırma hesaplarının olduğundan emin olun.

Not

Windows kapsayıcısı şu anda VNet Tümleştirmesi Key Vault başvurularını desteklemez.

Kullanıcı tarafından atanan kimlikle kasalara erişme

Bazı uygulamaların, sistem tarafından atanan kimlik henüz kullanılabilir olmayacakken oluşturma zamanında gizli dizilere başvuracak olması gerekir. Bu durumlarda, kullanıcı tarafından atanan bir kimlik oluşturulabilir ve kasaya önceden erişim izni verilmiştir.

Kullanıcı tarafından atanan kimliğe izinler verdiktan sonra şu adımları izleyin:

  1. Henüz uygulamanıza kimlik atamadınız.

  2. Özelliğini kullanıcı tarafından atanan kimliğin kaynak kimliğine ayar Key Vault için uygulamayı bu kimliği kullanmak keyVaultReferenceIdentity üzere yapılandırma.

    userAssignedIdentityResourceId=$(az identity show -g MyResourceGroupName -n MyUserAssignedIdentityName --query id -o tsv)
    appResourceId=$(az webapp show -g MyResourceGroupName -n MyAppName --query id -o tsv)
    az rest --method PATCH --uri "${appResourceId}?api-version=2021-01-01" --body "{'properties':{'keyVaultReferenceIdentity':'${userAssignedIdentityResourceId}'}}"
    

Bu yapılandırma, uygulamanın tüm başvuruları için geçerlidir.

Başvuru söz dizimi

Bir Key Vault @Microsoft.KeyVault({referenceString}) biçimidir; {referenceString} burada, aşağıdaki seçeneklerden biri ile değiştirilir:

Başvuru dizesi Description
SecretUri=secretUri SecretUri, isteğe bağlı olarak bir sürüm de dahil olmak üzere Key Vault gizli Key Vault tam veri düzlemi URI'si https://myvault.vault.azure.net/secrets/mysecret/ olması gerekir.https://myvault.vault.azure.net/secrets/mysecret/ec96f02080254f109c51a1f14cdb1931
VaultName=vaultName; SecretName=secretName; SecretVersion=secretVersion VaultName gereklidir ve kaynak adı Key Vault gerekir. SecretName gereklidir ve hedef gizli adın adı olması gerekir. SecretVersion isteğe bağlıdır, ancak varsa, kullanmak üzere gizli öğenin sürümünü gösterir.

Örneğin, tam bir başvuru aşağıdaki gibi olabilir:

@Microsoft.KeyVault(SecretUri=https://myvault.vault.azure.net/secrets/mysecret/)

Alternatif olarak:

@Microsoft.KeyVault(VaultName=myvault;SecretName=mysecret)

Döndürme

Başvuruda bir sürüm belirtilmezse, uygulama anahtar kasasında mevcut olan en son sürümü kullanır. Döndürme olayı gibi daha yeni sürümler kullanılabilir olduğunda, uygulama 24 saat içinde otomatik olarak güncelleştirmeyi ve en son sürümü kullanmaya başlar. Gecikmenin nedeni App Service kasa başvurularının değerlerini önbelleğe alan ve 24 saatte bir yeniden önbelleğe alan bir dosyadır. Uygulamada yapılan tüm yapılandırma değişiklikleri, başvurulan tüm gizli dizilerin hemen yeniden yakalanmasına neden olur.

Ayarlar Kaynak Uygulama Key Vault

Key Vault, site yapılandırması yerine gizli dizileri Ayarlaruygulama içinde tutmanıza olanak sağlayan Application Key Vault için değer olarak kullanılabilir. Uygulama Ayarlar güvenli bir şekilde şifrelenir, ancak gizli yönetim özelliklerine ihtiyacınız varsa, gizli Key Vault.

Uygulama ayarı Key Vault bir uygulama başvurusu kullanmak için,başvuru değerini ayarın değeri olarak ayarlayın. Uygulamanız, anahtarı aracılığıyla gizli anahtara normal şekilde başvurabilirsiniz. Kodda değişiklik gerekmez.

İpucu

Uygulama başvurularını Key Vault çoğu uygulama ayarı yuva ayarları olarak işaretlenir çünkü her ortam için ayrı kasalara sahip olursanız.

Bağlama ile ilgili Azure Dosyalar noktalar

Uygulamalar, dosya WEBSITE_CONTENTAZUREFILECONNECTIONSTRING sistemi olarak Azure Dosyalar için uygulama ayarını kullanabilir. Bu ayar, uygulamanın düzgün bir şekilde başlatılana kadar ek doğrulama denetimlerine sahip olur. Platform, Azure Dosyalar içinde bir içerik paylaşımına sahip olma Azure Dosyalar ayar aracılığıyla belirtilmemişse varsayılan bir ad WEBSITE_CONTENTSHARE varsayıyor. Bu ayarları değiştiren tüm istekler için platform, bu içerik paylaşımının mevcut olup olmadığını doğrulamayı ve yoksa bunu oluşturmayı denemeyi dener. İçerik paylaşımını bulamaz veya oluşturamazsa istek engellenir.

Bu ayar için Key Vault başvurular kullanılırken, gelen istek işlenirken gizli bilgi çözümlenemezse bu doğrulama denetimi varsayılan olarak başarısız olur. Bu sorunu önlemek için doğrulamayı WEBSITE_SKIP_CONTENTSHARE_VALIDATION "1" olarak ayarlayıp atlayabilirsiniz. Bu tüm denetimleri atlar ve içerik paylaşımı sizin için oluşturulmaz. Önceden oluşturulduktan emin olmak gerekir.

Dikkat

Doğrulamayı atlarsanız ve bağlantı dizesi veya içerik paylaşımı geçersizse, uygulama düzgün başlatamaz ve yalnızca HTTP 500 hatalarına neden olur.

Sitenin oluşturulmasının bir parçası olarak, yönetilen kimlik izinlerinin yayılmamış olması veya sanal ağ tümleştirmesi ayarlanmazsa içerik paylaşımını bağlama girişiminin başarısız olması da mümkündür. Bu ayarı daha sonra Azure Dosyalar şablonuna kadar erteleyebilirsiniz. Daha Azure Resource Manager için bkz. dağıtım. App Service, Azure Dosyalar ayarlanana kadar varsayılan bir dosya sistemi kullanır ve dosyalar kopyalanmaz. Bu nedenle, Azure Dosyalar bağlı olmadan önce ara dönemde hiçbir dağıtım girişiminin oluşmay olduğundan emin olun.

Azure Resource Manager dağıtımı

Kaynak dağıtımlarını şablon Azure Resource Manager otomatik hale Azure Resource Manager, bu özelliğin çalışması için bağımlılıklarınızı belirli bir sırada sıralamanız gerekir. Ayrıca, uygulama ayarlarınızı site tanımında bir özellik kullanmak yerine kendi kaynakları siteConfig olarak tanımlamanız gerekir. Bunun nedeni, sistem tarafından atanan kimliğin bu kimlikle oluşturulacak ve erişim ilkesinde kullanılalacak şekilde önce sitenin tanımlanmamış olmasıdır.

Bir işlev uygulaması için örnek bir sahte şablon aşağıdaki gibi olabilir:

{
    //...
    "resources": [
        {
            "type": "Microsoft.Storage/storageAccounts",
            "name": "[variables('storageAccountName')]",
            //...
        },
        {
            "type": "Microsoft.Insights/components",
            "name": "[variables('appInsightsName')]",
            //...
        },
        {
            "type": "Microsoft.Web/sites",
            "name": "[variables('functionAppName')]",
            "identity": {
                "type": "SystemAssigned"
            },
            //...
            "resources": [
                {
                    "type": "config",
                    "name": "appsettings",
                    //...
                    "dependsOn": [
                        "[resourceId('Microsoft.Web/sites', variables('functionAppName'))]",
                        "[resourceId('Microsoft.KeyVault/vaults/', variables('keyVaultName'))]",
                        "[resourceId('Microsoft.KeyVault/vaults/secrets', variables('keyVaultName'), variables('storageConnectionStringName'))]",
                        "[resourceId('Microsoft.KeyVault/vaults/secrets', variables('keyVaultName'), variables('appInsightsKeyName'))]"
                    ],
                    "properties": {
                        "AzureWebJobsStorage": "[concat('@Microsoft.KeyVault(SecretUri=', reference(variables('storageConnectionStringResourceId')).secretUriWithVersion, ')')]",
                        "WEBSITE_CONTENTAZUREFILECONNECTIONSTRING": "[concat('@Microsoft.KeyVault(SecretUri=', reference(variables('storageConnectionStringResourceId')).secretUriWithVersion, ')')]",
                        "APPINSIGHTS_INSTRUMENTATIONKEY": "[concat('@Microsoft.KeyVault(SecretUri=', reference(variables('appInsightsKeyResourceId')).secretUriWithVersion, ')')]",
                        "WEBSITE_ENABLE_SYNC_UPDATE_SITE": "true"
                        //...
                    }
                },
                {
                    "type": "sourcecontrols",
                    "name": "web",
                    //...
                    "dependsOn": [
                        "[resourceId('Microsoft.Web/sites', variables('functionAppName'))]",
                        "[resourceId('Microsoft.Web/sites/config', variables('functionAppName'), 'appsettings')]"
                    ],
                }
            ]
        },
        {
            "type": "Microsoft.KeyVault/vaults",
            "name": "[variables('keyVaultName')]",
            //...
            "dependsOn": [
                "[resourceId('Microsoft.Web/sites', variables('functionAppName'))]"
            ],
            "properties": {
                //...
                "accessPolicies": [
                    {
                        "tenantId": "[reference(resourceId('Microsoft.Web/sites/', variables('functionAppName')), '2020-12-01', 'Full').identity.tenantId]",
                        "objectId": "[reference(resourceId('Microsoft.Web/sites/', variables('functionAppName')), '2020-12-01', 'Full').identity.principalId]",
                        "permissions": {
                            "secrets": [ "get" ]
                        }
                    }
                ]
            },
            "resources": [
                {
                    "type": "secrets",
                    "name": "[variables('storageConnectionStringName')]",
                    //...
                    "dependsOn": [
                        "[resourceId('Microsoft.KeyVault/vaults/', variables('keyVaultName'))]",
                        "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
                    ],
                    "properties": {
                        "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('storageAccountName'), ';AccountKey=', listKeys(variables('storageAccountResourceId'),'2019-09-01').key1)]"
                    }
                },
                {
                    "type": "secrets",
                    "name": "[variables('appInsightsKeyName')]",
                    //...
                    "dependsOn": [
                        "[resourceId('Microsoft.KeyVault/vaults/', variables('keyVaultName'))]",
                        "[resourceId('Microsoft.Insights/components', variables('appInsightsName'))]"
                    ],
                    "properties": {
                        "value": "[reference(resourceId('microsoft.insights/components/', variables('appInsightsName')), '2019-09-01').InstrumentationKey]"
                    }
                }
            ]
        }
    ]
}

Not

Bu örnekte, kaynak denetimi dağıtımı uygulama ayarlarına bağlıdır. Bu normalde güvenli değildir çünkü uygulama ayarı güncelleştirmesi zaman uyumsuz olarak davranır. Ancak, uygulama ayarını dahil WEBSITE_ENABLE_SYNC_UPDATE_SITE etmek için güncelleştirme zaman uyumlu. Bu, kaynak denetimi dağıtımının yalnızca uygulama ayarları tamamen güncelleştirildiğinde başlayacağı anlamına gelir. Daha fazla uygulama ayarı için bkz. Ortam değişkenleri ve uygulama ayarları Azure App Service.

Key Vault Sorunlarını Giderme

Bir başvuru düzgün çözümlenmezse, bunun yerine başvuru değeri kullanılır. Bu, uygulama ayarları için değeri söz dizimi olan bir ortam değişkeni oluşturulacak anlamına @Microsoft.KeyVault(...) gelir. Bu durum uygulamanın belirli bir yapının gizli bir slanı beklediği için hatalara neden olabilir.

En yaygın olarak, bunun nedeni, erişim ilkesi için Key Vault olmasıdır. Ancak bunun nedeni gizli dizinin artık mevcut olması veya başvuruda söz dizimi hatası olması olabilir.

Söz dizimi doğruysa, portalda geçerli çözüm durumunu kontrol ederek hatanın diğer nedenlerini görüntüebilirsiniz. Uygulama Uygulaması'Ayarlar gidin ve söz konusu başvuru için "Düzenle"yi seçin. Ayar yapılandırmasının altında, hatalar da dahil olmak üzere durum bilgilerini görüyor olun. Bunların olmaması, başvuru söz dizimlerinin geçersiz olduğu anlamına gelir.

Ek bilgi almak için yerleşik algılayıcılardan birini de kullanabilirsiniz.

Algılayıcıyı App Service

  1. Portalda uygulamanıza gidin.
  2. Sorunları tanılama ve çözme’yi seçin.
  3. Kullanılabilirlik ve Performans'ı ve ardından Web uygulaması kapat'ı seçin.
  4. Uygulama Key Vault Tanılama Ayarlar ı bulun ve Daha fazla bilgi'ye tıklayın.

Algılayıcıyı Azure İşlevleri

  1. Portalda uygulamanıza gidin.
  2. Platform özellikleri'ne gidin.
  3. Sorunları tanılama ve çözme’yi seçin.
  4. Kullanılabilirlik ve Performans'ı seçin ve İşlev uygulaması çalışmıyor veya hataları bildir'i seçin.
  5. Uygulama Tanılama Key Vault'Ayarlar tıklayın.