РОТАЦИЯ КЛЮЧЕЙ УЧЕТНЫХ ЗАПИСЕЙ ХРАНИЛИЩ С ПОМОЩЬЮ AZ DEVOPS

Приветствую моих коллег — сторонников и специалистов в области технологий.

В этой сессии я продемонстрирую, как ротировать ключи учетных записей хранилищ (первичные и вторичные) и хранить их в хранилище ключей с помощью Azure DevOps.

ВОТ КАК ЭТО ВЫГЛЯДИТ: —
ЦЕЛЬ АВТОМАТИЗАЦИИ:-
Проверить, существует ли группа ресурсов, содержащая хранилище ключей. Если группа ресурсов не найдена, Pipeline завершится неудачей.
Проверить, существует ли учетная запись хранилища внутри указанной группы ресурсов. Если учетная запись хранилища не найдена, конвейер завершится неудачно.
Проверьте, существует ли хранилище ключей в указанной группе ресурсов. Если ключевое хранилище не найдено, конвейер не будет работать.
Если все вышеперечисленные проверки выполнены УСПЕШНО, в зависимости от того, какой ключ пользователь хочет повернуть (первичный или вторичный), Pipeline повернет ключ счета хранения и сохранит его в хранилище ключей.
ВАЖНОЕ ПРИМЕЧАНИЕ:-

Конвейер YAML тестируется только на WINDOWS BUILD AGENT!!!

ТРЕБОВАНИЯ:-
  1. Подписка на Azure.
  2. Организация и проект Azure DevOps.
  3. Принципал службы с требуемым RBAC (контрибьютор), примененным к подписке или группе (группам) ресурсов.
  4. Подключение службы Azure Resource Manager в Azure DevOps.
РЕПОЗИТОРИЙ КОДА:-

arindam0310018 / 29-Aug-2022-DevOps__Rotate-Storage-Account-Keys

КАК ВЫГЛЯДИТ МОЙ КОД: —
ФРАГМЕНТ КОДА ТРУБОПРОВОДА:-
AZURE DEVOPS YAML PIPELINE (azure-pipelines-storage-account-key-rotation-v1.0.yml):-
trigger:
  none

######################
#DECLARE PARAMETERS:-
######################
parameters:
- name: SUBSCRIPTIONID
  displayName: Subscription ID Details Follow Below:-
  type: string
  default: 210e66cb-55cf-424e-8daa-6cad804ab604
  values:
  - 210e66cb-55cf-424e-8daa-6cad804ab604

- name: RGNAME
  displayName: Please Provide the Resource Group Name:-
  type: object
  default: 

- name: STORAGEACCOUNTNAME
  displayName: Please Provide the Storage Account Name:-
  type: object
  default:

- name: KVNAME
  displayName: Please Provide the Keyvault Name:-
  type: object
  default: 

- name: STORAGEACCOUNTKEYS
  displayName: Choose Storage Account Keys - Primary or Secondary:-
  type: string
  default: Primary
  values:
  - Primary
  - Secondary 

######################
#DECLARE VARIABLES:-
######################
variables:
  ServiceConnection: amcloud-cicd-service-connection
  BuildAgent: windows-latest

#########################
# Declare Build Agents:-
#########################
pool:
  vmImage: $(BuildAgent)

###################
# Declare Stages:-
###################

stages:

- stage: VALIDATE_RG_STORAGE_ACCOUNT_AND_KV 
  jobs:
  - job: VALIDATE_RG_STORAGE_ACCOUNT_AND_KV 
    displayName: VALIDATE RG STORAGE ACCOUNT & KV
    steps:
    - task: AzureCLI@2
      displayName: SET AZURE ACCOUNT
      inputs:
        azureSubscription: $(ServiceConnection)
        scriptType: ps
        scriptLocation: inlineScript
        inlineScript: |
          az --version
          az account set --subscription ${{ parameters.SUBSCRIPTIONID }}
          az account show  
    - task: AzureCLI@2
      displayName: VALIDATE RG STORAGE ACCOUNT & RG
      inputs:
        azureSubscription: $(ServiceConnection)
        scriptType: ps
        scriptLocation: inlineScript
        inlineScript: |      
          $i = az group exists -n ${{ parameters.RGNAME }}
            if ($i -eq "true") {
              echo "#####################################################"
              echo "Resource Group ${{ parameters.RGNAME }} exists!!!"
              echo "#####################################################"
              $j = az storage account check-name --name ${{ parameters.STORAGEACCOUNTNAME }} --query "reason" --out tsv
                if ($j -eq "AlreadyExists") {
                  echo "###################################################################"
                  echo "Storage Account ${{ parameters.STORAGEACCOUNTNAME }} exists!!!"
                  echo "###################################################################"
                  $k = az keyvault list --resource-group ${{ parameters.RGNAME }} --query [].name -o tsv        
                    if ($k -eq "${{ parameters.KVNAME }}") {
                      echo "###################################################################"
                      echo "Key Vault ${{ parameters.KVNAME }} exists!!!"
                      echo "###################################################################"
                    }
                  else {
                    echo "###################################################################################################"
                    echo "Key Vault ${{ parameters.KVNAME }} DOES NOT EXISTS in Resource Group ${{ parameters.RGNAME }}!!!"
                    echo "###################################################################################################"
                    exit 1
                  }
                }  
                else {
                  echo "#######################################################################################################################"
                  echo "Storage Account ${{ parameters.STORAGEACCOUNTNAME }} DOES NOT EXISTS in Resource Group ${{ parameters.RGNAME }}!!!"
                  echo "#######################################################################################################################"
                  exit 1
                }              
            }
            else {
              echo "#############################################################"
              echo "Resource Group ${{ parameters.RGNAME }} DOES NOT EXISTS!!!"
              echo "#############################################################"
              exit 1
            }

- stage: RENEW_STORAGE_ACCOUNT_PRIMARY_KEY
  condition: |
     and(succeeded(),
       eq('${{ parameters.STORAGEACCOUNTKEYS }}', 'Primary')
     ) 
  jobs:
  - job: RENEW_STORAGE_ACCOUNT_PRIMARY_KEY 
    displayName: ROTATE PRIMARY KEY & STORE IN KV
    steps:
    - task: AzureCLI@2
      displayName: ROTATE AND STORE
      inputs:
        azureSubscription: $(ServiceConnection)
        scriptType: ps
        scriptLocation: inlineScript
        inlineScript: |
          $saprimary = az storage account keys renew -g ${{ parameters.RGNAME }} -n ${{ parameters.STORAGEACCOUNTNAME }} --key ${{ parameters.STORAGEACCOUNTKEYS }} --query [0].value -o tsv
          az keyvault secret set --name "${{ parameters.STORAGEACCOUNTNAME }}-${{ parameters.STORAGEACCOUNTKEYS }}" --vault-name ${{ parameters.KVNAME }} --value $saprimary
          echo "#################################################################################################################################################################"
          echo "Storage Account Primary Key has been successfully Rotated and Stored in Key Vault ${{ parameters.KVNAME }} under the Resource Group ${{ parameters.RGNAME }}!!!"
          echo "#################################################################################################################################################################"

- stage: RENEW_STORAGE_ACCOUNT_SECONDARY_KEY
  condition: |
       eq('${{ parameters.STORAGEACCOUNTKEYS }}', 'Secondary')
  dependsOn: VALIDATE_RG_STORAGE_ACCOUNT_AND_KV   
  jobs:
  - job: RENEW_STORAGE_ACCOUNT_SECONDARY_KEY 
    displayName: ROTATE SECONDARY KEY & STORE IN KV
    steps:
    - task: AzureCLI@2
      displayName: ROTATE AND STORE
      inputs:
        azureSubscription: $(ServiceConnection)
        scriptType: ps
        scriptLocation: inlineScript
        inlineScript: |
          $sasecondary = az storage account keys renew -g ${{ parameters.RGNAME }} -n ${{ parameters.STORAGEACCOUNTNAME }} --key ${{ parameters.STORAGEACCOUNTKEYS }} --query [1].value -o tsv
          az keyvault secret set --name "${{ parameters.STORAGEACCOUNTNAME }}-${{ parameters.STORAGEACCOUNTKEYS }}" --vault-name ${{ parameters.KVNAME }} --value $sasecondary
          echo "#################################################################################################################################################################"
          echo "Storage Account Secondary Key has been successfully Rotated and Stored in Key Vault ${{ parameters.KVNAME }} under the Resource Group ${{ parameters.RGNAME }}!!!"
          echo "#################################################################################################################################################################"

