استخدام Bicep لإدارة الأسرار
غالباً ما تتطلب عمليات النشر تخزين الأسرار ونشرها بشكلٍ آمن في جميع أنحاء بيئة Azure. توفر Bicep وAzure العديد من الميزات لمساعدتك في إدارة الأسرار في عمليات النشر الخاصة بك.
تجنب الأسرار حيث يمكنك
من الممكن تجنب استخدام الأسرار تماما في العديد من الحالات. تمكن العديد من موارد Azure الهويات المدارة من المصادقة والمخولة بالوصول إلى الموارد الأخرى داخل Azure ودون الحاجة إلى معالجة أو إدارة أي بيانات اعتماد. بالإضافة إلى ذلك، يمكن لبعض خدمات Azure إنشاء شهادات HTTPS لك تلقائيا، ما يمنعك من التعامل مع الشهادات والمفاتيح الخاصة. استخدم الهويات المُدارة والشهادات المُدارة بواسطة الخدمة حيثما أمكن ذلك.
استخدام معلمات آمنة
عندما تحتاج إلى توفير أسرار لنشر Bicep الخاص بك كمعلمات، استخدم مصمم الديكور@secure()
. عند وضع علامة على معلمة على أنها آمنة، يتجنب Azure Resource Manager تسجيل القيمة أو عرضها في مدخل Microsoft 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 أو خارجه وأيضا لتخزين الأسرار في key vault.
استخدام المخزن الرئيسي
تم تصميم مخزن 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
.
راجع key vault من خلال توفير معرف الاشتراك واسم مجموعة الموارد واسم key vault. يمكنك الحصول على قيمة السر عن طريق توفير الاسم السري. يمكنك اختياريا توفير الإصدار السري؛ يتم استخدام أحدث إصدار إذا لم تكن كذلك.
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: