Bicep 및 Azure 키 라이브러리를 사용하여 Azure 배포 보호

9951 단어 devopssecurityazure
Bicep은 Azure에 인프라를 구축하고 배치하는 새로운 방법(실험적) 중 하나다.표준 Azure Resource Manager json 템플릿으로 컴파일된 언어입니다.따라서 수백 줄 (수천 줄이 아니라면) 의 json을 수동으로 만들지 않고, Bicep 인코딩을 해서 컴파일러로 하여금 힘든 일을 하게 할 수 있다.
Bicep에서 시작하려면 Bicep CLI toolVS Code extension를 설치하여 스마트 감지와 코드 문법 착색을 실현해야 합니다.방주: 모든 주제의 확장이 이두근을 지지하는 것은 아니다.
만약 내가 첫 번째 이두근 프로그램을 설정하고 작성한 영상을 보고 싶다면 아래의 녹음을 보십시오.

저희 첫 번째 이두근 템플릿.


이 블로그에서는 Bicep을 사용하여 Azure에 SQL Server 및 SQL 데이터베이스 리소스를 작성합니다.새 디렉토리를 만들고 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 모듈을 호출합니다.
그런 다음 SQL Server 및 데이터베이스에 대한 새 Bicep 파일을 만들어야 합니다.새 파일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()는 내장된 이두근 기능이다.너는 이두근의 기능에 대한 더 많은 정보를 찾을 수 있다here
또한 초기화되지 않은 두 개의 보안 매개 변수가 있습니다.
  • 관리자 로그인
  • 관리자 로그인 비밀번호
  • 우리가 공백을 남긴 데는 충분한 이유가 있다!우리는 코드에 비밀을 저장하고 싶지 않다. 왜냐하면 이것은 안전 공격 캐리어이기 때문이다.이러한 속성의 값은 main.bicep 파일에서 전달되며, 이 파일은Azure KeyVault에서 그것들을 검색하여 배포 코드를 끝까지 안전하게 합니다.
    코드를 구축해 보겠습니다.
    bicep build main.bicep
    
    이렇게 하면 컴파일된 ARM 템플릿 json이 포함된 출력 파일main.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'))]"
          ]
        }
      ]
    }
    

    DevSecOps에 Sec을 추가합니다.


    우선, 이 ARM 템플릿을 배포한 계정이 이 작업을 수행할 수 있는 권한이 충분한지 확인해야 합니다.사용자 계정을 사용하지 않으려는 경우 이러한 계정이 더 높은 권한을 가지기 때문에 심각한 손해를 입을 수 있습니다.서비스 의뢰인 계좌를 사용하는 것을 권장합니다.이러한 작업은 Azure 포털, PowerShell 또는 CLI를 통해 만들 수 있습니다.이 예에서는 Azure CLI 를 사용합니다.
    az login
    az ad sp create-for-rbac --role Contributor --scopes /subscriptions/<Your Subscription ID>/resourceGroups/<Your Resource Group Name> --name <Give it a nice name> 
    
    출력을 기록하다.
    Azure Key Vault에서 계정이 필요한 기밀을 검색할 수 있도록 매우 특정한 역할을 만들어야 합니다.이 맞춤형 RBAC 역할here을 만드는 방법에 대한 더 많은 정보를 얻을 수 있습니다.
    위 문서 다음에 새 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/<Your Subscription ID>/resourceGroups/<Your Resource Group Name>/providers/Microsoft.KeyVault/vaults/<Your Key Vault name>"
      ]
    }
    
    우리는 현재 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 <your SP client Id> --resource-group bicep-demo
    
    현재 우리는 정확한 권한을 가진 계정이 하나 있는데, 우리는 취소 (우리의 신분으로) 하고 새로 만든 서비스 주체 계정으로 로그인해야 한다.
    az account clear
    az login --service-principal -u <Service Principal Id> -p <Service Principal password> --tenant <Azure AD Tenant ID>
    az account show
    

    마지막 단계는 ARM 배치를 허용하고 필요한 기밀을 만드는 키 라이브러리입니다. 이 기밀은 Bicep에서 생성한 ARM 템플릿에서 참조됩니다.
    키 라이브러리에서 액세스 정책 탭으로 이동하여 액세스 활성화: 아래의 Azure Resource Manager for template deployment 옵션이 선택되었는지 확인합니다.변경한 내용이 있으면 저장 버튼을 누른 후 다음을 수행합니다.

    마지막으로, 우리는 키 라이브러리에서 기밀을 읽을 수 있도록 서비스 담당자가 정확한 역할을 분배받았는지 확인해야 한다.액세스 제어(IAM) 탭으로 이동하여 역할 할당에서 이전에 실행된 스크립트가 제대로 작동하는지 확인합니다.

    우리는 현재 잠긴 계좌가 하나 있는데, 모든 비밀이 열쇠 창고에 저장되어 있다.우리들은 이두근/팔의 배치를 완성합시다.이제 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"
    }
    

    더욱 정교한 이두근 코드 구축


    GitHub repo는 현재 매우 얇아서, 한동안 나는 내가 교과서 예시 코드에 걸린 줄 알았다.그러나 나중에 나는 휘황찬란한 이두근 운동장을 만났고 모든 것이 다시 좋아졌다.Playground Bicep과 컴파일된 json을 나란히 표시하고 템플릿을 구축하는 데 도움을 주는 예시 코드를 대량으로 제공합니다.이 모든 것이 Azure ARM 샘플 재구매 프로토콜에 의해 구동된 것으로 의심됩니다.

    소스 코드


    이것GitHub repo은 이 블로그 게시물에 인용된 모든 파일과 코드를 포함한다.

    요약


    저는 Bicep을 좋아합니다. 왜냐하면 Azure 자원을 사용하는 것을 더욱 간단명료하게 하기 때문입니다.Pulumi나 Terraform과 달리 기본 Azure이므로 Azure 리소스를 더욱 잘 지원할 수 있습니다.그러나 모든 도구는 이로움과 폐단이 있기 때문에 진정으로 당신을 즐겁게 하거나 효과가 있는 도구를 선택하세요.

    좋은 웹페이지 즐겨찾기