Вход в полноэкранный режим Выход из полноэкранного режима

Теперь позвольте мне объяснить каждую часть YAML Pipeline для лучшего понимания.

ЧАСТЬ #1:-
НИЖЕ СЛЕДУЕТ ФРАГМЕНТ КОДА ПЕРЕМЕННЫХ ВРЕМЕНИ ВЫПОЛНЕНИЯ КОНВЕЙЕРА:-
######################
#DECLARE PARAMETERS:-
######################
parameters:
- name: SUBSCRIPTIONID
  displayName: Subscription ID Details Follow Below:-
  type: string
  default: 210e66cb-55cf-424e-8daa-6cad804ab604
  values:
  - 210e66cb-55cf-424e-8daa-6cad804ab604

- name: RGNAME
  displayName: Please Provide the Resource Group Name:-
  type: object
  default: 

- name: STORAGEACCOUNTNAME
  displayName: Please Provide the Storage Account Name:-
  type: object
  default:

- name: KVNAME
  displayName: Please Provide the Keyvault Name:-
  type: object
  default: 

- name: STORAGEACCOUNTKEYS
  displayName: Choose Storage Account Keys - Primary or Secondary:-
  type: string
  default: Primary
  values:
  - Primary
  - Secondary 

Войти в полноэкранный режим Выйти из полноэкранного режима
ЧАСТЬ #2:-
НИЖЕ СЛЕДУЕТ СНИППЕТ КОДА ПЕРЕМЕННЫХ КОНВЕЙЕРА:-
######################
#DECLARE VARIABLES:-
######################
variables:
  ServiceConnection: amcloud-cicd-service-connection
  BuildAgent: windows-latest

Вход в полноэкранный режим Выйти из полноэкранного режима
ПРИМЕЧАНИЕ:-
Пожалуйста, измените значения переменных соответствующим образом.
Весь конвейер YAML строится с использованием параметров и переменных времени выполнения. Никакие значения не закодированы.
ЧАСТЬ #3:-
Это 3 этапа конвейера: —
ЭТАП #1 — ВАЛИДАЦИЯ_RG_ХРАНИЛИЩА_АККАУНТА_И_KV:-
На этом этапе конвейер будет проверять группу ресурсов, учетную запись хранилища и хранилище ключей. Если какой-либо из ресурсов Azure недоступен, конвейер не выполнит проверку, а два других этапа будут пропущены.
- stage: VALIDATE_RG_STORAGE_ACCOUNT_AND_KV 
  jobs:
  - job: VALIDATE_RG_STORAGE_ACCOUNT_AND_KV 
    displayName: VALIDATE RG STORAGE ACCOUNT & KV
    steps:
    - task: AzureCLI@2
      displayName: SET AZURE ACCOUNT
      inputs:
        azureSubscription: $(ServiceConnection)
        scriptType: ps
        scriptLocation: inlineScript
        inlineScript: |
          az --version
          az account set --subscription ${{ parameters.SUBSCRIPTIONID }}
          az account show  
    - task: AzureCLI@2
      displayName: VALIDATE RG STORAGE ACCOUNT & RG
      inputs:
        azureSubscription: $(ServiceConnection)
        scriptType: ps
        scriptLocation: inlineScript
        inlineScript: |      
          $i = az group exists -n ${{ parameters.RGNAME }}
            if ($i -eq "true") {
              echo "#####################################################"
              echo "Resource Group ${{ parameters.RGNAME }} exists!!!"
              echo "#####################################################"
              $j = az storage account check-name --name ${{ parameters.STORAGEACCOUNTNAME }} --query "reason" --out tsv
                if ($j -eq "AlreadyExists") {
                  echo "###################################################################"
                  echo "Storage Account ${{ parameters.STORAGEACCOUNTNAME }} exists!!!"
                  echo "###################################################################"
                  $k = az keyvault list --resource-group ${{ parameters.RGNAME }} --query [].name -o tsv        
                    if ($k -eq "${{ parameters.KVNAME }}") {
                      echo "###################################################################"
                      echo "Key Vault ${{ parameters.KVNAME }} exists!!!"
                      echo "###################################################################"
                    }
                  else {
                    echo "###################################################################################################"
                    echo "Key Vault ${{ parameters.KVNAME }} DOES NOT EXISTS in Resource Group ${{ parameters.RGNAME }}!!!"
                    echo "###################################################################################################"
                    exit 1
                  }
                }  
                else {
                  echo "#######################################################################################################################"
                  echo "Storage Account ${{ parameters.STORAGEACCOUNTNAME }} DOES NOT EXISTS in Resource Group ${{ parameters.RGNAME }}!!!"
                  echo "#######################################################################################################################"
                  exit 1
                }              
            }
            else {
              echo "#############################################################"
              echo "Resource Group ${{ parameters.RGNAME }} DOES NOT EXISTS!!!"
              echo "#############################################################"
              exit 1
            }
