แบบฝึกหัด - เพิ่มไฟล์พารามิเตอร์และพารามิเตอร์ที่ปลอดภัย
Note
แบบฝึกหัดนี้เป็นแบบทางเลือก หากคุณต้องการทําแบบฝึกหัดนี้ให้เสร็จสมบูรณ์ คุณจะต้องสร้างการสมัครใช้งาน Azure ก่อนที่คุณจะเริ่มต้น หากคุณไม่มีบัญชี Azure หรือไม่ต้องการสร้างบัญชีในขณะนี้ คุณสามารถอ่านคําแนะนําเพื่อให้คุณเข้าใจข้อมูลที่นําเสนอ
ในแบบฝึกหัดนี้ คุณจะสร้างไฟล์พารามิเตอร์ที่มีค่าสําหรับไฟล์ Bicep ที่คุณสร้างไว้ก่อนหน้านี้ ในไฟล์พารามิเตอร์เดียวกัน คุณจะเพิ่มการอ้างอิงชุดเก็บคีย์ของ Azure เพื่อให้ข้อมูลที่ละเอียดอ่อนได้อย่างปลอดภัย
ในระหว่างกระบวนการ คุณจะทํางานต่อไปนี้:
- เพิ่มพารามิเตอร์ความปลอดภัยบางอย่าง
- สร้างไฟล์พารามิเตอร์
- ทดสอบการปรับใช้เพื่อให้แน่ใจว่าไฟล์พารามิเตอร์ถูกต้อง
- สร้างชุดเก็บคีย์และความลับ
- อัปเดตไฟล์พารามิเตอร์เพื่ออ้างอิงถึงข้อมูลลับชุดเก็บคีย์
- ทดสอบการปรับใช้อีกครั้งเพื่อให้แน่ใจว่าไฟล์พารามิเตอร์ยังคงถูกต้อง
ลบค่าเริ่มต้นสําหรับ App Service Plan SKU
เพื่อให้เทมเพลตของคุณทํางานข้ามสภาพแวดล้อม รายละเอียด SKU ของแผนบริการแอป Azure จะระบุในไฟล์พารามิเตอร์แทนที่จะเป็นค่าเริ่มต้น
ในแฟ้ม main.bicep ใน Visual Studio Code ให้ปรับปรุงพารามิเตอร์ appServicePlanSku เพื่อเอาค่าเริ่มต้นออก
@description('The name and tier of the App Service plan SKU.')
param appServicePlanSku object
เพิ่มพารามิเตอร์ใหม่
ในตอนนี้ คุณจําเป็นต้องเพิ่ม SQL Server และฐานข้อมูล ก่อนอื่น คุณจะเพิ่มพารามิเตอร์สําหรับการเข้าสู่ระบบและรหัสผ่านของผู้ดูแลระบบ และ SKU ของฐานข้อมูล คุณจะตั้งค่าในภายหลัง
ในไฟล์ main.bicep ใน Visual Studio Code ให้เพิ่มพารามิเตอร์ sqlServerAdministratorLogin, และ sqlServerAdministratorPasswordพารามิเตอร์ sqlDatabaseSku ใต้การประกาศพารามิเตอร์ปัจจุบัน เมื่อคุณทําเสร็จแล้ว การประกาศพารามิเตอร์ของคุณควรมีลักษณะดังตัวอย่างนี้:
@description('The name of the environment. This must be dev, test, or prod.')
@allowed([
'dev'
'test'
'prod'
])
param environmentName string = 'dev'
@description('The unique name of the solution. This is used to ensure that resource names are unique.')
@minLength(5)
@maxLength(30)
param solutionName string = 'toyhr${uniqueString(resourceGroup().id)}'
@description('The number of App Service plan instances.')
@minValue(1)
@maxValue(10)
param appServicePlanInstanceCount int = 1
@description('The name and tier of the App Service plan SKU.')
param appServicePlanSku object
@description('The Azure region into which the resources should be deployed.')
param location string = 'eastus'
@secure()
@description('The administrator login username for the SQL server.')
param sqlServerAdministratorLogin string
@secure()
@description('The administrator login password for the SQL server.')
param sqlServerAdministratorPassword string
@description('The name and tier of the SQL database SKU.')
param sqlDatabaseSku object
โปรดสังเกตว่าคุณไม่ได้ระบุค่าเริ่มต้นสําหรับพารามิเตอร์ sqlServerAdministratorLogin และ sqlServerAdministratorPassword การเพิ่มค่าเริ่มต้นสําหรับพารามิเตอร์ที่ปลอดภัยเป็นแนวทางปฏิบัติที่ไม่ดี นอกจากนี้ คุณไม่ได้ระบุค่าเริ่มต้นสําหรับ sqlDatabaseSku คุณจะต้องระบุค่าในไฟล์พารามิเตอร์
เพิ่มตัวแปรใหม่
ในไฟล์ main.bicep ใน Visual Studio Code เพิ่ม sqlServerName ตัวแปร และ ใต้ sqlDatabaseName ตัวแปรที่มีอยู่ เมื่อคุณทําเสร็จแล้ว การประกาศตัวแปรของคุณควรมีลักษณะดังตัวอย่างนี้:
var appServicePlanName = '${environmentName}-${solutionName}-plan'
var appServiceAppName = '${environmentName}-${solutionName}-app'
var sqlServerName = '${environmentName}-${solutionName}-sql'
var sqlDatabaseName = 'Employees'
เพิ่มทรัพยากรเซิร์ฟเวอร์ SQL และฐานข้อมูล
ในไฟล์ main.bicep ใน Visual Studio Code เพิ่มรหัสต่อไปนี้ที่ด้านล่างของไฟล์:
resource sqlServer 'Microsoft.Sql/servers@2024-05-01-preview' = { name: sqlServerName location: location properties: { administratorLogin: sqlServerAdministratorLogin administratorLoginPassword: sqlServerAdministratorPassword } } resource sqlDatabase 'Microsoft.Sql/servers/databases@2024-05-01-preview' = { parent: sqlServer name: sqlDatabaseName location: location sku: { name: sqlDatabaseSku.name tier: sqlDatabaseSku.tier } }บันทึกการเปลี่ยนแปลงไปยังไฟล์
ตรวจสอบไฟล์ Bicep ของคุณ
หลังจากที่คุณทําการเปลี่ยนแปลงก่อนหน้านี้ทั้งหมดเสร็จสิ้นแล้ว ไฟล์ Bicep ของคุณควรมีลักษณะดังนี้:
@description('The name of the environment. This must be dev, test, or prod.')
@allowed([
'dev'
'test'
'prod'
])
param environmentName string = 'dev'
@description('The unique name of the solution. This is used to ensure that resource names are unique.')
@minLength(5)
@maxLength(30)
param solutionName string = 'toyhr${uniqueString(resourceGroup().id)}'
@description('The number of App Service plan instances.')
@minValue(1)
@maxValue(10)
param appServicePlanInstanceCount int = 1
@description('The name and tier of the App Service plan SKU.')
param appServicePlanSku object
@description('The Azure region into which the resources should be deployed.')
param location string = 'eastus'
@secure()
@description('The administrator login username for the SQL server.')
param sqlServerAdministratorLogin string
@secure()
@description('The administrator login password for the SQL server.')
param sqlServerAdministratorPassword string
@description('The name and tier of the SQL database SKU.')
param sqlDatabaseSku object
var appServicePlanName = '${environmentName}-${solutionName}-plan'
var appServiceAppName = '${environmentName}-${solutionName}-app'
var sqlServerName = '${environmentName}-${solutionName}-sql'
var sqlDatabaseName = 'Employees'
resource appServicePlan 'Microsoft.Web/serverfarms@2024-04-01' = {
name: appServicePlanName
location: location
sku: {
name: appServicePlanSku.name
tier: appServicePlanSku.tier
capacity: appServicePlanInstanceCount
}
}
resource appServiceApp 'Microsoft.Web/sites@2024-04-01' = {
name: appServiceAppName
location: location
properties: {
serverFarmId: appServicePlan.id
httpsOnly: true
}
}
resource sqlServer 'Microsoft.Sql/servers@2024-05-01-preview' = {
name: sqlServerName
location: location
properties: {
administratorLogin: sqlServerAdministratorLogin
administratorLoginPassword: sqlServerAdministratorPassword
}
}
resource sqlDatabase 'Microsoft.Sql/servers/databases@2024-05-01-preview' = {
parent: sqlServer
name: sqlDatabaseName
location: location
sku: {
name: sqlDatabaseSku.name
tier: sqlDatabaseSku.tier
}
}
ถ้าไม่เป็นเช่นนั้น ให้คัดลอกตัวอย่างหรือปรับเทมเพลตของคุณให้ตรงกับตัวอย่าง
สร้างไฟล์พารามิเตอร์
เปิด Visual Studio Code และเปิดโฟลเดอร์ที่มีไฟล์ main.bicep อยู่ ในโฟลเดอร์เดียวกัน ให้สร้างไฟล์ใหม่ชื่อ main.parameters.dev.json.
ในไฟล์ main.parameters.dev.json ให้เพิ่มรหัสต่อไปนี้:
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#", "contentVersion": "1.0.0.0", "parameters": { "appServicePlanSku": { "value": { "name": "F1", "tier": "Free" } }, "sqlDatabaseSku": { "value": { "name": "Standard", "tier": "Standard" } } } }บันทึกการเปลี่ยนแปลงไปยังไฟล์
ปรับใช้เทมเพลต Bicep ด้วยไฟล์พารามิเตอร์
เรียกใช้คําสั่ง Azure CLI ต่อไปนี้ในเทอร์มินัล โปรดสังเกตว่าคุณกําลังให้ไฟล์พารามิเตอร์สําหรับการปรับใช้
az deployment group create \
--name main \
--template-file main.bicep \
--parameters main.parameters.dev.json
เรียกใช้คําสั่ง Azure PowerShell ต่อไปนี้ในเทอร์มินัล โปรดสังเกตว่าคุณกําลังให้ไฟล์พารามิเตอร์สําหรับการปรับใช้
New-AzResourceGroupDeployment `
-Name main `
-TemplateFile main.bicep `
-TemplateParameterFile main.parameters.dev.json
คุณจะได้รับแจ้งให้ป้อนค่าสําหรับพารามิเตอร์ sqlServerAdministratorLogin และ sqlServerAdministratorPassword เมื่อคุณดําเนินการปรับใช้ คุณไม่จําเป็นต้องระบุ solutionName เนื่องจากมีค่าเริ่มต้นที่ระบุไว้ในเทมเพลต คุณไม่จําเป็นต้องระบุค่าพารามิเตอร์อื่น ๆ เนื่องจากมีการระบุค่าพารามิเตอร์ไว้ในไฟล์พารามิเตอร์
Tip
เมื่อคุณป้อนพารามิเตอร์ความปลอดภัย ค่าที่คุณเลือกต้องเป็นไปตามกฎบางอย่าง:
-
sqlServerAdministratorLoginจะต้องไม่เป็นชื่อเข้าสู่ระบบที่คาดเดาได้ง่าย เช่นadminหรือrootซึ่งสามารถประกอบด้วยอักขระพยัญชนะผสมตัวเลขเท่านั้น และต้องเริ่มต้นด้วยตัวอักษร -
sqlServerAdministratorPasswordต้องมีความยาวอย่างน้อย 8 อักขระ และประกอบด้วยตัวอักษรพิมพ์เล็ก อักษรตัวพิมพ์ใหญ่ ตัวเลข และสัญลักษณ์ สําหรับข้อมูลเพิ่มเติมเกี่ยวกับความซับซ้อนของรหัสผ่าน ให้ดูนโยบายรหัสผ่าน SQL Azure
ถ้าค่าพารามิเตอร์ไม่ตรงตามข้อกําหนด Azure SQL จะไม่ปรับใช้เซิร์ฟเวอร์ของคุณ
นอกจากนี้ ตรวจสอบให้แน่ใจว่าคุณเก็บบันทึกของการเข้าสู่ระบบและรหัสผ่านที่คุณป้อน คุณจะใช้ฟังก์ชันเหล่านี้ในส่วนถัดไป
การปรับใช้อาจใช้เวลาสองถึงสามนาทีจึงจะเสร็จสิ้นได้
สร้างชุดเก็บคีย์และข้อมูลลับ
บริษัทของเล่นของคุณมีชุดเก็บคีย์พร้อมข้อมูลลับที่จําเป็นสําหรับการปรับใช้อยู่แล้ว เพื่อจําลองสถานการณ์นี้ คุณจะสร้างชุดเก็บคีย์ใหม่และเพิ่มข้อมูลลับที่จะใช้
ในเทอร์มินัล ให้ดําเนินการคําสั่งต่อไปนี้เพื่อสร้างชุดเก็บคีย์และข้อมูลลับ อัปเดตค่าตัวแปรก่อนที่คุณจะดําเนินการคําสั่งเหล่านี้ ชื่อชุดเก็บคีย์ต้องเป็นสตริงที่ไม่ซ้ํากันทั่วโลกที่มีอักขระ 3 ถึง 24 ตัวที่สามารถมีได้เฉพาะอักษรตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก เครื่องหมายยัติภังค์ (-) และตัวเลขเท่านั้น ตัวอย่างเช่น demo-kv-1234567abcdefg
Caution
ตรวจสอบให้แน่ใจว่าคุณใช้การเข้าสู่ระบบและรหัสผ่านเดียวกันกับที่คุณใช้ในขั้นตอนก่อนหน้า หากคุณไม่ดําเนินการดังกล่าว การปรับใช้ถัดไปจะไม่เสร็จสมบูรณ์
สําหรับ keyVaultName แทนที่ YOUR-KEY-VAULT-NAME ด้วยชื่อสําหรับชุดเก็บคีย์ของคุณ คําสั่ง read สําหรับตัวแปร login และ password จะพร้อมท์ให้คุณใส่ค่า ขณะที่คุณพิมพ์ ค่าจะไม่แสดงในเทอร์มินัล และจะไม่ถูกบันทึกในประวัติคําสั่งของคุณ
เพื่อปกป้องค่าตัวแปรในเซสชันเทอร์มินัล Bash ของคุณ โปรดระวังรายการต่อไปนี้:
- ค่าตัวแปรจะไม่ถูกจัดเก็บเป็นสตริงที่ปลอดภัย และสามารถแสดงโดยการป้อนคําสั่งเช่น
$yourVariableNameบนบรรทัดคําสั่ง หรือด้วยคําสั่งechoในแบบฝึกหัดนี้ หลังจากสร้างข้อมูลลับชุดเก็บข้อมูลของคุณคุณสามารถลบค่าที่มีอยู่ของตัวแปรแต่ละตัวโดยการเรียกใช้คําสั่งreadโดยไม่ต้องป้อนค่า -
az keyvault secret setใช้พารามิเตอร์--valueเพื่อสร้างค่าของข้อมูลลับ ผลลัพธ์ของคําสั่งแสดงคุณสมบัติที่ชื่อvalueที่ประกอบด้วยค่าของข้อมูลลับ คุณสามารถระงับผลลัพธ์ทั้งหมดของคําสั่งด้วยพารามิเตอร์--output noneดังที่แสดงในตัวอย่าง
หากต้องการสร้างตัวแปร keyVaultName, loginและ password ให้เรียกใช้แต่ละคําสั่งแยกต่างหาก จากนั้นคุณสามารถเรียกใช้บล็อกของคําสั่งเพื่อสร้างชุดเก็บคีย์และข้อมูลลับ
keyVaultName='YOUR-KEY-VAULT-NAME'
read -s -p "Enter the login name: " login
read -s -p "Enter the password: " password
az keyvault create --name $keyVaultName --location eastus --enabled-for-template-deployment true
az keyvault secret set --vault-name $keyVaultName --name "sqlServerAdministratorLogin" --value $login --output none
az keyvault secret set --vault-name $keyVaultName --name "sqlServerAdministratorPassword" --value $password --output none
Note
คุณกําลังตั้งค่า --enabled-for-template-deployment บนชุดเก็บข้อมูลประจําตัวเพื่อให้ Azure สามารถใช้ข้อมูลลับจากชุดเก็บข้อมูลของคุณระหว่างการปรับใช้ หากคุณไม่ได้ตั้งค่านี้ตามค่าเริ่มต้น การปรับใช้ของคุณจะไม่สามารถเข้าถึงข้อมูลลับในชุดเก็บข้อมูลส่วนบุคคลของคุณได้
นอกจากนี้ผู้ใดก็ตามที่ดําเนินการปรับใช้จะต้องมีสิทธิ์ในการเข้าถึงชุดเก็บ เนื่องจากคุณได้สร้าง Key Vault คุณเป็นเจ้าของ ดังนั้นคุณจึงไม่จําเป็นต้องให้สิทธิ์ในแบบฝึกหัดนี้อย่างชัดเจน สําหรับห้องนิรภัยของคุณเอง คุณต้องให้สิทธิ์การเข้าถึงข้อมูลลับ
สําหรับ keyVaultName แทนที่ YOUR-KEY-VAULT-NAME ด้วยชื่อสําหรับชุดเก็บคีย์ของคุณ คําสั่ง Read-Host สําหรับตัวแปร login และ password จะพร้อมท์ให้คุณใส่ค่า ขณะที่คุณพิมพ์ ค่าจะไม่แสดงในเทอร์มินัล และจะไม่ถูกบันทึกในประวัติคําสั่งของคุณ ค่าต่าง ๆ จะถูกจัดเก็บเป็นสตริงที่ปลอดภัย
หากต้องการสร้างตัวแปร keyVaultName, loginและ password ให้เรียกใช้แต่ละคําสั่งแยกต่างหาก จากนั้นคุณสามารถเรียกใช้บล็อกของคําสั่งเพื่อสร้างชุดเก็บคีย์และข้อมูลลับ
$keyVaultName = 'YOUR-KEY-VAULT-NAME'
$login = Read-Host "Enter the login name" -AsSecureString
$password = Read-Host "Enter the password" -AsSecureString
New-AzKeyVault -VaultName $keyVaultName -Location eastus -EnabledForTemplateDeployment
Set-AzKeyVaultSecret -VaultName $keyVaultName -Name 'sqlServerAdministratorLogin' -SecretValue $login
Set-AzKeyVaultSecret -VaultName $keyVaultName -Name 'sqlServerAdministratorPassword' -SecretValue $password
Note
คุณกําลังตั้งค่า -EnabledForTemplateDeployment บนชุดเก็บข้อมูลประจําตัวเพื่อให้ Azure สามารถใช้ข้อมูลลับจากชุดเก็บข้อมูลของคุณระหว่างการปรับใช้ หากคุณไม่ได้ตั้งค่านี้ตามค่าเริ่มต้น การปรับใช้ของคุณจะไม่สามารถเข้าถึงข้อมูลลับในชุดเก็บข้อมูลส่วนบุคคลของคุณได้
นอกจากนี้ผู้ใดก็ตามที่ดําเนินการปรับใช้จะต้องมีสิทธิ์ในการเข้าถึงชุดเก็บ เนื่องจากคุณได้สร้าง Key Vault คุณเป็นเจ้าของ ดังนั้นคุณจึงไม่จําเป็นต้องให้สิทธิ์ในแบบฝึกหัดนี้อย่างชัดเจน สําหรับห้องนิรภัยของคุณเอง คุณต้องให้สิทธิ์การเข้าถึงข้อมูลลับ
รับ ID ทรัพยากรของชุดเก็บคีย์
หากต้องการใช้ข้อมูลลับของชุดเก็บคีย์ในการปรับใช้ของคุณ คุณจําเป็นต้องมี ID ทรัพยากรของชุดเก็บ เรียกใช้คําสั่งต่อไปนี้เพื่อเรียกใช้รหัสทรัพยากรของชุดเก็บคีย์:
az keyvault show --name $keyVaultName --query id --output tsv
(Get-AzKeyVault -Name $keyVaultName).ResourceId
ID ทรัพยากรจะมีลักษณะบางอย่างเหมือนกับตัวอย่างนี้:
/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/PlatformResources/providers/Microsoft.KeyVault/vaults/toysecrets
คัดลอก ID ทรัพยากร คุณจะใช้ในขั้นตอนถัดไป
เพิ่มการอ้างอิงชุดเก็บคีย์ไปยังไฟล์พารามิเตอร์
ในไฟล์ main.parameters.dev.json ให้ผนวกรหัสต่อไปนี้หลัง
sqlDatabaseSkuวงเล็บปีกกาปิดของพารามิเตอร์ ตรวจสอบให้แน่ใจว่าคุณแทนที่YOUR-KEY-VAULT-RESOURCE-IDด้วยค่าของ ID ทรัพยากรชุดเก็บคีย์ที่คุณคัดลอกในขั้นตอนก่อนหน้า หลังจากที่คุณดําเนินการเสร็จแล้ว ไฟล์พารามิเตอร์ของคุณควรมีลักษณะดังตัวอย่างนี้:{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#", "contentVersion": "1.0.0.0", "parameters": { "appServicePlanSku": { "value": { "name": "F1", "tier": "Free" } }, "sqlDatabaseSku": { "value": { "name": "Standard", "tier": "Standard" } }, "sqlServerAdministratorLogin": { "reference": { "keyVault": { "id": "YOUR-KEY-VAULT-RESOURCE-ID" }, "secretName": "sqlServerAdministratorLogin" } }, "sqlServerAdministratorPassword": { "reference": { "keyVault": { "id": "YOUR-KEY-VAULT-RESOURCE-ID" }, "secretName": "sqlServerAdministratorPassword" } } } }บันทึกการเปลี่ยนแปลงไปยังไฟล์
ปรับใช้เทมเพลต Bicep ด้วยไฟล์พารามิเตอร์และการอ้างอิงชุดเก็บคีย์ของ Azure
เรียกใช้คําสั่ง Azure CLI ต่อไปนี้ในเทอร์มินัล คุณกําลังให้ไฟล์พารามิเตอร์พร้อมกับไฟล์ Bicep
az deployment group create \
--name main \
--template-file main.bicep \
--parameters main.parameters.dev.json
เรียกใช้คําสั่ง Azure PowerShell ต่อไปนี้ในเทอร์มินัล คุณกําลังให้ไฟล์พารามิเตอร์พร้อมกับไฟล์ Bicep
New-AzResourceGroupDeployment `
-Name main `
-TemplateFile main.bicep `
-TemplateParameterFile main.parameters.dev.json
คุณไม่ได้รับพร้อมท์ให้ป้อนค่าสําหรับพารามิเตอร์ sqlServerAdministratorLogin และ sqlServerAdministratorPassword เมื่อคุณดําเนินการปรับใช้ในขณะนี้ Azure จะดึงค่าจาก Key Vault ของคุณแทน
การปรับใช้จะเสร็จสมบูรณ์อย่างรวดเร็วยิ่งขึ้นในขณะนี้เนื่องจากทรัพยากร Azure มีอยู่แล้ว
ตรวจสอบการปรับใช้ของคุณ
ในเบราว์เซอร์ของคุณ ย้อนกลับไปยังพอร์ทัล Azure ไปยังกลุ่มทรัพยากรของคุณ คุณจะยังคงเห็นการปรับใช้ที่สําเร็จหนึ่งรายการเนื่องจากการปรับใช้ชื่อเดียวกันกับการปรับใช้ครั้งแรก
เลือกลิงก์ 1 สําเร็จ
เลือกการปรับใช้ที่เรียกว่า main
ในเมนูด้านซ้าย ให้เลือกอินพุต
โปรดสังเกตว่าทั้ง
appServicePlanSkuและค่าพารามิเตอร์sqlDatabaseSkuได้รับการตั้งค่าเป็นค่าในไฟล์พารามิเตอร์ นอกจากนี้ โปรดสังเกตว่าค่าพารามิเตอร์ของsqlServerAdministratorLoginและsqlServerAdministratorPasswordจะไม่แสดงขึ้น เนื่องจากคุณใช้ตัวตกแต่ง@secure()กับพวกเขา