Bicep — это новый (экспериментальный) способ для построения и развертывания инфраструктуры в Azure. Это язык, который собирается в соответствии с стандартными шаблонами JSON Manager Resource Manager. Таким образом, вместо того, чтобы создавать сотни (если не тысячи) строк JSON, вы можете кодировать его в бицепсе, а затем позволить компилятору выполнять тяжелую работу:)
Чтобы начать с BICEP, вам нужно установить Инструмент BICEP CLI И в идеале Против расширения кода чтобы вы могли получить Intellisense и Code Syntax. Примечание: пока не все расширения темы поддерживают бицепс.
Если вы хотите увидеть видео, на котором я настраивает все это и написать мою первую программу BICEP, ознакомьтесь с этой записью:
Наш первый шаблон бицепса
Для целей этого блога мы будем использовать BICEP для создания ресурса SQL Server и SQL базы данных на Azure. Создайте новый каталог и добавьте main.bicep
файл:
param subscriptionId string = 'e42acc2b-8462-4fb5-bf0d-d983c0017584' param kvResourceGroup string = 'identity' param kvName string = 'cm-identity-kv' resource kv 'Microsoft.KeyVault/vaults@2019-09-01' existing = { name: kvName scope: resourceGroup(subscriptionId, kvResourceGroup ) } module sql './sql.bicep' = { name: 'deploySQL' params: { administratorLogin: kv.getSecret('sqlAdministratorLogin') administratorLoginPassword: kv.getSecret('sqlAdministratorLoginPassword') } }
В этом файле мы определяем несколько параметров, которые в основном указывают на наш ресурс KeyVault, а затем мы вызовываем в модуль SQL.
Затем нам нужно создать новый файл BICEP для нашего SQL Server и базы данных. Назовите новый файл sql.bicep
и добавить следующий код:
param serverName string = uniqueString('sql125486asdf2') param sqlDBName string = 'SampleDB' param location string = resourceGroup().location @secure() param administratorLogin string @secure() param administratorLoginPassword string resource server 'Microsoft.Sql/servers@2019-06-01-preview' = { name: serverName location: location properties: { administratorLogin: administratorLogin administratorLoginPassword: administratorLoginPassword } } resource sqlDB 'Microsoft.Sql/servers/databases@2020-08-01-preview' = { name: '${server.name}/${sqlDBName}' location: location sku: { name: 'Standard' tier: 'Standard' } }
Мы будем использовать случайное имя для SQL Server, и мы унаследоваем некоторые свойства (то есть местоположение) от группы ресурсов Azure, для которой мы развертываем. Uniquestring ()
и ResourceGroup ()
встроенные функции бицепса. Вы можете узнать больше о функциях BICEP здесь
Вы заметите, что у нас также есть два ненициализированных Безопасно параметры:
- Администратор
- Администраторлгенпийныйорд
Мы оставили их пустыми по уважительной причине! Мы не хотим хранить секреты в нашем коде, так как это вектор атаки безопасности. Значения для этих свойств будут переданы из main.bicep
Файл, который извлечет их из Azure KeyVault, что делает наш код развертывания безопасным.
Давайте создадим наш код:
bicep build main.bicep
Это должно генерировать выходной файл main.json
который содержит скомпилированный шаблон рук json:
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "serverName": { "type": "string", "defaultValue": "[uniqueString('sql125486asdf')]" }, "sqlDBName": { "type": "string", "defaultValue": "SampleDB" }, "location": { "type": "string", "defaultValue": "[resourceGroup().location]" }, "administratorLogin": { "type": "string" }, "administratorLoginPassword": { "type": "secureString" } }, "functions": [], "resources": [ { "type": "Microsoft.Sql/servers", "apiVersion": "2019-06-01-preview", "name": "[parameters('serverName')]", "location": "[parameters('location')]", "properties": { "administratorLogin": "[parameters('administratorLogin')]", "administratorLoginPassword": "[parameters('administratorLoginPassword')]" } }, { "type": "Microsoft.Sql/servers/databases", "apiVersion": "2020-08-01-preview", "name": "[format('{0}/{1}', parameters('serverName'), parameters('sqlDBName'))]", "location": "[parameters('location')]", "sku": { "name": "Standard", "tier": "Standard" }, "dependsOn": [ "[resourceId('Microsoft.Sql/servers', parameters('serverName'))]" ] } ] }
Давайте добавим SEC в DevSecops
Прежде всего, мы должны убедиться, что учетная запись, развертывающая этот шаблон руки, имеет достаточно правую привилегию для этого. Вы не хотите использовать учетную запись пользователя, так как они, как правило, имеют повышенные разрешения и могут нанести серьезный ущерб. Рекомендуемая практика заключается в использовании основной учетной записи услуги. Вы можете создать их через портал Azure, PowerShell или CLI. В этом случае мы будем использовать Azure CLI
az login az ad sp create-for-rbac --role Contributor --scopes /subscriptions//resourceGroups/ --name
Запишите вывод.
Чтобы наша учетная запись также была в состоянии получить необходимые секреты из Vault Azure Key, нам нужно создать очень специфическую роль. Вы можете найти больше информации о том, как создать эту очень пользовательскую роль RBAC Здесь Анкет
Следуя приведенным выше документам, мы создадим новый keyvaultrole.json
Подайте и вставьте следующий JSON:
{ "Name": "Key Vault CM resource manager template deployment operator", "IsCustom": true, "Description": "Lets you deploy a resource manager template with the access to the secrets in the Key Vault.", "Actions": [ "Microsoft.KeyVault/vaults/deploy/action" ], "NotActions": [], "DataActions": [], "NotDataActions": [], "AssignableScopes": [ "/subscriptions//resourceGroups/ /providers/Microsoft.KeyVault/vaults/ " ] }
Теперь нам нужно создать эту роль в нашей подписке на Azure (если он еще не существует) и назначить ее на нашу директора услуги. В Azure CLI введите следующее:
az role definition create --role-definition ./keyvaultrole.json az role assignment create --role "Key Vault CM resource manager template deployment operator" --assignee--resource-group bicep-demo
Теперь, когда у нас есть учетная запись с правильными привилегиями, нам нужно выйти из виду (как мы сами) и подписаться с недавно созданной учетной записью Сервиса:
az account clear az login --service-principal -u-p --tenant az account show
Последний шаг-настройка нашего ключа, чтобы разрешить развертывание рук, а также создать необходимые секреты, на которые будет ссылаться наши шаблоны сгенерированного BICEP.
В ключевом хранилище перейдите к Политики доступа вкладка и убедитесь, что Azure Resource Manager для развертывания шаблона опция под Включить доступ к: проверено. Обязательно нажмите Сохранить кнопка, если вы внесете какие -либо изменения:
Наконец, мы хотим проверить, что нашему директору службы была назначена правильная роль, чтобы иметь возможность читать секреты из Key Vault. Перейдите к Контроль доступа (IAM) вкладка и проверка под Ролевые задания Чтобы убедиться, что сценарий, который мы запускаем ранее, работал:
Теперь у нас есть заблокированная учетная запись и все секреты, хранящиеся в Key Vault. Давайте завершим наше развертывание BICEP/ARM. Теперь мы можем пойти дальше и развернуть нашу инфраструктуру в качестве кода, используя Azure CLI:
az deployment group create --resource-group bicep-demo --template-file main.bicep
Вывод будет куча JSON с информацией о развертывании, такой как сильно пропущенный вывод ниже:
{ "id": "/subscriptions/e42acc2d-8462-4fb5-bf0d-d983c0017584/resourceGroups/bicep-demo/providers/Microsoft.Resources/deployments/cmdeployment425show", "location": null, ... "provisioningState": "Succeeded", "templateHash": "18120650064530837360", "templateLink": null, "timestamp": "2021-03-02T00:16:56.630918+00:00", "validatedResources": null }, "resourceGroup": "bicep-demo", "tags": null, "type": "Microsoft.Resources/deployments" }
Создание более сложного кода бицепса
Repo Github в данный момент тонкий, и на мгновение я подумал, что застрял с учебным примером кода. Но потом я наткнулся на славного Bicep Playground И все снова было здорово. Детская площадка Отображает BICEP и скомпилированный JSON рядом и предоставляет вам множество образцов кода, чтобы помочь вам создать свои собственные шаблоны. Я подозреваю, что все это управляется образцами Azure Arm Repo:
Исходный код
Это GitHub Repo Содержит все файлы и код, упомянутые в этом посте Blob.
Резюме
Я люблю бицепса, потому что он делает работу с Azure Resources более простыми и кратким. И в отличие от Pulumi или Terraform, это нативная Azure и, следовательно, обеспечивает лучшую поддержку ресурсов Azure. Тем не менее, есть плюсы и минусы с каждым инструментом, поэтому выбирайте тот, который действительно делает вас счастливым (или продуктивным).
Оригинал: «https://dev.to/425show/secure-azure-deployments-with-bicep-and-azure-key-vault-2dc9»