Вход в полноэкранный режим Выход из полноэкранного режима
ЭТАП №2 — ОБНОВЛЕНИЕ_АККАУНТА_ХРАНИЛИЩА_ПЕРВИЧНОГО_КЛЮЧА:-
На этом этапе у трубопровода есть условия.
Условие №1: Предыдущий этап должен быть успешным.
Условие №2: Пользователь должен выбрать опцию «Основной».
- stage: RENEW_STORAGE_ACCOUNT_PRIMARY_KEY
  condition: |
     and(succeeded(),
       eq('${{ parameters.STORAGEACCOUNTKEYS }}', 'Primary')
     ) 
Вход в полноэкранный режим Выйти из полноэкранного режима
НИЖЕ ПРИВЕДЕНА ЛОГИКА, ОПРЕДЕЛЕННАЯ ДЛЯ ОБНОВЛЕНИЯ/ПОВОРОТА ПЕРВИЧНОГО КЛЮЧА УЧЕТНОЙ ЗАПИСИ ХРАНИЛИЩА И ХРАНЕНИЯ В УПОМЯНУТОМ ХРАНИЛИЩЕ КЛЮЧЕЙ:-
jobs:
  - job: RENEW_STORAGE_ACCOUNT_PRIMARY_KEY 
    displayName: ROTATE PRIMARY KEY & STORE IN KV
    steps:
    - task: AzureCLI@2
      displayName: ROTATE AND STORE
      inputs:
        azureSubscription: $(ServiceConnection)
        scriptType: ps
        scriptLocation: inlineScript
        inlineScript: |
          $saprimary = az storage account keys renew -g ${{ parameters.RGNAME }} -n ${{ parameters.STORAGEACCOUNTNAME }} --key ${{ parameters.STORAGEACCOUNTKEYS }} --query [0].value -o tsv
          az keyvault secret set --name "${{ parameters.STORAGEACCOUNTNAME }}-${{ parameters.STORAGEACCOUNTKEYS }}" --vault-name ${{ parameters.KVNAME }} --value $saprimary
          echo "#################################################################################################################################################################"
          echo "Storage Account Primary Key has been successfully Rotated and Stored in Key Vault ${{ parameters.KVNAME }} under the Resource Group ${{ parameters.RGNAME }}!!!"
          echo "#################################################################################################################################################################"

Вход в полноэкранный режим Выход из полноэкранного режима
ЭТАП #3 — ОБНОВЛЕНИЕ_АККАУНТА_ХРАНИЛИЩА_ВТОРИЧНОГО_КЛЮЧА:-
На этом этапе у Pipeline есть условия.
Условие №1: Пользователь должен выбрать опцию «Вторичный».
Условие №2: зависит от этапа №1: VALIDATE_RG_STORAGE_ACCOUNT_AND_KV .
- stage: RENEW_STORAGE_ACCOUNT_SECONDARY_KEY
  condition: |
       eq('${{ parameters.STORAGEACCOUNTKEYS }}', 'Secondary')
  dependsOn: VALIDATE_RG_STORAGE_ACCOUNT_AND_KV  

