إدارة الأسرار باستخدام Bicep
غالباً ما تتطلب عمليات النشر تخزين الأسرار ونشرها بشكلٍ آمن في جميع أنحاء بيئة Azure. توفر Bicep وAzure العديد من الميزات لمساعدتك في إدارة الأسرار في عمليات النشر الخاصة بك.
تجنب الأسرار حيث يمكنك
في كثيرٍ من الحالات، من الممكن تجنب استخدام الأسرار على الإطلاق. يدعم العديد من موارد Azure الهويات المدارة، والتي تمكنها من المصادقة على الموارد الأخرى داخل Azure وتخويلها، دون الحاجة إلى معالجة أو إدارة أي بيانات اعتماد. بالإضافة إلى ذلك، يمكن لبعض خدمات Azure إنشاء شهادات HTTPS لك تلقائياً، لتجنب التعامل مع الشهادات والمفاتيح الخاصة. استخدم الهويات المُدارة والشهادات المُدارة بواسطة الخدمة حيثما أمكن ذلك.
استخدام معلمات آمنة
عندما تحتاج إلى توفير أسرار لنشر Bicep الخاص بك كمعلمات، استخدم مصمم الديكور@secure()
. عندما تقوم بتمييز معلمة على أنها آمنة، يتجنب مدير موارد Azure تسجيل القيمة أو عرضها في مدخل Azure أو Azure CLI أو Azure PowerShell.
تجنب مخرجات الأسرار
تجنب استخدام مخرجات Bicep للبيانات الآمنة. يتم تسجيل المخرجات إلى محفوظات النشر، ويمكن لأي شخص لديه حق الوصول إلى النشر عرض قيم مخرجات النشر.
إذا كنت بحاجة إلى إنشاء سر ضمن نشر Bicep وإتاحته للمتصل أو موارد أخرى، ففكر في استخدام إحدى الطرق التالية.
بحث عن الأسرار ديناميكياً
في بعض الأحيان، تحتاج إلى الوصول إلى سر من أحد الموارد لتكوين مورد آخر.
على سبيل المثال، ربما تكون قد أنشأت حساب تخزين في عملية نشر أخرى، وتحتاج إلى الوصول إلى مفتاحه الأساسي لتكوين تطبيق Azure Functions. يمكنك استخدام الكلمة الأساسية existing
للحصول على مرجع مكتوب بقوة إلى حساب التخزين الذي تم إنشاؤه مسبقاً، ثم استخدم أسلوب حساب التخزين listKeys()
لإنشاء سلسلة اتصال بالمفتاح الأساسي:
المثال التالي هو جزء من مثال أكبر. للحصول على ملف Bicep الذي يمكنك توزيعه، راجع الملف الكامل.
param location string = resourceGroup().location
param storageAccountName string
param functionAppName string = 'fn-${uniqueString(resourceGroup().id)}'
var appServicePlanName = 'MyPlan'
var applicationInsightsName = 'MyApplicationInsights'
resource storageAccount 'Microsoft.Storage/storageAccounts@2021-06-01' existing = {
name: storageAccountName
}
var storageAccountConnectionString = 'DefaultEndpointsProtocol=https;AccountName=${storageAccount.name};EndpointSuffix=${environment().suffixes.storage};AccountKey=${listKeys(storageAccount.id, storageAccount.apiVersion).keys[0].value}'
resource functionApp 'Microsoft.Web/sites@2023-12-01' = {
name: functionAppName
location: location
kind: 'functionapp'
properties: {
httpsOnly: true
serverFarmId: appServicePlan.id
siteConfig: {
appSettings: [
{
name: 'APPINSIGHTS_INSTRUMENTATIONKEY'
value: applicationInsights.properties.InstrumentationKey
}
{
name: 'AzureWebJobsStorage'
value: storageAccountConnectionString
}
{
name: 'FUNCTIONS_EXTENSION_VERSION'
value: '~3'
}
{
name: 'FUNCTIONS_WORKER_RUNTIME'
value: 'dotnet'
}
{
name: 'WEBSITE_CONTENTAZUREFILECONNECTIONSTRING'
value: storageAccountConnectionString
}
]
}
}
}
resource appServicePlan 'Microsoft.Web/serverfarms@2023-12-01' = {
name: appServicePlanName
location: location
sku: {
name: 'Y1'
tier: 'Dynamic'
}
}
resource applicationInsights 'Microsoft.Insights/components@2020-02-02' = {
name: applicationInsightsName
location: location
kind: 'web'
properties: {
Application_Type: 'web'
publicNetworkAccessForIngestion: 'Enabled'
publicNetworkAccessForQuery: 'Enabled'
}
}
باستخدام هذا الأسلوب، يمكنك تجنب تمرير الأسرار داخل أو خارج ملف Bicep الخاص بك.
يمكنك أيضاً استخدام هذا الأسلوب لتخزين الأسرار في المخزن الرئيسي.
استخدام المخزن الرئيسي
تم تصميم مخزن Azure الأساسي لتخزين البيانات الآمنة وإدارتها. استخدم مخزناً رئيسياً لإدارة أسرارك وشهاداتك ومفاتيحك والبيانات الأخرى التي تحتاج إلى الحماية والمشاركة.
يمكنك إنشاء وإدارة الخزائن والأسرار باستخدام Bicep. حدد المخازن الخاصة بك عن طريق إنشاء مورد مع النوع Microsoft.KeyVault/vaults
.
عند إنشاء مخزن تحتاج إلى تحديد من وما الذي يمكنه الوصول إلى بياناته. إذا كنت تخطط لقراءة أسرار المخزن من داخل ملف Bicep، فقم بتعيين الخاصية enabledForTemplateDeployment
على true
.
إضافة أسرار إلى المخزن الرئيسي
الأسرار هي مورد تابع ويمكن إنشاؤها باستخدام النوع Microsoft.KeyVault/vaults/secrets
. يوضح المثال التالي كيفية إنشاء مخزن وسر:
المثال التالي هو جزء من مثال أكبر. للحصول على ملف Bicep الذي يمكنك توزيعه، راجع الملف الكامل.
param location string = resourceGroup().location
param keyVaultName string = 'mykv${uniqueString(resourceGroup().id)}'
resource keyVault 'Microsoft.KeyVault/vaults@2023-07-01' = {
name: keyVaultName
location: location
properties: {
enabledForTemplateDeployment: true
tenantId: tenant().tenantId
accessPolicies: [
]
sku: {
name: 'standard'
family: 'A'
}
}
}
resource keyVaultSecret 'Microsoft.KeyVault/vaults/secrets@2023-07-01' = {
parent: keyVault
name: 'MySecretName'
properties: {
value: 'MyVerySecretValue'
}
}
تلميح
عند استخدام خطوط أنابيب النشر التلقائي، قد يكون من الصعب أحياناً تحديد كيفية وضع أسرار المخزن الرئيسي في عمليات النشر الخاصة بك. على سبيل المثال، إذا تم تزويدك بمفتاح API لاستخدامه عند الاتصال بواجهة برمجة تطبيقات خارجية، فيجب إضافة السر إلى المخزن قبل استخدامها في عمليات النشر.
عند العمل مع الأسرار التي تأتي من طرف ثالث، قد تحتاج إلى إضافتها يدوياً إلى المخزن الخاص بك، ومن ثم يمكنك الرجوع إلى السر لجميع الاستخدامات اللاحقة.
استخدام مخزن رئيسي مع وحدات
عند استخدام وحدات Bicep يمكنك توفير معلمات آمنة باستخدام الدالةgetSecret
.
يمكنك أيضاً الرجوع إلى مخزن رئيسي محدد في مجموعة موارد أخرى باستخدام الكلمات الرئيسية existing
وscope
معاً. في المثال التالي، يتم نشر الملف Bicep إلى مجموعة موارد تسمى عمليات الشبكة. يتم تحديد قيمة المعلمة الوحدة mySecret في مخزن رئيسي يسمى contosonetworkingsecrets الموجود في مجموعة موارد الأسرار:
resource networkingSecretsKeyVault 'Microsoft.KeyVault/vaults@2023-07-01' existing = {
scope: resourceGroup('Secrets')
name: 'contosonetworkingsecrets'
}
module exampleModule 'module.bicep' = {
name: 'exampleModule'
params: {
mySecret: networkingSecretsKeyVault.getSecret('mySecret')
}
}
استخدام مخزن مفاتيح في ملف .bicepparam
عند استخدام .bicepparam
تنسيق الملف، يمكنك توفير قيم آمنة للمعلمات باستخدام الدالة getSecret
.
راجع KeyVault من خلال توفير معرف الاشتراك واسم مجموعة الموارد واسم مخزن المفاتيح. يمكنك الحصول على قيمة السر عن طريق توفير الاسم السري. يمكنك اختياريا توفير الإصدار السري. إذا لم توفر الإصدار السري، يتم استخدام أحدث إصدار.
using './main.bicep'
param secureUserName = az.getSecret('<subscriptionId>', '<resourceGroupName>', '<keyVaultName>', '<secretName>', '<secretVersion>')
param securePassword = az.getSecret('<subscriptionId>', '<resourceGroupName>', '<keyVaultName>', '<secretName>')
العمل مع الأسرار في خطوط الأنابيب
عند نشر موارد Azure باستخدام خط أنابيب، يتعين عليك توخي الحذر للتعامل مع أسرارك بشكلٍ مناسب.
- تجنب تخزين الأسرار في مستودع التعليمات البرمجية. على سبيل المثال، لا تضف أسراراً إلى ملفات المعلمات أو ملفات YAML الخاصة بتعريف خط الأنابيب.
- في إجراءات GitHub، استخدم الأسرار المشفرة لتخزين البيانات الآمنة. استخدم الفحص السري لاكتشاف أي ارتكاب عرضي للأسرار.
- في خطوط أنابيب Azure، استخدم متغيرات سرية لتخزين بيانات آمنة.
الموارد ذات الصلة
- وثائق الموارد
- ميزات Azure
- ميزات Bicep
- قوالب التشغيل السريع
- Azure Pipelines
- إجراءات GitHub