Вход в полноэкранный режим Выход из полноэкранного режима
НИЖЕ ОПИСАНА ЛОГИКА ОБНОВЛЕНИЯ/РОТАЦИИ ВТОРИЧНОГО КЛЮЧА УЧЕТНОЙ ЗАПИСИ ХРАНИЛИЩА И ХРАНЕНИЯ ЕГО В УПОМЯНУТОМ KEYVAULT:-.
jobs:
  - job: RENEW_STORAGE_ACCOUNT_SECONDARY_KEY 
    displayName: ROTATE SECONDARY KEY & STORE IN KV
    steps:
    - task: AzureCLI@2
      displayName: ROTATE AND STORE
      inputs:
        azureSubscription: $(ServiceConnection)
        scriptType: ps
        scriptLocation: inlineScript
        inlineScript: |
          $sasecondary = az storage account keys renew -g ${{ parameters.RGNAME }} -n ${{ parameters.STORAGEACCOUNTNAME }} --key ${{ parameters.STORAGEACCOUNTKEYS }} --query [1].value -o tsv
          az keyvault secret set --name "${{ parameters.STORAGEACCOUNTNAME }}-${{ parameters.STORAGEACCOUNTKEYS }}" --vault-name ${{ parameters.KVNAME }} --value $sasecondary
          echo "#################################################################################################################################################################"
          echo "Storage Account Secondary Key has been successfully Rotated and Stored in Key Vault ${{ parameters.KVNAME }} under the Resource Group ${{ parameters.RGNAME }}!!!"
          echo "#################################################################################################################################################################"

Вход в полноэкранный режим Выход из полноэкранного режима

ТЕПЕРЬ ПРИШЛО ВРЕМЯ ТЕСТИРОВАНИЯ!!!…..

ТЕСТОВЫЕ СЛУЧАИ:-
ТЕСТОВЫЙ ПРИМЕР #1: ПРОВЕРКА ГРУППЫ РЕСУРСОВ, УЧЕТНОЙ ЗАПИСИ ХРАНИЛИЩА И ХРАНИЛИЩА КЛЮЧЕЙ:-
ЖЕЛАЕМЫЙ РЕЗУЛЬТАТ: КОНВЕЙЕР НЕ РАБОТАЕТ, ЕСЛИ ГРУППА РЕСУРСОВ НЕ СУЩЕСТВУЕТ.
ЖЕЛАЕМЫЙ РЕЗУЛЬТАТ: СБОЙ ТРУБОПРОВОДА ПРИ ОТСУТСТВИИ УЧЕТНОЙ ЗАПИСИ ХРАНИЛИЩА.
ЖЕЛАЕМЫЙ РЕЗУЛЬТАТ: КОНВЕЙЕР НЕ РАБОТАЕТ, ЕСЛИ ХРАНИЛИЩЕ КЛЮЧЕЙ НЕ СУЩЕСТВУЕТ.
ТЕСТОВЫЙ ПРИМЕР #2: ВРАЩАЙТЕ/ОБНОВЛЯЙТЕ ПЕРВИЧНЫЙ КЛЮЧ УЧЕТНОЙ ЗАПИСИ ХРАНИЛИЩА И ХРАНИТЕ ЕГО В ХРАНИЛИЩЕ КЛЮЧЕЙ:-
ТЕСТОВЫЙ ПРИМЕР #3: ВРАЩАЕМ/ОБНОВЛЯЕМ ВТОРИЧНЫЙ КЛЮЧ УЧЕТНОЙ ЗАПИСИ ХРАНИЛИЩА И СОХРАНЯЕМ В ХРАНИЛИЩЕ КЛЮЧЕЙ:-

Надеюсь, вам понравилось занятие!!!

Оставайтесь в безопасности | Продолжайте учиться | Распространяйте знания

Оцените статью
devanswers.ru
Добавить комментарий